仿真+代碼
51hei圖片_20250331100701.png (103.57 KB, 下載次數: 0)
下載附件
仿真
2025-3-31 10:07 上傳
單片機源程序如下:- #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)
2025-4-1 20:13 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|