基于DS18B20的温度采集显示系统的设计 下载本文

课程设计用纸

write_byte(0xbe);

temp_data[0]=read_byte(); temp_data[1]=read_byte();

ow_reset(); write_byte(0xcc); write_byte(0x44); }

4.2.4计算温度子程序

流程图如图4-5所示:

开始 温度零Y 下? N 温度值取补码置“—”标志 计算小数位温度BCD值 计算整数位温度BCD值 结束 图4-5 计算温度子程序

第 23 页

课程设计用纸

计算温度的C语言程序如下: work_temp() {

uchar n=0;

if(temp_data[1]>127) {

temp_data[1]=(255-temp_data[1]); temp_data[0]=(255-temp_data[0]); n=1;

} //负温度求补码

display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]]; display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;

display[3]=display[4]/100; display[1]=display[4]0; display[2]=display[1]/10; display[1]=display[1];

if(!display[3]){display[3]=0x0a;

if(!display[2]){display[2]=0x0a;}} //最高位为0时不显示 if(n){display[3]=0x0b;} }

4.2.5显示扫描过程子程序

流程图如图4-6所示:

//负温度是最高为显示“-”

第 24 页

课程设计用纸

开始 送位选码 送段选码 延时

图4-6 显示扫描过程子程序

显示扫描的C语言程序如下: scan() { char k;

for(k=0;k<4;k++) {

disdata=dis_7[display[k]]; if(k==1){DIN=0;}

//当K=1时,P0^7为低电平显示小数点 //4位LED扫描控制

discan=scan_con[k]; //列扫描 delay(30); discan=0xFF; } }

第 25 页

课程设计用纸

5.基于DS18B20的温度采集显示系统的调试

运行后,按下K1键,开始进入报警温度设置过程,按下K2则温度增加一度,按下K3则温度减少一度,刚开始调试时,由于接的LED报警灯是高电平点亮,程序一运行时,AT89C51给各个引脚都是高电平,所以LED灯一运行就会发光,违背了超过报警温度才发光的要求,所以在子程序中加上了一条开始时将LED所连引脚置0的程序。之后运行过程中又发现按下报警温度的设置键K1,K2,K3都不是很灵敏,有时按下的时间太短甚至会没有反应,经过与小组成员讨论,发现是由于按键没有进行消抖,在显示扫描子程序中加入了延时函数进行按键的消抖,这一问题也得到了解决。

图5-1温度实时显示且未超过报警温度25摄氏度时LED没有发光报警

第 26 页