微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 利用51单片机接收计算机发送的任一字节数据,比特率为4800bps,并通过数码管显示为十进制数。

利用51单片机接收计算机发送的任一字节数据,比特率为4800bps,并通过数码管显示为十进制数。

时间:10-02 整理:3721RD 点击:
问题:我用串口助手进行试验的时候,计算机输入01,显示的却是04,输入02,显示05,在输入03,还是显示04,显示就是04和05循环,这是什么问题呢?
程序:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uint z);
uchar num;
uchar code leddata[]={
                                0xC0,  //"0"
                                0xF9,  //"1"
                                0xA4,  //"2"
                                0xB0,  //"3"
                                0x99,  //"4"
                                0x92,  //"5"
                                0x82,  //"6"
                                0xF8,  //"7"
                                0x80,  //"8"
                                0x90   //"9"
                                        };
void display(uchar num)
{
        uchar sw , gw , bw;
        bw = num / 100;
        sw = num % 100 / 10;
        gw = num % 100;
        P0 = 0xff;
        P2 = 0xfe;
        P0 = leddata[bw];
        delay(1);
        P0 = 0xff;
        P2 = 0xfd;
        P0 = leddata[sw];
        delay(1);
        P0 = 0xff;
        P2 = 0xfb;
        P0 = leddata[gw];
        delay(1);
}
void delay(uint z)
{
        uint x , y;
       
        for(x = z; z > 0; z--)
                for(y = 116; y > 0; y--);
}
void UART_init()
{
        TMOD = 0x20;
        TH1 = 0xfa;
        TL1 = 0xfa;
        TR1 = 1;
        SM0 = 0;
        SM1 = 1;
        REN = 1;       
}
int main(void)
{
        UART_init();
        while(1)
        {
               
                if(RI)
                {
                        RI = 0;
                }
                display(SBUF);
                                       
        }
       
        return 0;       
}
原理图:


循环显示一下0-9,但你的显示编码对不对。
bw = num / 100;
        sw = num % 100 / 10;
        gw = num % 100;
好像不太严禁。
更改为
bw = num / 100;
sw = num /10% 10;
gw = num % 10;

不对吧,中间位要先求余数,再求整数的

结果一样的,先试试第一条,
再试试向电脑的串口发0-9,看收到的是什么。以确认你的波特率是不是对的、

这个还没有学到比特率的问题  看一下

谢谢,程序错误了,我没有一条一条的检查,gw = num % 100;写错了。

我之前学习数码管的时候,也有这样的问题,后来吧友,告诉我是先求余在就商,就没在意了,这里又出现了,我也想知道是问什么。

结果是一样的,那sw = num % 100 / 10; 和sw = num /10 % 10;有什么区别呢?讨论一下

提醒一下跟我一样的初学者,就是isp里面的串口助手,发送缓冲区有两种模式:文本模式和HEX模式,选择文本模式发送,计算机会把发送的数据当字符发送,数码管显示的结果是这个字符对应的十进制ASCII码;选择HEX模式发送,就会显示你发送数据原型了(转化为十六进制了,因为isp默认是的十六进制发送)。

哦,学到了,谢谢提醒

这很好理解呀,比如说1756,要把7分离出来,不就需要%1000求余=756,然后再/100求整=7

我想了一下是一样的,可以随便用一个百位数试一下

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top