找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机+蓝牙模块如何接收10进制数据?

[复制链接]
跳转到指定楼层
楼主
ID:900977 发表于 2021-5-10 22:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下是源程序,“shu”是个变量,当我用蓝牙向单片机发送1的时候,单片机会将“shu”统计到的数发送给蓝牙,但是蓝牙接收到的数只能16进制显示,如果不选的十六进制显示的话,出现乱码!!!现在是如何解决,能让蓝牙接收到的数据十进制显示???各位大哥积极提个建议,谢谢了!

单片机源程序如下:
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int           //用"uint"代替"unsigned int"   无符号整数
#define uchar unsigned char                                        //用"uchar"代替"unsigned char" 无符号字符
unsigned char tmp;
sbit h1=P2^0;   //四个红外传感器
sbit h2=P2^1;
sbit h3=P2^2;
sbit h4=P2^3;
uint shu=0;
uint ji1,ji2,ji3,ji4;

void init();   //串口初始化

void send(unsigned char a);     //单字节发送函数

void ctrl(); //接收处理函数



void main()

{

                   init();

          while(1)

          {         

                  if(RI==1)                     //是否有数据到来

                  {

                   RI = 0;

                  tmp = SBUF;                   //暂存接收到的数据

                                       ctrl();

                                       }      

          }

}



void init()        //串口初始化

{

                   ES=0;                                                                       //关中断

                     SCON = 0x50;                        // REN=1允许串行接受状态,串口工作模式1,

                                                                                                         //10位UART(1位起始位,8位数据位,1位停止位,无奇偶校验),波特率可变



                     TMOD = 0x20;                        //定时器1工作于方式2,8位自动重载模式,用于产生波特率

          TH1=TL1=0xFD;                       //波特率9600

         

          PCON &= 0x7f;                       //波特率不倍增

          TR1 = 1;                                                                  //定时器1开始工作,产生波特率

                                                                                                         //发送标志位置0

                     TI=0;                                                                        //接收标志位置0

                     RI=0;

                     

                     //EA=0;

               ES=1;





                  
                                                  
                    
}

   

void send(unsigned char a)      //单字节数据发送

{                                                                //注意:若单片机TXD(P3.1)无上拉能力,必须在P3.1端接上拉电阻。本次测试需要接上拉电阻

         TI=0;         

         SBUF=a;

         while(TI==0);

         TI=0;



         

}



void ctrl()                      //接收处理函数

{

                                     switch(tmp)

                                       {

                                            case '1':

                                             
                                                                                                      
                                                        send(shu);

                                                        break;                                          

                                                                           }



        if(ji1==0&&ji2==0&&ji3==0&&ji4==0)                                                //如果四个红外传感器都感应到人
   {      
   shu=4;                                                                                                                                                                //则说明4人到场
   }  
     if(ji1==1&&ji2==1&&ji3==1&&ji4==1)                                        //如果四个红外传感器都没有感应到人
   {
   shu=0;                                                                                                                                                                //则0人到场,全部旷课
   }

      

        if(ji1==0&&ji2==0&&ji3==0&&ji4==1)                                                //如果有三个传感器感应到人,则说明三人到场
        {
        shu=3;
        }
                if(ji1==0&&ji2==0&&ji3==1&&ji4==0)
        {
        shu=3;
        }
                if(ji1==0&&ji2==1&&ji3==0&&ji4==0)
        {
        shu=3;
        }
                if(ji1==1&&ji2==0&&ji3==0&&ji4==0)
        {
        shu=3;
        }




        if(ji1==0&&ji2==0&&ji3==1&&ji4==1)                                                //如果两个传感器感应到人,则两人到场
        {
        shu=2;
        }
                if(ji1==1&&ji2==1&&ji3==0&&ji4==0)
        {
        shu=2;
        }
                if(ji1==0&&ji2==1&&ji3==1&&ji4==0)
        {
        shu=2;
        }
                if(ji1==1&&ji2==0&&ji3==0&&ji4==1)
        {
        shu=2;
        }

                   if(ji1==0&&ji2==1&&ji3==0&&ji4==1)
        {
        shu=2;
        }

                           if(ji1==1&&ji2==0&&ji3==1&&ji4==0)
        {
        shu=2;
        }

                                      if(ji1==0&&ji2==1&&ji3==1&&ji4==0)
        {
        shu=2;
        }

                           if(ji1==1&&ji2==0&&ji3==0&&ji4==1)
        {
        shu=2;
        }





                   if(ji1==0&&ji2==1&&ji3==1&&ji4==1)                                                        //如果有一个传感器感应到人,说明一人到场
        {
        shu=1;
        }


                                   if(ji1==1&&ji2==0&&ji3==1&&ji4==1)
        {
        shu=1;
        }

                           if(ji1==1&&ji2==1&&ji3==0&&ji4==1)
        {
        shu=1;
        }

                           if(ji1==1&&ji2==1&&ji3==1&&ji4==0)
        {
        shu=1;
        }

  if(h1==0)                                                //此处是红外传感器的感应触发,无实际意义,下同
  {
  ji1=0;  //低电平触发
  }
  else
  {
  ji1=1;
  }

    if(h2==0)
  {
  ji2=0;
  }
  else
  {
  ji2=1;
  }

    if(h3==0)
  {
  ji3=0;
  }
  else
  {
  ji3=1;
  }

    if(h4==0)
  {
  ji4=0;
  }
  else
  {
  ji4=1;
  }

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

使用道具 举报

沙发
ID:889094 发表于 2021-5-10 23:15 | 只看该作者
前面程序结构很好,只是为什么要把串口处理放在主函数中?
还是单独弄个串口服务程序的好。参考单片机手册中串口服务例程,我前段时间我自己写的串口服务函数少了一点点就中间出现莫名的问题。
可以参考下面两个函数
void Uart1_Int() interrupt 4                                        //串口1
{
        if(RI)
        {  
                   tmp = SBUF;                   //暂存接收到的数据
            RI = 0;
        }
        if(TI)
        {
                TI=0;
                busy=0;
        }
}
void send(unsigned char a)      //单字节数据发送
{                 
         while(busy);   
      busy=1;
          SBUF=a;

}

回复

使用道具 举报

板凳
ID:858964 发表于 2021-5-11 01:47 | 只看该作者
我做过一个项目,(单片机+蓝牙串口模块)接收来自手机的的数据,
例如,接收到4个16进数分别是0x38,0x39,0x35,0x32,
这4个数是ASCII码,对应的十进制数值就是8952。
回复

使用道具 举报

地板
ID:277550 发表于 2021-5-11 08:58 | 只看该作者
单片机中的int ? 是2个字节,unsigned int也是,所以,根据数据的长度,直接移位就可以。
回复

使用道具 举报

5#
ID:900977 发表于 2021-5-11 09:42 来自手机 | 只看该作者
Kxuan163 发表于 2021-5-11 01:47
我做过一个项目,(单片机+蓝牙串口模块)接收来自手机的的数据,
例如,接收到4个16进数分别是0x38,0x39, ...

我的也是接受到16进制,0x01就是1,0x02就是2,不懂怎么搞了
回复

使用道具 举报

6#
ID:900977 发表于 2021-5-11 09:45 来自手机 | 只看该作者
devcang 发表于 2021-5-11 08:58
单片机中的int ? 是2个字节,unsigned int也是,所以,根据数据的长度,直接移位就可以。

可以移位处理吗
回复

使用道具 举报

7#
ID:900977 发表于 2021-5-11 11:01 | 只看该作者
birdzhyli 发表于 2021-5-10 23:15
前面程序结构很好,只是为什么要把串口处理放在主函数中?
还是单独弄个串口服务程序的好。参考单片机手册 ...

我现在的1问题是,如何把接收到的16进制转为十进制,就是接收到的以十进制显示
回复

使用道具 举报

8#
ID:919213 发表于 2021-5-11 11:14 | 只看该作者
这个MCU和蓝牙是通过uart通信吗?
回复

使用道具 举报

9#
ID:401564 发表于 2021-5-12 00:15 | 只看该作者
16进制转换成10进制,那不是很简单的事情吗?
但问题是在显示那:16进制实际上是3位10进制,显示程序肯定是不一样的了
比如:0xFF=255,
如果是16进制显示,就只要两个位置
如果你要10进制显示,那就要3个位置
至于处理,倒也简单,0xFF进行算法和取模运算,就会得到2,5,5,得到这三个数,然后分别显示就行了
回复

使用道具 举报

10#
ID:889094 发表于 2021-5-12 01:06 来自手机 | 只看该作者
罗大韩 发表于 2021-5-11 11:01
我现在的1问题是,如何把接收到的16进制转为十进制,就是接收到的以十进制显示

你要发送的不是16进制数,你要发送的是字符串12345,先把你的数字转化成字符串,然后再发,方法简单,每一位都+字符0就是对应的字符了,cbai=shu%1000/100+'0'
回复

使用道具 举报

11#
ID:139866 发表于 2021-5-12 09:34 | 只看该作者
你发送的是一串数字,不论是10进制还是16进制都不改变他的大小,如果你想显示的是10进制字符串,那就在单片机端先把数字按位转换成16进制数,比如155D,转换成1H,5H,5H,再把16进制数字加上0X30,串口助手那里选中ASCII显示,就能显示155这个字符串
回复

使用道具 举报

12#
ID:900977 发表于 2021-5-13 16:59 | 只看该作者
birdzhyli 发表于 2021-5-12 01:06
你要发送的不是16进制数,你要发送的是字符串12345,先把你的数字转化成字符串,然后再发,方法简单,每 ...

谢谢了,我用你的方法实现了
回复

使用道具 举报

13#
ID:900977 发表于 2021-5-13 16:59 | 只看该作者
天ノ忆 发表于 2021-5-12 09:34
你发送的是一串数字,不论是10进制还是16进制都不改变他的大小,如果你想显示的是10进制字符串,那就在单片 ...

谢谢了
回复

使用道具 举报

14#
ID:900977 发表于 2021-5-13 17:00 | 只看该作者
Kxuan163 发表于 2021-5-11 01:47
我做过一个项目,(单片机+蓝牙串口模块)接收来自手机的的数据,
例如,接收到4个16进数分别是0x38,0x39, ...

谢谢您的建议,使用
回复

使用道具 举报

15#
ID:900977 发表于 2021-5-13 17:00 | 只看该作者
天ノ忆 发表于 2021-5-12 09:34
你发送的是一串数字,不论是10进制还是16进制都不改变他的大小,如果你想显示的是10进制字符串,那就在单片 ...

谢谢您的建议
回复

使用道具 举报

16#
ID:879348 发表于 2021-5-13 17:25 | 只看该作者
sprintf函数变换成字符串发送
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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