单片机数码管动态显示 定时器

发布时间:
浏览次数: 672

好酷屋教程网小编为您收集和整理了单片机数码管动态显示 定时器的相关教程:请你明确你的程序具体出什么问题,别让我们再去读整个程序啊!你可以这样描述:不显示、计数不正确、时间间隔不正确等等……大致看了一下,感觉有几个思路问题,给你些提示吧:1.你的程序会不断的执行displa

请你明确你的程序具体出什么问题,别让我们再去读整个程序啊!你可以这样描述:不显示、计数不正确、时间间隔不正确等等……
大致看了一下,感觉有几个思路问题,给你些提示吧:
1. 你的程序会不断的执行display(),原因是超级循环体里面没有对display的执行条件予以限制,我想着一定是你不希望的吧,而且通常这样会带来问题!解决:增加一个标志变量,你的限定条件是1秒刷新一次显示,在定时器中断中计数到达1秒时置位这一个标志,在超级循环体中的部分使用:
if(标识变量) {
……
display();
标识变量 = 0; //清零标志,很重要!
}
你上面的程序 if(a==20) {} 也可以有类似的效果,不过你没有把display包括进去就有问题了。
2. 从优化的角度讲TH0=(65536-50000)/256这样的语句是垃圾代码,你应该把具体的值算出来填写上去才对,否则单片机运行的时候还需要计算这个太浪费。如果你想程序便于理解又便于维护你可以这样:
#define THVALUE (65536-50000)/256
TH0 = THVALUE;
这样在编译的时候编译器会帮你完成计算。同样是优化,temp计数再转换成个十百位也不理想,其实本例中你的temp没有其它用处,你完全可以这样:
ge++;
if (ge == 10) {
shi++;
ge = 0;
}
if (shi == 10) {
bai++;
shi = 0;
}
if(bai == 10) {
bai = 0;
}
直接得到个十百位的数值,而且完全不使用除法何求余(要知道这可是单片机的软肋)。
3. 为什么要在定时器中断服务程序中重置定时器初值?不能自动重计数吗?要知道重置定时器初值也是需要指令周期的,直接的结果就是定时不准,累积误差不可小看。仔细查查单片机的手册看如何配置定时器。
4. 已经启用了定时器为什么还要使用阻塞式的延时函数?就算是动态扫描,合理的确定定时器中断的时长,结合前面提到的标志变量使用应该也容易完成的。

上面的供你参考,希望对你有帮助。

以上就是好酷屋教程网小编为您收集和整理的数码管,定时器,单片机相关内容,如果对您有帮助,请帮忙分享这篇文章^_^

本文来源: https://www.haoku5.com/youxi/63e4cab2f40eb6edc7038a02.html

相关推荐

    分享到: