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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1707|回復: 5
打印 上一主題 下一主題
收起左側

單片機SBUF收到的數據為什么不能正確顯示在數碼管上?

[復制鏈接]
跳轉到指定樓層
樓主
ID:1051991 發表于 2023-6-16 19:29 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
大佬幫忙看一下

單片機源程序如下:
#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; // 設置定時器1為工作方式2,8位自動重裝載
    TH1 = 0xFA; // 波特率9600,定時器1初始值
    TL1 = 0xFA; // 波特率9600,定時器1初始值
    TR1 = 1; // 啟動定時器1
    SCON = 0x50; // 設置串口為模式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;  //讀出來的全是正數
                        temp_buf[4] = 0x40;  //顯示負號
                }
                else temp_buf[4] = 0x00;         //正數不顯示符號


                        temp_buf[0] = gsmg_code[received_data/1000];  //千位                                            串口發送的數據
                        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];                        //個位

                        //temp_buf[1] = gsmg_code[temp_value/1000]; //百位                                              溫度數據
                        temp_buf[5] = gsmg_code[temp_value%1000/100];  //十位
                        temp_buf[6] = gsmg_code[temp_value%1000%100/10]|0x80;          //個位和小數點
                        temp_buf[7] = gsmg_code[temp_value%1000%100%10]; //一位小數
        
                        smg_display(temp_buf,1);   //數碼管全部打開
                }
}


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

    if(RI) // 接收中斷標志位
    {
        RI = 0; // 清除接收中斷標志位
        received_data = SBUF; // 將接收到的數據賦值給received_data變量
         }
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1051991 發表于 2023-6-16 19:30 | 只看該作者
數碼管前四位要顯示的是上位機發送給串口的數據,但是顯示的不正確
回復

使用道具 舉報

板凳
ID:1080935 發表于 2023-6-17 15:59 | 只看該作者
SBUF只有一個字節,最大0到255,十六進制0~FF,你用串口調試助手十六進制發送看下。不能一次發多個字節,沒有用的,要在程序中處理才行。
回復

使用道具 舉報

地板
ID:213173 發表于 2023-6-18 06:07 | 只看該作者
ExploreX 發表于 2023-6-16 19:30
數碼管前四位要顯示的是上位機發送給串口的數據,但是顯示的不正確

串口每次只能傳輸1個字節。大于1個字節的數據要拆分成若干個字節分別發送,接收方收齊后再還原數據。
回復

使用道具 舉報

5#
ID:1051991 發表于 2023-6-18 20:45 | 只看該作者
發送16進制數據就能夠正確顯示,但是發送字符型就不對了,這是為什么呢?
回復

使用道具 舉報

6#
ID:213173 發表于 2023-6-19 07:28 | 只看該作者
ExploreX 發表于 2023-6-18 20:45
發送16進制數據就能夠正確顯示,但是發送字符型就不對了,這是為什么呢?

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久99 | 妞干网av | 午夜日韩 | 欧美日韩国产一区 | 日韩欧美操 | 成人福利网站 | 久久久久久国产 | 自拍视频国产 | 欧美激情一区二区 | 99pao成人国产永久免费视频 | 国产乱码一二三区精品 | 中文字幕国产在线 | 天堂av免费观看 | 91精品久久久久久久久中文字幕 | 亚洲高清在线观看 | 国内自拍视频在线观看 | 国产精品欧美日韩 | 精品毛片 | 亚洲精品在线看 | 日韩精品一区二区三区在线观看 | 午夜一区二区三区视频 | 亚洲精品免费视频 | 成人在线视频免费观看 | 北条麻妃99精品青青久久主播 | 久久在线 | 久久久久一区二区三区 | av中文字幕在线播放 | 国产日韩欧美在线观看 | 久久新视频 | 亚洲精品久久久蜜桃网站 | 国产影音先锋 | 在线观看国产wwwa级羞羞视频 | 毛片视频网址 | yeyeav| 日韩欧美国产成人一区二区 | 欧美一区二区三区 | 中文字幕在线看第二 | 殴美成人在线视频 | 亚洲精品乱码久久久久久9色 | 中文字幕电影在线观看 | 日韩三级视频 |