找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1324|回复: 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 单片机教程网

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