久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3823|回復: 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;
  }

}
回復

使用道具 舉報

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也是,所以,根據數據的長度,直接移位就可以。
回復

使用道具 舉報

ID:900977 發表于 2021-5-11 09:42 來自手機 | 顯示全部樓層
Kxuan163 發表于 2021-5-11 01:47
我做過一個項目,(單片機+藍牙串口模塊)接收來自手機的的數據,
例如,接收到4個16進數分別是0x38,0x39, ...

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

使用道具 舉報

ID:900977 發表于 2021-5-11 09:45 來自手機 | 顯示全部樓層
devcang 發表于 2021-5-11 08:58
單片機中的int ? 是2個字節,unsigned int也是,所以,根據數據的長度,直接移位就可以。

可以移位處理嗎
回復

使用道具 舉報

ID:900977 發表于 2021-5-11 11:01 | 顯示全部樓層
birdzhyli 發表于 2021-5-10 23:15
前面程序結構很好,只是為什么要把串口處理放在主函數中?
還是單獨弄個串口服務程序的好。參考單片機手冊 ...

我現在的1問題是,如何把接收到的16進制轉為十進制,就是接收到的以十進制顯示
回復

使用道具 舉報

ID:919213 發表于 2021-5-11 11:14 | 顯示全部樓層
這個MCU和藍牙是通過uart通信嗎?
回復

使用道具 舉報

ID:401564 發表于 2021-5-12 00:15 | 顯示全部樓層
16進制轉換成10進制,那不是很簡單的事情嗎?
但問題是在顯示那:16進制實際上是3位10進制,顯示程序肯定是不一樣的了
比如:0xFF=255,
如果是16進制顯示,就只要兩個位置
如果你要10進制顯示,那就要3個位置
至于處理,倒也簡單,0xFF進行算法和取模運算,就會得到2,5,5,得到這三個數,然后分別顯示就行了
回復

使用道具 舉報

ID:889094 發表于 2021-5-12 01:06 來自手機 | 顯示全部樓層
羅大韓 發表于 2021-5-11 11:01
我現在的1問題是,如何把接收到的16進制轉為十進制,就是接收到的以十進制顯示

你要發送的不是16進制數,你要發送的是字符串12345,先把你的數字轉化成字符串,然后再發,方法簡單,每一位都+字符0就是對應的字符了,cbai=shu%1000/100+'0'
回復

使用道具 舉報

ID:139866 發表于 2021-5-12 09:34 | 顯示全部樓層
你發送的是一串數字,不論是10進制還是16進制都不改變他的大小,如果你想顯示的是10進制字符串,那就在單片機端先把數字按位轉換成16進制數,比如155D,轉換成1H,5H,5H,再把16進制數字加上0X30,串口助手那里選中ASCII顯示,就能顯示155這個字符串
回復

使用道具 舉報

ID:900977 發表于 2021-5-13 16:59 | 顯示全部樓層
birdzhyli 發表于 2021-5-12 01:06
你要發送的不是16進制數,你要發送的是字符串12345,先把你的數字轉化成字符串,然后再發,方法簡單,每 ...

謝謝了,我用你的方法實現了
回復

使用道具 舉報

ID:900977 發表于 2021-5-13 16:59 | 顯示全部樓層
天ノ憶 發表于 2021-5-12 09:34
你發送的是一串數字,不論是10進制還是16進制都不改變他的大小,如果你想顯示的是10進制字符串,那就在單片 ...

謝謝了
回復

使用道具 舉報

ID:900977 發表于 2021-5-13 17:00 | 顯示全部樓層
Kxuan163 發表于 2021-5-11 01:47
我做過一個項目,(單片機+藍牙串口模塊)接收來自手機的的數據,
例如,接收到4個16進數分別是0x38,0x39, ...

謝謝您的建議,使用
回復

使用道具 舉報

ID:900977 發表于 2021-5-13 17:00 | 顯示全部樓層
天ノ憶 發表于 2021-5-12 09:34
你發送的是一串數字,不論是10進制還是16進制都不改變他的大小,如果你想顯示的是10進制字符串,那就在單片 ...

謝謝您的建議
回復

使用道具 舉報

ID:879348 發表于 2021-5-13 17:25 | 顯示全部樓層
sprintf函數變換成字符串發送
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品亚洲一区 | 国产探花在线精品一区二区 | 国产免费视频 | 超碰人人人人 | 日本一区二区三区视频在线 | 中文字幕乱码一区二区三区 | 成人午夜在线观看 | 99久久亚洲| 韩日一区二区 | 久久久看 | 91在线电影 | 性欧美xxxx| 羞羞色网站 | 亚洲一区精品在线 | 黑人巨大精品欧美一区二区免费 | 久久精品国产一区二区电影 | 成人欧美一区二区三区黑人孕妇 | 国产成人高清 | 午夜视频一区二区 | 日韩小视频在线 | 日韩欧美三级 | 午夜视频在线观看视频 | 免费黄色片在线观看 | 久久精品久久久 | 精一区二区 | 黄色在线观看网址 | va在线| 亚洲精品视频在线播放 | 欧美精品一二三区 | 99精品一区二区三区 | 亚洲精品一区二区三区 | 成人国产精品久久 | 国产区精品视频 | 国产精品免费观看 | 99re在线视频观看 | 亚洲国产激情 | 欧美在线视频一区 | 亚洲精品中文字幕在线 | 日韩在线中文 | www.日韩av.com| 欧美日韩中文在线 |