在图3-23所示的仿真电路中,定时/计数器TIMER1的计数脉冲由RC0/T1CKI引脚输入,实现了按键和脉冲计数及显示功能,案例设计与调试的要点在于掌握TIMER1工作于同步计数方式的程序设计方法。
图3-23 用工作于同步计数方式的TIMER1实现10 000以内的脉冲或按键计数
(一)TIMER1的同步工作模式
PIC16F877A的16位定时/计数寄存器TIMER1可工作于3种模式:分别为(1)同步定时器模式;(2)同步计数器模式;(3)异步计数器模式。3种模式的配置由T1CON寄存器的TMR1CS和T1SYNC决定。当设置TMR1CS=1时,TMR1寄存器的计数时钟不再由系统时钟分频提供,而是由外部输入脉冲提供,此时TIMER1工作于计数器模式,T1SYNC=0时工作于同步模式,在同步计数器模式下:
(1)T1OSCEN=0对RC0/T1OSO/T1CKI输入的脉冲上升沿计数;
(2)T1OSCEN=1对RC1/T1OSI/CCP2输入的脉冲上升沿计数。
实测时发现当前版本的Proteus在这里存在BUG,它将这两位弄反了。
有关TIMER1的内部结构可参考本章案例3.17中的图3-20。
(二)计数程序设计
因为存在BUG,主程序中将T1OSCEN暂设为1,以便对RC0/T1OSO/T1CKI输入脉冲的上升沿计数,在实物电路上应根据技术手册设T1OSCEN=0。
主程序将TIMER1配置为工作于同步计数方式,所选择的计数脉冲将由RC0/T1OSO/T1CKI引脚输入,输入脉冲的上升沿使TMR1寄存器累加,实现脉冲计数,所输入脉冲信号可能是无固定周期的(如仿真电路中的按键计数操作),也可能是有固定周期的(如外部输入的10Hz计数脉冲)。运行时可观察到数码管并不会在按下按键时显示计数递增,只有按键释放时出现的脉冲上升沿才会使TMR1累加,数码管显示递增。
对于4位的计数值(实际最大可达65 535,受限于仿真电路中的数码管位数,仅取0000~9999范围之内计数值),为将其分解为4位待显示数字,中断函数内未直接使用常规的整除“/”与取余“%”运算符,而是完全由“+”,“−”运算符及循环语句实现数位分解,这样可有效地节约MCU时间,提高运行效率,因为“/”与“%”的运行效率是很低的。
① 将输入脉冲改接到RC1/T1OSI/CCP2,修改程序,实现同样的计数功能。
② 添加信号调理电路,检测交流信号频率并显示。