【嵌入式】51单片机+1602+dht11显示温湿度
时间:2022-11-29 17:30:00
51单片机 1602 dht温湿度例程代码如下:
/*************************************************************** **联系:请勿转载! **功能描述:1602显示 dht11温度湿度 **管脚说明:显示器1602管脚说明:RS_P2.4,RW_P2.5,EN_P2.6 排口P0 dht11管脚date_P2.7 蜂鸣器P2^3 加湿器继电器控制端_P2^2 **更新时间:2019/4/16 ****************************************************************/ # include ///头文件不需要修改 # include typedef unsigned char BYTE; //定义部分 typedef unsigned int WORD; #define uint unsigned int #define uchar unsigned char sbit beep=P2^3; //蜂鸣器 sbit hd=P2^2; //继电器控制端 sbit io=P2^7; //dht11data端接单片机P2.7口 sbit rw=P2^5; //一次三行设置lcd1602的使能端 sbit rs=P2^4; sbit ep=P2^6; typedef bit BOOL; //此声明布尔型变量是真是假// uchar data_byte; //定义部分 uchar RH,RL,TH,TL; //***************延时函数************************************* void delay(uchar ms) // { uchar i; while(ms--) for(i=0;i<100;i ); } void delay1() //一个for循环大约需要8个机器周期,机器周期为1us,晶振为12MHz,本函数延时8us { uchar i; for(i=0;i<1;i ); } //*************************************************************** //lcd模块// BOOL lcd_bz()//测试lcd忙碌状态返回值为布尔型值真或假'1'.'0' { BOOL result; rs=0; // 读忙信号 rw=1; ep=1; _nop_(); _nop_(); _nop_(); _nop_(); result = (BOOL)(P0&0x80); ep=0; result ; } void write_cmd(uchar cmd)//写指令/////写指令///写指令/写指令/写指令/写指令/写指令/写指令/写指令//写指令//写指令//写指令//写指令//写指令///写指令//写指令//写指令//写指令//写指令//写指令//写指令//写指令///写指令///写指令///写指令////写指令/////写指令///写指令////写指令///写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/写/ { while (lcd_bz()); rs=0; rw=0; ep=0; _nop_(); _nop_(); P0=cmd ; _nop_(); _nop_(); _nop_(); _nop_(); ep=1; _nop_(); _nop_(); _nop_(); _nop_(); ep=0; } void write_addr(uchar addr)//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// { write_cmd(addr|0x80);//LCD第一行第一地址为0x80第二行第一地址为0x80 0x40=0xc0 } void write_byte(uchar dat) //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// { while (lcd_bz()); rs=1; rw=0; ep=0; _nop_(); _nop_(); P0=dat ; _nop_(); _nop_(); _nop_(); _nop_(); ep=1; _nop_(); _nop_(); _nop_(); _nop_(); ep=0; } void lcd_init() //lcd初始化// { write_cmd(0x38);//设置LCD两行显示一个数据由5*7点阵表示,数据由8跟线传输 delay(1); write_cmd(0x0c);//清除屏幕显示 delay(1); write_cmd(0x06)增量不移位 delay(1); write_cmd(0x01);//开整体显示关光标不闪烁 delay(1); } void display(uchar addr,uchar q)///在某个地址上显示内容adder表示地址偏移q显示的字符或数字/// { delay(10); write_addr(addr); write_byte(q); delay(1)//修改此时间可以改变LCD上数值跳变的数度 } //**************************dht11测试模块*************************************// void start()///开始信号 { io=1; delay1(); io=0; delay(25);// 主机必须拉线必须大于18ms保证DHT11能检测到起始信号 io=1; /////送开始信号后拉高电平延迟20-40us delay()//以下三个延迟函数几乎为24us符合要求 delay1(); delay1(); } uchar receive_byte()//接收一个字节//// { uchar i,temp; for(i=0;i<8;i )//接收8bit的数据 { while(!io);//等待50us低电平开始信号结束 delay()延时26us-28us以下三个延时函数 delay1(); delay1(); temp=0;/时间为26us-28us数据‘0’表示接收 if(io==1) temp=1; //如果26us-28us之后还为高电平接收的数据是‘1’ while(io);//等待数据信号高电平'0'为26us-28us'1'为70us data_byte<<=1;///接收的数据在前面很高右移 data_byte|=temp; } return data_byte; } void receive()////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// { uchar T_H,T_L,R_H,R_L,check,num_check,i; start() io=1; ///主机设置为输入判断从机DHT11响应信号 if(!io)///判断从机是否有低电平响应信号// { while(!io);////判断从机发出 80us 低电平响应信号是否结束/// while(io);////判断从机发出 80us 高电平是否结束最后,主机进入数据接收状态 R_H=receive_byte();//湿度高位 R_L=receive_byte();//低湿度 T_H=receive_byte();//高温 T_L=receive_byte();//低温 check=receive_byte()///校准位 io=0; //做最后一个bit数据完成后从机拉低电平50us// for(i=0;i<7;i )//差不多50us的延时 delay1(); io=1.//总线由上拉电阻拉高进入空闲状态 num_check=R_H R_L T_H T_L; if(num_check==check)//判断读到的四个数据之和是否与验证位相同 { RH=R_H; RL=R_L; TH=T_H; TL=T_L; check=num_check; } } } //**************功能函数****************************************************** void dis_t_h() ///扫描显示温湿度数据 { receive();//接收数据 display(0x00,'R');//LCD显示第一行 display(0x display(0x02,RH/10 0x30); //0x30表示带字库的LCD1602中0x30位置有数字0RH/10 0x30在字库中表示湿度的十位数RH/10 0x放在30的位置 display(0x03,RH 0x30); display(0X04,'%'); display(0x40,'T');//LCD的第二行显示 display(0x四十一、」; display(0x42,TH/10 0x30); display(0x43,TH 0x30); display(0x44,0xdf);//以下两个是温度单位的处理 display(0x45,0x43); } void deep_alarm() { int i; for(i=0;i<3;i ) { beep=0; delay(500); beep=1; delay(500); } } //***************************************************************************** void main()////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// { lcd_init();//初始化LCD beep=0; ///关闭继电器和蜂鸣器 hd=1; while(1) { dis_t_h(); }
}