基于51的温度控制系统设计.docx
/*/*/*程序名称:温度监控系统/*程序功能:利用89C52单片机和DS18B20温度传感器实现环境*/*温度的实时测量和高、低温报警*/*程序版本:vl.0*/*作者:*/*编写时间:*/#includc<reg52.h>#includc<intrins.h>含_nop_()延时函数定义数据类型#defineucharunsignedchar#defineuintunsignedint定义端口#defineLEDPOsbitDQ=P32;段码输出口传感器数据口sbitSMG_q=PMO;定义数码管阳级控制脚(千位)sbitSMGj)=P。;定义数码管阳级控制脚(百位)sbitSMG-s=Pl2;定义数码管阳级控制脚(十位)sbitSMG_g=PD3;定义数码管阳级控制脚(个位)sbitbuzzer=P15;sbitIedJow=P26;sbitlcd_high=P27;蜂鸣器低温指示灯高温指示灯sbitlcd_ok=P25;温度正常指示灯sbitlcd_work=P24;sbitset=P37;sbitadd=P34;sbitdec=P35;定义变量和常量intcount=0;inth;uinttemp;ucharr;ucharhigh=35,low=20;共阳LED段码表工作指示灯设置按键加一按键减一按键按键次数存放器主函数用循环计数器温度值温度值整数形式上下限初值110»»IlIIl"2”"3''"4"''5''''6'',yg“9”»1”IlucharcodeLED_code12=OxcO,0xf9,0xa4,OxbO,0x99,0x92,0x82,0xf8,0x80,0x90;ucharcodeLED_codel=0x40,0x79,0x24,0x30,0x19,Ox12,0x02,0x78,0x(X),0x10);ucharcodeditabl6=0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09;小数局部转换码表uchardatatemp_data2=0x00,0x00;存储从传感器读出的温度值uchardatadp5=0x00,0x00,0x00,0x00,0x00;显示单元数据,共4个数据和一个运算子函数声明voidds_reset();/DS18B20初始化函数voidds_write(uchards_wrdata);/DS18B20写数据函数uchards_read();read_temp();/DS18B20读数据函数读取温度函数voidchange_temp(uinttern);温度数据处理void void void void voidxianshi(int horl);display();keyscan();Warned();dclay(uint t);温度显示转换数码管显示函数按键查询函数超限报警延时函数,单次25US/*主函数*/voidmain()(1.ED=OxOO;初始化显示端口Icdl=O;led2=0;led3=0;led4=0;for(h=0;h<4;h+)dph=8;Iwhile(l)循环执行显示和温度读取(uchari;for(i=0;i<200;i+)(warnjed();指示灯控制display();显示keyscan();按键扫描)change_iemp(read_temp();温度数据读取和处理)/*/*函数名称:ds_reset()*/*函数功能:DS18B20初始化*/*入口参数:无*/*输出参数:无*/*调用函数:delay();_nop_();*/*全局变量:无*/*局部变量:presence*/*/voidds_reset(void)(charpresence=1;while(presence)while(presence)(DQ=1;传感器数据段先置高电平-11P-();_nop_();适当延时DQ=O;传感器数据段从高电平拉到低电平delay(50);延时再置高电平延时初始化成功,继续下一步延时DQ=I;delay(6);presence=DQ;)delay(45);PreSenCe=DQ;DQ=I;led_work=0;拉高电平开工作指示灯/*/*/*/*/*/*/*/*/*函数名称:ds_write()/*函数功能:向DS18B20写数据/*入口参数:ds_wrdata/*输出参数:无/*调用函数:delay();_nop_();/*全局变量:无/*局部变量:ds_wrdata*/voidds_write(uchards_wrdata)(uchari;for(i=8;i>0;i-)DQ=I;-11op-0;-110P-();DQ=O;_nop_();_nop_();_nop_();_nop_();DQ=ds_wrdata&0x01;最低位移出delay(6);ds_wrdata=ds_wrdata/2;右移1位DQ=I;delay(l);/*/*函数名称:ds_read()*/*函数功能:从DS18B20读数据*/*入口参数:无*/*输出参数:value*/*调用函数:delay();_nop_();*/*全局变量:*/*局部变量:i;ValUe;*/*木木*木*木*/uchards_read(void)uchari;ucharvalue=O;for(i=8;i>0;i-)DQ=l;_nop_();_nop_();value>>=l;DQ=O;_nop_0;_nop_();_nop_();-nop-0;DQ=I;_nop_();-11op-0;_nop_0;_nop_();if(DQ)value=0x80;delay(6);DQ=I;return(value);)/*/*函数名称: *函数功能: /*入口参数: /*输出参数: /*调用函数: /*/*全局变量: /*局部变量:read_temp()读温度数据数据无yempds_reset();ds_write();ds_read(); */delay。;temptemp-data;*/*/*/*/*/*/*/* */rcad_temp()(ds_reset();delay(200);ds_write(Oxcc);ds_write(0x44);ds_reset();delay(l);ds_write(Oxcc); ds_write(Oxbe);temp_dataO=ds_rcad(); temp-data 1 =ds_read(); temp=tcmp_datal 1 ;temp<<=8;temp=temptemp-dataO; return temp;)传感器初始化发跳过读取序列号命令发温度转换命令读18B20中存储器读温度值的低字节命令读温度值的高字节两字节合成一个整型变量 返同温度值/*左*木*木*/*函数名称:chang_temp()*/*函数功能:将温鹿传感器中独到的数据进展转换*/*入口参数:tem*/*输出参数:dpi*/*调用函数:无*/*全局变量:dp;ditab;r;*/*局部变量:Iem*/void change_temp(uint tem)(uchar n=0;if(tem>6348)(tem=65536-tem;n=l;Idp4=tem&0x0f;dpO=ditabdp4;dp4=em>>4;dp3=dp4100;dpl=dp4%100;dp2=dpl10;dpl=dpl%10;r=dpl+dpf21*10+dpf3*100;if(!dp3)dp3=0x0a;if(!dp )(dp2=0x0a;I)if(n)dp3=0x0b;/温度值正负判断/负温度求补码标志位置1/取小数局部的值/存入小数局部显示值/取中间八位,即整数局部的值/取百位数据/取后两位数据/取十位数据/个位/实际温度值(十进制)符号位显示判断最高位为0时不显示次高位为0时不显示负温度时最高位显示”/*木*:*木*木*木*/*函数名称:xianshi()*/*函数功能:温度数据转换成显示所需LED段码*/*入口参数:horl*/*输出参数:dpj*/*调用函数:无*/*全局变量:dp;/*局部变量:n;*/voidxianshi(inthorl)intn=0;if(horl>128)(horl=256-horl;n=l;Idp3=horl100;dp3=dp3<fexf;dp=horl%10010;dpl=horl%10;dpO=O;if(!dp3)dp3=0x0a;if(!dp)dp2=0x0a;)Iif(n)dp3=0x0b;负数补码转换百位十位个位小数位局位为零不显示负数最高位显示/*/*函数名称:display()*/*函数功能:数码管显示*/*入口参数:无*/*输出参数:无*/*调用函数:delay()*/*全局变量:dp;LED_coden;LED_code1;*/*Iedl;led2;led3;led4;*/*局部变量:j;*/voiddisplay()(intj;for(j=0;j<4;j+)/4位LED扫描控制(switch(j)case0:LED=LED_codedp0JJ;led4=l;delay(450);led4=0;break;小数位case1:LED=LED_codeldp1;led3=1;delay(450);led3=O;break;个位case2:LED=LED_codedp2;Ied2=l;dclay(450);led2=O;break;/十位case3:LED=LED_codedp3;ledl=l;delay(450);led1=0;break;百位/*/*函数名称:keyscan()*/字函数功能:按键查询*/*入口参数:无*/*输出参数:无*/*调用函数:delay();display();xianshi();*/*全局变量:count;high;low;*/*局部变量:无*/*/voidkeyscan()(if(set=O)(while(l)(delay(500);if(set=O)(count+;while(!set)display();)if(count=l)xianshi(high);display();if(add=O)(while(!add)display();high+=l;if(dec=O)(/set键按下延时去抖动重新判断Set键是否按下按键弹起继续显示前面内容/set按下一次执行此段转换上限温度为段码并显示/add键是否按下弹起时上限温度加一并显示/dec键是否按下弹起时上限温度减一并显示while(!dec)display();high-=l;if(count=2)/set键按下两次执行此段Xianshi(Iow);display();if(add=O)转换下限温度为段码并显示/add键是否按下while(!add)display();low+=l;弹起时下限温度加并显示/dec键是否按下if(dec=0)while(!dec)display();Iow-=I;弹起时下限温度减一并显示if(count>=3)/set键按下三次回到温度显示状态count=0;break;/*/*函数名称:wamjed()*/*函数功能:工作情况指示灯控制*/*入口参数:无*/*输出参数:无*/*调用函数:无*/*全局变量:high;Iow;r;*/*局部变量:无*/*/voidwarn_lcd()if(r>high)(ledOW=1;温度高于上限温度/“低温”指示灯灭led.high=O;/“高温”指示灯亮led_ok=1;“正常”指示灯灭buzzer=0;蜂鸣器发声Ielseif(r<low)IedJow=O;led_high=l;温度低于下限温度/“低温”指示灯亮/“高温”指示灯灭led_ok=1;“正常”指示灯灭buzzer=0;蜂鸣器发声温度正常ledOW=1;“低温”指示灯灭led_high=l;/“高温指示灯灭led_ok=0;buzzer=1;/“正常”指示灯亮蜂鸣器不发声else/*/*函数名称:delay()*/*函数功能:延时函数,单次25us左右延时*/*入口参数:t;*/*输出参数:无*/*调用函数:无*/*全局变量:无*/*局部变量:t;*/*木木*木*木*/voiddelay(uintt)*I