数字温度计的设计word版本.docx
《数字温度计的设计word版本.docx》由会员分享,可在线阅读,更多相关《数字温度计的设计word版本.docx(35页珍藏版)》请在冰点文库上搜索。
数字温度计的设计word版本
数字温度计的设计
实验六数字温度计的设计
一、设计目的
通过电子技术的综合设计,熟悉一般电子电路综合设计过程、设计要求、应完成的工作内容和具体的设计方法。
通过设计有助于复习、巩固以往的学习内容,达到灵活应用的目的。
设计完成后在实验室进行自行安装、调试,从而加强学生的动手能力。
在该过程中培养从事设计工作的整体概念。
二、设计要求
1、利用所学的知识,通过上网或到图书馆查阅资料,完成数字温度计的设计;要求写出实验原理,画出原理功能框图,描述其功能。
2、需采用单片机STC15W404AS、NTC热敏电阻、共阳数码管等元器件进行设计,试确定设计方案详细工作原理,计算出参数。
3、技术指标:
1)温度范围:
0---+100℃;误差≤±2℃;
2)选择设计方案;
3)根据设计方案分析设计原理及写出详细的硬件电路设计过程;
方案概要
本设计是利用NTC热敏电阻MF52E-10K(B=3950)1%精度,作为温度传感器,其输出的信号通过STC15W404AS内部AD进行模数转换,然后STC15W404AS对该温度数据进行处理,并由一个4位一体共阳数码管显示显示温度值。
实验报告要求原理、计算等)
1、根据设计要求确定数字温度计方案,并完成电路设计,分别说明设计方案、电路工作原理:
2、完成电路连接并进行数字温度计测试:
参考设计电路
图1参考电路图
表1元器件清单
图2参考电路图
表2元器件清单
图3数码管引脚图
参考程序:
******************************************/
#defineMAIN_Fosc22118400L//定义主时钟
#include"STC15Fxxxx.H"
/******************************用户定义宏***********************************/
#defineTimer0_Reload(65536UL-(MAIN_Fosc/1000))//Timer0中断频率,1000次/秒
/*****************************************************************************/
#defineDIS_DOT0x20
#defineDIS_BLACK16
#defineDIS_17
#defineAD_Cha2//0-4通道
/*************本地常量声明**************/
u8codet_display[]={//标准字库共阳
//0123456789ABCDEF
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,
//black-HJKLNoPUtGQrMy
0xff,0xBF,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x46};//0.1.2.3.4.5.6.7.8.9.-1
/*
u8codet_display[]={//标准字库
//0123456789ABCDEF
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black-HJKLNoPUtGQrMy
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};//0.1.2.3.4.5.6.7.8.9.-1
*/
u8codeT_COM[]={0xEF,0xDF,0xBF,0x7F,0xEF,0xDF,0xBF,0x7F};//位码
/*************IO口定义**************/
sbitP_HC595_SER=P4^0;//pin14SERdatainput
sbitP_HC595_RCLK=P5^4;//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<4;i++)LED8[i]=14;
}
j=Get_ADC10bitResult(3);//参数0~7,查询方式做一次ADC,返回值就是结果,==1024为错误
j+=Get_ADC10bitResult(3);
j+=Get_ADC10bitResult(3);
j+=Get_ADC10bitResult(3);
if(j<1024*4)
{
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]=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_;//显示-
}
else//错误
{
for(i=0;i<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
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{
while(min<=max)
{
min++;
if(adc==p[min]){i=min*D_SCALE;break;}
elseif(adc
{
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;ifor(j=0;j<1280;j++)
{
_nop_();
}
}
/**********************显示扫描函数************************/
voidDisplayScan(void)
{
u8i;
for(i=0;i<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、ST