基于51的温度控制系统设计C语言源程序.docx
《基于51的温度控制系统设计C语言源程序.docx》由会员分享,可在线阅读,更多相关《基于51的温度控制系统设计C语言源程序.docx(15页珍藏版)》请在冰豆网上搜索。
基于基于51的温度控制系统设计的温度控制系统设计C语言源程序语言源程序/*程序名称:
温度监控系统*/*程序功能:
利用89C52单片机和DS18B20温度传感器实现环境*/*温度的实时测量和高、低温报警*/*程序版本:
*/*作者:
*/*编写时间:
*/*/#include#include/含_nop_()延时函数/定义数据类型#defineucharunsignedchar#defineuintunsignedint/定义端口#defineLEDP0/段码输出口sbitDQ=P32;/传感器数据口sbitSMG_q=P10;/定义数码管阳级控制脚(千位)sbitSMG_b=P11;/定义数码管阳级控制脚(百位)sbitSMG_s=P12;/定义数码管阳级控制脚(十位)sbitSMG_g=P13;/定义数码管阳级控制脚(个位)sbitbuzzer=P15;/蜂鸣器sbitled_low=P26;/低温指示灯sbitled_high=P27;/高温指示灯sbitled_ok=P25;/温度正常指示灯sbitled_work=P24;/工作指示灯sbitset=P37;/设置按键sbitadd=P34;/加一按键sbitdec=P35;/减一按键/定义变量和常量intcount=0;/按键次数寄存器inth;/主函数用循环计数器uinttemp;/温度值ucharr;/温度值整数形式ucharhigh=35,low=20;/上下限初值/共阳LED段码表0123456789不亮-ucharcodeLED_code12=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;ucharcodeLED_code1=0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10;ucharcodeditab16=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();/DS18B20读数据函数read_temp();/读取温度函数voidchange_temp(uinttem);/温度数据处理voidxianshi(inthorl);/温度显示转换voiddisplay();/数码管显示函数voidkeyscan();/按键查询函数voidwarn_led();/超限报警voiddelay(uintt);/延时函数,单次25us/*主函数*/voidmain()LED=0x00;/初始化显示端口led1=0;led2=0;led3=0;led4=0;for(h=0;h4;h+)dph=8;while
(1)/循环执行显示和温度读取uchari;for(i=0;i0;i-)DQ=1;_nop_();_nop_();DQ=0;_nop_();_nop_();_nop_();_nop_();DQ=ds_wrdata&0x01;/最低位移出delay(6);ds_wrdata=ds_wrdata/2;/右移1位DQ=1;delay
(1);/*/*函数名称:
ds_read()*/*函数功能:
从DS18B20读数据*/*入口参数:
无*/*输出参数:
value*/*调用函数:
delay();_nop_();*/*全局变量:
*/*局部变量:
i;value;*/*/uchards_read(void)uchari;ucharvalue=0;for(i=8;i0;i-)DQ=1;_nop_();_nop_();value=1;DQ=0;_nop_();_nop_();_nop_();_nop_();DQ=1;_nop_();_nop_();_nop_();_nop_();if(DQ)value|=0x80;delay(6);DQ=1;return(value);/*/*函数名称:
read_temp()*/*函数功能:
读温度数据数据*/*入口参数:
无*/*输出参数:
yemp*/*调用函数:
ds_reset();ds_write();ds_read();*/*delay();*/*全局变量:
temp*/*局部变量:
temp_data;*/*/read_temp()ds_reset();/传感器初始化delay(200);ds_write(0xcc);/发跳过读取序列号命令ds_write(0x44);/发温度转换命令ds_reset();delay
(1);ds_write(0xcc);ds_write(0xbe);/读18B20中存储器temp_data0=ds_read();/读温度值的低字节命令temp_data1=ds_read();/读温度值的高字节temp=temp_data1;temp6348)/温度值正负判断tem=65536-tem;/负温度求补码n=1;/标志位置1dp4=tem&0x0f;/取小数部分的值dp0=ditabdp4;/存入小数部分显示值dp4=tem4;/取中间八位,即整数部分的值dp3=dp4/100;/取百位数据dp1=dp4%100;/取后两位数据dp2=dp1/10;/取十位数据dp1=dp1%10;/个位r=dp1+dp2*10+dp3*100;/实际温度值(十进制)if(!
dp3)/符号位显示判断dp3=0x0a;/最高位为0时不显示if(!
dp2)dp2=0x0a;/次高位为0时不显示if(n)dp3=0x0b;/负温度时最高位显示-/*/*函数名称:
xianshi()*/*函数功能:
温度数据转换成显示所需LED段码*/*入口参数:
horl*/*输出参数:
dp*/*调用函数:
无*/*全局变量:
dp;*/*局部变量:
n;*/*/voidxianshi(inthorl)intn=0;if(horl128)/负数补码转换horl=256-horl;n=1;dp3=horl/100;dp3=dp3&0x0f;/百位dp2=horl%100/10;/十位dp1=horl%10;/个位dp0=0;/小数位if(!
dp3)/高位为零不显示dp3=0x0a;if(!
dp2)dp2=0x0a;if(n)/负数最高位显示“-”dp3=0x0b;/*/*函数名称:
display()*/*函数功能:
数码管显示*/*入口参数:
无*/*输出参数:
无*/*调用函数:
delay()*/*全局变量:
dp;LED_code;LED_code1;*/*led1;led2;led3;led4;*/*局部变量:
j;*/*/voiddisplay()intj;for(j=0;j=3)/set键按下三次回到温度显示状态count=0;break;/*/*函数名称:
warn_led()*/*函数功能:
工作情况指示灯控制*/*入口参数:
无*/*输出参数:
无*/*调用函数:
无*/*全局变量:
high;low;r;*/*局部变量:
无*/*/voidwarn_led()if(rhigh)/温度高于上限温度led_low=1;/“低温”指示灯灭led_high=0;/“高温”指示灯亮led_ok=1;/“正常”指示灯灭buzzer=0;/蜂鸣器发声elseif(r0;t-);/*程序结束*/