4536|10

62

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

我这个秒表程序为什么十位显示的时候个位就不现实?代码如下 [复制链接]

#include
unsigned char code tab[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f};
unsigned time=0;//为一秒的计数周期
unsigned char count=0;//为59秒的计数周期
unsigned char a,b;//a为十位上的数,b为个位上的数
delay(unsigned int s )//延时函数几MS
{
        unsigned char i;
        while(s--)
        for(i=0;i<240;i++);
}
display(unsigned char shiwei,unsigned char gewei)//显示函数  肯定是这里出了问题
{

        P2=0XFE;
        P0=tab[gewei];
        delay(100);
        P0=0XFF;
        P2=0XFD;
        P0=tab[shiwei];
        delay(5000);
        P0=0XFF;
}
void  timer0() interrupt 1//定时器0的中断函数入口程序
{
        TH0=0x3c;
        TL0=0xb0;
        time++;
        if(time==20)
        {
                time=0;
                count++;
                if(count==59)
                count=0;
        }
}
void main()
{

        TMOD=0x01;//定时器0工作方式1
        TH0=0x3c;
        TL0=0xb0;//设置初值为50MS
        EA=1;
        ET0=1;
        TR0=1;
        while(1)
        {
                a=count/10;
                b=count%10;
                display(a,b);
        }

}
我在硬件上验证过,具体现象是:首先是个位从1开始,等一会显示2,然后3,一直到9。然后十位变成1,也就是10,虽然个位在向上加的时候,十位保持住了1,但个位每次加1,十位就和他一起闪一次。不知道我说清楚了没有,就像电子秒表一样显示。也就是用两个数码管循环显示0到59,两个数之间的时间间隔为一秒。本人不才,老是麻烦大家,望大家帮我。谢谢了

最新回复

主要是你的定时函数时间有点长! 人的视觉停留是1/24 所以显示刷新的时间要控制在40ms以内! 把你的定时初始值改一下就ok了!比如25ms!  详情 回复 发表于 2010-5-10 08:56
点赞 关注

回复
举报

75

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
display(unsigned char shiwei,unsigned char gewei)//显示函数 肯定是这里出了问题
{
  P0=tab[gewei];
  P2=0XFE;
  delay(100);
  P0=tab[shiwei];
  P2=0XFD;
}
改成这样可以吗??(也就是先赋值给数据口,然后片选)
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
这个程序按道理是可以的,你试一下,如果不行再告诉我,我再用Proteus仿真一下
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

4
 
这个程序按道理是可以的,你试一下,如果不行再告诉我,我再用Proteus仿真一下



我的程序没什么错误,按你的就有错误,我也是改了很久,越改越糟。这个比较接近了
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

5
 

  1. unsigned char show_flag=0;// 定义一个显示用的延时标志
  2. void timer0() interrupt 1//定时器0的中断函数入口程序
  3. {
  4. TH0=0x3c;  
  5. TL0=0xb0;
  6. show_flag=~show_flag;//显示标志取反
  7. time++;
  8. if(time==20)
  9. {
  10. time=0;
  11. count++;
  12. if(count==59)
  13. count=0;
  14. }
  15. }
  16. display(unsigned char shiwei,unsigned char gewei)//显示函数 肯定是这里出了问题
  17. {
  18. if (show_flag){//不为零时显示个位
  19.   P0=tab[gewei];
  20.   P2=0XFE;
  21. }
  22. else {//为零时显示十位
  23.   P0=tab[shiwei];
  24.   P2=0XFD;
  25. }
  26. }
复制代码
显示个位和显示十位是都要延时!按照你的定义,个位、十位各显示50ms循环
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 4 楼 galle 的回复:
C/C++ code

unsigned char show_flag=0;// 定义一个显示用的延时标志
void timer0() interrupt 1//定时器0的中断函数入口程序
{
TH0=0x3c;  
TL0=0xb0;
show_flag=~show_flag;//显示标志取反
time++;
if(time==20)
{
time=0;
count++;……
谢谢啊,我怎么没想到还要个延时标志呢。呵呵,还是太笨了,基本上解决了,只是在延时方面还需调试,再次谢谢了
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

7
 
4楼的有问题吧。标志位来回的从0到1变化,一次显示个位,一次显示十位,也没有实现闪烁啊,而且楼主的那个主函数不太妥当吧,按你的意思就是只有增加1一秒的时候才会改变显示值。那么没有必要频繁的在主函数里的while循环了赋值,你可以开始先初始化,然后就等待中断,只有等到中断后,在中断里才改变显示值,并且在闪烁一次。。。。不需要设置延时标志,只是有一点,如果你想在秒数不到十秒的时候不显示十位,那样的话你可以添加一个判断语句。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

8
 
#include
unsigned char code tab[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f};
unsigned time=0;//为一秒的计数周期
unsigned char count=0;//为59秒的计数周期
unsigned char a,b;//a为十位上的数,b为个位上的数
delay(unsigned int s )//延时函数几MS
{
unsigned char i;
while(s--)
for(i=0;i<100;i++);
}
display(unsigned char shiwei,unsigned char gewei)//显示函数 肯定是这里出了问题
{////////////////亮
P2=0XFE;
P0=tab[gewei];
delay(100);
if(shiwei!=0)   //当十位不为0时才显示十位
{
P2=0XFD;
P0=tab[shiwei];
delay(100);
}
///////////////灭
P2=0XFE;
P0=0XFF;
delay(100);
if(shiwei!=0)   //当十位不为0时才显示十位
{
P2=0XFD;
P0=0XFF;
delay(100);
}
/////////////////////////亮
P2=0XFE;
P0=tab[gewei];
if(shiwei!=0)   //当十位不为0时才显示十位
{
P2=0XFD;
P0=tab[shiwei];
}
}
void timer0() interrupt 1//定时器0的中断函数入口程序
{
TH0=0x3c;  
TL0=0xb0;
time++;
if(time==20)
{
time=0;
count++;
if(count==59)
count=0;
}
a=count/10;
b=count%10;
display(a,b);
}
void main()
{

TMOD=0x01;//定时器0工作方式1
TH0=0x3c;
TL0=0xb0;//设置初值为50MS
EA=1;
ET0=1;
TR0=1;
a=count/10;
b=count%10;
display(a,b);
while(1)
{;}
}
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 7 楼 chutianya 的回复:
#include
unsigned char code tab[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f};
unsigned time=0;//为一秒的计数周期
unsigned char count=0;//为59秒的计数周期
unsigned char a,b;//a为十位上的数,b为个位上的数
……

display(a,b);//这个个应该放在while语句里才对吧
while(1)
{;}
  


 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 4 楼 galle 的回复:
C/C++ code

unsigned char show_flag=0;// 定义一个显示用的延时标志
void timer0() interrupt 1//定时器0的中断函数入口程序
{
TH0=0x3c;  
TL0=0xb0;
show_flag=~show_flag;//显示标志取反
time++;
if(time==20)
{
time=0;
count++;……
楼主有时间的话,麻烦你在调试一下你改的这个程序。效果还不是很好啊
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

11
 
主要是你的定时函数时间有点长!
人的视觉停留是1/24
所以显示刷新的时间要控制在40ms以内!
把你的定时初始值改一下就ok了!比如25ms!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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