找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 453|回复: 0
打印 上一主题 下一主题
收起左侧

C51单片机温湿度显示(DHT11)仿真程序

[复制链接]
跳转到指定楼层
楼主
仿真+代码


单片机源程序如下:
  1. #include "DHT11.h"
  2. #include "LCD1602.h"
  3. //灯、蜂鸣器、按键引脚定义
  4. sbit led1    = P1^1;  //正常指示灯
  5. sbit led2    = P1^2;  //超限指示灯
  6. sbit buzz    = P2^1;  //蜂鸣器
  7. sbit key_set = P3^2;  //设置键
  8. sbit key_jia = P3^3;  //加键
  9. sbit key_jian= P3^4;  //减键

  10. //变量定义
  11. uchar temp_up=35,temp_down=10;//存储温度上、下限值
  12. uchar humi_up=80,humi_down=40;//存储湿度上、下限值
  13. uchar set_f;                           //设置选择标记,=0非设置,=1设置湿度上限,=2设置湿度下限
  14.                                                   //     =3设置温度上限,=4设置温度下限,=5设置照度上限,=6设置照度下限
  15. uchar Flash;        //闪烁信号
  16. uchar  U8FLAG;
  17. uchar  Temp_H,Temp_L,Humi_H,Humi_L,Check_data;//温度整数位,小数位;湿度整数位
  18. //显示固定内容
  19. void fix_display()  
  20. {
  21.         LCD_ShowString(1,1,"Humidity: ");//humidity
  22.         LCD_ShowString(2,1,"Temperature: ");//temperature
  23.         LCD_ShowString(1,13,"%");
  24.         LCD_ShowString(2,16,"C");
  25. }

  26. //显示当前测出的内容
  27. void now_display()  
  28. {
  29.         if(temp_up<Temp_H||temp_down>Temp_H||humi_up<Humi_H||humi_down>Humi_H)//当温湿度超过界限时
  30.         {
  31.                 //蜂鸣器响,超限指示灯亮
  32.                 buzz=0;
  33.                 led1=1;
  34.                 led2=0;
  35.         }
  36.         else  //蜂鸣器不响,正常指示灯亮
  37.         {
  38.                 buzz=1;
  39.                 led1=0;
  40.                 led2=1;
  41.         }
  42.         //显示实测的照度与温湿度
  43.         LCD_ShowNum(1,11,Humi_H,2);  
  44.         LCD_ShowNum(2,14,Temp_H,2);
  45.        
  46. }



  47. //显示设置时的内容
  48. void set_display()
  49. {
  50.                 LCD_ShowString(1,1,"Humi:Up");  
  51.                 LCD_ShowString(2,1,"Temp:Up");
  52.                 LCD_ShowString(1,10,"Down");
  53.                 LCD_ShowString(2,10,"Down");
  54.                 //利用定时器设置Flash闪烁值以达到闪烁效果
  55.                 if(Flash==1&&set_f==1){LCD_ShowString(1,8,"  ");}  //当Flash等于1则清零,等于0则显示
  56.                 else{LCD_ShowNum(1,8,humi_up,2);}                  //当set_f标记键分别等于1,2,3,4时,设置不同位置
  57.                 if(Flash==1&&set_f==2){LCD_ShowString(1,14,"  ");}
  58.                 else{LCD_ShowNum(1,14,humi_down,2);}
  59.                 if(Flash==1&&set_f==3){LCD_ShowString(2,8,"  ");}
  60.                 else{LCD_ShowNum(2,8,temp_up,2);}
  61.                 if(Flash==1&&set_f==4){LCD_ShowString(2,14,"  ");}
  62.                 else{LCD_ShowNum(2,14,temp_down,2);}
  63. }

  64. //按键扫描
  65. void scan()  
  66. {
  67.         if(key_set==0)  //当设置键摁下时
  68.         {
  69.                 Delay_ms(7);
  70.          if(key_set==0)
  71.          {
  72.                 buzz=1;  //蜂鸣器关闭,所有LED熄灭
  73.                 led1=1;
  74.                 led2=1;
  75.                
  76.                 if(set_f==0) //进入设置模式
  77.                 {
  78.                         LCD_WriteCommand(0x01);  //清屏
  79.                         Delay_ms(10);
  80.                 }
  81.                 set_f++;     //每摁一次key_f设置键,set_f标记键便加1
  82.                 if(set_f==5) //当循环6次,即摁下key_set设置键6次时,把set_f标记键置0
  83.                 {
  84.                         set_f=0;
  85.                         LCD_WriteCommand(0x01);  //清屏
  86.                         Delay_ms(10);
  87.                         fix_display();  //显示固定内容
  88.                 }
  89.          }
  90.                   while(!key_set);  //当摁下key_sey设置键松手时,完成一次操作
  91.         }

  92.        
  93.         if(key_jia==0&&set_f!=0)  //加法键
  94.         {
  95.                 Delay_ms(7);
  96.                 if(set_f==1){humi_up++;}
  97.                 if(set_f==2){humi_down++;}
  98.                 if(set_f==3){temp_up++;}
  99.                 if(set_f==4){temp_down++;}
  100.         }
  101.        
  102.         if(key_jian==0&&set_f!=0) //减法键
  103.         {
  104.                 Delay_ms(7);
  105.                 if(set_f==1){humi_up--;}
  106.                 if(set_f==2){humi_down--;}
  107.                 if(set_f==3){temp_up--;}
  108.                 if(set_f==4){temp_down--;}
  109.         }
  110. }
  111.        

  112. void main()
  113. {
  114.         TMOD &= 0x00;                //设置定时器模式
  115.         TMOD |= 0x10;                //设置定时器模式
  116.         TL1 = 0x18;                //设置定时初值
  117.         TH1 = 0xFC;                //设置定时初值
  118.         TF1 = 0;                //清除TF0标志
  119.         TR1 = 1;                //定时器0开始计时
  120.         ET1=1;
  121.         EA=1;
  122.         led1=1;
  123.         led2=1;
  124.         LCD_Init();    //LCD初始化
  125.         fix_display(); //显示固定内容
  126.         Delay_ms(100);
  127.         while(1)
  128.         {
  129.                 scan();  //按键扫描
  130.                 if(set_f==0) //表示并未进入设置操作
  131.                 {
  132.                         EA=0;          //关闭中断
  133.                         DHT11_read();          //DHT11读取温湿度值
  134.                         now_display();         //显示实测内容
  135.                         EA=1;  //打开中断
  136.                 }
  137.                 else
  138.                         set_display();   //显示设置内容
  139.         }
  140. }

  141. void Timer1_Rountine() interrupt 3  //中断程序
  142. {
  143.         static unsigned int T1Count;
  144.         TL1 = 0x18;  //设置初值
  145.         TH1 = 0xFC;
  146.         T1Count++;
  147.         if(T1Count>=500)  //每隔500ms,即0.5秒
  148.         {
  149.                 T1Count=0;
  150.                 Flash=!Flash;   //Flash翻转
  151.         }
  152. }
复制代码
下载: C51_温湿度显示(DHT11).7z (181.58 KB, 下载次数: 0)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表