在51单片机的串口通信中,如何在数码管上用16进制显示0-65536

以16进制发送一个0-65536之间的任一数,当单片机收到后在数码管上动态显示出来,波特率自定

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code tab_disp[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code tabwela[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar i,k,flag;
uint b,num1[2];
uchar num[5];
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=10;y>0;y--);
}
void display()
{
uchar j;
for(j=0;j<5;j++)
{
P0=tabwela[j];
P2=tab_disp[num[j]];
delay(1);
P2=0x00;
}
}
void main()
{
TMOD=0x20;//定时器1的工作方式2
TH1=0xfd; //装数,设定波特率 9600
TL1=0xfd;
TR1=1;//启动定时器1
REN=1;//启动串口接收数据
SM0=0;//串口工作方式1
SM1=1;
EA=1;//开总中断
ES=1;//开串口中
while(1)
{
if(flag==1)
{
num[0]=b/10000;
num[1]=b%10000/1000;
num[2]=b%1000/100;
num[3]=b%100/10;
num[4]=b%10;
flag=0;
SBUF=b;
while(TI==1)
TI=0;
}
display(); }

}
void ser() interrupt 4
{
while(RI==1)
{
RI=0;
num1[i]=SBUF;
i++;
if(i==2)
i=0;
k++;
}
if(k==2)
{
k=0;
b=(num1[0]*256)+num1[1];
flag=1;
}
}
温馨提示:内容为网友见解,仅供参考
无其他回答

单片机串口方式一发送一个16位的数(0~65536)然后在数码管上显示出来以...
16位的数,没有 65536,最大,只不过是 65535。串口,每次,仅仅可以发送一个字节,8位数,0~255。16位的数,就得传送两次。先传送什么,后传送什么,先接收的是什么,后接收的什么,仅仅从接收次数来判断高、低字节,是不准确的。必须有所标记,否则,就要识别错位了。16位的数,再加上高、低字...

以16进制发送一个0-65536之间的任一数,当单片机收到后在数码管上动态...
这样只有在收到数据后,才显示一遍,显示结束时,仅仅是显示个位,前两位,都消影了。动态显示程序,必须不停的调用,才能看见各个位。动态显示程序,应该放在条件语句的外面,如下:while(1){ bai=a\/100;shi=a%100\/10;ge=a%10;display(bai,shi,ge);\/\/--放在这里,才能稳定的显示 if(flag==1...

51单片机0∼999循环显示(数码管)
include<reg51.h>#include<INTRINS.h>#define u16 unsigned int#define u8 unsigned charu8 ds[4]; \/\/数码管显示缓存code u8 w[]={0x01,0x02,0x04,0x08,};\/\/位码code u8 d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};\/\/断码void dispaly(){\/\/显示函数static ...

单片机串口通信问题,请求大侠帮忙!
以16进制发送一个0~65536之间的任意数,...--- 标准的串口,只能传输0~255之间的数。要想传送多字节的数据,就需要多次传送。这就必须制定通信协议。发送方,先向对方呼叫,待收到正确的回音后;再向对方发送“数据的字节数”;再向对方连续发送数据字节串,对方收到,存放到一个缓存空间;发送方...

题目:以16进制发送一个0-65536之间的任一数,当单片机收到后在数码管上...
以16进制发送一个0-65536之间的任一数:这题目本身是有问题的,因为超过255的数,要用两个字节了,就是需要发送两次。而你程序只接收一次,shu = SBUF;这是不可能的。发送两次,要分高8位和低8位,这还要确定是先发高8位,还是先发低8位。下一个问题是,看你的仿真图,是用虚拟终端发的,对...

以16进制发送一个0-65536之间的任一数,当单片机收到后在数码管上动态...
a=SBUF;下面加一条 SBUF=a;发回数据看接收到的数据是否正常 数码管转换的时候是没错的 估计是波特率的问题 12MHz晶振可以使用4800bsp的波特率 PCON=0x80;TH1 = 0xF3;TL1 = TH1;

用51单片机串行通信传输数据,每秒传输一个十六位数据,定时器和波特率怎 ...
TL0 =(65536-2500)%256; \/\/约2.50MS定时器初值 ET0 = 1;TR0 = 1; \/\/启动定时器 TR1 = 1; \/\/启动定时器 SM0 SM1 SM0 = 0; \/\/串口通信模式设置 0 0 = 0 SM1 = 1; \/\/ 0 1 = 1 REN = 1; \/\/串口允许接收数据 ES = 1; \/\/开串中断 ...

51单片机实现秒表,要求16进制进位
51单片机实现秒表, 0~9、A、b、C、d、E、F,16进制秒表。include<reg52.h> define uint unsigned int define uchar unsigned char uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar bai,shi;uint a1,a2;sbit D1...

51单片机怎么通过串口通信在数码管的显示大于255的值
串口助手“以16进制发送数据”时,软件会先将“FF”转换成8位二进制数据“11111111”即十进制数据“255”发送出去。单片机接收到的实际上也是二进制数据“11111111”。而你的单片机代码中“bai=x\/100;"是我们人类的思维模式,编译器将代码编译时,实际上进行的运算是"bai=X\/0b01100100"。

51单片机数码管显示学号
voidTimer0_Init(void){ TMOD=0x01;TH0=(65536-50000)\/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;} \/\/主函数 voidmain(void){ Timer0_Init();P0=0xff;P2=0xff;while(1){ Display();\/\/显示 } } \/\/定时器0中断函数 voidTimer0(void)interrupt1 { staticu8Count=0;TH0=(...

相似回答