但是用 Keil uVision 4 编译 不能 通过,STC12C5A.H头文件加入 也不成功'劳烦各位师博看看那里 出错谢谢
单片机源程序如下:
- //****************************************/
- //* 基于STC12C5A60S2的NTC温度计 */
- //* 测温范围-40°~110° */
- //****************************************/
- //4位共阳极数码管段码a-h接P27-P20,
- //位选端接P3高4位
- //NTC使用MF52-103/3435;10K±1%精度;B值:3435±1%
- //NTC温度输出端子接P1.0
- #include "STC12C5A.H"
- #include "intrins.h"
- #define u8 unsigned char
- #define u16 unsigned int
- #define u32 unsigned long int
- sbit GW=P2^1; //数码管位码
- sbit SW=P2^4;
- sbit BW=P2^3;
- sbit QW=P2^2;
- u8 show[4]; //显示四位数数组
- u32 Temp_Buf[9]; //采样数组
- u8 Ledcount,ADCcount; //数码管显示计数变量,ADC采样次数变量
- u8 code smg0[12]={0x0a,0xfa,0x4c,0x68,0xb8,0x29,0x09,0x7a,0x08,0x28,0xfd,0xff}; //数码管段码表,不带小数点:0-9,-,灭
- u8 code smg1[11]={0x02,0xf2,0x44,0x60,0xb0,0x21,0x01,0x72,0x00,0x20,0xff}; //数码管段码表,带小数点:0-9,灭
- u8 i,j,m,n;
- u32 WD; //温度值
- /************************************************
- NTC阻值与温度关系表
- ************************************************/
- u32 code NTCcode[] = {
- /***电阻值(扩大万倍)****温度值*******序号*******/
- 1905562, // -40.00 0
- 1834132, // -39.00 1
- 1756140, // -38.00 2
- 1676467, // -37.00 3
- 1595647, // -36.00 4
- 1515975, // -35.00 5
- 1438624, // -34.00 6
- 1364361, // -33.00 7
- 1293641, // -32.00 8
- 1226678, // -31.00 9
- 1163519, // -30.00 10
- 1104098, // -29.00 11
- 1048272, // -28.00 12
- 995847, // -27.00 13
- 946608, // -26.00 14
- 900326, // -25.00 15
- 856778, // -24.00 16
- 815747, // -23.00 17
- 777031, // -22.00 18
- 740442, // -21.00 19
- 705811, // -20.00 20
- 672987, // -19.00 21
- 641834, // -18.00 22
- 612233, // -17.00 23
- 584080, // -16.00 24
- 557284, // -15.00 25
- 531766, // -14.00 26
- 507456, // -13.00 27
- 484294, // -12.00 28
- 462224, // -11.00 29
- 441201, // -10.00 30
- 421180, // -9.00 31
- 402121, // -8.00 32
- 383988, // -7.00 33
- 366746, // -6.00 34
- 350362, // -5.00 35
- 334802, // -4.00 36
- 320035, // -3.00 37
- 306028, // -2.00 38
- 292750, // -1.00 39
- 280170, // 0.00 40
- 268255, // 1.00 41
- 256972, // 2.00 42
- 246290, // 3.00 43
- 236176, // 4.00 44
- 226597, // 5.00 45
- 217522, // 6.00 46
- 208916, // 7.00 47
- 200749, // 8.00 48
- 192988, // 9.00 49
- 185600, // 10.00 50
- 184818, // 11.00 51
- 181489, // 12.00 52
- 176316, // 13.00 53
- 169917, // 14.00 54
- 162797, // 15.00 55
- 155350, // 16.00 56
- 147867, // 17.00 57
- 140551, // 18.00 58
- 133536, // 19.00 59
- 126900, // 20.00 60
- 120684, // 21.00 61
- 114900, // 22.00 62
- 109539, // 23.00 63
- 104582, // 24.00 64
- 100000, // 25.00 65
- 95762, // 26.00 66
- 91835, // 27.00 67
- 88186, // 28.00 68
- 84784, // 29.00 69
- 81600, // 30.00 70
- 78608, // 31.00 71
- 75785, // 32.00 72
- 73109, // 33.00 73
- 70564, // 34.00 74
- 68133, // 35.00 75
- 65806, // 36.00 76
- 63570, // 37.00 77
- 61418, // 38.00 78
- 59343, // 39.00 79
- 57340, // 40.00 80
- 55405, // 41.00 81
- 53534, // 42.00 82
- 51725, // 43.00 83
- 49976, // 44.00 84
- 48286, // 45.00 85
- 46652, // 46.00 86
- 45073, // 47.00 87
- 43548, // 48.00 88
- 42075, // 49.00 89
- 40650, // 50.00 90
- 39271, // 51.00 91
- 37936, // 52.00 92
- 36639, // 53.00 93
- 35377, // 54.00 94
- 34146, // 55.00 95
- 32939, // 56.00 96
- 31752, // 57.00 97
- 30579, // 58.00 98
- 29414, // 59.00 99
- 28250, // 60.00 100
- 27762, // 61.00 101
- 27179, // 62.00 102
- 26523, // 63.00 103
- 25817, // 64.00 104
- 25076, // 65.00 105
- 24319, // 66.00 106
- 23557, // 67.00 107
- 22803, // 68.00 108
- 22065, // 69.00 109
- 21350, // 70.00 110
- 20661, // 71.00 111
- 20004, // 72.00 112
- 19378, // 73.00 113
- 18785, // 74.00 114
- 18225, // 75.00 115
- 17696, // 76.00 116
- 17197, // 77.00 117
- 16727, // 78.00 118
- 16282, // 79.00 119
- 15860, // 80.00 120
- 15458, // 81.00 121
- 15075, // 82.00 122
- 14707, // 83.00 123
- 14352, // 84.00 124
- 14006, // 85.00 125
- 13669, // 86.00 126
- 13337, // 87.00 127
- 13009, // 88.00 128
- 12684, // 89.00 129
- 12360, // 90.00 130
- 12037, // 91.00 131
- 11714, // 92.00 132
- 11390, // 93.00 133
- 11067, // 94.00 134
- 10744, // 95.00 135
- 10422, // 96.00 136
- 10104, // 97.00 137
- 9789, // 98.00 138
- 9481, // 99.00 139
- 9180, // 100.00 140
- 8889, // 101.00 141
- 8610, // 102.00 142
- 8346, // 103.00 143
- 8099, // 104.00 144
- 7870, // 105.00 145
- 7665, // 106.00 146
- 7485, // 107.00 147
- 7334, // 108.00 148
- 7214, // 109.00 149
- 7130, // 110.00 150
- };
- void ys1ms(u16 z) //zms延时函数
- {
- u8 x,y;
- for(x=z;x>0;x--)
- for(y=125;y>0;y--);
- }
- void XS() //数码管显示函数
- {
- for(i=0;i<4;i++)
- {
- switch(i)
- {
- case(0):
- GW=0;SW=1;BW=1;QW=1; P0=smg0[show[0]]; break; //小数位
- case(1):
- GW=1;SW=0;BW=1;QW=1; P0=smg1[show[1]]; break; //个位带小数点
- case(2):
- GW=1;SW=1;BW=0;QW=1; P0=smg0[show[2]]; break; //十位
- case(3):
- GW=1;SW=1;BW=1;QW=0; P0=smg0[show[3]]; break; //百位
- }
- ys1ms(10);
- GW=1;
- SW=1;
- BW=1;
- QW=1;
- P0=0xff;
- ys1ms(10);
- }
- }
- void InitADC() //ADC初始化
- {
- P1ASF=0x80; //1000 0000,设置P17作为AD使用
- ADC_RES=0; //转换结果寄存器高8位清零
- ADC_RESL=0; //转换结果寄存器低2位清零
- ADC_CONTR=ADC_POWER | ADC_SPEEDLL; //开启AD电源,AD转换速度
- ys1ms(2); //延时1ms以上,等待电源稳定
- }
- u16 AD_GET(u8 ch) //查询方式AD转换程序
- {
- ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- while(!(ADC_CONTR & ADC_FLAG)); //等待转换结束
- ADC_CONTR &= ~ADC_FLAG; //关闭ADC,AD_FLAG清零
- return(ADC_RES*4+ADC_RESL); //返回AD转换得到的10位数据(16进制)
- }
- void Get_Temp() //读取电阻值
- {
- u8 xx;
- u32 sum,RT;
- sum=0;
- RT=0;
- Temp_Buf[8]=(u32)102300000/AD_GET(7)-100000; //将ADC转换结果换算为电阻值并扩大10000倍
- if( ++ADCcount < 8) //采样初期不使用递推滤波算法
- {
- for(xx=0;xx<8;xx++) //准备递推滤波算法的数据
- {
- Temp_Buf[xx]=Temp_Buf[xx+1]; //所有数据循环左移
- }
- RT=Temp_Buf[8]; //采样初期使用当前采样值
- }
- else //只有采样次数大于8次以后才使用递推滤波算法
- {
- ADCcount=8; //采样次数超过8次后,固定设置为8
- for(xx=0;xx<8;xx++) //递推滤波算法
- {
- Temp_Buf[xx]=Temp_Buf[xx+1]; //所有数据循环左移
- sum+=Temp_Buf[xx]; //求和
- }
- RT=sum/8; //求平均值
- }
- if (RT>=7130 && RT<=1905562)
- {
- xx=0;
- while( RT < NTCcode[xx] ) //将当前电阻值与表对比,得到所在位置
- {
- xx++;
- }
- WD=xx*10-((RT+5-NTCcode[xx])*10/(NTCcode[xx-1]-NTCcode[xx])); //插值法计算,数据扩大10倍
- if (WD>400) //正温度(大于0度)
- {
- WD=WD-400; //取得0°以上温度
- if (WD>999) //大于100度显示最高位
- {
- show[3]=WD/1000;
- }
- else //小于100度不显示最高位
- {
- show[3]=11; //百位
- show[2]=WD%1000/100; //十位
- show[1]=WD%100/10; //个位加小数点
- show[0]=WD%10; //小数位
- }
- }
- else //负温度(小于0度)
- {
- WD=400-WD; //取得0°以下温度
- show[3]=10; //显示负号-
- show[2]=WD/100;
- show[1]=WD%100/10; //加小数点
- show[0]=WD%10;
- }
- }
- else if (RT>1905562) //温度低于-40℃,显示-0,表示超出量程(欠量程)
- {
- show[3]=10; //显示负号-
- show[2]=11;
- show[1]=10; //加小数点
- show[0]=0;
- }
- else if (RT<7130) //温度高于110℃,显示1,表示超量程
- {
- show[3]=1; //百位
- show[2]=11; //十位
- show[1]=10; //个位加小数点
- show[0]=11;
- }
- }
- void main()
- {
- InitADC();
- ADCcount=0; //ADC采样次数
- while(1)
- {
- Get_Temp();
- XS();
- }
- }
复制代码
所有资料51hei提供下载:
STC热敏电阻温度计程序.rar
(26.33 KB, 下载次数: 42)
|