⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fet410_sd16_02.c

📁 基于MSP430的PT1000温度测量程序
💻 C
字号:

#include  <msp430x42x.h>
#include <math.h>
char* LCD = LCDMEM;
/* Array to store SD16 conversion results  */
/* NOTE: array needs to be global to       */
/*       prevent removal by compiler       */
static unsigned int results[3];
//LCD液晶控制为d e g f h c b a
const char show_Num[10] =
{
  0xD7,  // "0"    LCD segments a+b+c+d+e+f
  0x06,  // "1"    LCD segments b+c
  0xE3,  // "2"    LCD segments a+b+d+e+g
  0xA7,  // "3"    LCD segments a+b+c+d+g
  0x36,  // "4"    LCD segments b+c+f+g
  0xB5,  // "5"    LCD segments a+c+d+f+g
  0xF5,  // "6"    LCD segments a+c+d+e+f+g
  0x07,  // "7"    LCD segments a+b+c
  0xF7,  // "8"    LCD segments a+b+c+d+e+f+g
  0x37   // "9"    LCD segments a+b+c+f+g
};

float vt1,vt0,pr1,pr0,temperature1,temperature0;
static float pt1000[202]={1000,1001.954,1003.908,1005.861,1007.814,1009.767,1011.72,1013.672,1015.624,1017.576,
1019.527,1021.478,1023.429,1025.38,1027.33,1029.28,1031.229,1033.179,1035.128,1037.077,
1039.025,1040.973,1042.921,1044.869,1046.816,1048.764,1050.71,1052.657,1054.603,1056.549,
1058.495,1060.44,1062.385,1064.33,1066.274,1068.218,1070.162,1072.106,1074.049,1075.992,
1077.935,1079.877,1081.82,1083.762,1085.703,1087.644,1089.585,1091.526,1093.467,1095.407,
1097.347,1099.286,1101.225,1103.164,1105.103,1107.042,1108.98,1110.917,1112.855,1114.792,
1116.729,1118.666,1120.602,1122.538,1124.474,1126.41,1128.345,1130.28,1132.215,1134.149,
1136.083,1138.017,1139.95,1141.884,1143.817,1145.749,1147.681,1149.614,1151.545,1153.477,
1155.408,1157.339,1159.27,1161.2,1163.13,1165.06,1166.989,1168.918,1170.847,1172.776,
1174.704,1176.632,1178.56,1180.487,1182.414,1184.341,1186.268,1188.194,1190.12,1192.046,
1193.971,1195.896,1197.821,1199.746,1201.67,1203.594,1205.518,1207.441,1209.364,1211.287,
1213.21,1215.12,1217.054,1218.975,1220.897,1222.818,1224.739,1226.659,1228.579,1230.499,
1232.419,1234.338,1236.257,1238.176,1240.095,1242.03,1243.931,1245.848,1247.766,1249.683,
1251.6,1253.516,1255.432,1257.348,1259.264,1261.179,1263.094,1265.009,1266.923,1268.837,
1270.751,1272.665,1274.578,1275.141,1278.404,1280.316,1282.228,1284.14,1286.052,1287.963,
1289.874,1291.785,1293.695,1295.605,1297.515,1299.425,1301.334,1303.243,1305.152,1307.06,
1308.968,1310.876,1312.783,1314.691,1316.597,1318.504,1320.411,1322.316,1324.222,1326.128,
1328.033,1329.938,1331.843,1333.747,1335.651,1337.555,1339.458,1321.361,1343.264,1345.167,
1347.069,1348.971,1350.873,1352.774,1354.676,1356.577,1358.477,1360.377,1362.277,1364.177,
1366.077,1367.976,1369.875,1371.773,1373.671,1375.569,1377.467,1379.365,1381.262,1383.158,
1385.055,1386.951};
void lcd_config(void){
  volatile unsigned int i; 
  LCDCTL = LCDSG0_1 + LCD4MUX + LCDON;      // 4-Mux LCD, segments S0-S15
  BTCTL  = BT_fLCD_DIV64;                  // LCD clock freq is ACLK/64
//  P5SEL  = 0xFC;                            // Select P5.2-7 as Com and Rxx
  // Clear LCD memory to clear display
  for (i=0; i<15; i++)
  {
    LCD[i] = 0;
  }
}
void letter_show(void){
  LCD[0] = 0x80;
  LCD[1] = 0x55;
}
//在五个数字显示处显示digit位有效数字的val
void number_show(float val,char digit,char section){
  char *s,*mid_s,i,mid_Num,mid_length,length=1;
  float val2;
  long number;
  s=(char *)0x0300;
  mid_s=s;
  val2=val;                
  while(val2>=10){                               //计算小数点前的数字位数
    val2=val2/10;
    length++;
  }
  mid_length=length;                             //中间变量存取长度
  if(length==1){                                 //放置小数点前面数字
    *s++=val;
  }
  else{
    number=val;
    do{
      length--;
      mid_Num=number/(pow(10,length));
      number=number-mid_Num*(pow(10,length));
      *s++=mid_Num;
    }while(length!=0);
  }
  val=val-(long)val;                             //把小数点后面数字放入数组中
  length=mid_length;
  for(i=0;i<digit-length;i++){
    mid_Num=val*10;
    *s++=mid_Num;
    val=val*10-mid_Num;
  }
/*  if(val>=0.5){                                  //四舍五入方法
    s--;
    (*s)++;
  }*/
  if(section==0){
    for(i=1;i<=digit;i++){  //通过指针把浮点型数字显示出来
      if(i==length){                               //小数点放置处     
        LCD[i+8]=show_Num[(*mid_s++)]|0x08;
      }
      else
        LCD[i+8]=show_Num[(*mid_s++)];
    }
  }
  else{
    for(i=1;i<=digit;i++){
      if(i==length){                               //小数点放置处     
        LCD[i+1]=show_Num[(*mid_s++)]|0x08;
      }
      else
        LCD[i+1]=show_Num[(*mid_s++)];
    }
  }  
}

void sd16_config(void){
  volatile unsigned int i;                  // Use volatile to prevent removal
  SD16CTL   = SD16REFON+SD16SSEL0+SD16VMIDON;          // 1.2V ref, SMCLK
  SD16CCTL0 = SD16SNGL+SD16GRP;             // Single conv, group with CH1
  SD16CCTL1 = SD16SNGL+SD16GRP;             // Single conv, group with CH2
  SD16CCTL2 = SD16SNGL+SD16IE;              // Single conv, enable interrupt
  for (i = 0; i < 0x3600; i++);             // Delay for 1.2V ref startup

  _EINT();                                  // Enable general interrupts
}

void main(void)
{
  volatile unsigned int i;                  // Use volatile to prevent removal
                                            // by compiler optimization
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  FLL_CTL0 |= XCAP14PF;                     // Configure load caps
  for (i = 0; i < 10000; i++);              // Delay for 32 kHz crystal to
                                            // stabilize
  sd16_config();
  lcd_config();
  while (1)
  {
    SD16CCTL2 |= SD16SC;                    // SET BREAKPOINT HERE
                                            // Set bit to start conversion
//    i++;
//    number_show(temperature0,3);
    _BIS_SR(LPM0_bits);                     // Enter LPM0
  }
}



#pragma vector=SD16_VECTOR
__interrupt void SD16ISR(void)
{
  float mid_num;
  unsigned char i;
  switch (SD16IV)
  {
  case 2:                                   // SD16MEM Overflow
    break;
  case 4:                                   // SD16MEM0 IFG
    break;
  case 6:                                   // SD16MEM1 IFG
    break;
  case 8:                                   // SD16MEM2 IFG
    results[0] = SD16MEM0;                  // Save CH0 results (clears IFG)
    results[1] = SD16MEM1;                  // Save CH1 results (clears IFG)
    results[2] = SD16MEM2;                  // Save CH2 results (clears IFG)
    //vt1=(float)(results[1]+40)/65536*1.2-0.6;
    //vt0=(float)(results[0]+40)/65536*1.2-0.6;
    //pr1=1508.1*vt1/(1.2-vt1);   
    //pr0=1495*vt0/(1.2-vt0);
    pr1=(results[1]-32768)*1515.0/(98304-results[1]);
    pr0=(results[0]-32768)*1501.8/(98304-results[0]);
    if(pr1>1174.704){//高于45度时的处理
      pr1=(results[1]-32768)*1500.0/(98304-results[1]);
    }
    if(pr0>1174.704){
      pr0=(results[0]-32768)*1490.0/(98304-results[0]);
    }
    if(pr1<1039.025){//低于10度时的处理
      pr1=(results[1]-32768)*1525.3/(98304-results[1]);
    }
    if(pr0<1039.025){
      pr0=(results[0]-32768)*1513.8/(98304-results[0]);
    }
    if(1039.025<pr0<1077.935){
      pr0=(results[0]-32768)*1506.5/(98304-results[0]);
    }
    if(1039.025<pr1<1077.935){
      pr1=(results[1]-32768)*1518.0/(98304-results[1]);
    }    
    break;
  }
  for(i=0;i<=201;i++){                            //PT0温度电阻查取,同时进行就近四舍五入
    if(pr1<pt1000[i]){
      mid_num=(pt1000[i]+pt1000[i-1])/2;
      if(pr1<mid_num)
        temperature1=0.5*(i-1);
      else
        temperature1=0.5*i;
      break;
    }
  }
  for(i=0;i<=201;i++){                           //PT1温度电阻查取,同时进行就近四舍五入
    if(pr0<pt1000[i]){
      mid_num=(pt1000[i]+pt1000[i-1])/2;       
      if(pr0<mid_num)
        temperature0=0.5*(i-1);
      else
        temperature0=0.5*i;
      break;
    }
  }
  letter_show();
  number_show(temperature0,3,0);                 //将测到的温度显示出来 
  number_show(temperature1,3,1);                 //将测到的温度显示出来
  _BIC_SR_IRQ(LPM0_bits);                        // Exit LPM0
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -