以16进制发送一个0-65536之间的任一数,当单片机收到后在数码管上动态显示出来,看下面的程序有什么问题

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char flag,a,b;
unsigned int c;
sbit dula=P2^6;
sbit wela=P2^7;
uchar temp[2]={0,0};
uchar code tabledu[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code tablewe[]=
{0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
void delay()
{ int d,f;
for(d=5;d>0;d--)
for(f=90;f>0;f--);
}
void display(uint i,uint j,uint k,uint l,uint m) ;
void main()
{
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
while(1)
{

if(flag==2)
{
flag=0;
a=0;
c=(((temp[0]/16)*16+temp[0]%16)*256+(temp[1]/16)*16+temp[1]%16);
}
display(c/10000,c%10000/1000,c%1000/100,c%100/10,c%10);

}
}
void ser() interrupt 4
{
RI=0;
temp[a]=SBUF;
a++;
flag++;
}
void display(uint i,uint j,uint k,uint l,uint m)
{
P0=tabledu[i];
dula=1;
dula=0;
P0=tablewe[0];
wela=1;
wela=0;
delay();
P0=tabledu[j];
dula=1;
dula=0;
P0=tablewe[1];
wela=1;
wela=0;
delay();
P0=tabledu[k];
dula=1;
dula=0;
P0=tablewe[2];
wela=1;
wela=0;
delay();
P0=tabledu[l];
dula=1;
dula=0;
P0=tablewe[3];
wela=1;
wela=0;
delay();
P0=tabledu[m];
dula=1;
dula=0;
P0=tablewe[4];
wela=1;
wela=0;
delay();
}

第1个回答  2012-08-02
65535 需要16位 SBUF一次只能收到8位
第2个回答  2012-08-06
我来做下任务

以16进制发送一个0-65536之间的任一数,当单片机收到后在数码管上动态...
while(!TI);TI=0;ES=1;……

以16进制发送一个0-65536之间的任一数,当单片机收到后在数码管上动态...
估计是波特率的问题 12MHz晶振可以使用4800bsp的波特率 PCON=0x80;TH1 = 0xF3;TL1 = TH1;

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

以16进制发送一个0-255之间的任一数,当单片机收到后在数码管上动态显示...
0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};\/\/共阳级数码管码表0-9uchar dat,bai,shi,ge,scan;void delay(uchar a){uchar i;while(a--)for(i=0;i<120;i++);}void uart() interrupt 4{if(RI) { RI=0;

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

...为什么数码管显示255。题目是以16进制数发送,数码管显示
就是不知道复位后,为什么数码管显示255。--你认为应该显示多少?是不是复位后,SBUF中的值变为255了?---你读出再显示一下看看。但是,复位后,SBUF中的值应该是随机的--怎么是随机?应该是0。这个程序,复位后,显示的是 num 的内容,和 SBUF 无关。只有当串口收到数据,发生串口中断之后...

请高手帮我解决一个51单片机程序 ,怎么达不到不到题目的要求
2、main()中:应接收2次后再调用init(),可以设定一个计数变量记录接收次数,计数到2后归0;3、单独再设一个uint变量或通过参数传递方式将两次计数得到的16位二进制数在init()函数中完成获取万千百十个的各位数字的运算。如果原来上位机连续发送0x55,0xAA而你的显示为170(0x55对应的85显示太快,...

为什么51单片机定时器计数值取出来之后会比初值还小
有两种可能会造成这种情况:1、定时计数器启动后会从初值开始每个机器周期+1,也就是从49806开始每个机器周期+1,等记到65535(0xFFFF)后下一个周期就会清零,即从0000H开始计数。所以工作方式1在定时中断响应函数中一开始都要重装初值,否则就从0开始了。你说的情况可能定时中断函数中没有重装初值或者...

一直有一个疑问,手机拍照像素与屏幕分辨率的关系到底如何?
也可以用16进制表示:白色:#000,黑色:#FFF。 很高兴回答你的问题…希望我的回答对你有所帮助。感谢官方 首先,显示屏和摄像头不是一样的,显示屏是用来显示的,摄像头是用来拍照的,摄像头像素都是高于显示屏的,所以拍完照以后是将一个大像素的照片显示在一个小显示屏上面的,你不用担心小显示屏显示不下,因为...

...数码管显示电路。 设计要求:每隔2S显示数字加1,显示初值
shu=0; } } void time1(void) interrupt 3 { TH1=(65536-5000)\/256; TL1=(65536-5000)%256; display(); } void init() { TMOD=0x11; EA=1; ET0=1; ET1=1; TR1=1; TR0=1; } main() { init(); while(1) { conv(shu); } } 本回答由提问者推荐 举报| 答案纠错 | 评论(4) 1 ...

相似回答