课程设计用纸
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 页