购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.15 TIMER0控制流水灯

图3-17所示的仿真电路利用定时器TIMER0控制连接在PB、PC端口的两组LED滚动显示。上一案例演示的是定时器溢出中断方式,本例演示的是定时器溢出查询方式。

图3-17 TIMER0控制流水灯

1.程序设计与调试

(一)两种基于计数溢出的定时方法

(1)使用溢出中断:例如上一案例中启用TMR0溢出中断,当时钟驱动TMR0从指定初值(默认为0)累加至溢出时(0xFF+1→0),自动进入TIMER0中断处理函数。

(2)中断标志查询:反复轮询TIMER0中断标志位T0IF,硬件置位即表示定时计数溢出。

(二)基于中断标志位查询的流水灯程序设计

本例由主程序控制LED滚动显示,整个代码中未使用定时器溢出中断函数,而是改用了定时器溢出轮询的方法。

主程序首先将Pattern设为0xFFFE(1111111111111110),16位的Pattern中只有最低位为0,主函数选择内部时钟后定时器随即启动,控制LED在设定的时间间隔内滚动显示。

主函数内的语句:while(!T0IF)循环等待TIMER0定时计数器溢出中断标志位T0IF被硬件置位,当检测到T0IF被置位时则表示定时溢出,随后的语句T0IF=0通过软件方式清除中断标志,再还原TMR0定时初值,后续代码则控制16只LED完成一次滚动显示。

仿真电路中选择的是1MHz晶振,TIMER0在256分频下的最大溢出时间为:

256×K×Tcy=256×256×4μs=262 144μs≈0.26s

显然,振荡器频率降低为原来的1/4以后,同一配置的定时器TIMER0的最大溢出时间扩大了4倍(65ms×4=0.26s)。

主程序设置0.1秒溢出语句为:TMR0=(INT8U)(256−_XTAL_FREQ/4/256×0.1)。

上一案例中用该语句直接实现0.1s延时是不可能的,因为在4 MHz振荡频率/最大256分频的配置下,TIMER0的最大溢出时间仅为65ms。

2.实训要求

① 仍使用定时器溢出查询方式,实现单只数码管滚动显示单个数字。

② 重新使用定时器溢出中断方式改写代码,实现相同的运行效果。 M5NR5gaRApvIcwCMOKgJthPdJAp6Iu8f4Uh96ZaPiGn3ezGAhdqgVHMjgkM7QQNm

3.源程序代码
点击中间区域
呼出菜单
上一章
目录
下一章
×