新闻中心

EEPW首页>嵌入式系统>设计应用> dth11温湿度传感器的单片机程序

dth11温湿度传感器的单片机程序

作者: 时间:2016-11-29 来源:网络 收藏
#include
#define uint unsigned int#define uchar unsigned chartypedef bit BOOL ;sbit io = P1^0 ;sbit rs = P2^4 ;sbit rw = P2^5 ;sbit ep = P2^6 ;uchar data_byte;uchar RH,RL,TH,TL;/************************************************延时模块***************************************************/void delay(uchar ms){ // 延时子程序uchar i ;while(ms--){for(i = 0 ; i<250;i++) ;}}void delay1()//延时10us{uchar i;i--;i--;i--;i--;i--;i--;}void longdelay(uchar s) //长延时{while(s--){delay(60) ;}}/***********************************************LCD模块********************************************************/BOOL lcd_bz()//测试LCD忙碌状态{ BOOL result ;rs = 0 ;rw = 1 ;ep = 1 ;result = (BOOL)(P0 & 0x80) ;ep = 0 ;return result ;}void write_cmd(uchar cmd)// 写指令{ while(lcd_bz()) ;rs = 0 ;rw = 0 ;ep = 0 ;P0 = cmd ;ep = 1 ;ep = 0 ; }void write_addr(uchar addr)//写地址{ write_cmd(addr|0x80) ;}void write_byte(uchar dat)//写字节{ while(lcd_bz()) ;rs = 1 ;rw = 0 ;ep = 0 ;P0 = dat ;ep = 1 ;ep = 0 ;}void lcd_init()// 初始化{ write_cmd(0x38) ;delay(1);write_cmd(0x08) ; delay(1);write_cmd(0x01) ;delay(1);write_cmd(0x06) ;delay(1);write_cmd(0x0c) ;delay(1);}void display(uchar addr, uchar q)//在某一地址上显示一字节{ delay(10) ;write_addr(addr) ;write_byte(q) ;longdelay(2) ;}/************************************************ DHT11测试模块***********************************************/void start()//开始信号{io=1;delay1();io=0;delay(20);//>18msio=1;delay1();//20-40usdelay1();delay1();delay1();delay1();}uchar receive_byte()//接收一个字节{uchar i,temp,count;for(i=0;i<8;i++){count=2;while((!io)&&count++)//等待50us低电平结束temp=0;delay1();delay1();delay1();delay1();if(io==1)temp=1;count=2;while((io)&&count++);if(count==1)break;data_byte<<=1; data_byte|=temp;}return data_byte;}void receive()//接收数据{uchar T_H,T_L,R_H,R_L,check,num_check;uchar count;start();//开始信号io=1;if(!io)//读取DHT11响应信号{count=2;while((!io)&&count++);//DHT11高电平80us是否结束count=2;while((io)&&count++);R_H=receive_byte();R_L=receive_byte();T_H=receive_byte();T_L=receive_byte();check=receive_byte();io=0;//拉低延时50usdelay1();delay1();delay1();delay1();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 main(){lcd_init();delay(10);while(1){receive();delay(100);display(0x00,R) ;display(0x01,:);display(0x02,RH/10+0x30);display(0x03,RH%10+0x30);display(0x04,%);display(0x40,T) ;display(0x41,:);display(0x42,TH/10+0x30);display(0x43,TH%10+0x30);display(0x44,0xdf);display(0x45,0x43);}}/**********************************************/


评论


技术专区

关闭