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

3.17 TIMER1控制交通指示灯

Proteus内置了交通指示灯组件,图3-19所示的仿真电路用TIMER1定时器控制交通指示灯按一定时间间隔切换显示。为了能快速观察到红绿灯切换及黄灯闪烁效果,源程序调短了切换时间间隔。

图3-19 TIMER1控制交通指示灯

1.程序设计与调试

(一)TIMER1定时/计数器工作模式

TIMER1是由两个8位的寄存器(TMR1H:TMR1L)组成的16位定时/计数器,计数寄存器TMR1的值递增到达0xFFFF,再递增则溢出为0x0000,硬件置位中断标志位TMR1F,触发溢出中断。

PIC16F877A的定时/计数寄存器TIMER1可工作于以下3种模式:

(1)16位的同步定时器模式(TMR1CS=0 T1SYNC不设置,因为内部时钟总是同步的);

(2)16位的同步计数器模式(TMR1CS=1 T1SYNC=0);

(3)16位的异步计数器模式(TMR1CS=1 T1SYNC=1)。

图3-20给出了TIMER1的结构图,由结构图可知,TIMER1时钟源选择位TMR1CS(Timer1 Clock Source Select bit)和外部时钟输入同步控制位T1SYNC(Timer1 External Clock Input Synchronization Control bit)决定了TIMER1的工作模式。

图3-20 TIMER1结构图

(二)TIMER1控制交通灯程序

仿真电路中使用PIC16F877A单片机的TIMER1定时/计数器溢出中断控制交通指示灯的所有切换过程,主程序将TIMER1配置为定时器模式(TMR1CS清零),TMR1在每一个指令周期递增1,定时器的启停控制由TMR1ON控制。

由TIMER1的结构图还可以看出,TIMER1有一个专用的低频振荡器,当振荡器使能控制位T1OSCEN(Timer1 Oscillator Enable Control bit)置1时,T1OSI与T1OSO引脚自动被设定为输入,外部低频振荡器通常选用32.768 kHz作为时钟源频率,由于32 768=0x8000,当TMR1初值为0时,累加到0xFFFF再加1时溢出,相当于0x8000的2倍,可见初值设为0时可定时2s,如果TMR1初值设为0x8000,溢出时相当于累加了0x8000,即32 768,因此可实现1 s的定时。当前版本的 Proteus 暂不支持晶振仿真,但可用一脉冲信号连接在 RC0/T1CKI 或RC1/T1CKO引脚进行仿真。

PIC16F877A单片机TIMER1定时/计数寄存器TMR1是16位的,设置TMR1初值的计算公式如下:

TMR1=65 536−Fosc/4/分频×定时长度(秒)

类似于TMR0初值的计算,现设分频值为K,在4MHz晶振下,Tcy=1μs,TMR1的最大分频值为8,故最大溢出时间为:

65 536×K×Tcy=65 536×8×1μs=524 288μs≈0.52s

由于TIMER1的最小分频比为1:1,故最小溢出时间约为65ms。

要设置TMR1的溢出时间为0.5s,有:

65 536×K×Tcy=500 000,得K≈7.6,由于TIMER1的分频比只能是:1:1、1:2、1:4、1:8,故这里取K=8。根据TMR1初始值公式有:

其中Fosc对应于主程序中定义的_XTAL_FREQ,故有:

XC8编译器允许给16位的TMR1直接赋值,也允许通过给TMR1的高8位TMR1H与低8位TMR1L分别赋值来设置TMR1,赋值语句如下:

TIMER1的分频比由T1CKPS[1:0]设置,取值00~11分别对应于1、2、4、8分频,本例主函数设置T1CKPS[1:0]=11选择8分频。

编译程序生成HEX文件之前会对源程序中的常量表达式求值,因此编写源程序时不必求出计算以后的值,直接写出整个表达式会使程序的可读性更好。

另外,本例中指示灯切换设计类似于本章LED模拟交通灯案例,大家可以自行比对阅读。

2.实训要求

① 用TIMER0定时器重新设计程序,实现相同的显示效果。

② 重新调整切换与闪烁时间,实现完整的交通指示灯仿真效果。

③ 重新设计程序,使电路能对RC1/T1OSI/CCP2输入脉冲的上升沿计数。

④ 在RC0/T1OSO/T1CKI引脚或RC1/T1OSI/CCP2使用32.768kHz信号模拟外接晶振,用数码管实现电子钟的显示。 00Zku/bFe+5uOxvDBlQ6BZcYnDnKx0BFCEGrlhtrOii4jaAlSP2QxONpfLvZY1Lo

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