|
基于51單片機的智能加濕器最近幫小伙伴做的,設計一款智能加濕器,要求能夠設置溫度上下限并且在LCD1602上進行數據顯示,現在項目做完就分享一下,可以作為51單片機練手的項目
下面是一些圖,在壓縮包里都可以看見,其他包括程序和數據手冊也會一起打包.
繼電器&&加濕器模塊DXP原理圖
繼電器控制電路.PNG (51.25 KB, 下載次數: 117)
下載附件
2020-5-7 16:43 上傳
加濕器模塊實物
加濕器模塊實物圖.PNG (232.91 KB, 下載次數: 120)
下載附件
2020-5-7 16:49 上傳
TIM圖片20200507164840.jpg (265.06 KB, 下載次數: 123)
下載附件
2020-5-7 16:50 上傳
TIM圖片20200507164924.jpg (185.03 KB, 下載次數: 111)
下載附件
2020-5-7 16:50 上傳
壓縮包說明.PNG (96.09 KB, 下載次數: 122)
下載附件
2020-5-7 16:59 上傳
1、硬件連接
//DHT11
io = P1^0; //DHT11 DATA端口
//蜂鳴器和LED
sbit Beep = P2^0; //蜂鳴器
sbit Led = P2^1; //LED
sbit Led_SF = P2^2; //噴霧LED
sbit Led_DJ = P2^3; //待機LED
//按鍵
sbit Key_Wake = P2^4; //按鍵接地
sbit Key_Set = P1^2; //設置按鍵 //Version:2.0
sbit Key_Sel = P1^3; //上下限選擇
sbit Key_Up = P1^4; //增加
sbit Key_Down = P1^5; //減少
sbit Key_End = P1^6; //退出設置
/* LCD1602
#define LCD1602_DB P0 //數據 P0^0-->DB0
sbit LCD1602_RW = P2^5; //RW
sbit LCD1602_RS = P2^6; //RS
sbit LCD1602_EN = P2^7; //EN */
2、操作說明
(1)默認是運行階段,按鍵按一次(會有蜂鳴器響)進入待機狀態,LCD顯示Sleepping,待機LED亮
(2) 按Key_Set鍵時進入"Setting"設置界面,Sel鍵為上下限切換,Up為增加,Down為減少,End為退出
例如設置下限為44:按Set,按4次Up,再按End退出即可,(設置上限還需要按下Sel切換鍵)
3、默認設置濕度大于70%RH時,停止噴霧,濕度小于40%RH時,打開加濕器(噴霧LED亮起)
下面是單片機代碼(mian),2秒延時刷新一次,包括DHT11源碼,整個系統有三個模式,分別是運行模式、設置模式與待機模式
- /******************************************************
- By:CYJ
- Version:2.0
- LCDD1602顯示界面
- 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
- 0 T e m p : °C
- 1 H u m i : % R H
- H _ U : H _ D :
- *******************************************************/
- //LCD1602上顯示當前的溫濕度及單位其中濕度在第一行顯示溫度在第二行顯示
- # include <reg51.h>
- # include <intrins.h>
- #include "lcd.h"
-
- //DHT11
- sbit io=P1^0; //dht11 data端接單片機的P1^0口
- //加濕器控制按鍵
- sbit JSQ = P1^1;
- //蜂鳴&LED控制位
- sbit Beep = P2^0; //蜂鳴器
- sbit Led = P2^1; //測試LED
- sbit Led_SF = P2^2; //噴霧LED
- sbit Led_DJ = P2^3; //待機LED
- //按鍵掃描
- sbit Key_Wake = P2^4; //喚醒按鍵
- sbit Key_Set = P1^2; //進入設置
- sbit Key_Sel = P1^3; //移位控制
- sbit Key_Up = P1^4; //增加
- sbit Key_Down = P1^5; //減少
- sbit Key_End = P1^7; //退出設置
- /* LCD1602
- #define LCD1602_DB P0
- sbit LCD1602_RW = P2^5;//數據總線
- sbit LCD1602_RS = P2^6;
- sbit LCD1602_EN = P2^7; */
- uchar Flag = 0; //喚醒
- uchar data_byte;
- uchar RH = 0,RL = 0,TH = 0,TL = 0; //DHT11的數據位
- uchar *XP1 = "Temp:"; //溫度
- uchar *XP2 = "Humi:"; //濕度
- uchar *XP3 = "C"; //溫度單位
- uchar *XP4 = "%RH"; //濕度單位
- uchar *XP5 = "Hello the world"; //啟動界面
- uchar *XP6 = "Starting...";
- uchar *XP7 = "Sleepping..."; //待機狀態
- uchar *XP8 = "Setting..."; //設置中
- uchar *XP9 = "H_U:"; //上限
- uchar *XP10 = "H_D:"; //下限
- uchar code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-'};
- uchar Humi_U = 70,Humi_D = 40; //濕度上下限
- uchar yiwei = 0;
- /*******************************************************************************
- * 函數名 : delayxms()\ delay1()
- * 功能 : 延時
- * 輸入 :
- * 輸出 :
- *******************************************************************************/
- void delayxms(uint xms) //0us
- {
- unsigned char a = 0,b = 0;
- uint num = 0;
-
- for(num=xms;num>0;num--)
- {
- for(b=199;b>0;b--)
- for(a=1;a>0;a--);
- }
- }
- void delay(uchar ms) //延時模塊//
- {
- uchar i;
- while(ms--)
-
- for(i=0;i<100;i++);
- }
- void delay1()
- {
- uchar i;
- for(i=0;i<1;i++);
- }
- /*******************************************************************************
- * 函數名 :
- * 功能 : DHT11讀取溫濕度
- * 輸入 :
- * 輸出 :
- *******************************************************************************/
- void start()//開始信號
- {
- io=1;
- //delay1();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
-
- io=0;
- delay(25);// 主機把總線拉低必須大于18ms保證DHT11能檢測到起始信號
- io=1; //發送開始信號結束后拉高電平延時20-40us
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- uchar receive_byte()//接收一個字節
- {
- uchar i,temp;
- for(i=0;i<8;i++) //接收8bit的數據
- {
- while(!io); //等待50us的低電平開始信號結束
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- 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的延時
- {
- _nop_(); //7us
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- _nop_();
- 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;
- }
- }
- }
- /*******************************************************************************
- * 函數名 : Test()
- * 功能 : LED&BEEP
- * 輸入 :
- * 輸出 :
- *******************************************************************************/
- void Test()
- {
- uchar num = 0;
-
- Beep = 1;
- delayxms(500);
- Beep = 0;
-
- for(;num<3;num++)
- {
- Led = 0;
- delayxms(500);
- Led = 1;
- }
- }
- void Sound()
- {
- Beep = 1;
- delayxms(200);
- Beep = 0;
- }
- void SF(uint xms) //釋放LED
- {
- Led_SF = 0;
- delayxms(xms);
- Led_SF = 1;
- }
-
- void DJ(uint xms) //待機LED
- {
- Led_DJ = 0;
- delayxms(xms);
- Led_DJ = 1;
- }
- /*******************************************************************************
- * 函數名 : Key_Scan()
- * 功能 : 按鍵掃描
- * 輸入 :
- * 輸出 :
- *******************************************************************************/
- void Key_Scan()
- {
- uchar U_SW = 0,U_GW = 0,D_SW = 0,D_GW = 0;
-
- if(Key_Wake==0) //待機與運行控制
- {
- delayxms(12);
- if(Key_Wake==0)
- {
- Sound();
- Flag++;
- if(Flag>1)
- Flag = 0; //清零標志位
- }
- }
-
- if(Key_Set==0) //設置溫度上下限
- {
- delayxms(12);
- if(Key_Set==0) //設置溫度上下限
- {
- Lcd1602_Write_Cmd(0x01); //清屏
- LcdShowStr(0,0,XP8); //設置狀態
- LcdShowStr(0,1,XP9); //上限
- LcdShowStr(7,1,XP10); //下限
-
- Sound();
- while(1)
- {
- U_SW = Humi_U/10; //上限數據顯示
- U_GW = Humi_U%10;
- D_SW = Humi_D/10; //下限數據顯示
- D_GW = Humi_D%10;
- DisplayOneChar(4,1,ASCII[U_SW]);
- DisplayOneChar(5,1,ASCII[U_GW]);
- DisplayOneChar(11,1,ASCII[D_SW]);
- DisplayOneChar(12,1,ASCII[D_GW]);
-
- if(Key_Sel==0) //移位
- {
- delayxms(12);
- if(Key_Sel==0)
- {
- Sound();
- if(yiwei>1)
- yiwei = 0; //清零
- yiwei++;
- }
- }
-
- if(Key_Up==0) //增加
- {
- delayxms(12);
- if(Key_Up==0)
- {
- Sound();
- if(yiwei==0) //下限值設置
- {
- Humi_D++;
- }
- if(yiwei==1) //上限值設置
- {
- Humi_U++;
- }
- }
- }
-
- if(Key_Down==0) //減少
- {
- delayxms(12);
- if(Key_Down==0)
- {
- Sound();
- if(yiwei==0) //下限值設置
- {
- Humi_D--;
- }
- if(yiwei==1) //上限值設置
- {
- Humi_U--;
- }
- }
- }
-
- if(Key_End==0) //退出設置
- {
- delayxms(12);
- if(Key_End==0)
- {
- Sound();
- break;
- }
- }
- }
-
- }
- }
-
- }
復制代碼
一路5V繼電器控制模塊.PNG (640.9 KB, 下載次數: 160)
下載附件
2020-5-7 16:50 上傳
附件里面只包含源程序:
智能加濕器.7z
(5.47 MB, 下載次數: 452)
2020-5-7 17:37 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|