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

QQ登錄

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

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

單片機(jī)SBUF收到的數(shù)據(jù)為什么不能正確顯示在數(shù)碼管上?

[復(fù)制鏈接]
ID:1051991 發(fā)表于 2023-6-16 19:29 | 顯示全部樓層 |閱讀模式
大佬幫忙看一下

單片機(jī)源程序如下:
#include "public.h"
#include "ds18b20.h"
#include "smg.h"
u8  received_data;
void main()
{
        u8  i = 0;
        int temp_value;


        u8 temp_buf[8];

        ds18b20_init();

        TMOD |= 0x20; // 設(shè)置定時(shí)器1為工作方式2,8位自動(dòng)重裝載
    TH1 = 0xFA; // 波特率9600,定時(shí)器1初始值
    TL1 = 0xFA; // 波特率9600,定時(shí)器1初始值
    TR1 = 1; // 啟動(dòng)定時(shí)器1
    SCON = 0x50; // 設(shè)置串口為模式1,允許接收
        PCON = 0X80; //波特
    EA = 1; // 允許全局中斷
    ES = 1; // 允許串口中斷


        while(1)
        {
                i++;
                if(i%50 == 0)
                {
                        temp_value = ds18b20_read_temperature()*10;
                }
                if(temp_value<0)
                {
                        temp_value = -temp_value;  //讀出來(lái)的全是正數(shù)
                        temp_buf[4] = 0x40;  //顯示負(fù)號(hào)
                }
                else temp_buf[4] = 0x00;         //正數(shù)不顯示符號(hào)


                        temp_buf[0] = gsmg_code[received_data/1000];  //千位                                            串口發(fā)送的數(shù)據(jù)
                        temp_buf[1]        = gsmg_code[received_data%1000/100];        //百位
                        temp_buf[2]        = gsmg_code[received_data%1000%100/10];          //十位
                        temp_buf[3]        = gsmg_code[received_data%1000%100%10];                        //個(gè)位

                        //temp_buf[1] = gsmg_code[temp_value/1000]; //百位                                              溫度數(shù)據(jù)
                        temp_buf[5] = gsmg_code[temp_value%1000/100];  //十位
                        temp_buf[6] = gsmg_code[temp_value%1000%100/10]|0x80;          //個(gè)位和小數(shù)點(diǎn)
                        temp_buf[7] = gsmg_code[temp_value%1000%100%10]; //一位小數(shù)
        
                        smg_display(temp_buf,1);   //數(shù)碼管全部打開(kāi)
                }
}


// 串口接收中斷處理函數(shù)
void Serial_Receive() interrupt 4
{

    if(RI) // 接收中斷標(biāo)志位
    {
        RI = 0; // 清除接收中斷標(biāo)志位
        received_data = SBUF; // 將接收到的數(shù)據(jù)賦值給received_data變量
         }
}
回復(fù)

使用道具 舉報(bào)

ID:1051991 發(fā)表于 2023-6-16 19:30 | 顯示全部樓層
數(shù)碼管前四位要顯示的是上位機(jī)發(fā)送給串口的數(shù)據(jù),但是顯示的不正確
回復(fù)

使用道具 舉報(bào)

ID:1080935 發(fā)表于 2023-6-17 15:59 | 顯示全部樓層
SBUF只有一個(gè)字節(jié),最大0到255,十六進(jìn)制0~FF,你用串口調(diào)試助手十六進(jìn)制發(fā)送看下。不能一次發(fā)多個(gè)字節(jié),沒(méi)有用的,要在程序中處理才行。
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2023-6-18 06:07 | 顯示全部樓層
ExploreX 發(fā)表于 2023-6-16 19:30
數(shù)碼管前四位要顯示的是上位機(jī)發(fā)送給串口的數(shù)據(jù),但是顯示的不正確

串口每次只能傳輸1個(gè)字節(jié)。大于1個(gè)字節(jié)的數(shù)據(jù)要拆分成若干個(gè)字節(jié)分別發(fā)送,接收方收齊后再還原數(shù)據(jù)。
回復(fù)

使用道具 舉報(bào)

ID:1051991 發(fā)表于 2023-6-18 20:45 | 顯示全部樓層
發(fā)送16進(jìn)制數(shù)據(jù)就能夠正確顯示,但是發(fā)送字符型就不對(duì)了,這是為什么呢?
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2023-6-19 07:28 | 顯示全部樓層
ExploreX 發(fā)表于 2023-6-18 20:45
發(fā)送16進(jìn)制數(shù)據(jù)就能夠正確顯示,但是發(fā)送字符型就不對(duì)了,這是為什么呢?

數(shù)碼管顯示一個(gè)字符型數(shù)字(ASCII碼)需要先把字符型數(shù)字變量-0x30轉(zhuǎn)換成十進(jìn)制數(shù)字,再把十進(jìn)制數(shù)字轉(zhuǎn)換成數(shù)碼管段碼送到數(shù)碼管才能正確顯示。
temp_buf[0] = gsmg_code[received_data-0x30];//received_data='0'-'9'
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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