打印

c语言程序问题

[复制链接]
2780|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
717665524qqcom|  楼主 | 2011-3-25 10:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar flag1,shi,ge,aa;
void display(uchar);
void main()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SM0=0;
SM1=1;
REN=1;
ES=1;
EA=1;
while(1)
{
  if(flag1==1)
  {
   ES=0;
   flag1=0;
   SBUF=aa;
   while(!TI);
   TI=0;
   ES=1;
  }
  display(aa);
}
}
void serial() interrupt 4//串口函数
{
RI=0;
aa=SBUF;
flag1=1;
// SBUF=aa;
}
void display(uchar num)//显示函数
{
uchar i;
shi=num/10;
ge=num%10;
P1=0;
P2=table[shi];
i=255;
while(i--);
P1=0x01;
P2=table[ge];
i=255;
while(i--);
}

本人用stc89c52写的一段程序 ,其实现功能是通过串口发送两位的数字,在数码管上显示出来,为了验证发送数据的正确性,并通过串口接收回来,当发送单位数时,数码管显示是正确的,(如01,02),但是如果发送超过10以上的数,显示结不正确了,但串口接收回来的都是正确的,不知道为什么,希望高人指点。

相关帖子

沙发
XZL| | 2011-3-25 10:11 | 只看该作者
呵呵,一个BYTE最大可以是255,你的单个数码管如何显示?所以收到的数据要进行处理

使用特权

评论回复
板凳
717665524qqcom|  楼主 | 2011-3-25 10:15 | 只看该作者
我不是用的单位数码管 ,我用的是双位显示? 2# XZL

使用特权

评论回复
地板
717665524qqcom|  楼主 | 2011-3-25 10:24 | 只看该作者
而且,发送从01-09显示连续01-09
发送10-19显示也连续 16-25
发送20-29显示都是连续的32-41
以此类推。。。。。。。
但为什么中间会断开显示呢?

使用特权

评论回复
5
wzf3151| | 2011-3-25 10:36 | 只看该作者
你的单片机程序是用的16进制,数码管是10进制

使用特权

评论回复
6
110xia| | 2011-3-25 10:43 | 只看该作者
用的动态扫描吧!!!
扫描频率是多?

使用特权

评论回复
7
717665524qqcom|  楼主 | 2011-3-25 10:45 | 只看该作者
但是我已经在显示的时候,已经将串口发送的数取整,取余了(shi=num/10;  ge=num%10;)在10以内啊,不是很明白??? 5# wzf3151

使用特权

评论回复
8
717665524qqcom|  楼主 | 2011-3-25 10:46 | 只看该作者
希望再解释一下 5# wzf3151

使用特权

评论回复
9
717665524qqcom|  楼主 | 2011-3-25 10:53 | 只看该作者
是的,只是做了一下延时i=255; while(i--);跟这应该没什么太大关系吧
6# 110xia

使用特权

评论回复
10
717665524qqcom|  楼主 | 2011-3-25 11:03 | 只看该作者
个人感觉问题应该是出现在进制转换上了,但怎么处理呢?

使用特权

评论回复
11
迎风K歌| | 2011-3-25 17:13 | 只看该作者
挂个仿真器,或者软件仿真,一下就找到问题了:)

使用特权

评论回复
12
wangyy608| | 2011-3-25 17:54 | 只看该作者
你发的是0X10~0X19====16~25

使用特权

评论回复
13
717665524qqcom|  楼主 | 2011-3-25 18:28 | 只看该作者
我知道了  我发的数字,单片机都是按16进制算的(应该只能识别16进制) 在显示的时候自动转化为了十进制,转化公式为16*shi+16*ge 如我用串口向单片机发送10,则变成16*1+16*0=16了,这样以此类推,就得出我上面说的那些数了,所以01~09显示是正常的,10以上就不正常了。终于明白了

使用特权

评论回复
14
wangyy608| | 2011-3-25 20:53 | 只看该作者
你在串口助手输入的数是按十六进制发的  10(16进制)就是0001 0000 实际就是16(10进制)
你要显示10 须在串口助手发0a

使用特权

评论回复
15
hust_hanker| | 2011-3-25 22:01 | 只看该作者
可以刷积分不

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

125

帖子

1

粉丝