利用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;
}
原理图:
程序:
#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
我想了一下是一样的,可以随便用一个百位数试一下