|
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
代碼流程圖:
元件清單
名稱 編號 規(guī)格 數(shù)量 單位 備注
電源插口 USB-A USB-A 1 個 電源供電
電解電容 C1 470uf/16V 1 個 5v電源濾波
瓷片電容 C2 0.1uf 1 個 5v電源濾波
瓷片電容 C3 C4 22P 2 個 晶振電容
電解電容 C5 10uf/16V 1 個 單片機復(fù)位電容
電阻 R1 10K 1/4W 1 個 單片機復(fù)位電阻
電阻 R2 R3 R4 1K 1/4W 3 個 發(fā)光二極管限流電阻
晶振 Y1 11.0529M 1 個
單片機 IC1 AT89C52 1 片 單片機可先AT89C51、AT89C52、AT89S51、AT89S52、STC89C52RC
4腳集成電路座 DIP40 DIP40 1 個 單片機座子
發(fā)光二極管 LED1 LED2 φ5 3 個 紅
藍(lán)牙模塊 HC-05 1 塊 HC-05 HC-06都可以
按鍵開關(guān) K1 SW-0606 3 個
PCB板 1 塊 90*120洞洞板或根據(jù)PCB圖制作
溫度濕傳感器 DHT11 DHT11 1 只
細(xì)導(dǎo)線 若干
焊錫 若干
下載程序的工具 請自己根據(jù)實際情況配備(單片機不同,工具不同)
供電線 USB-A 1 根 雙頭均為USB-A
單片機源程序如下:
- #include<reg52.h>
- #include <stdio.h>
- extern unsigned char F16T,F16RH; //溫濕度數(shù)據(jù)
- unsigned char Rx_buf[4],Rxnum=0,temp,rh;
- sbit LED1=P2^0; //投停自動按鍵
- sbit LED2=P2^3; //加溫啟啟指示燈(如果要實現(xiàn)控制,可在這個端口加裝上樓層電器模塊)
- sbit LED3=P2^6; //加濕啟啟指示燈(如果要實現(xiàn)控制,可在這個端口加裝上樓層電器模塊)
- sbit k1=P1^4; //投停自動按鍵
- sbit k2=P1^5; //加溫啟停按鍵
- sbit k3=P1^6; //加濕啟停按鍵
- sbit bit11=P1^0; //DHT11傳感器數(shù)據(jù)端
- unsigned char U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
- unsigned char F16T,F16RH,n;// read 8 bits onice
- void Delay_ms(unsigned int n)//n 毫秒延時
- {
- unsigned char j;
- while(n--)
- {
- for(j=0;j<125;j++);
- }
- if(k1==0) //自動、手動切換按鍵按下判斷處理
- {
- while(k1==0); //再次判斷按下否,當(dāng)放開按鍵時
- if(LED1==1) //判斷自動按停情況:1為手動 0為自動
- LED1=0; //切換為自動開
- else LED1=1; //切換為自動關(guān)
- }
- if(LED1==1) //自動、手動判斷 1為手動 0為自動
- {
- if(k2==0) //加熱啟停切換按鍵按下判斷處理
- {
- while(k2==0); //再次判斷按下否
- if(LED2==1) //如果之前是 1為停止(加熱關(guān)) 0為加熱(加熱開)
- LED2=0; //則切換為加熱狀態(tài)(加熱開)
- else LED2=1; //否則切換為停止加熱狀態(tài)(加熱關(guān))
- }
- if(k3==0) //加濕啟停切換按鍵按下判斷處理
- {
- while(k3==0); //再次判斷按下否
- if(LED3==1) //如果之前是 1為停止(加濕關(guān)) 0為加濕(加濕開)
- LED3=0; //則切換為加濕狀態(tài)(加濕開)
- else LED3=1; //否則切換為停止加濕狀態(tài)(加濕關(guān))
- }
- }
- else //自動狀態(tài)
- {
- if(F16T>temp) //溫度大于設(shè)定值時
- {
- LED2=1; //停止加熱(加熱關(guān))
- }
- else LED2=0; //溫度低于設(shè)定值時,開始加熱(加熱開)
- if(F16RH>rh) //濕度大于設(shè)定值時
- {
- LED3=1; //停止加熱(加熱關(guān))
- }
- else LED3=0; //濕度低于設(shè)定值時,開始加濕(加濕開)
- }
- }
- void Delay_us(unsigned char n)
- {
- n=n/2;
- while(--n);
- }//N us 延時函數(shù)
- //--------------------------------
- //-----溫濕度讀取子程序 ------------
- //--------------------------------
- //----以下變量均為全局變量--------
- //----溫度高 8 位== U8T_data_H------
- //----溫度低 8 位== U8T_data_L------
- //----濕度高 8 位== U8RH_data_H-----
- //----濕度低 8 位== U8RH_data_L-----
- //----校驗 8 位 == U8checkdata-----
- //----調(diào)用相關(guān)子程序如下----------
- //---- Delay();, Delay_10us();,COM();
- //--------------------------------
- char COM(void)
- {
- char i,U8temp,U8comdata; //用于最終讀取的溫濕度數(shù)據(jù)
- for(i=0;i<8;i++)
- {
- while(!bit11);
- Delay_us(35); //表示讀取的高電位延時大于 20 多 us 則讀取的是 1 否則讀取的是0
- U8temp=0;
- if(bit11)U8temp=1; //通過 U8FLAG可判斷bit11 顯示數(shù)據(jù)的脈長
- while(bit11);
- U8comdata<<=1;
- U8comdata|=U8temp;
- }//rof
- return U8comdata;
- }
- void getDHT11(void)
- {
- GO1:bit11=0;
- Delay_ms(20); //主機拉低 18ms
- bit11=1; //總線由上拉電阻拉高 主機延時 20us
- Delay_us(60); //主機設(shè)為輸入
-
- if(!bit11) //bit11=1;判斷從機響應(yīng)信號,判斷從機是否有低電平響應(yīng)信號
- {
- while(!bit11); //如不響應(yīng)則跳出,響應(yīng)則向下運行
- while(bit11);
- U8RH_data_H=COM(); //數(shù)據(jù)接收狀態(tài)
- U8RH_data_L=COM();
- U8T_data_H=COM();
- U8T_data_L=COM();
- U8checkdata=COM();
- bit11=1;
- if((U8T_data_H+U8T_data_L+U8RH_data_H+U8RH_data_L)!=U8checkdata) //數(shù)據(jù)校驗
- goto GO1;
- }//fi
- F16T=U8T_data_H+U8T_data_L/256; //change integer to float
- F16RH=U8RH_data_H+U8RH_data_L/256;
- }
- void InitUART(void) //這是串口的基本配置,配置他的波特率是9600.這些參數(shù)都是標(biāo)準(zhǔn)的。
- {
- TMOD = 0x20;
- SCON = 0x50;
- TH1 = 0xFD;
- TL1 = TH1;
- PCON = 0x00;
- EA = 1;
- ES = 1;
- TR1 = 1;
- }
- /*
- * UART 發(fā)送一字節(jié)
- */
- void UART_send_byte(char dat)
- {
- SBUF = dat;
- while (TI == 0);
- TI = 0;
- }
- /*
- * UART 發(fā)送字符串
- */
- void UART_send_string(unsigned char *buf)
- {
- while (*buf != '\0')
- {
- UART_send_byte(*buf++);
- }
- }
- void main()
- {
- unsigned char Tx_Buf[12];
- unsigned char LEDstatus;//燈的狀態(tài)
- InitUART(); //初始化串口
- temp=25;
- rh=60;
- while(1)
- {
- getDHT11(); //獲取溫濕度值
- Tx_Buf[0]='T'; //幀頭
- Tx_Buf[1]=F16T/10%10+0x30; //將溫濕度數(shù)據(jù)送往發(fā)送數(shù)組,送給藍(lán)牙模塊讓手機APP顯示
- Tx_Buf[2]=F16T%10+0x30;
- Tx_Buf[3]=F16RH/10%10+0x30;
- Tx_Buf[4]=F16RH%10+0x30;
- Tx_Buf[5]=temp/10%10+0x30; //將溫濕度數(shù)據(jù)送往發(fā)送數(shù)組,送給藍(lán)牙模塊讓手機APP顯示
- Tx_Buf[6]=temp%10+0x30;
- Tx_Buf[7]=rh/10%10+0x30;
- Tx_Buf[8]=rh%10+0x30;
- LEDstatus=LED1;
- Tx_Buf[9]=LEDstatus+0x30; //發(fā)送自動投停狀態(tài)到APP顯示
- LEDstatus=LED2;
- Tx_Buf[10]=LEDstatus+0x30; //發(fā)送加熱狀態(tài)到APP顯示
- LEDstatus=LED3;
- Tx_Buf[11]=LEDstatus+0x30; //發(fā)送加濕狀態(tài)到APP顯示
- UART_send_string(Tx_Buf); //串口發(fā)送溫濕度數(shù)據(jù)出去
- Delay_ms(1000);
- }
- }
- /*****************串口接收中斷函數(shù),接收藍(lán)牙模塊的數(shù)據(jù)****************** ***/
- void UARTInterrupt(void) interrupt 4
- {
- ES=0; //關(guān)閉中斷
- if(RI) //接收到數(shù)據(jù)
- {
- Rx_buf[Rxnum]=SBUF; //接收數(shù)據(jù)進數(shù)組
- if(Rx_buf[Rxnum]==0x0A)
- Rxnum=0;
- else
- Rxnum++;
- if(Rx_buf[0]==0x31) //接收到的APP傳送來的手動、自動切換指令頭部數(shù)據(jù)
- {
- if(Rx_buf[1]==0x30) //接收到的APP傳送來的切換為自動指令
- LED1=0; //自動開
- if(Rx_buf[1]==0x31) //接收到的APP傳送來的切換為手動指令
- LED1=1; //自動關(guān)
- }
- if(Rx_buf[0]==0x32) //接收到的APP傳送來的加溫指令頭部數(shù)據(jù)
- {
- if(Rx_buf[1]==0x30) //接收到的APP傳送來的加溫開指令
- LED2=0; //加溫開
- if(Rx_buf[1]==0x31) //接收到的APP傳送來的加溫關(guān)指令
- LED2=1; //加溫關(guān)
- }
- if(Rx_buf[0]==0x33) //接收到的APP傳送來的加濕指令頭部數(shù)據(jù)
- {
- if(Rx_buf[1]==0x30) //接收到的APP傳送來的加濕開指令
- {
- LED3=0; //加濕開
- }
- else
- if(Rx_buf[1]==0x31) //接收到的APP傳送來的加濕開指令
- {
- LED3=1; //加濕關(guān)
- }
- }
- if(Rx_buf[0]==0x34) //接收到的APP傳送來的溫度設(shè)置指令頭數(shù)據(jù)
- {
- if(Rx_buf[1]==0x31) //接收到的APP傳送來的溫度設(shè)置定值加1指令
- {
- temp++; //溫度定值加1
- if(temp>99)
- temp=99;
- }
- if(Rx_buf[1]==0x30) //接收到的APP傳送來的溫度設(shè)置定值減1指令
- {
- temp--; //溫度定值減1
- if(temp<1)
- temp=1;
- }
- Rx_buf[1]=0; //清除指令
- }
- if(Rx_buf[0]==0x35) //接收到的APP傳送來的濕度設(shè)置指令頭數(shù)據(jù)
- {
- if(Rx_buf[1]==0x31) //接收到的APP傳送來的濕度設(shè)置定值加1指令
- {
- rh++; //濕度定值加1
- if(rh>99)
- rh=99;
- }
- if(Rx_buf[1]==0x30) //接收到的APP傳送來的濕度設(shè)置定值減1指令
- {
- rh--; //濕度定值減1
- if(rh<1)
- rh=1;
- }
- Rx_buf[1]=0; //清除指令
- }
- }
- RI=0;
- ES=1; //關(guān)閉中斷
- }
復(fù)制代碼
PCB 源程序51hei附件下載:
藍(lán)牙溫濕度測量控制 下位機.7z
(8.71 MB, 下載次數(shù): 102)
2021-7-21 17:15 上傳
點擊文件名下載附件
上位機APP資料由于某些問題不能分享在這里,大家可以利用藍(lán)牙串口助手來調(diào)試
|
評分
-
查看全部評分
|