【《基于STC89C52单片机的温湿度测量计设计》20000字】_第1页
【《基于STC89C52单片机的温湿度测量计设计》20000字】_第2页
【《基于STC89C52单片机的温湿度测量计设计》20000字】_第3页
【《基于STC89C52单片机的温湿度测量计设计》20000字】_第4页
【《基于STC89C52单片机的温湿度测量计设计》20000字】_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

参考文献[1]喻评,郭文川.单片机原理与接口技术.北京:化学工业出版社,2006.[2]秦实宏,周龙等.单片机原理与应用技术[M].北京:中国水利水电出版社,2005.9.[3]赵亮,侯国锐等.单片机C语言编程与实例[M].北京:人民邮电出版社,2003.[4]马忠梅等.单片机的C语言应用程序设计[M].北京:北京航空航天大学出版社,2003.11.[5]何希才,刘洪梅.传感器应用接口电路[M].北京:机械工业出版社,1997.[6]刘迎春.传感器原理一设计与应用[M].北京:国防科技大学出版社,2004.[7]李志全等.智能仪表设计原理及应用[M].北京:国防工业出版社,1998.6.[8]谢光忠,蒋亚东等.温湿度智能数据采集控制系统的研制.传感器技术,2000,19(4):29-33.[9]涂玲英,肖俊武,张宇.智能型温湿度测控仪研究与实践.武汉:湖北工学院学报,2002.[10]李秀忠.基于单片机的LED显示屏控制电路设计[J].现代电子技术,ModernElectronicsTechnique,2010,(15):200-202.[11]陈有卿.张晓东.报警集成电路和报警器制作实例[J].北京:人民邮电岀版社.附录源程序代码//****************************************************************////单片机:STC89C52RC//功能:串口发送温湿度数据晶振11.0592M波特率9600//硬件连接:P2.3口为通讯口连接DHT11,DHT11的电源和地连接单片机的电源和地,单片机串口加MAX232连接电脑//****************************************************************//#include<reg51.h>#include<intrins.h>//typedefunsignedcharU8;/*definedforunsigned8-bitsintegervariable无符号8位整型变量*/typedefsignedcharS8;/*definedforsigned8-bitsintegervariable有符号8位整型变量*/typedefunsignedintU16;/*definedforunsigned16-bitsintegervariable无符号16位整型变量*/typedefsignedintS16;/*definedforsigned16-bitsintegervariable有符号16位整型变量*/typedefunsignedlongU32;/*definedforunsigned32-bitsintegervariable无符号32位整型变量*/typedefsignedlongS32;/*definedforsigned32-bitsintegervariable有符号32位整型变量*/typedeffloatF32;/*singleprecisionfloatingpointvariable(32bits)单精度浮点数(32位长度)*/typedefdoubleF64;/*doubleprecisionfloatingpointvariable(64bits)双精度浮点数(64位长度)*///#defineucharunsignedchar#defineuintunsignedint#defineData_0_time4//////IO口定义区//////sbitP2_0=P2^3;#defineLCD_BUSP0sbitRS=P2^5;sbitRW=P2^6;sbitE=P2^7;sbitSetKey=P2^2;sbitUpKey=P2^1;sbitDnKey=P2^0;sbitBEEP=P2^4;unsignedcharAlarmTempLow=10,AlarmTempTop=40,Set=0,NG=0;unsignedcharAlarmRHLow=40,AlarmRHTop=80;unsignedcharCRH=0,CTP=0;//////定义区//////U8U8FLAG,k;U8U8count,U8temp;U8U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;U8U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;U8U8comdata;U8outdata[5];//定义发送的字节数U8indata[5];U8count,count_r=0;U8str[5]={0,0,0,0,0};U16U16temp1,U16temp2;voiddelayms(uintms)//延时xx毫秒{uchari;while(ms--){for(i=0;i<120;i++);}}voidcommand(uintcom)//LCD写指令{RS=0;//RS为0LCD_BUS=com;//装载指令delayms(5);//延时5msE=1;//LCD使能delayms(5);//延时5msE=0;//LCD不使能}voidwrite_dat(uchardat)//LCD写数据{RS=1;//RS为1LCD_BUS=dat;//装载数据delayms(5);//延时5msE=1;//LCD使能delayms(5);//延时5msE=0;//LCD不使能}voidLCD_WriteCommand(uintcom)//LCD写指令{RS=0;//RS为0LCD_BUS=com;//装载指令delayms(5);//延时5msE=1;//LCD使能delayms(5);//延时5msE=0;//LCD不使能}voidLCD_WriteData(uchardat)//LCD写数据{RS=1;//RS为1LCD_BUS=dat;//装载数据delayms(5);//延时5msE=1;//LCD使能delayms(5);//延时5msE=0;//LCD不使能}voidLCD_SetXY(unsignedcharX,unsignedcharY)//LCD设置显示位置{unsignedcharaddress=0;switch(Y){case1:address=0x80+X;break;//Y=1,显示位置第一行case2:address=0xc0+X;break;//Y=2,显示位置第2行default:address=0x80+X;//默认第一行显示}LCD_WriteCommand(address);}voidLCD_SramChar(unsignedcharX,unsignedcharY,unsignedcharp){EA=0;//禁止中断LCD_SetXY(X,Y);//设置显示位置LCD_WriteData(p);//显示字符EA=1;//允许中断}voidwritestring(ucharx,uchary,uchar*s)//LCD写字符串{if(y<=1)command(0x80+x);//表示第一行elsecommand(0xC0+x);//表示第二行while(*s)//判断是否字符串的结尾{write_dat(*s);//显示当前字符s++;//字符串地址加1}}voidLCD_Initial()//LCD初始化{E=0;//LCD不使能RW=0;//RW为0command(0x38);//发送初始化指令command(0x0c);//发送初始化指令command(0x06);//发送初始化指令command(0x01);//发送初始化指令command(0x80+0x02);//发送LCD初始位置}voidDelay(U16j)//延时子函数{U8i;for(;j>0;j--){for(i=0;i<27;i++);}}voidDelay_10us(void)//延时10us子函数{U8i;i--;i--;i--;i--;i--;i--;}voidCOM(void)//读取DHT11数据{U8i;for(i=0;i<8;i++)//循环8次{U8FLAG=2;//标志位=2while((!P2_0)&&U8FLAG++);//等待DHT11为1Delay_10us();//延时10usDelay_10us();//延时10usDelay_10us();//延时10usU8temp=0;//清除缓存if(P2_0)U8temp=1;//获取数据U8FLAG=2;while((P2_0)&&U8FLAG++);//等待DHT11为0//超时则跳出for循环if(U8FLAG==1)break;//判断数据位是0还是1//如果高电平高过预定0高电平值则数据位为1U8comdata<<=1;//数据左移一位U8comdata|=U8temp;//保存数据//0}//rof}////湿度读取子程序////以下变量均为全局变量//温度高8位==U8T_data_H//温度低8位==U8T_data_L//湿度高8位==U8RH_data_H//湿度低8位==U8RH_data_L//校验8位==U8checkdata//调用相关子程序如下//Delay();,Delay_10us();,COM();//voidRH(void){//主机拉低18msP2_0=0;Delay(180);P2_0=1;//总线由上拉电阻拉高主机延时20usDelay_10us();Delay_10us();Delay_10us();Delay_10us();//主机设为输入判断从机响应信号P2_0=1;//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行if(!P2_0)//T!{U8FLAG=2;//判断从机是否发出80us的低电平响应信号是否结束while((!P2_0)&&U8FLAG++);U8FLAG=2;//判断从机是否发出80us的高电平,如发出则进入数据接收状态while((P2_0)&&U8FLAG++);//数据接收状态COM();U8RH_data_H_temp=U8comdata;//读取温度值高位COM();U8RH_data_L_temp=U8comdata;//读取温度值低位COM();U8T_data_H_temp=U8comdata;//读取湿度值高位COM();U8T_data_L_temp=U8comdata;//读取湿度值低位COM();U8checkdata_temp=U8comdata;//获取校验值P2_0=1;//数据校验U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);//数据校验if(U8temp==U8checkdata_temp)//数据校验{U8RH_data_H=U8RH_data_H_temp;//保存湿度值U8RH_data_L=U8RH_data_L_temp;//保存湿度值U8T_data_H=U8T_data_H_temp;//保存温度值U8T_data_L=U8T_data_L_temp;//保存温度值U8checkdata=U8checkdata_temp;//保存校验值}//fi}//fi}voidDisplayTempAlarm(void){unsignedchari1=0,i2=0,i3=0,i4=0,i5=0,i6=0;i1=AlarmTempLow/100;//获得温度值的百位i2=AlarmTempLow%100/10;//获得温度值的十位i3=AlarmTempLow%10;//获得温度值的个位i4=AlarmTempTop/100;//获得温度值的百位i5=AlarmTempTop%100/10;//获得温度值的十位i6=AlarmTempTop%10;//获得温度值的个位writestring(4,2,"C");writestring(12,2,"C");if(i1!=0)LCD_SramChar(4,2,i1+'0');//显示i1if((i1==0)&&(i2!=0))LCD_SramChar(4,2,i2+'0');//显示i2if(i1!=0)LCD_SramChar(5,2,i2+'0');//显示i2if((i1==0)&&(i2==0))LCD_SramChar(4,2,i3+'0');//显示i3elseif((i1==0)&&(i2!=0))LCD_SramChar(5,2,i3+'0');//显示i3if((i1!=0))LCD_SramChar(6,2,i3+'0');//显示i3if(i4!=0)LCD_SramChar(12,2,i4+'0');//显示i4if((i4==0)&&(i5!=0))LCD_SramChar(12,2,i5+'0');//显示i4if(i4!=0)LCD_SramChar(13,2,i5+'0');//显示i5if((i4==0)&&(i5==0))LCD_SramChar(12,2,i6+'0');//显示i6elseif((i4==0)&&(i5!=0))LCD_SramChar(13,2,i6+'0');//显示i6if((i4!=0))LCD_SramChar(14,2,i6+'0');//显示i6}voidDisplayRHAlarm(void){unsignedchari1=0,i2=0,i3=0,i4=0,i5=0,i6=0;i1=AlarmRHLow/100;//获得温度值的百位i2=AlarmRHLow%100/10;//获得温度值的十位i3=AlarmRHLow%10;//获得温度值的个位i4=AlarmRHTop/100;//获得温度值的百位i5=AlarmRHTop%100/10;//获得温度值的十位i6=AlarmRHTop%10;//获得温度值的个位writestring(4,2,"%");writestring(12,2,"%");if(i1!=0)LCD_SramChar(4,2,i1+'0');//显示i1if((i1==0)&&(i2!=0))LCD_SramChar(4,2,i2+'0');//显示i2if(i1!=0)LCD_SramChar(5,2,i2+'0');//显示i2if((i1==0)&&(i2==0))LCD_SramChar(4,2,i3+'0');//显示i3elseif((i1==0)&&(i2!=0))LCD_SramChar(5,2,i3+'0');//显示i3if((i1!=0))LCD_SramChar(6,2,i3+'0');//显示i3if(i4!=0)LCD_SramChar(12,2,i4+'0');//显示i4if((i4==0)&&(i5!=0))LCD_SramChar(12,2,i5+'0');//显示i4if(i4!=0)LCD_SramChar(13,2,i5+'0');//显示i5if((i4==0)&&(i5==0))LCD_SramChar(12,2,i6+'0');//显示i6elseif((i4==0)&&(i5!=0))LCD_SramChar(13,2,i6+'0');//显示i6if((i4!=0))LCD_SramChar(14,2,i6+'0');//显示i6}voidSetFun(void){if(SetKey==0)//判断按键是否按下{delayms(20);//延时if(SetKey==0)//判断按键是否按下{if(Set<4)Set++;//按键次数累计elseSet=0;}switch(Set)//判断按键次数{case0:writestring(0,2,"");writestring(8,2,"");break;//清除显示case1:writestring(0,2,">");writestring(8,2,"");DisplayTempAlarm();break;//显示温度报警值case2:writestring(0,2,"");writestring(8,2,">");DisplayTempAlarm();break;//显示温度报警值case3:writestring(0,2,">");writestring(8,2,"");DisplayRHAlarm();break;//显示湿度度报警值case4:writestring(0,2,"");writestring(8,2,">");DisplayRHAlarm();break;//显示湿度度报警值}while(SetKey==0);//等待按键松开}if((UpKey==0)&&(Set!=0))//判断按键按下{delayms(20);if(UpKey==0){switch(Set)//判断按键次数{case1:if(AlarmTempLow<99)AlarmTempLow++;elseAlarmTempLow=99;DisplayTempAlarm();break;//修改温度下限case2:if(AlarmTempTop<99)AlarmTempTop++;elseAlarmTempTop=99;DisplayTempAlarm();break;//修改温度上限case3:if(AlarmRHLow<99)AlarmRHLow++;elseAlarmRHLow=99;DisplayRHAlarm();break;//修改湿度下限case4:if(AlarmRHTop<99)AlarmRHTop++;elseAlarmRHTop=99;DisplayRHAlarm();break;//修改湿度上限}while(UpKey==0);//等待按键松开}}if((DnKey==0)&&(Set!=0))//判断按键按下{delayms(20);if(DnKey==0){switch(Set)//判断按键次数{case1:if(AlarmTempLow>0)AlarmTempLow--;elseAlarmTempLow=0;DisplayTempAlarm();break;//修改温度下限case2:if(AlarmTempTop>0)AlarmTempTop--;elseAlarmTempTop=0;DisplayTempAlarm();break;//修改温度上限case3:if(AlarmRHLow>0)AlarmRHLow--;elseAlarmRHLow=0;DisplayRHAlarm();break;//修改湿度下限case4:if(AlarmRHTop>0)AlarmRHTop--;elseAlarmRHTop=0;DisplayRHAlarm();break;//修改湿度上限}while(DnKey==0);//等待按键松开}}}voidAlarm(void)//报警函数{if(((CTP>=(AlarmTempTop))||(CTP<=(AlarmTempLow)))||((CRH>=(AlarmRHTop))||(CRH<=(AlarmRHLow))))//温度高于上限或者低于下限报警,湿度高于上限或者低于下限报警{BEEP=0;}else//温度湿度在设置范围内不报警{BEEP=1;}}voidmain(){unsignedchari=0;P2=0xef;BEEP=1;LCD_Initial();//LCD初始化w

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论