|
/*///////////////按键定义/////////////////////////////////
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
作者:小梁学长
测试芯片STC89C52RC
蓝牙模块HC-05 默认波特率9600
单片机晶振11.0592
APP为易安卓编写
喜欢的朋友支持一下哦,可以关注一下相互讨论学习哦
*//////////////////////////////////////////////////////////
- #include<reg52.h>
- #include <stdio.h>
- #define uint unsigned int
- #define uchar unsigned char
- extern unsigned char F16T,F16RH; //温湿度数据
- 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 //系统工作单步时间为1us
- #define Timer0_Reload (D_TIMER0 * freq_base / 10000)//100 //定时器重装值
- //初始画时显示的内容
- 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);
- }
- //写数据
- 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);//打开显示 无光标 无光标闪烁
- write_com(0x06);//当读或写一个字符是指针后一一位
- write_com(0x01);//清屏
-
- write_com(0x80);//设置位置
- for(i=0;i<16;i++)
- {
- write_data(Init1[ i]); //显示数组1的数据[ i]
- }
- write_com(0x80+5);
- write_data(0xdf);//°
-
- write_com(0x80+0x40);//设置位置
- for(i=0;i<16;i++)
- {
- write_data(Init2[ i]); //显示数组2的数据[ 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 延时函数
- //----------------------------------
- //-----温湿度读取子程序 ------------
- //----------------------------------
- //----以下变量均为全局变量----------
- //----温度高 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;//灯的状态
- Delay_ms(50);//上电延时100ms,等待SHT11启动
- Init1602(); //调用初始化显示函数
- InitUART(); //初始化串口
- temp=90;
- rh=90;
- 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) //
- {
- if(Rx_buf[1]==0x30) //
- 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) //
- 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) //
- {
- 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传送来的指令头数据
- {
- if(Rx_buf[1]==0x31) //接收到的APP传送来的定值加1指令
- {
- rh++; //湿度定值加1
- if(rh>99)
- rh=99;
- }
- if(Rx_buf[1]==0x30) //接收到的APP传送来的设置定值减1指令
- {
- rh--; //
- if(rh<1)
- rh=1;
- }
- Rx_buf[1]=0; //清除指令
- }
- }
- RI=0;
- ES=1; //关闭中断
- }
复制代码
|
|