|
/*///////////////按鍵定義/////////////////////////////////
sbit LED1=P1^0; //繼電器輸出接口1
sbit LED2=P1^6; //繼電器輸出接口2
sbit LED3=P1^7; //繼電器輸出接口3
sbit k1=P3^2; //啟動停止按鍵1
sbit k2=P3^3; //啟動停止按鍵2
sbit k3=P3^4; //啟動停止按鍵3
作者:小梁學(xué)長
測試芯片STC89C52RC
藍(lán)牙模塊HC-05 默認(rèn)波特率9600
單片機晶振11.0592
APP為易安卓編寫
喜歡的朋友支持一下哦,可以關(guān)注一下相互討論學(xué)習(xí)哦
*//////////////////////////////////////////////////////////
Screenshot_2021-08-25-15-50-39-35_723258d758cb797.jpg (168.44 KB, 下載次數(shù): 62)
下載附件
2021-8-25 16:00 上傳
1629877928668.jpg (3.39 MB, 下載次數(shù): 46)
下載附件
2021-8-25 16:00 上傳
1629877939462.jpg (3 MB, 下載次數(shù): 62)
下載附件
2021-8-25 16:00 上傳
- #include<reg52.h>
- #include <stdio.h>
- #define uint unsigned int
- #define uchar unsigned char
- extern unsigned char F16T,F16RH; //溫濕度數(shù)據(jù)
- unsigned char Rx_buf[4],Rxnum=0,temp,rh;
- sbit LED1=P1^0; //繼電器輸出接口1
- sbit LED2=P1^6; //繼電器輸出接口2
- sbit LED3=P1^7; //繼電器輸出接口3
- sbit k1=P3^2; //啟動停止按鍵1
- sbit k2=P3^3; //啟動停止按鍵2
- sbit k3=P3^4; //啟動停止按鍵3
- uint c;
- uchar temp;
- unsigned char U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
- uchar U8FLAG,U8comdata;
- uchar U8count,U8temp;
- uchar U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
- unsigned char F16T,F16RH,n;// read 8 bits onice
- #define IR_CH_MIN 0x45 // CH-
- #define IR_CH 0x46 // CH
- #define IR_CH_ADD 0x47 // CH+
- #define IR_LEFT 0x44 // |<<
- #define IR_RIGHT 0x40 // >>|
- #define IR_RUN 0x43 // >||
- #define IR_MIN 0x07 // -
- #define IR_ADD 0x15 // +
- #define IR_EQ 0x09 // EQ
- #define IR_0 0x16 // 0
- #define IR_100 0x19 // 100+
- #define IR_200 0x0D // 200+
- #define IR_1 0x0C // 1
- #define IR_2 0x18 // 2
- #define IR_3 0x5E // 3
- #define IR_4 0x08 // 4
- #define IR_5 0x1C // 5
- #define IR_6 0x5A // 6
- #define IR_7 0x42 // 7
- #define IR_8 0x52 // 8
- #define IR_9 0x4A // 9
- #define D_TIMER0 100 //選擇定時器時間, us, 紅外接收要求在60us~250us之間//125微妙一次中斷
- //#define User_code 0x611c //定義紅外接收用戶碼
- #define FOSC 12000000L //定義主時鐘
- #define freq_base (FOSC / 1200) //10000 //系統(tǒng)工作單步時間為1us
- #define Timer0_Reload (D_TIMER0 * freq_base / 10000)//100 //定時器重裝值
- //初始畫時顯示的內(nèi)容
- uchar code Init1[]="TA= C ";
- uchar code Init2[]="RH= % ";
- void LCDdelay(uint z) //該延時大約100us(不精確,液晶操作的延時不要求很精確)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=10;y>0;y--);
- }
- sbit bit11=P2^0;
- void write_com(uchar com)
- {
- LCDRS=0;
- LCDRW=0;
- LCDEN=0;
- P0=com;
- LCDdelay(5);
- LCDEN=1;
- LCDdelay(5);
- LCDEN=0;
- LCDdelay(5);
- }
- //寫數(shù)據(jù)
- void write_data(uchar date)
- {
- LCDRS=1;
- LCDRW=0;
- LCDEN=0;
- P0=date;
- LCDdelay(5);
- LCDEN=1;
- LCDdelay(5);
- LCDEN=0;
- LCDdelay(5);
- }
- sbit LCDRS = P2^7;
- sbit LCDRW = P2^6;
- sbit LCDEN = P2^5;
- void Init1602()
- {
- uchar i=0;
- write_com(0x38);//屏幕初始化
- write_com(0x0c);//打開顯示 無光標(biāo) 無光標(biāo)閃爍
- write_com(0x06);//當(dāng)讀或?qū)懸粋字符是指針后一一位
- write_com(0x01);//清屏
-
- write_com(0x80);//設(shè)置位置
- for(i=0;i<16;i++)
- {
- write_data(Init1[ i]); //顯示數(shù)組1的數(shù)據(jù)[ i]
- }
- write_com(0x80+5);
- write_data(0xdf);//°
-
- write_com(0x80+0x40);//設(shè)置位置
- for(i=0;i<16;i++)
- {
- write_data(Init2[ i]); //顯示數(shù)組2的數(shù)據(jù)[ i]
- }
-
- }
- 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) //
- LED1=0; //
- else LED1=1; //
- }
- if(k2==0) //
- {
- while(k2==0); //
- if(LED2==1) //
- LED2=0; //
- else LED2=1; //
- }
- if(k3==0) //
- {
- while(k3==0); //
- if(LED3==1) //)
- LED3=0; //
- else LED3=1; //
- }
-
- }
- 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)
- Delay_ms(50);//上電延時100ms,等待SHT11啟動
- Init1602(); //調(diào)用初始化顯示函數(shù)
- InitUART(); //初始化串口
- temp=90;
- rh=90;
- 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ù)進(jìn)數(shù)組
- if(Rx_buf[Rxnum]==0x0A)
- Rxnum=0;
- else
- Rxnum++;
- if(Rx_buf[0]==0x31) //
- {
- if(Rx_buf[1]==0x30) //
- LED1=0; //
- if(Rx_buf[1]==0x31) //接收到的APP傳送來的切換為手動指令
- LED1=1; //
- }
- if(Rx_buf[0]==0x32) //接收到的APP傳送來的指令頭部數(shù)據(jù)
- {
- if(Rx_buf[1]==0x30) //接收到的APP傳送來的開指令
- LED2=0; //
- if(Rx_buf[1]==0x31) //
- LED2=1; //
- }
- 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; //
- }
- }
- if(Rx_buf[0]==0x34) //接收到的APP傳送來的頭數(shù)據(jù)
- {
- if(Rx_buf[1]==0x31) //
- {
- temp++; //
- if(temp>99)
- temp=99;
- }
- if(Rx_buf[1]==0x30) //
- {
- temp--; //
- if(temp<1)
- temp=1;
- }
- Rx_buf[1]=0; //
- }
- if(Rx_buf[0]==0x35) //接收到的APP傳送來的指令頭數(shù)據(jù)
- {
- if(Rx_buf[1]==0x31) //接收到的APP傳送來的定值加1指令
- {
- rh++; //濕度定值加1
- if(rh>99)
- rh=99;
- }
- if(Rx_buf[1]==0x30) //接收到的APP傳送來的設(shè)置定值減1指令
- {
- rh--; //
- if(rh<1)
- rh=1;
- }
- Rx_buf[1]=0; //清除指令
- }
- }
- RI=0;
- ES=1; //關(guān)閉中斷
- }
復(fù)制代碼
|
-
-
程序.zip
2021-8-25 16:01 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
57.51 KB, 下載次數(shù): 40, 下載積分: 黑幣 -5
-
-
藍(lán)牙智能開關(guān)APP.zip
2021-8-25 16:02 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
631.47 KB, 下載次數(shù): 48, 下載積分: 黑幣 -5
|