找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2874|回复: 1
打印 上一主题 下一主题
收起左侧

单片机蓝牙开关带APP状态反馈

[复制链接]
回帖奖励 10 黑币 回复本帖可获得 1 黑币奖励! 每人限 1 次(中奖概率 30%)
跳转到指定楼层
楼主
/*///////////////按键定义/////////////////////////////////
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为易安卓编写
喜欢的朋友支持一下哦,可以关注一下相互讨论学习哦
*//////////////////////////////////////////////////////////






  1. #include<reg52.h>
  2. #include <stdio.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. extern unsigned char  F16T,F16RH;                //温湿度数据
  6. unsigned char Rx_buf[4],Rxnum=0,temp,rh;
  7. sbit LED1=P1^0;                                                //继电器输出接口1
  8. sbit LED2=P1^6;                                                //继电器输出接口2
  9. sbit LED3=P1^7;                                                //继电器输出接口3


  10. sbit k1=P3^2;                                                //启动停止按键1
  11. sbit k2=P3^3;                                                //启动停止按键2
  12. sbit k3=P3^4;                                                //启动停止按键3




  13. uint c;         
  14. uchar temp;        
  15. unsigned char U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
  16. uchar  U8FLAG,U8comdata;
  17. uchar  U8count,U8temp;
  18. uchar  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  19. unsigned char F16T,F16RH,n;// read 8 bits onice
  20. #define IR_CH_MIN  0x45                                        //  CH-         
  21. #define IR_CH      0x46                                        //  CH         
  22. #define IR_CH_ADD  0x47                                        //  CH+         
  23. #define IR_LEFT    0x44                                        //  |<<         
  24. #define IR_RIGHT   0x40                                        //  >>|     
  25. #define IR_RUN     0x43                                        //  >||         
  26. #define IR_MIN     0x07                                        //  -         
  27. #define IR_ADD     0x15                                        //  +         
  28. #define IR_EQ      0x09                                        //  EQ         
  29. #define IR_0       0x16                                        //  0         
  30. #define IR_100     0x19                                        //  100+         
  31. #define IR_200     0x0D                                        //  200+         
  32. #define IR_1       0x0C                                        //  1         
  33. #define IR_2       0x18                                        //  2         
  34. #define IR_3       0x5E                                        //  3         
  35. #define IR_4       0x08                                        //  4         
  36. #define IR_5       0x1C                                        //  5         
  37. #define IR_6       0x5A                                        //  6         
  38. #define IR_7       0x42                                        //  7         
  39. #define IR_8       0x52                                        //  8        
  40. #define IR_9       0x4A                                        //  9      
  41. #define D_TIMER0                100                        //选择定时器时间, us, 红外接收要求在60us~250us之间//125微妙一次中断
  42. //#define        User_code                0x611c                //定义红外接收用户码
  43. #define FOSC                12000000L        //定义主时钟
  44. #define freq_base                (FOSC / 1200)                //10000                        //系统工作单步时间为1us
  45. #define Timer0_Reload        (D_TIMER0 * freq_base / 10000)//100        //定时器重装值




  46. //初始画时显示的内容
  47. uchar code Init1[]="TA=   C              ";
  48. uchar code Init2[]="RH=   %              ";
  49. void LCDdelay(uint z)                  //该延时大约100us(不精确,液晶操作的延时不要求很精确)
  50. {
  51.   uint x,y;
  52.   for(x=z;x>0;x--)
  53.     for(y=10;y>0;y--);
  54. }
  55. sbit bit11=P2^0;
  56. void write_com(uchar com)
  57. {
  58.   LCDRS=0;
  59.   LCDRW=0;
  60.   LCDEN=0;        
  61.   P0=com;
  62.   LCDdelay(5);
  63.   LCDEN=1;
  64.   LCDdelay(5);
  65.   LCDEN=0;
  66.         LCDdelay(5);
  67. }
  68. //写数据
  69. void write_data(uchar date)
  70. {
  71.   LCDRS=1;
  72.         LCDRW=0;
  73.   LCDEN=0;
  74.   P0=date;
  75.   LCDdelay(5);
  76.   LCDEN=1;  
  77.   LCDdelay(5);
  78.   LCDEN=0;
  79.         LCDdelay(5);
  80. }
  81. sbit LCDRS = P2^7;
  82. sbit LCDRW = P2^6;
  83. sbit LCDEN = P2^5;
  84. void Init1602()
  85. {
  86.   uchar i=0;
  87.   write_com(0x38);//屏幕初始化
  88.   write_com(0x0c);//打开显示 无光标 无光标闪烁
  89.   write_com(0x06);//当读或写一个字符是指针后一一位
  90.   write_com(0x01);//清屏
  91.         
  92.   write_com(0x80);//设置位置
  93.   for(i=0;i<16;i++)
  94.   {
  95.                 write_data(Init1[ i]);          //显示数组1的数据[ i]
  96.   }
  97.         write_com(0x80+5);
  98.         write_data(0xdf);//°
  99.         
  100.   write_com(0x80+0x40);//设置位置
  101.   for(i=0;i<16;i++)
  102.   {
  103.                 write_data(Init2[ i]);          //显示数组2的数据[ i]
  104.   }
  105.         
  106. }


  107. void Delay_ms(unsigned int n)//n 毫秒延时
  108. {
  109.         unsigned char j;
  110.         while(n--)
  111.         {
  112.                 for(j=0;j<125;j++);
  113.         }
  114.     if(k1==0)                          //
  115.         {
  116.             while(k1==0);          //
  117.                 if(LED1==1)                  //
  118.                 LED1=0;                          //
  119.                 else LED1=1;          //
  120.         }


  121.             if(k2==0)                  //
  122.                 {
  123.                     while(k2==0); //
  124.                         if(LED2==1)          //
  125.                         LED2=0;                  //
  126.                         else LED2=1;  //
  127.                 }
  128.                 if(k3==0)                  //
  129.                 {
  130.                     while(k3==0); //
  131.                         if(LED3==1)          //)
  132.                         LED3=0;                  //
  133.                         else LED3=1;  //
  134.                 }




  135.         
  136. }
  137. void Delay_us(unsigned char n)
  138. {
  139.         n=n/2;
  140.         while(--n);
  141. }//N us 延时函数


  142. //----------------------------------
  143. //-----温湿度读取子程序 ------------
  144. //----------------------------------
  145. //----以下变量均为全局变量----------
  146. //----温度高 8 位== U8T_data_H------
  147. //----温度低 8 位== U8T_data_L------
  148. //----湿度高 8 位== U8RH_data_H-----
  149. //----湿度低 8 位== U8RH_data_L-----
  150. //----校验 8 位 == U8checkdata------
  151. //----调用相关子程序如下------------
  152. //---- Delay();, Delay_10us();,COM();
  153. //--------------------------------
  154. char  COM(void)
  155. {
  156.         char i,U8temp,U8comdata;           //用于最终读取的温湿度数据
  157.         for(i=0;i<8;i++)
  158.         {
  159.                 while(!bit11);               
  160.                 Delay_us(35);                        //表示读取的高电位延时大于 20 多 us 则读取的是 1 否则读取的是0
  161.                 U8temp=0;               
  162.                 if(bit11)U8temp=1;                //通过 U8FLAG可判断bit11 显示数据的脉长
  163.                 while(bit11);
  164.                 U8comdata<<=1;
  165.                 U8comdata|=U8temp;
  166.                 }//rof
  167.                 return    U8comdata;
  168.         }


  169. void getDHT11(void)
  170. {
  171.         GO1:bit11=0;
  172.         Delay_ms(20);                                 //主机拉低 18ms
  173.         bit11=1;                                        //总线由上拉电阻拉高 主机延时 20us
  174.         Delay_us(60);                                 //主机设为输入


  175.         
  176.         if(!bit11)                               //bit11=1;判断从机响应信号,判断从机是否有低电平响应信号
  177.         {
  178.                 while(!bit11);                        //如不响应则跳出,响应则向下运行
  179.                 while(bit11);
  180.                 U8RH_data_H=COM();                //数据接收状态
  181.                 U8RH_data_L=COM();
  182.                 U8T_data_H=COM();
  183.                 U8T_data_L=COM();
  184.                 U8checkdata=COM();
  185.                 bit11=1;               
  186.                 if((U8T_data_H+U8T_data_L+U8RH_data_H+U8RH_data_L)!=U8checkdata)   //数据校验
  187.                 goto  GO1;
  188.         }//fi
  189.         F16T=U8T_data_H+U8T_data_L/256;                                                                             //change integer to float
  190.         F16RH=U8RH_data_H+U8RH_data_L/256;
  191. }




  192. void InitUART(void)                                 //这是串口的基本配置,配置他的波特率是9600.这些参数都是标准的。
  193. {
  194.     TMOD = 0x20;
  195.     SCON = 0x50;
  196.     TH1 = 0xFD;
  197.     TL1 = TH1;
  198.     PCON = 0x00;
  199.     EA = 1;
  200.     ES = 1;
  201.     TR1 = 1;
  202. }


  203. /*
  204. * UART 发送一字节
  205. */
  206. void UART_send_byte(char dat)
  207. {
  208.         SBUF = dat;
  209.         while (TI == 0);
  210.         TI = 0;
  211. }


  212. /*
  213. * UART 发送字符串
  214. */
  215. void UART_send_string(unsigned char *buf)
  216. {
  217.         while (*buf != '\0')
  218.         {
  219.                 UART_send_byte(*buf++);
  220.         }
  221. }




  222. void main()
  223. {
  224.           unsigned char   Tx_Buf[12];
  225.           unsigned char LEDstatus;//灯的状态
  226.         Delay_ms(50);//上电延时100ms,等待SHT11启动
  227.         Init1602();                          //调用初始化显示函数
  228.          InitUART();                        //初始化串口
  229.         temp=90;
  230.         rh=90;
  231.          while(1)        
  232.         {
  233.                   getDHT11();                                                 //
  234.                   Tx_Buf[0]='T';                                                //帧头
  235.                   Tx_Buf[1]=F16T/10%10+0x30;                         //将数据送往发送数组,送给蓝牙模块让手机APP显示
  236.                   Tx_Buf[2]=F16T%10+0x30;               
  237.                   Tx_Buf[3]=F16RH/10%10+0x30;
  238.                   Tx_Buf[4]=F16RH%10+0x30;
  239.                   Tx_Buf[5]=temp/10%10+0x30;                         //将数据送往发送数组,送给蓝牙模块让手机APP显示
  240.                    Tx_Buf[6]=temp%10+0x30;               
  241.                   Tx_Buf[7]=rh/10%10+0x30;
  242.                    Tx_Buf[8]=rh%10+0x30;
  243.                   LEDstatus=LED1;
  244.                   Tx_Buf[9]=LEDstatus+0x30;                        //发送状态到APP显示
  245.                   LEDstatus=LED2;
  246.                   Tx_Buf[10]=LEDstatus+0x30;                    //发送状态到APP显示
  247.                   LEDstatus=LED3;
  248.                   Tx_Buf[11]=LEDstatus+0x30;                        //发送加湿状态到APP显示
  249.                   UART_send_string(Tx_Buf);                          //串口发送温湿度数据出去


  250.                
  251.                
  252.                
  253.                  Delay_ms(1000);
  254.         }
  255. }


  256. /*****************串口接收中断函数,接收蓝牙模块的数据*********************/
  257. void UARTInterrupt(void) interrupt 4
  258. {        
  259.         ES=0;                                                                        //关闭中断
  260.     if(RI)                                                                          //接收到数据
  261.     {
  262.                 Rx_buf[Rxnum]=SBUF;                                  //接收数据进数组
  263.                 if(Rx_buf[Rxnum]==0x0A)
  264.                 Rxnum=0;
  265.                 else
  266.                 Rxnum++;
  267.                 if(Rx_buf[0]==0x31)                                        //
  268.                 {
  269.                         if(Rx_buf[1]==0x30)                                //
  270.                         LED1=0;                                                        //
  271.                         if(Rx_buf[1]==0x31)                                //接收到的APP传送来的切换为手动指令
  272.                         LED1=1;                                                        //        
  273.                 }
  274.                 if(Rx_buf[0]==0x32)                                        //接收到的APP传送来的指令头部数据
  275.                 {
  276.                         if(Rx_buf[1]==0x30)                                //接收到的APP传送来的开指令
  277.                         LED2=0;                                                        //
  278.                         if(Rx_buf[1]==0x31)                                //
  279.                         LED2=1;                                                        //        
  280.                 }
  281.                 if(Rx_buf[0]==0x33)                                        //接收到的APP传送来的指令头部数据
  282.                 {
  283.                         if(Rx_buf[1]==0x30)                                //接收到的APP传送来的指令
  284.                         {
  285.                                 LED3=0;                                                //
  286.                         }
  287.                         else
  288.                         if(Rx_buf[1]==0x31)                            //接收到的APP传送来的指令
  289.                         {
  290.                                 LED3=1;                                                //        
  291.                         }
  292.                 }
  293.                 if(Rx_buf[0]==0x34)                                   //接收到的APP传送来的头数据
  294.                 {
  295.                         if(Rx_buf[1]==0x31)                           //
  296.                         {
  297.                                 temp++;                                           //
  298.                                 if(temp>99)
  299.                                 temp=99;
  300.                         }
  301.                         if(Rx_buf[1]==0x30)                           //
  302.                         {
  303.                                 temp--;                                           //
  304.                                 if(temp<1)
  305.                                 temp=1;
  306.                     }
  307.                         Rx_buf[1]=0;                                   //
  308.                 }
  309.                 if(Rx_buf[0]==0x35)                                  //接收到的APP传送来的指令头数据
  310.                 {
  311.                         if(Rx_buf[1]==0x31)                          //接收到的APP传送来的定值加1指令
  312.                         {
  313.                                 rh++;                                          //湿度定值加1
  314.                                 if(rh>99)
  315.                                 rh=99;
  316.                         }
  317.                         if(Rx_buf[1]==0x30)                          //接收到的APP传送来的设置定值减1指令
  318.                         {
  319.                                 rh--;                                          //
  320.                                 if(rh<1)
  321.                                 rh=1;
  322.                         }
  323.                         Rx_buf[1]=0;                                  //清除指令
  324.                 }
  325.         }
  326.     RI=0;
  327.            ES=1;                                                                          //关闭中断
  328. }
复制代码


程序.zip

57.51 KB, 下载次数: 40, 下载积分: 黑币 -5

蓝牙智能开关APP.zip

631.47 KB, 下载次数: 48, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:477532 发表于 2021-8-30 00:07 | 只看该作者
希望能加入帧头帧尾
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表