理论教育 实例:精确秒表,零点起步-PIC单片机常用模块与典型实例

实例:精确秒表,零点起步-PIC单片机常用模块与典型实例

时间:2023-10-19 理论教育 版权反馈
【摘要】:单片机主频为4MHz,编程实现秒表的计时效果。图7-2 精确的秒表模拟电路图电路图在光盘位置:“\Example\Chapter7\S071\sch\smg4.DSN”。虽然每一个10ms的变化时间略有偏差,但所有偏差值都保留在g_ACC中并得到累计修正,所以能保证长时间计时精确。4)新建seg74.c文件并加入项目中,其内容如下所示。图7-4 电子表程序运行效果图

实例:精确秒表,零点起步-PIC单片机常用模块与典型实例

【例7-1】电路图如图7-2所示。单片机主频为4MHz,编程实现秒表的计时效果。高两位显示分钟,低两位显示秒钟,每隔1s显示加1,每60s分钟显示加1且秒钟清零。要求使用TIMER0的定时功能实现。

978-7-111-33274-9-Chapter07-7.jpg

图7-2 精确的秒表模拟电路图

电路图在光盘位置:“\Example\Chapter7\S071\sch\smg4.DSN”。

程序分析

●本例中单片机主频是4MHz。虽然用单片机内部定时器计时最常使用的时钟源频率是32.768kHz(因为32.768kHz是2的整数次幂,在做定时器分频时没有计算误差),但是当主频过低时数码管动态刷新效果不好,所以本例还是用4MHz主频。

●当主频是4MHz时,为了能够精确计时,就不能够采用简单调整分频比的方法了。这里设置TMR0预分频系数为1:4,当主频是4MHz时,一次计数中断溢出时间为1024µs。每次TMR0中断服务中对时间累计变量g_ACC加上1024。如果g_ACC超过10000,即超过了10ms,则g_ACC=g_ACC-10000,同时10ms计数器g_MS10CNT加1,当g_MS10CNT累计到100时,说明到了1s,此时再更新秒钟、分钟等值。虽然每一个10ms的变化时间略有偏差,但所有偏差值都保留在g_ACC中并得到累计修正,所以能保证长时间计时精确。

●由于本例中有两个要显示的数据:分钟和秒钟,所以在编写数码管动态刷新显示函数时需要传递两个参数。

●本程序比较复杂,读者可以参考流程图7-3来理解设计思想。

978-7-111-33274-9-Chapter07-8.jpg

图7-3 例7-1的程序流程图

设计过程

1)用MPLAB新建项目S071,语言工具选择为“HI-TECH Universal Toolsuite”,保存在“C:\S071”文件夹下。

2)新建main.c文件并加入项目中,其内容如下所示。

978-7-111-33274-9-Chapter07-9.jpg(www.daowen.com)

978-7-111-33274-9-Chapter07-10.jpg

3)新建seg74.h文件并加入项目中,其内容如下所示。

978-7-111-33274-9-Chapter07-11.jpg

4)新建seg74.c文件并加入项目中,其内容如下所示。

978-7-111-33274-9-Chapter07-12.jpg

978-7-111-33274-9-Chapter07-13.jpg

5)新建myfuncs.h文件并加入项目中,其内容如下所示。

978-7-111-33274-9-Chapter07-14.jpg

6)新建myfuncs.c文件并加入项目中,其内容如下所示。

978-7-111-33274-9-Chapter07-15.jpg

7)程序录入完毕后,保存并编译。用Proteus VSM载入电路图smg4.DSN来运行,运行时注意观察Proteus VSM窗口的状态栏显示的时间与数码管显示的时间是否同步,如图7-4所示。

通过观察可以发现数码管显示的时间比操作系统状态栏显示的时间要慢一点儿,这是正常的,因为显示函数在显示刷新上存在一定延时。

978-7-111-33274-9-Chapter07-16.jpg

图7-4 电子表程序运行效果图

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈