找回密码
 立即注册

QQ登录

只需一步,快速开始

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

手机蓝牙控制51单片机温湿度检测及继电器浇水

[复制链接]
跳转到指定楼层
楼主
一个蓝牙串口模块,用51单片机通信。


单片机源程序如下:

  1. #include <intrins.h>
  2. #include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器

  3. typedef unsigned int u16;          //对数据类型进行声明定义
  4. typedef unsigned char u8;
  5. #define   Data_0_time    4   

  6. sbit  rec  = P2^1 ;
  7. sbit out=P2^0;
  8. u8  u8FLAG,k;
  9. u8  u8count,u8temp;
  10. u8  u8T_data_H,u8T_data_L,u8RH_data_H,u8RH_data_L,u8checkdata;
  11. u8  u8T_data_H_temp,u8T_data_L_temp,u8RH_data_H_temp,u8RH_data_L_temp,u8checkdata_temp;
  12. u8  u8comdata;
  13. u8  outdata[5];  //定义发送的字节数          
  14. u8  indata[5];
  15. u8  count, count_r=0;
  16. u8  str[5]={"ok000"};
  17. u8 flag =0;
  18. u16 u16temp1,u16temp2;
  19. void SendData(u8 *a)
  20. {
  21.         outdata[0] = a[0];
  22.         outdata[1] = a[1];
  23.         outdata[2] = a[2];
  24.         outdata[3] = a[3];
  25.         outdata[4] = a[4];
  26.         count = 1;
  27.         SBUF=outdata[0];
  28. }
  29.   void Delay(u16 j)
  30.     {      u8 i;
  31.             for(;j>0;j--)
  32.           {        
  33.                 for(i=0;i<27;i++);

  34.           }
  35.     }
  36.                
  37. void  Delay_10us(void)
  38.       {
  39.         u8 i;
  40.         i--;
  41.         i--;
  42.         i--;
  43.         i--;
  44.         i--;
  45.         i--;
  46.        }
  47.                          
  48.   void  COM(void)
  49.       {
  50.      
  51.                 u8 i;
  52.          
  53.        for(i=0;i<8;i++)          
  54.             {
  55.                
  56.                        u8FLAG=2;       
  57.                    while((!rec)&&u8FLAG++);
  58.                         Delay_10us();
  59.                     Delay_10us();
  60.                         Delay_10us();
  61.                           u8temp=0;
  62.              if(rec)u8temp=1;
  63.                     u8FLAG=2;
  64.                  while((rec)&&u8FLAG++);
  65.                    //超时则跳出for循环                  
  66.                     if(u8FLAG==1)break;
  67.                    //判断数据位是0还是1         
  68.                      
  69.                 // 如果高电平高过预定0高电平值则数据位为 1
  70.                     
  71.                    u8comdata<<=1;
  72.                       u8comdata|=u8temp;        //0
  73.              }//rof
  74.           
  75.         }


  76. void RH(void)
  77.         {
  78.           //主机拉低18ms
  79.        rec=0;
  80.            Delay(180);
  81.            rec=1;
  82.          //总线由上拉电阻拉高 主机延时20us
  83.            Delay_10us();
  84.            Delay_10us();
  85.            Delay_10us();
  86.            Delay_10us();
  87.          //主机设为输入 判断从机响应信号
  88.            rec=1;
  89.          //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行          
  90.            if(!rec)                 //T !          
  91.            {
  92.            u8FLAG=2;
  93.          //判断从机是否发出 80us 的低电平响应信号是否结束         
  94.            while((!rec)&&u8FLAG++);
  95.            u8FLAG=2;
  96.          //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
  97.            while((rec)&&u8FLAG++);
  98.          //数据接收状态                 
  99.            COM();
  100.            u8RH_data_H_temp=u8comdata;
  101.            COM();
  102.            u8RH_data_L_temp=u8comdata;
  103.            COM();
  104.            u8T_data_H_temp=u8comdata;
  105.            COM();
  106.            u8T_data_L_temp=u8comdata;
  107.            COM();
  108.            u8checkdata_temp=u8comdata;
  109.            rec=1;
  110.          //数据校验
  111.          
  112.            u8temp=(u8T_data_H_temp+u8T_data_L_temp+u8RH_data_H_temp+u8RH_data_L_temp);
  113.            if(u8temp==u8checkdata_temp)
  114.            {
  115.                      u8RH_data_H=u8RH_data_H_temp;
  116.                      u8RH_data_L=u8RH_data_L_temp;
  117.                   u8T_data_H=u8T_data_H_temp;
  118.                      u8T_data_L=u8T_data_L_temp;
  119.                      u8checkdata=u8checkdata_temp;
  120.            }
  121.            }

  122.         }       
  123. void UsartInit()
  124. {
  125.         SCON=0X50;                        //设置为工作方式1
  126.         TMOD=0X20;                        //设置计数器工作方式2
  127.         PCON&=0X7f;                       
  128.         TH1=0XFd;                               
  129.         TL1=0XFd;
  130.         ES=1;                                                //打开接收中断
  131.         EA=1;                                                //打开总中断
  132.         TR1=1;                                        //打开计数器
  133. }


  134. void main()
  135. {       
  136.        
  137.         UsartInit();  //        串口初始?
  138.   //SendData(str) ;   //发送到串口
  139.         Delay(1);         //延时100US(12M晶振)
  140.         while(1)
  141.         {

  142.                   
  143.                 if(flag==1)
  144.                 {out=!out;
  145.                 flag=0;
  146.                 }
  147.                 if(flag==2)
  148.                 {
  149.                         RH();
  150.                  str[0]=u8RH_data_H;
  151.            str[1]=u8RH_data_L;
  152.            str[2]=u8T_data_H;
  153.            str[3]=u8T_data_L;
  154.            str[4]=u8checkdata;
  155.            SendData(str) ;  //发送到串口
  156.      Delay(20000);               
  157.                         flag=0;
  158.                 }
  159.         }               
  160. }

  161. /*******************************************************************************
  162. 串口通信中断函数
  163. *******************************************************************************/
  164. void Usart() interrupt 4
  165. {
  166.         if(RI==1)
  167.                 {
  168.         u8 receiveData;
  169.         receiveData=SBUF;
  170.         if(receiveData==0)flag=1;
  171.         else if(receiveData==1)flag=2;
  172.         RI = 0;//清除接收中断标志位
  173.                 }
  174.        
  175.         if(TI==1) //发送中断          
  176.         {
  177.                 TI=0;
  178.                 if(count!=5) //发送完5位数据         
  179.                 {
  180.                         SBUF= outdata[count];
  181.                         count++;
  182.                 }
  183.         }
  184.         }
复制代码

所有资料51hei提供下载:
51单片机蓝牙控制.zip (71.21 KB, 下载次数: 49)


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

使用道具 举报

沙发
ID:544558 发表于 2019-6-6 21:20 | 只看该作者
大佬,请问有原理图嘛
回复

使用道具 举报

无效楼层,该帖已经被删除
无效楼层,该帖已经被删除
5#
无效楼层,该帖已经被删除
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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