【例7-2】电路图如图7-6示。用TIMER0的定时器模式实现每隔1s使数码管显示内容加1,若按S1后则进入“无喂狗”指令的死循环。单片机主频为38.768kHz,打开“看门狗”定时器。
电路图在光盘位置:“\Example\Chapter7\S072\sch\smgwdt.DSN”。
图7-6W DT实验电路图
题意分析
●本题目的关键是如何用TIMER0实现1s定时。由于TIMER0的计数脉冲来源于单片机内部指令时钟(即主频的四分频),所以当单片机主频为32.768kHz时,其内部指令时钟频率为32.768kHz/4=8192Hz,即TIMER0需要记录8192个脉冲后才说明是1s。
●由于TMR0是8位寄存器,其计数值范围是从0~255,也就是最多能记录256个数,远远小于8192,所以必须使用预分频器(PSA=0)。用8192/256就能得到预分频比1:32。所以,PS2~PS0为100。
●打开“看门狗”定时器,经过以上的学习可以知道把__CONFIG宏中的WDTDIS改为WDTEN即可。
中断程序分析
●要想使用TIMER中断,则GIE和T0IE必须置位。
●当TIMER0记录了8192个脉冲后会使T0IF信号为1,表示计数器溢出并产生中断。
●可以在中断服务程序中编程,判断T0IF是否为1来决定是否有TIMER0中断发生。若T0IF为1说明已经记录了8192个脉冲,即1s过去了。此时,把数码管显示内容加1即可。
设计过程
1)新建一个MPLAB项目S072,语言工具选择为“HI-TECH Universal Toolsuite”,保存在“C:\S072”文件夹下。(www.daowen.com)
2)向项目中加入一个新建的main.c文件,其内容如下(本项目所有内容参考光盘“\Example\Chapter7\S072”文件夹内容)。
3)把项目保存后成功编译出目标文件。然后用调试工具Proteus VSM加载smgwdt.DSN来运行程序。在运行时有两种方法来引起WDT溢出,第一种是等待计数值大于9,第二种是按S1。
4)先用第一种方法,当计数值大于9后,读者细心观察会发现数码管显示的内容会有一阵错乱,不是要显示的效果,这说明程序跑飞了。但过了一会儿又好了,这是因为跑飞后会使WDT溢出复位单片机,所以单片机又重新执行了写入单片机的程序,自然显示内容就正常了。
5)用第二种方法再实验一次。重新运行程序,在计数到9之前按S1,按完S1后读者会发现数码管又从0开始计数了。同时,Proteus VSM窗口下方状态栏的Message数目会增加,打开后看其内容,如图7-7所示。
图7-7 Proteus VSM模拟日志中记载WDT溢出的图示
6)图7-7中后3条消息说明处理器被WDT复位了。出现这么多次复位的原因是当用鼠标单击S1的过程是比较漫长的(在Proteus模拟中大约为100ms),程序判断S1被按下后就进入无“喂狗”指令的死循环,而WDT在不用预分频器的情况下复位时间约为18ms,所以在单击S1时会产生多次WDT溢出复位。
以上通过例子理解了WDT的作用,但是WDT的使用不是这么简单的,有些时候项目要求单片机在WDT复位后的状态与程序跑飞前状态一致。这样需要程序员在系统复位时判断是否是WDT复位,是则相关变量不做初始化,否则把相关变量初始化。下面是一段示意性的代码。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。