仿真+代码
单片机源程序如下:- #include "DHT11.h"
- #include "LCD1602.h"
- //灯、蜂鸣器、按键引脚定义
- sbit led1 = P1^1; //正常指示灯
- sbit led2 = P1^2; //超限指示灯
- sbit buzz = P2^1; //蜂鸣器
- sbit key_set = P3^2; //设置键
- sbit key_jia = P3^3; //加键
- sbit key_jian= P3^4; //减键
-
- //变量定义
- uchar temp_up=35,temp_down=10;//存储温度上、下限值
- uchar humi_up=80,humi_down=40;//存储湿度上、下限值
- uchar set_f; //设置选择标记,=0非设置,=1设置湿度上限,=2设置湿度下限
- // =3设置温度上限,=4设置温度下限,=5设置照度上限,=6设置照度下限
- uchar Flash; //闪烁信号
- uchar U8FLAG;
- uchar Temp_H,Temp_L,Humi_H,Humi_L,Check_data;//温度整数位,小数位;湿度整数位
- //显示固定内容
- void fix_display()
- {
- LCD_ShowString(1,1,"Humidity: ");//humidity
- LCD_ShowString(2,1,"Temperature: ");//temperature
- LCD_ShowString(1,13,"%");
- LCD_ShowString(2,16,"C");
- }
-
- //显示当前测出的内容
- void now_display()
- {
- if(temp_up<Temp_H||temp_down>Temp_H||humi_up<Humi_H||humi_down>Humi_H)//当温湿度超过界限时
- {
- //蜂鸣器响,超限指示灯亮
- buzz=0;
- led1=1;
- led2=0;
- }
- else //蜂鸣器不响,正常指示灯亮
- {
- buzz=1;
- led1=0;
- led2=1;
- }
- //显示实测的照度与温湿度
- LCD_ShowNum(1,11,Humi_H,2);
- LCD_ShowNum(2,14,Temp_H,2);
-
- }
- //显示设置时的内容
- void set_display()
- {
- LCD_ShowString(1,1,"Humi:Up");
- LCD_ShowString(2,1,"Temp:Up");
- LCD_ShowString(1,10,"Down");
- LCD_ShowString(2,10,"Down");
- //利用定时器设置Flash闪烁值以达到闪烁效果
- if(Flash==1&&set_f==1){LCD_ShowString(1,8," ");} //当Flash等于1则清零,等于0则显示
- else{LCD_ShowNum(1,8,humi_up,2);} //当set_f标记键分别等于1,2,3,4时,设置不同位置
- if(Flash==1&&set_f==2){LCD_ShowString(1,14," ");}
- else{LCD_ShowNum(1,14,humi_down,2);}
- if(Flash==1&&set_f==3){LCD_ShowString(2,8," ");}
- else{LCD_ShowNum(2,8,temp_up,2);}
- if(Flash==1&&set_f==4){LCD_ShowString(2,14," ");}
- else{LCD_ShowNum(2,14,temp_down,2);}
- }
-
- //按键扫描
- void scan()
- {
- if(key_set==0) //当设置键摁下时
- {
- Delay_ms(7);
- if(key_set==0)
- {
- buzz=1; //蜂鸣器关闭,所有LED熄灭
- led1=1;
- led2=1;
-
- if(set_f==0) //进入设置模式
- {
- LCD_WriteCommand(0x01); //清屏
- Delay_ms(10);
- }
- set_f++; //每摁一次key_f设置键,set_f标记键便加1
- if(set_f==5) //当循环6次,即摁下key_set设置键6次时,把set_f标记键置0
- {
- set_f=0;
- LCD_WriteCommand(0x01); //清屏
- Delay_ms(10);
- fix_display(); //显示固定内容
- }
- }
- while(!key_set); //当摁下key_sey设置键松手时,完成一次操作
- }
-
-
- if(key_jia==0&&set_f!=0) //加法键
- {
- Delay_ms(7);
- if(set_f==1){humi_up++;}
- if(set_f==2){humi_down++;}
- if(set_f==3){temp_up++;}
- if(set_f==4){temp_down++;}
- }
-
- if(key_jian==0&&set_f!=0) //减法键
- {
- Delay_ms(7);
- if(set_f==1){humi_up--;}
- if(set_f==2){humi_down--;}
- if(set_f==3){temp_up--;}
- if(set_f==4){temp_down--;}
- }
- }
-
-
- void main()
- {
- TMOD &= 0x00; //设置定时器模式
- TMOD |= 0x10; //设置定时器模式
- TL1 = 0x18; //设置定时初值
- TH1 = 0xFC; //设置定时初值
- TF1 = 0; //清除TF0标志
- TR1 = 1; //定时器0开始计时
- ET1=1;
- EA=1;
- led1=1;
- led2=1;
- LCD_Init(); //LCD初始化
- fix_display(); //显示固定内容
- Delay_ms(100);
- while(1)
- {
- scan(); //按键扫描
- if(set_f==0) //表示并未进入设置操作
- {
- EA=0; //关闭中断
- DHT11_read(); //DHT11读取温湿度值
- now_display(); //显示实测内容
- EA=1; //打开中断
- }
- else
- set_display(); //显示设置内容
- }
- }
-
- void Timer1_Rountine() interrupt 3 //中断程序
- {
- static unsigned int T1Count;
- TL1 = 0x18; //设置初值
- TH1 = 0xFC;
- T1Count++;
- if(T1Count>=500) //每隔500ms,即0.5秒
- {
- T1Count=0;
- Flash=!Flash; //Flash翻转
- }
- }
-
复制代码 下载:
C51_温湿度显示(DHT11).7z
(181.58 KB, 下载次数: 0)
|