锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

【嵌入式】51单片机+1602+dht11显示温湿度

时间:2022-11-29 17:30:00 dht11温度过高关闭继电器

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位置有数字0RH/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();     } 
} 
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章