找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10307|回复: 2
收起左侧

基于蓝牙连接的51单片机温度传感器Proteus仿真+源程序

[复制链接]
ID:523095 发表于 2019-4-27 17:44 | 显示全部楼层 |阅读模式
基于蓝牙连接的51单片机温度传感器仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
仿真截图.png 0.png

单片机源程序如下:
  1. //****************************************************************//
  2. //       DHT21使用范例
  3. //单片机 AT89S52 或 STC89C52RC
  4. //功能   串口发送温湿度数据 晶振 11.0592M 波特率 9600
  5. //硬件   P2.0口为通讯口连接DHT11,DHT11的电源和地连接单片机的电源和地,单片机串口加MAX232连接电脑
  6. //公司  雁凌电子   
  7. //****************************************************************//

  8. #include <reg51.h>
  9. //#include <intrins.h>
  10. //
  11. typedef unsigned char  U8;       /* defined for unsigned 8-bits integer variable       无符号8位整型变量  */
  12. typedef signed   char  S8;       /* defined for signed 8-bits integer variable          有符号8位整型变量  */
  13. typedef unsigned int   U16;      /* defined for unsigned 16-bits integer variable       无符号16位整型变量 */
  14. typedef signed   int   S16;      /* defined for signed 16-bits integer variable       有符号16位整型变量 */
  15. typedef unsigned long  U32;      /* defined for unsigned 32-bits integer variable       无符号32位整型变量 */
  16. typedef signed   long  S32;      /* defined for signed 32-bits integer variable       有符号32位整型变量 */
  17. typedef float          F32;      /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */
  18. typedef double         F64;      /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */
  19. //
  20. #define uchar unsigned char
  21. #define uint unsigned int
  22. #define   Data_0_time    4

  23. //----------------------------------------------//
  24. //----------------IO口定义区--------------------//
  25. //----------------------------------------------//
  26. sbit  P2_0  = P2^0 ;
  27. sbit  LED = P3^7;
  28. extern void InitLcd1602();
  29. extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
  30. void ConfigUART(unsigned int baud);
  31. //----------------------------------------------//
  32. //----------------定义区--------------------//
  33. //----------------------------------------------//
  34. U8  U8FLAG,k;
  35. U8  U8count,U8temp;
  36. U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
  37. U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  38. U8  U8comdata;
  39.    
  40. U8 str_T[15];
  41. U8 str_H[15];



  42.        void Delay(U16 j)
  43.     {      U8 i;
  44.         for(;j>0;j--)
  45.       {     
  46.         for(i=0;i<27;i++);

  47.       }
  48.     }
  49.       void  Delay_10us(void)
  50.       {
  51.         U8 i;
  52.         i--;
  53.         i--;
  54.         i--;
  55.         i--;
  56.         i--;
  57.         i--;

  58.        }
  59.    
  60.         void  COM(void)
  61.       {
  62.      
  63.             U8 i;
  64.          
  65.        for(i=0;i<8;i++)      
  66.         {
  67.         
  68.                U8FLAG=2;   
  69.            while((!P2_0)&&U8FLAG++);
  70.             Delay_10us();
  71.             Delay_10us();               
  72.             Delay_10us();
  73.               U8temp=0;
  74.          if(P2_0)U8temp=1;
  75.             U8FLAG=2;
  76.          while((P2_0)&&U8FLAG++);
  77.            //超时则跳出for循环         
  78.             if(U8FLAG==1)break;
  79.            //判断数据位是0还是1     
  80.               
  81.         // 如果高电平高过预定0高电平值则数据位为 1
  82.             
  83.            U8comdata<<=1;
  84.               U8comdata|=U8temp;        //0
  85.          }//rof
  86.       
  87.     }

  88.     //--------------------------------
  89.     //-----湿度读取子程序 ------------
  90.     //--------------------------------
  91.     //----以下变量均为全局变量--------
  92.     //----温度高8位== U8T_data_H------
  93.     //----温度低8位== U8T_data_L------
  94.     //----湿度高8位== U8RH_data_H-----
  95.     //----湿度低8位== U8RH_data_L-----
  96.     //----校验 8位 == U8checkdata-----
  97.     //----调用相关子程序如下----------
  98.     //---- Delay();, Delay_10us();,COM();
  99.     //--------------------------------

  100.     void RH(void)
  101.     {
  102.       //主机拉低18ms
  103.        P2_0=0;
  104.        Delay(180);
  105.        P2_0=1;
  106.      //总线由上拉电阻拉高 主机延时20us
  107.        Delay_10us();
  108.        Delay_10us();
  109.        Delay_10us();
  110.        Delay_10us();        
  111.      //主机设为输入 判断从机响应信号
  112.        P2_0=1;
  113.      //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行      
  114.        if(!P2_0)         //T !      
  115.        {
  116.        U8FLAG=2;
  117.      //判断从机是否发出 80us 的低电平响应信号是否结束     
  118.        while((!P2_0)&&U8FLAG++);
  119.        U8FLAG=2;
  120.      //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
  121.        while((P2_0)&&U8FLAG++);
  122.      //数据接收状态         
  123.        COM();
  124.        U8RH_data_H_temp=U8comdata;
  125.        COM();
  126.        U8RH_data_L_temp=U8comdata;
  127.        COM();
  128.        U8T_data_H_temp=U8comdata;
  129.        COM();
  130.        U8T_data_L_temp=U8comdata;
  131.        COM();
  132.        U8checkdata_temp=U8comdata;
  133.        P2_0=1;
  134.      //数据校验
  135.      
  136.        U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  137.        if(U8temp==U8checkdata_temp)
  138.        {
  139.              U8RH_data_H=U8RH_data_H_temp;
  140.              U8RH_data_L=U8RH_data_L_temp;
  141.           U8T_data_H=U8T_data_H_temp;
  142.              U8T_data_L=U8T_data_L_temp;
  143.              U8checkdata=U8checkdata_temp;
  144.        }//fi
  145.        }//fi

  146.     }
  147. //向串口发送一个字符  
  148. void send_char_com(unsigned char ch)
  149.   {     
  150.   SBUF=ch;   
  151.   while(TI==0);   
  152.   TI=0;
  153.   }
  154. //向串口发送一个字符串,strlen为该字符串长度   
  155. void send_string_com(unsigned char *str,unsigned int strlen)
  156. {
  157.    unsigned int k=0;   
  158.    do
  159.    {  
  160.    send_char_com(*(str + k));   
  161.    k++;     
  162.    }
  163.    while(k < strlen);
  164. }
  165.    
  166. //----------------------------------------------
  167. //main()功能描述:  AT89C51  11.0592MHz     串口发
  168. //送温湿度数据,波特率 9600
  169. //----------------------------------------------
  170. void main()
  171. {   
  172.     ConfigUART(9600);  //配置波特率为9600
  173.     InitLcd1602();     //初始化液晶

  174.     while(1)
  175.     {  

  176.        //------------------------
  177.        //调用温湿度读取子程序
  178.        RH();
  179.        //串口显示程序
  180.        //--------------------------
  181.        str_T[0] = 'T';
  182.        str_T[1] = 'e';
  183.        str_T[2] = 'm';
  184.        str_T[3] = ':';                         // 温度
  185.        str_T[4]=U8T_data_H%100/10+0x30;    // 整数十位
  186.        str_T[5]=U8T_data_H%10+0x30;        // 整数个位
  187.        str_T[6] = '.';  
  188.        str_T[7]=U8T_data_L%100/10+0x30;    // 小数后一位
  189.        str_T[8]=U8T_data_L%10+0x30;        // 小数后两位
  190.        str_T[9] = ' ' ;
  191.        str_T[10] = 'C' ;
  192.        str_T[11] = ' ' ;
  193.        str_T[12] = ' ' ;
  194.       
  195.        str_H[0] = 'H';
  196.        str_H[1] = 't';
  197.        str_H[2] = 'y';
  198.        str_H[3] = ':';                       // 湿度
  199.        str_H[4]=U8RH_data_H%100/10+0x30;   // 整数十位
  200.        str_H[5]=U8RH_data_H%10+0x30;          // 整数个位
  201.        str_H[6] = '.';
  202.        str_H[7]=U8RH_data_L%100/10+0x30;      // 小数后一位
  203.        str_H[8]=U8RH_data_L%10+0x30;          // 小数后两位
  204.        str_H[9]= ' ';
  205.        str_H[10]= '%';
  206.        str_H[11]= 'R';
  207.        str_H[12]= 'H';
  208.        str_H[13]= ' ';
  209.        str_H[14]= ' ';      
  210.        str_H[15]= '\x0a';                                    
  211.       
  212.        send_string_com(str_T,13);
  213.        send_string_com(str_H,16);

  214.        LcdShowStr(0, 0, str_T);        //显示到液晶屏上
  215.        LcdShowStr(0, 1, str_H);        //显示到液晶屏上
  216.        LED =~LED;
  217.        //读取模块数据周期不宜小于 2S
  218.        Delay(20000);
  219.     }//elihw
  220.    
  221. }

  222. /* 串口配置函数,baud-通信波特率 */
  223. void ConfigUART(unsigned int baud)
  224. {
  225.     SCON  = 0x50;  //配置串口为模式1
  226.     TMOD &= 0x0F;  //清零T1的控制位
  227.     TMOD |= 0x20;  //配置T1为模式2
  228.     TH1 = 256 - (11059200/12/32)/baud;  //计算T1重载值
  229.     TL1 = TH1;     //初值等于重载值
  230.     ET1 = 0;       //禁止T1中断
  231.     TR1 = 1;       //启动T1
  232. }
复制代码

所有资料51hei提供下载:
蓝牙的温湿度检测系统的设计.rar (246.55 KB, 下载次数: 334)
回复

使用道具 举报

ID:523095 发表于 2019-4-27 17:44 | 显示全部楼层
大家看一看
回复

使用道具 举报

ID:746321 发表于 2020-5-8 19:44 | 显示全部楼层
最近刚好在学单片机,看一看!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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