当前位置:文档之家› 1602的DHT11温湿度显示程序

1602的DHT11温湿度显示程序

/****************************************************************DHT11使用范例单片机:STC89C52RC功能:1602实时显示温湿度硬件连接:P2.7口为通讯口连接DHT11,DHT11的电源和地连接单片机的电源和地****************************************************************/#include <reg51.h>#include <intrins.h>typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量*///typedef signed char S8; /* defined for signed 8-bits integer variable有符号8位整型变量*/typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量*///typedef signed int S16; /* defined for signed 16-bits integer variable 有符号16位整型变量*///typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 无符号32位整型变量*///typedef signed long S32; /* defined for signed 32-bits integer variable 有符号32位整型变量*///typedef float F32; /* single precision floating point variable (32bits) 单精度浮点数(32位长度)*///typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数(64位长度)*/sbit P2_7 = P2^7 ;//定义DHT11通信IO口/**********************************************变量定义***********************************************/U8 U8FLAG,k;U8 U8count,U8temp;U8U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata,RH_shi,RH_ge,T_shi,T_ge;U8U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_te mp;U8 U8comdata;void Delay_1(U16 j){ U8 i;for(;j>0;j--){for(i=0;i<27;i++);}}void Delay_10us(void){U8 i;i--;i--;i--;i--;i--;i--;}void COM(void){U8 i;for(i=0;i<8;i++){U8FLAG=2;while((!P2_7)&&U8FLAG++);Delay_10us();Delay_10us();Delay_10us();U8temp=0;if(P2_7)U8temp=1;U8FLAG=2;while((P2_7)&&U8FLAG++);if(U8FLAG==1)break; //超时则跳出for循环//判断数据位是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();****************************************************/void RH(void){//主机拉低18msP2_7=0;Delay_1(180);P2_7=1;//总线由上拉电阻拉高主机延时20usDelay_10us();Delay_10us();Delay_10us();Delay_10us();//主机设为输入判断从机响应信号P2_7=1;//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行if(!P2_7)//T !{U8FLAG=2;//判断从机是否发出80us 的低电平响应信号是否结束while((!P2_7)&&U8FLAG++);U8FLAG=2;//判断从机是否发出80us 的高电平,如发出则进入数据接收状态while((P2_7)&&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_7=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}/*********************************************函数功能:数进制转换********************************************/void Shuzhuanhuan(){RH_shi=(unsigned char)U8RH_data_H/10;RH_ge=U8RH_data_H%10;T_shi=U8T_data_H/10;T_ge=U8T_data_H%10;}/*********************************************//*********************************************/sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚unsigned char code digit[ ]={"0123456789"}; //定义字符数组显示数字,液晶只能显示ASCII,其中的7为0011 0111//RH_shi中7是0000 0111,unsigned char code User[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//自定义字符℃*//*****************************************************函数功能:延时1ms***************************************************/void delay1ms(){unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<33;j++);}/*****************************************************函数功能:延时若干毫秒入口参数:n***************************************************/void delay(unsigned int n){unsigned int i;for(i=0;i<n;i++)delay1ms();}/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。

result=1,忙碌;result=0,不忙***************************************************/bit BusyTest(void){bit result;RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态RW=1;E=1; //E=1,才允许读写_nop_(); //空操作_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间result=BF; //将忙碌标志电平赋给resultE=0;return result;}/*****************************************************函数功能:将模式设置指令或显示地址写入液晶模块入口参数:dictate***************************************************/void Write_com (unsigned char dictate){while(BusyTest()==1); //如果忙就等待RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令RW=0;E=0; //E置低电平(写指令时,// 就是让E从0到1发生正跳变,所以应先置"0"_nop_();_nop_(); //空操作两个机器周期,给硬件反应时间P0=dictate; //将数据送入P0口,即写入指令或地址_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=1; //E置高电平_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令}/*****************************************************函数功能:指定字符显示的实际地址入口参数:x***************************************************/void WriteAddress(unsigned char x){Write_com(x|0x80); //显示位置的确定方法规定为"80H+地址码x"}/*****************************************************函数功能:将数据(字符的标准ASCII码)写入液晶模块入口参数:y(为字符常量)***************************************************/void WriteData(unsigned char y){while(BusyTest()==1);RS=1; //RS为高电平,RW为低电平时,可以写入数据RW=0;E=0; //E置低电平(写指令时,,// 就是让E从0到1发生正跳变,所以应先置"0"P0=y; //将数据送入P0口,即将数据写入液晶模块_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=1; //E置高电平_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令}/*****************************************************函数功能:对LCD的显示模式进行初始化设置***************************************************/void LcdInt(void){delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间Write_com(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口delay(5); //延时5msWrite_com(0x38);delay(5);Write_com(0x38); //3次写设置模式delay(5);Write_com(0x0F); //显示模式设置:显示开,有光标,光标闪烁delay(5);Write_com(0x06); //显示模式设置:光标右移,字符不移delay(5);Write_com(0x01); //清屏幕指令,将以前的显示内容清除delay(5);}/*****************************************************函数功能:显示自定义图形℃***************************************************/void Zidingyi(void){unsigned char j;Write_com(0x40); //设定CGRAM地址delay(5);for(j=0;j<8;j++ ){WriteData(User[j]);//写入自定义图形℃}WriteAddress(0x4c);//设定屏幕上的显示位置delay(5);WriteData(0x00);//从CGRAM里取出自定义图形显示}void main (void){LcdInt();delay(10);while(1){RH();Shuzhuanhuan();WriteAddress(0x02);//从第一行第三列开始显示WriteData('s');WriteAddress(0x03);WriteData('h');WriteAddress(0x04);WriteData('i');WriteAddress(0x05);WriteData('d');WriteAddress(0x06);WriteData('u');WriteAddress(0x07);WriteData(':');WriteAddress(0x08);WriteData(digit[RH_shi]);WriteAddress(0x09);WriteData(digit[RH_ge]);WriteAddress(0x0a);WriteData('.');WriteAddress(0x0b);WriteData('2');WriteAddress(0x0c);WriteData('%');WriteAddress(0x42);//从第一行第三列开始显示WriteData('w');WriteAddress(0x43);WriteData('e');WriteAddress(0x44);WriteData('n');WriteAddress(0x45);WriteData('d');WriteAddress(0x46);WriteData('u');WriteAddress(0x47);WriteData(':');WriteAddress(0x48);WriteData(digit[T_shi]);WriteAddress(0x49);WriteData(digit[T_ge]);WriteAddress(0x4a);WriteData('.');WriteAddress(0x4b);WriteData('4');WriteAddress(0x4c);Zidingyi();//delay(500);}}。

相关主题