Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
原理圖.jpg (147.6 KB, 下載次數: 15)
下載附件
2024-1-2 01:13 上傳
PCB圖.jpg (251.55 KB, 下載次數: 16)
下載附件
2024-1-2 01:13 上傳
程序流程圖:
51hei.png (21.44 KB, 下載次數: 14)
下載附件
2024-1-2 01:14 上傳
51hei.png (25.8 KB, 下載次數: 19)
下載附件
2024-1-2 01:14 上傳
單片機源程序如下:- #include<reg52.h>
- #include <stdio.h>
- extern unsigned char F16T,F16RH; //溫濕度數據
- unsigned char Rx_buf[4],Rxnum=0,temp,rh;
- sbit LED1=P2^0; //投停自動按鍵
- sbit LED2=P2^3; //加溫啟啟指示燈(如果要實現控制,可在這個端口加裝上樓層電器模塊)
- sbit LED3=P2^6; //加濕啟啟指示燈(如果要實現控制,可在這個端口加裝上樓層電器模塊)
- sbit k1=P1^4; //投停自動按鍵
- sbit k2=P1^5; //加溫啟停按鍵
- sbit k3=P1^6; //加濕啟停按鍵
- sbit bit11=P1^1; //DHT11傳感器數據端
- 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); //再次判斷按下否,當放開按鍵時
- if(LED1==1) //判斷自動按停情況:1為手動 0為自動
- LED1=0; //切換為自動開
- else LED1=1; //切換為自動關
- }
- if(LED1==1) //自動、手動判斷 1為手動 0為自動
- {
- if(k2==0) //加熱啟停切換按鍵按下判斷處理
- {
- while(k2==0); //再次判斷按下否
- if(LED2==1) //如果之前是 1為停止(加熱關) 0為加熱(加熱開)
- LED2=0; //則切換為加熱狀態(加熱開)
- else LED2=1; //否則切換為停止加熱狀態(加熱關)
- }
- if(k3==0) //加濕啟停切換按鍵按下判斷處理
- {
- while(k3==0); //再次判斷按下否
- if(LED3==1) //如果之前是 1為停止(加濕關) 0為加濕(加濕開)
- LED3=0; //則切換為加濕狀態(加濕開)
- else LED3=1; //否則切換為停止加濕狀態(加濕關)
- }
- }
- else //自動狀態
- {
- if(F16T>temp) //溫度大于設定值時
- {
- LED2=1; //停止加熱(加熱關)
- }
- else LED2=0; //溫度低于設定值時,開始加熱(加熱開)
- if(F16RH>rh) //濕度大于設定值時
- {
- LED3=1; //停止加熱(加熱關)
- }
- else LED3=0; //濕度低于設定值時,開始加濕(加濕開)
- }
- }
- void Delay_us(unsigned char n)
- {
- n=n/2;
- while(--n);
- }//N us 延時函數
- //--------------------------------
- //-----溫濕度讀取子程序 ------------
- //--------------------------------
- //----以下變量均為全局變量--------
- //----溫度高 8 位== U8T_data_H------
- //----溫度低 8 位== U8T_data_L------
- //----濕度高 8 位== U8RH_data_H-----
- //----濕度低 8 位== U8RH_data_L-----
- //----校驗 8 位 == U8checkdata-----
- //----調用相關子程序如下----------
- //---- Delay();, Delay_10us();,COM();
- //--------------------------------
- char COM(void)
- {
- char i,U8temp,U8comdata; //用于最終讀取的溫濕度數據
- for(i=0;i<8;i++)
- {
- while(!bit11);
- Delay_us(35); //表示讀取的高電位延時大于 20 多 us 則讀取的是 1 否則讀取的是0
- U8temp=0;
- if(bit11)U8temp=1; //通過 U8FLAG可判斷bit11 顯示數據的脈長
- 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); //主機設為輸入
-
- if(!bit11) //bit11=1;判斷從機響應信號,判斷從機是否有低電平響應信號
- {
- while(!bit11); //如不響應則跳出,響應則向下運行
- while(bit11);
- U8RH_data_H=COM(); //數據接收狀態
- 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) //數據校驗
- 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.這些參數都是標準的。
- {
- TMOD = 0x20;
- SCON = 0x50;
- TH1 = 0xFD;
- TL1 = TH1;
- PCON = 0x00;
- EA = 1;
- ES = 1;
- TR1 = 1;
- }
- /*
- * UART 發送一字節
- */
- void UART_send_byte(char dat)
- {
- SBUF = dat;
- while (TI == 0);
- TI = 0;
- }
- /*
- * UART 發送字符串
- */
- void UART_send_string(unsigned char *buf)
- {
- while (*buf != '\0')
- {
- UART_send_byte(*buf++);
- }
- }
- void main()
- {
- unsigned char Tx_Buf[12];
- unsigned char LEDstatus;//燈的狀態
- InitUART(); //初始化串口
- temp=25;
- rh=60;
- while(1)
- {
- getDHT11(); //獲取溫濕度值
- Tx_Buf[0]='T'; //幀頭
- Tx_Buf[1]=F16T/10%10+0x30; //將溫濕度數據送往發送數組,送給藍牙模塊讓手機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; //將溫濕度數據送往發送數組,送給藍牙模塊讓手機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; //發送自動投停狀態到APP顯示
- LEDstatus=LED2;
- Tx_Buf[10]=LEDstatus+0x30; //發送加熱狀態到APP顯示
- LEDstatus=LED3;
- Tx_Buf[11]=LEDstatus+0x30; //發送加濕狀態到APP顯示
- UART_send_string(Tx_Buf); //串口發送溫濕度數據出去
- Delay_ms(1000);
- }
- }
- /*****************串口接收中斷函數,接收藍牙模塊的數據****************** ***/
- void UARTInterrupt(void) interrupt 4
- {
- ES=0; //關閉中斷
- if(RI) //接收到數據
- {
- Rx_buf[Rxnum]=SBUF; //接收數據進數組
- if(Rx_buf[Rxnum]==0x0A)
- Rxnum=0;
- else
- Rxnum++;
- if(Rx_buf[0]==0x31) //接收到的APP傳送來的手動、自動切換指令頭部數據
- {
- if(Rx_buf[1]==0x30) //接收到的APP傳送來的切換為自動指令
- LED1=0; //自動開
- if(Rx_buf[1]==0x31) //接收到的APP傳送來的切換為手動指令
- LED1=1; //自動關
- }
- if(Rx_buf[0]==0x32) //接收到的APP傳送來的加溫指令頭部數據
- {
- if(Rx_buf[1]==0x30) //接收到的APP傳送來的加溫開指令
- LED2=0; //加溫開
- if(Rx_buf[1]==0x31) //接收到的APP傳送來的加溫關指令
- LED2=1; //加溫關
- }
- if(Rx_buf[0]==0x33) //接收到的APP傳送來的加濕指令頭部數據
- {
- if(Rx_buf[1]==0x30) //接收到的APP傳送來的加濕開指令
- {
- LED3=0; //加濕開
- }
- else
- if(Rx_buf[1]==0x31) //接收到的APP傳送來的加濕開指令
- {
- LED3=1; //加濕關
- }
- }
- if(Rx_buf[0]==0x34) //接收到的APP傳送來的溫度設置指令頭數據
- {
- if(Rx_buf[1]==0x31) //接收到的APP傳送來的溫度設置定值加1指令
- {
- temp++; //溫度定值加1
- if(temp>99)
- temp=99;
- }
- if(Rx_buf[1]==0x30) //接收到的APP傳送來的溫度設置定值減1指令
- {
- temp--; //溫度定值減1
- if(temp<1)
- temp=1;
- }
- Rx_buf[1]=0; //清除指令
- }
- if(Rx_buf[0]==0x35) //接收到的APP傳送來的濕度設置指令頭數據
- {
- if(Rx_buf[1]==0x31) //接收到的APP傳送來的濕度設置定值加1指令
- {
- rh++; //濕度定值加1
- if(rh>99)
- rh=99;
- }
- if(Rx_buf[1]==0x30) //接收到的APP傳送來的濕度設置定值減1指令
- {
- rh--; //濕度定值減1
- if(rh<1)
- rh=1;
- }
- Rx_buf[1]=0; //清除指令
- }
- }
- RI=0;
- ES=1; //關閉中斷
- }
-
復制代碼
仿真: 無
代碼原理圖PCB:
LY04A_藍牙溫濕度測量控制.7z
(1.01 MB, 下載次數: 15)
2024-1-2 01:16 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|