4778|10

58

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

在51上用C写一个计时的程序,碰到一个问题,哪里不对呢? [复制链接]

#include
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code weitable[]={
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf};
uchar oclock,min;
uint num;
uint aa;

delay(uchar n)
{uint i,AI;
for (i=n;i>0;i--)
for (AI=100;AI>0;AI--);
}

/*display(uint number)
{


}*/
void time() interrupt 1
{
TH0=(65536-46053)/256;
TL0=(65536-46053)%256;
aa++;

}

void main()
{
uchar shi,ge;
TH0=(65536-46053)/256;
TL0=(65536-46053)%256;
TMOD=1;
EA=1;
ET0=1;
TR0=1;
if(aa==100)
{
num++;
aa=0;
}
shi=num/10;
ge=num%10;
while(1)
{
        wela=1;
        P0=0xfe;
        wela=0;

        dula=1;
        P0=table[shi];
        dula=0;

        delay(2);

        wela=1;
        P0=0xfd;
        wela=0;
       
        dula=1;
        P0=table[ge];
        dula=0;
        delay(2);
}
}
想用LED显示一个计秒的程序,第过一段时间在LED的前两位上数字加一,但不知哪里出错了,总是显示“00”,后来调示发现num++这句没有起做用,(就是if(aa==100){num++;aa=0;})这段程序没有起作用。aa变量是在累加,计时器也在工作。把num++放入中断函数中去,num++起作用了,但display函数不运行了。这是怎么回事呢?

最新回复

楼主把书写规范点吧。。  详情 回复 发表于 2009-9-15 15:40
点赞 关注

回复
举报

67

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
volatile uint aa; // 否则编译器会做错误的优化,在后台可能得不到更新的值。
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你写的程序很不规范啊。
命名还有风格都很差,可读性很差。
==我给本电子书你,你看看就知道咋回事了
看看这个吧,一下子搞定。http://download.eeworld.net/source/901886
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 1 楼 zyzhang365 的回复:
volatile uint aa; // 否则编译器会做错误的优化,在后台可能得不到更新的值。


此是关键
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

5
 
是的,这个程序写得不好,开始我是用模块的方式写的,后来发现有问题,于是就改来改去的调试,就成这样了。很乱。不过现在我已经找到问题了,是因为我的IF语句应该写在while循环语句里面,呵呵。不过我还是有几个地方不明白,为什么单生机端口操作要延时呢?我试过了,如果没有延迟数码管会乱,这是为什么?另外,为什么在对双字节变量操作时,如果用i++加到65535,当数字连续加到大于32765时,时间会增加很多,但如果是从65535连续减(i--)到零,时间则会比i++少很多,这是什么原因?答对的都有分。
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

6
 
1. 对你++/--本身造成时间差异表示怀疑,这可能是其他原因引起的,比如中断把你的操作给抢占了,这这个计时不准;另外一个可能是因为指令长度或执行时间变化了,好像不对。

2. uC端口外设反应应该是很快的,慢的是你的外设,比如数码管的电路
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

7
 
楼主你应该把if(aa==100)
{
num++;
aa=0;
}
shi=num/10;
ge=num%10;  这段放进while里面。因为这是计数值num和shi,ge必须不断刷新的,我在protues上仿真了,你可以试一下啊
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 4 楼 dynamic_pump 的回复:
是的,这个程序写得不好,开始我是用模块的方式写的,后来发现有问题,于是就改来改去的调试,就成这样了。很乱。不过现在我已经找到问题了,是因为我的IF语句应该写在while循环语句里面,呵呵。不过我还是有几个地方不明白,为什么单生机端口操作要延时呢?我试过了,如果没有延迟数码管会乱,这是为什么?另外,为什么在对双字节变量操作时,如果用i++加到65535,当数字连续加到大于32765时,时间会增加很多??
你那两个数码管是用扫描法进行显示的,如果你延时太短或者没延时,数码管会出现叠影,即两个数码管的字互相覆盖在一起,扫描法每次先点亮一个数码管,而当后个数码管位码点亮时,见下面程序
dula=1;
P0=table[shi];
dula=0;

delay(2);

wela=1;
P0=0xfd;
wela=0;

dula=1; 比如这里的位码点亮后,实际上显示的是上个P0=table[shi]; 即p0口段码仍保持,这就是所谓的
   段码覆盖,个位的显示的也是十位数,但是P0=table[ge];这里及时输出个位段码才掩盖了原来的十位,这种相互覆盖是必然存在的,只有当延时达到一定长度时,人眼才无法察觉,延时太短意味扫描周期很短,那么覆盖的频率就高了,这样人眼就会就看到乱码

dula=0;   楼主你试着改变延时长短就会发现了
delay(2);



{


 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 4 楼 dynamic_pump 的回复:
是的,这个程序写得不好,开始我是用模块的方式写的,后来发现有问题,于是就改来改去的调试,就成这样了。很乱。不过现在我已经找到问题了,是因为我的IF语句应该写在while循环语句里面,呵呵。不过我还是有几个地方不明白,为什么单生机端口操作要延时呢?我试过了,如果没有延迟数码管会乱,这是为什么?另外,为什么在对双字节变量操作时,如果用i++加到65535,当数字连续加到大于32765时,时间会增加很多??
你所谓的i++中的i++是指通过定时中断增加吗?
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

10
 
用前减(--i)时间更短,你汇编后看下就明白了






 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

11
 
楼主把书写规范点吧。。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表