找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3841|回復(fù): 15
收起左側(cè)

單片機(jī)+藍(lán)牙模塊如何接收10進(jìn)制數(shù)據(jù)?

[復(fù)制鏈接]
ID:900977 發(fā)表于 2021-5-10 22:07 | 顯示全部樓層 |閱讀模式
以下是源程序,“shu”是個(gè)變量,當(dāng)我用藍(lán)牙向單片機(jī)發(fā)送1的時(shí)候,單片機(jī)會(huì)將“shu”統(tǒng)計(jì)到的數(shù)發(fā)送給藍(lán)牙,但是藍(lán)牙接收到的數(shù)只能16進(jìn)制顯示,如果不選的十六進(jìn)制顯示的話,出現(xiàn)亂碼。。‖F(xiàn)在是如何解決,能讓藍(lán)牙接收到的數(shù)據(jù)十進(jìn)制顯示???各位大哥積極提個(gè)建議,謝謝了!

單片機(jī)源程序如下:
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int           //用"uint"代替"unsigned int"   無(wú)符號(hào)整數(shù)
#define uchar unsigned char                                        //用"uchar"代替"unsigned char" 無(wú)符號(hào)字符
unsigned char tmp;
sbit h1=P2^0;   //四個(gè)紅外傳感器
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);     //單字節(jié)發(fā)送函數(shù)

void ctrl(); //接收處理函數(shù)



void main()

{

                   init();

          while(1)

          {         

                  if(RI==1)                     //是否有數(shù)據(jù)到來(lái)

                  {

                   RI = 0;

                  tmp = SBUF;                   //暫存接收到的數(shù)據(jù)

                                       ctrl();

                                       }      

          }

}



void init()        //串口初始化

{

                   ES=0;                                                                       //關(guān)中斷

                     SCON = 0x50;                        // REN=1允許串行接受狀態(tài),串口工作模式1,

                                                                                                         //10位UART(1位起始位,8位數(shù)據(jù)位,1位停止位,無(wú)奇偶校驗(yàn)),波特率可變



                     TMOD = 0x20;                        //定時(shí)器1工作于方式2,8位自動(dòng)重載模式,用于產(chǎn)生波特率

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

         

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

          TR1 = 1;                                                                  //定時(shí)器1開(kāi)始工作,產(chǎn)生波特率

                                                                                                         //發(fā)送標(biāo)志位置0

                     TI=0;                                                                        //接收標(biāo)志位置0

                     RI=0;

                     

                     //EA=0;

               ES=1;





                  
                                                  
                    
}

   

void send(unsigned char a)      //單字節(jié)數(shù)據(jù)發(fā)送

{                                                                //注意:若單片機(jī)TXD(P3.1)無(wú)上拉能力,必須在P3.1端接上拉電阻。本次測(cè)試需要接上拉電阻

         TI=0;         

         SBUF=a;

         while(TI==0);

         TI=0;



         

}



void ctrl()                      //接收處理函數(shù)

{

                                     switch(tmp)

                                       {

                                            case '1':

                                             
                                                                                                      
                                                        send(shu);

                                                        break;                                          

                                                                           }



        if(ji1==0&&ji2==0&&ji3==0&&ji4==0)                                                //如果四個(gè)紅外傳感器都感應(yīng)到人
   {      
   shu=4;                                                                                                                                                                //則說(shuō)明4人到場(chǎng)
   }  
     if(ji1==1&&ji2==1&&ji3==1&&ji4==1)                                        //如果四個(gè)紅外傳感器都沒(méi)有感應(yīng)到人
   {
   shu=0;                                                                                                                                                                //則0人到場(chǎng),全部曠課
   }

      

        if(ji1==0&&ji2==0&&ji3==0&&ji4==1)                                                //如果有三個(gè)傳感器感應(yīng)到人,則說(shuō)明三人到場(chǎng)
        {
        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)                                                //如果兩個(gè)傳感器感應(yīng)到人,則兩人到場(chǎng)
        {
        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)                                                        //如果有一個(gè)傳感器感應(yīng)到人,說(shuō)明一人到場(chǎng)
        {
        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)                                                //此處是紅外傳感器的感應(yīng)觸發(fā),無(wú)實(shí)際意義,下同
  {
  ji1=0;  //低電平觸發(fā)
  }
  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;
  }

}
回復(fù)

使用道具 舉報(bào)

ID:889094 發(fā)表于 2021-5-10 23:15 | 顯示全部樓層
前面程序結(jié)構(gòu)很好,只是為什么要把串口處理放在主函數(shù)中?
還是單獨(dú)弄個(gè)串口服務(wù)程序的好。參考單片機(jī)手冊(cè)中串口服務(wù)例程,我前段時(shí)間我自己寫(xiě)的串口服務(wù)函數(shù)少了一點(diǎn)點(diǎn)就中間出現(xiàn)莫名的問(wèn)題。
可以參考下面兩個(gè)函數(shù)
void Uart1_Int() interrupt 4                                        //串口1
{
        if(RI)
        {  
                   tmp = SBUF;                   //暫存接收到的數(shù)據(jù)
            RI = 0;
        }
        if(TI)
        {
                TI=0;
                busy=0;
        }
}
void send(unsigned char a)      //單字節(jié)數(shù)據(jù)發(fā)送
{                 
         while(busy);   
      busy=1;
          SBUF=a;

}

回復(fù)

使用道具 舉報(bào)

ID:858964 發(fā)表于 2021-5-11 01:47 | 顯示全部樓層
我做過(guò)一個(gè)項(xiàng)目,(單片機(jī)+藍(lán)牙串口模塊)接收來(lái)自手機(jī)的的數(shù)據(jù),
例如,接收到4個(gè)16進(jìn)數(shù)分別是0x38,0x39,0x35,0x32,
這4個(gè)數(shù)是ASCII碼,對(duì)應(yīng)的十進(jìn)制數(shù)值就是8952。
回復(fù)

使用道具 舉報(bào)

ID:277550 發(fā)表于 2021-5-11 08:58 | 顯示全部樓層
單片機(jī)中的int ? 是2個(gè)字節(jié),unsigned int也是,所以,根據(jù)數(shù)據(jù)的長(zhǎng)度,直接移位就可以。
回復(fù)

使用道具 舉報(bào)

ID:900977 發(fā)表于 2021-5-11 09:42 來(lái)自手機(jī) | 顯示全部樓層
Kxuan163 發(fā)表于 2021-5-11 01:47
我做過(guò)一個(gè)項(xiàng)目,(單片機(jī)+藍(lán)牙串口模塊)接收來(lái)自手機(jī)的的數(shù)據(jù),
例如,接收到4個(gè)16進(jìn)數(shù)分別是0x38,0x39, ...

我的也是接受到16進(jìn)制,0x01就是1,0x02就是2,不懂怎么搞了
回復(fù)

使用道具 舉報(bào)

ID:900977 發(fā)表于 2021-5-11 09:45 來(lái)自手機(jī) | 顯示全部樓層
devcang 發(fā)表于 2021-5-11 08:58
單片機(jī)中的int ? 是2個(gè)字節(jié),unsigned int也是,所以,根據(jù)數(shù)據(jù)的長(zhǎng)度,直接移位就可以。

可以移位處理嗎
回復(fù)

使用道具 舉報(bào)

ID:900977 發(fā)表于 2021-5-11 11:01 | 顯示全部樓層
birdzhyli 發(fā)表于 2021-5-10 23:15
前面程序結(jié)構(gòu)很好,只是為什么要把串口處理放在主函數(shù)中?
還是單獨(dú)弄個(gè)串口服務(wù)程序的好。參考單片機(jī)手冊(cè) ...

我現(xiàn)在的1問(wèn)題是,如何把接收到的16進(jìn)制轉(zhuǎn)為十進(jìn)制,就是接收到的以十進(jìn)制顯示
回復(fù)

使用道具 舉報(bào)

ID:919213 發(fā)表于 2021-5-11 11:14 | 顯示全部樓層
這個(gè)MCU和藍(lán)牙是通過(guò)uart通信嗎?
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

ID:889094 發(fā)表于 2021-5-12 01:06 來(lái)自手機(jī) | 顯示全部樓層
羅大韓 發(fā)表于 2021-5-11 11:01
我現(xiàn)在的1問(wèn)題是,如何把接收到的16進(jìn)制轉(zhuǎn)為十進(jìn)制,就是接收到的以十進(jìn)制顯示

你要發(fā)送的不是16進(jìn)制數(shù),你要發(fā)送的是字符串12345,先把你的數(shù)字轉(zhuǎn)化成字符串,然后再發(fā),方法簡(jiǎn)單,每一位都+字符0就是對(duì)應(yīng)的字符了,cbai=shu%1000/100+'0'
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

謝謝了,我用你的方法實(shí)現(xiàn)了
回復(fù)

使用道具 舉報(bào)

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

謝謝了
回復(fù)

使用道具 舉報(bào)

ID:900977 發(fā)表于 2021-5-13 17:00 | 顯示全部樓層
Kxuan163 發(fā)表于 2021-5-11 01:47
我做過(guò)一個(gè)項(xiàng)目,(單片機(jī)+藍(lán)牙串口模塊)接收來(lái)自手機(jī)的的數(shù)據(jù),
例如,接收到4個(gè)16進(jìn)數(shù)分別是0x38,0x39, ...

謝謝您的建議,使用
回復(fù)

使用道具 舉報(bào)

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

謝謝您的建議
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表