数字温度计的设计Word格式文档下载.docx
《数字温度计的设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数字温度计的设计Word格式文档下载.docx(28页珍藏版)》请在冰豆网上搜索。
//pin12RCLkstore(latch)clock
sbitP_HC595_SRCLK=P4^3;
//pin11SRCLKShiftdataclock
/*************本地变量声明**************/
u8LED8[8];
//显示缓冲
u8display_index;
//显示位索引
bitB_1ms;
//1ms标志
u8offled;
u16msecond;
/*************本地函数声明**************/
u16get_temperature(u16adc);
u16Get_ADC10bitResult(u8channel);
//channel=0~7
voidDelayms(u16dlayT);
voidDisplayScan(void);
/**********************************************/
voidmain(void)
{
u8i,k;
u16j;
P0M1=0;
P0M0=0;
//设置为准双向口
P1M1=0;
P1M0=0;
P2M1=0;
P2M0=0;
P3M1=0;
P3M0=0;
P4M1=0;
P4M0=0;
P5M1=0;
P5M0=0;
P6M1=0;
P6M0=0;
P7M1=0;
P7M0=0;
display_index=4;
offled=0;
P1ASF=0x0F;
//P1.0P1.1P1.2P1.3做ADC
ADC_CONTR=0xE0;
//90T,ADCpoweron
CLK_DIV=CLK_DIV&
0xDF;
//CLK_DIV.5ADRJ=0
AUXR=0x80;
//Timer0setas1T,16bitstimerauto-reload,
TH0=(u8)(Timer0_Reload/256);
TL0=(u8)(Timer0_Reload%256);
ET0=1;
//Timer0interruptenable
TR0=1;
//Tiner0run
EA=1;
//打开总中断
for(k=11;
k>
0;
k--)
{
for(i=0;
i<
4;
i++)LED8[i]=k-1;
//上电消隐
Delayms(1000);
}
while
(1)
if(B_1ms)//1ms到
{
B_1ms=0;
if(++msecond>
=300)//300ms到
{
msecond=0;
j=Get_ADC10bitResult(AD_Cha);
//参数0~7,查询方式做一次ADC,返回值就是结果,==1024为错误
//j=768;
if(j<
1024)
{
LED8[0]=j/1000;
//显示ADC值
LED8[1]=(j%1000)/100;
LED8[2]=(j%100)/10;
LED8[3]=j%10;
if(LED8[0]==0)LED8[0]=16;
}
else//错误
for(i=0;
i++)LED8[i]=14;
j=Get_ADC10bitResult(3);
j+=Get_ADC10bitResult(3);
1024*4)
if(LED8[0]==0)LED8[0]=DIS_BLACK;
j=get_temperature(j);
//计算温度值
if(j>
=400)F0=0,j-=400;
//温度>
=0度
elseF0=1,j=400-j;
//温度<
0度
LED8[4]=j/1000;
//显示温度值
LED8[5]=(j%1000)/100;
LED8[6]=(j%100)/10+DIS_DOT;
LED8[7]=j%10;
if(LED8[4]==0)LED8[4]=DIS_BLACK;
if(F0)LED8[4]=DIS_;
//显示-
8;
i++)LED8[i]=DIS_;
}
}
}
//========================================================================
//函数:
u16Get_ADC10bitResult(u8channel)
//描述:
查询法读一次ADC结果.
//参数:
channel:
选择要转换的ADC.
//返回:
10位ADC结果.
//版本:
V1.0,2012-10-22
u16Get_ADC10bitResult(u8channel)//channel=0~7
ADC_RES=0;
ADC_RESL=0;
ADC_CONTR=(ADC_CONTR&
0xe0)|0x08|channel;
//starttheADC
NOP(4);
while((ADC_CONTR&
0x10)==0);
//waitforADCfinish
ADC_CONTR&
=~0x10;
//清除ADC结束标志
return(((u16)ADC_RES<
<
2)|(ADC_RESL&
3));
}
//MF52E10Kat25,B=3950,ADC=12bits
u16codetemp_table[]={
140,//;
-400
149,//;
-391
159,//;
-382
168,//;
-373
178,//;
-364
188,//;
-355
199,//;
-346
210,//;
-337
222,//;
-328
233,//;
-319
246,//;
-3010
259,//;
-2911
272,//;
-2812
286,//;
-2713
301,//;
-2614
317,//;
-2515
333,//;
-2416
349,//;
-2317
367,//;
-2218
385,//;
-2119
403,//;
-2020
423,//;
-1921
443,//;
-1822
464,//;
-1723
486,//;
-1624
509,//;
-1525
533,//;
-1426
558,//;
-1327
583,//;
-1228
610,//;
-1129
638,//;
-1030
667,//;
-931
696,//;
-832
727,//;
-733
758,//;
-634
791,//;
-535
824,//;
-436
858,//;
-337
893,//;
-238
929,//;
-139
965,//;
040
1003,//;
141
1041,//;
242
1080,//;
343
1119,//;
444
1160,//;
545
1201,//;
646
1243,//;
747
1285,//;
848
1328,//;
949
1371,//;
1050
1414,//;
1151
1459,//;
1252
1503,//;
1353
1548,//;
1454
1593,//;
1555
1638,//;
1656
1684,//;
1757
1730,//;
1858
1775,//;
1959
1821,//;
2060
1867,//;
2161
1912,//;
2262
1958,//;
2363
2003,//;
2464
2048,//;
2565
2093,//;
2666
2137,//;
2767
2182,//;
2868
2225,//;
2969
2269,//;
3070
2312,//;
3171
2354,//;
3272
2397,//;
3373
2438,//;
3474
2479,//;
3575
2519,//;
3676
2559,//;
3777
2598,//;
3878
2637,//;
3979
2675,//;
4080
2712,//;
4181
2748,//;
4282
2784,//;
4383
2819,//;
4484
2853,//;
4585
2887,//;
4686
2920,//;
4787
2952,//;
4888
2984,//;
4989
3014,//;
5090
3044,//;
5191
3073,//;
5292
3102,//;
5393
3130,//;
5494
3157,//;
5595
3183,//;
5696
3209,//;
5797
3234,//;
5898
3259,//;
5999
3283,//;
60100
3306,//;
61101
3328,//;
62102
3351,//;
63103
3372,//;
64104
3393,//;
65105
3413,//;
66106
3432,//;
67107
3452,//;
68108
3470,//;
69109
3488,//;
70110
3506,//;
71111
3523,//;
72112
3539,//;
73113
3555,//;
74114
3571,//;
75115
3586,//;
76116
3601,//;
77117
3615,//;
78118
3628,//;
79119
3642,//;
80120
3655,//;
81121
3667,//;
82122
3679,//;
83123
3691,//;
84124
3702,//;
85125
3714,//;
86126
3724,//;
87127
3735,//;
88128
3745,//;
89129
3754,//;
90130
3764,//;
91131
3773,//;
92132
3782,//;
93133
3791,//;
94134
3799,//;
95135
3807,//;
96136
3815,//;
97137
3822,//;
98138
3830,//;
99139
3837,//;
100140
3844,//;
101141
3850,//;
102142
3857,//;
103143
3863,//;
104144
3869,//;
105145
3875,//;
106146
3881,//;
107147
3887,//;
108148
3892,//;
109149
3897,//;
110150
3902,//;
111151
3907,//;
112152
3912,//;
113153
3917,//;
114154
3921,//;
115155
3926,//;
116156
3930,//;
117157
3934,//;
118158
3938,//;
119159
3942//;
120160
};
/********************计算温度***********************************************/
//计算结果:
0对应-40.0度,400对应0度,625对应25.0度,最大1600对应120.0度.
//为了通用,ADC输入为12bit的ADC值.
//电路和软件算法设计:
Coody
#defineD_SCALE10//结果放大倍数,放大10倍就是保留一位小数
u16get_temperature(u16adc)
u16code*p;
u16i;
u8j,k,min,max;
adc=4096-adc;
//Rt接地
p=temp_table;
if(adc<
p[0])return(0xfffe);
if(adc>
p[160])return(0xffff);
min=0;
//-40度
max=160;
//120度
for(j=0;
j<
5;
j++)//对分查表
k=min/2+max/2;
if(adc<
=p[k])max=k;
elsemin=k;
if(adc==p[min])i=min*D_SCALE;
elseif(adc==p[max])i=max*D_SCALE;
else//min<
temp<
max
while(min<
=max)
min++;
if(adc==p[min]){i=min*D_SCALE;
break;
elseif(adc<
p[min])
min--;
i=p[min];
//min
j=(adc-i)*D_SCALE/(p[min+1]-i);
i=min;
i*=D_SCALE;
i+=j;
break;
returni;
voidDelayms(u16dlayT)
u16i,j;
for(i=0;
i<
dlayT;
i++)
for(j=0;
j<
1280;
j++)
_nop_();
/**********************显示扫描函数************************/
voidDisplayScan(void)
{
u8i;
for(i=0;
10;
i++)
P3=0xff;
P1=0xff;
P3=t_display[LED8[display_index]];
//输出段码
P1=T_COM[display_index];
//输出位码
if(++display_index>
=8)display_index=4;
//8位结束回0
/**********************Timer01ms中断函数************************/
voidtimer0(void)interruptTIMER0_VECTOR
DisplayScan();
//1ms扫描显示一位
B_1ms=1;
//1ms标志
附件:
1、NTC热敏电阻原理及应用
2、STC15Fxxxx.H程序头文件
3、STC15.pdf单片机芯片资料
(a