找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2658|回复: 1
收起左侧

C51单片机 蓝牙 串口、温度、1602主机从机代码分享

[复制链接]
ID:408809 发表于 2021-3-26 15:25 | 显示全部楼层 |阅读模式
感兴趣的朋友们可以参考哈,如有更好的建议多谢指点!!!
等我哪天把它整合到我的车载 温控GPS系统里面。
程序分主从两部分......
000111.jpg

单片机主机源程序如下:
  1. //***********************************************
  2. //晶振:11.0592
  3. //波特率:9600          (主机)
  4. //液晶:1602
  5. //***********************************************
  6. #include <reg52.h>
  7. #include "LCD1602.h"
  8. #include <math.h>

  9. //*************************************************************************************************
  10. #define uchar unsigned char
  11. #define uint unsigned int
  12.        
  13. static int count=0;//数组计数
  14.        
  15. static int begin=0;//当为0时表示对于接收到的数据丢弃,1表示接收的数据放到数组array中
  16.        
  17. int flags;//标志位,用到测试用
  18.        
  19. char xdata array[9]={0};//数组
  20.        
  21. char temp;
  22.        
  23. uchar i, j, flag;

  24. //****************************************************************************************************

  25. sbit LED=P1^0;



  26.        
  27.    
  28.        

  29. void ZCxshm()  //正常显示画面
  30.         {
  31.                 stringaddress(2,0,"TEMP:");
  32.                 lcdwritecom(0xc0+14);         // 14表示第15列
  33.                 lcdwritedata(0xdf);           // 温度符号的小圈
  34.                 stringaddress(2,15,"C");

  35.         }
  36.        
  37. void Intcon() // 初始化 TCON:控制寄存器,作用是控制定时器的启、停,标志定时器溢出和中断情况。
  38.         {
  39.                 IT0=1;   //IT0   :IT0=1表示INT0为下降沿(负跳变)触发,IT0=0表示INT0为低电平触发。
  40.                 EX0=1;  //EX0   :INT0中断允许位;EX0=1允许中断。
  41.                 EA=1;  //EA=1允许中断
  42.         }
  43.        
  44. /**********************************************************************************************/       
  45.        
  46. void main()
  47.         {
  48.                 TMOD = 0x20;
  49.                 TH1 = 0xfd;//9600赫兹
  50.                 TL1 = 0xfd;
  51.                 TR1 = 1; //开启时间中断

  52.                 SCON = 0x50;//方式2
  53.                 SM2 = 1; //可以向cpu请求中断
  54.                 EA = 1; //开总中断
  55.                 ES = 1; //开串口中断
  56.                

  57.                 lcdinit();  // LCD显示器初始化
  58.                 Intcon();   // 初始化 TCON:控制寄存器,作用是控制定时器的启、停,标志定时器溢出和中断情况。
  59.                
  60.        
  61.                 ZCxshm();  //正常显示画面
  62.                
  63.                 while(1)
  64.                         {
  65.                        
  66.                                 lcdwritecom(0xC0+6);  
  67.                                 lcdwritedata(array[2]);
  68.                                 lcdwritecom(0xC0+7);         
  69.                                 lcdwritedata(array[3]);
  70.                                 lcdwritecom(0xC0+8);         
  71.                                 lcdwritedata(array[4]);
  72.                                 lcdwritecom(0xC0+9);         
  73.                                 lcdwritedata(array[5]);
  74.                                 lcdwritecom(0xC0+10);         
  75.                                 lcdwritedata(array[6]);

  76.                                
  77.                         }
  78.         }
  79.        
  80. //************************************************************************************************       
  81. void Serial() interrupt 4
  82.         {

  83.                 RI = 0;
  84.                 temp=SBUF;
  85.                 if(temp=='<'||begin==1)//如果是<,则接下来的数据都是要接收的,如果begin是1也表示是要接收的
  86.                          {
  87.                                  begin=1;
  88.                                  if(temp!='<')//因为<是标致位,所以我们是要丢弃的
  89.                                                  {
  90.                                                          if(temp!='>')
  91.                                                                         {
  92.                                                                                 array[count]=temp;   
  93.                                                                                 count++;
  94.                                                                         }

  95.                                                                 else if(temp=='>')//停止位
  96.                                                                         {
  97.                                                                                 begin=0;
  98.                                                                                 count=0;
  99.                                                                                 flags=1;
  100.                                                                         }

  101.                                                 }
  102.                                 }
  103.         }       
  104.        
  105.        
复制代码
从机代码:

  1. #include "temp.H"

  2. void Delay1ms(unsigned int y) //延时函数
  3.         {
  4.                 unsigned int x;
  5.                 for(y;y>0;y--)
  6.                 for(x=110;x>0;x--);
  7.         }
  8.        
  9. unsigned char Ds18b20Init()  //DS18B20 的初始化函数
  10.         {
  11.         unsigned int i;
  12.         DSPORT=0;
  13.         i=70;
  14.         while(i--);// 延时 642us
  15.         DSPORT=1;
  16.         i=0;
  17.         while(DSPORT) //等待 DS18B20 拉低总线
  18.                 {
  19.                         i++;
  20.                         if(i>5000)// 等待>5MS
  21.                         return 0;//初始化失败
  22.                 }
  23.         return 1;//初始化成功
  24.         }
  25.        
  26.        
  27. void Ds18b20WriteByte(unsigned char dat)  //向 DS18B20写入一个字节
  28.         {
  29.         unsigned int i,j;
  30.         for(j=0;j<8;j++)
  31.                 {
  32.                         DSPORT=0; //每写入一位数据之前先把总线拉低 1us
  33.                         i++;
  34.                         DSPORT=dat&0x01; //然后写入一个数据,从最低位开始
  35.                         i=6;
  36.                         while(i--); // 延时 68us,持续时间最少 60us
  37.                         DSPORT=1; // 然后释放总线,至少 1us给总线恢复时间才能接着写入第
  38.                         //二个数值
  39.                         dat>>=1;
  40.                 }
  41.         }
  42.        
  43. unsigned char Ds18b20ReadByte() //向 DS18B20 读取一个字节
  44.         {
  45.         unsigned char byte,bi;
  46.         unsigned int i,j;
  47.         for(j=8;j>0;j--)
  48.                 {
  49.                         DSPORT=0;//先将总线拉低 1us
  50.                         i++;
  51.                         DSPORT=1;//然后释放总线
  52.                         i++;
  53.                         i++;//延时 6us等待数据稳定
  54.                         bi=DSPORT;  //读取数据,从最低位开始读取
  55.                         /*将 byte 右移一位,然后或上左移 7 位后的 bi,注意移动之后移掉那位
  56.                         补 0。*/
  57.                         byte=(byte>>1)|(bi<<7);
  58.                         i=4; //读取完之后等待 48us再接着读取下一个数
  59.                         while(i--);
  60.                 }
  61.         return byte;
  62.         }
  63.        
  64. void  Ds18b20ChangTemp() // 让 DS18B20 开始转换温度
  65.         {
  66.                 Ds18b20Init();
  67.                 Delay1ms(1);
  68.                 Ds18b20WriteByte(0xcc);  //跳过 ROM 操作命令
  69.                 Ds18b20WriteByte(0x44);  //温度转换命令
  70.         }
  71.        
  72. void  Ds18b20ReadTempCom() //发送读取温度命令
  73.         {
  74.                 Ds18b20Init();
  75.                 Delay1ms(1);
  76.                 Ds18b20WriteByte(0xcc);  //跳过 ROM 操作命令
  77.                 Ds18b20WriteByte(0xbe);  //发送读取温度命令
  78.         }
  79.        
  80. int Ds18b20ReadTemp()  //读取温度
  81.         {
  82.                 int temp=0;
  83.                 unsigned char tmh,tml;
  84.                 Ds18b20ChangTemp();  //先写入转换命令
  85.                 Ds18b20ReadTempCom();  //然后等待转换完后发送读取温度命令
  86.                 tml=Ds18b20ReadByte();  //读取温度值共 16 位,先读低字节
  87.                 tmh=Ds18b20ReadByte();  //再读高字节
  88.                 temp=tmh;
  89.                 temp<<=8;
  90.                 temp|=tml;
  91.                 return temp;
  92.         }
复制代码


所有代码51hei提供下载:
单片机蓝牙串口温度例子 -我修改版.7z (27.06 KB, 下载次数: 40)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:110875 发表于 2021-3-26 22:49 | 显示全部楼层
如果没有记错的话,处理以上软件外,两个蓝牙模块需要通过AT指令配对为主从机模式才可以正常运行。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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