单片机学习之十七:计数器的应用
2016-09-09 来源:eefocus
每次按下k0按键2次后,在P0.0输出一个周期是100ms的方波信号。
二、实验目的
掌握内部定时/计数器作计数功能的应用
三、实验任务分析
在前面的3个试验里面,我们都是让T0工作于定时方式,从而产生一段固定的时间。但是T0和T1除了可以用于定时外,还可以用于对外部输入的脉冲进行计数。在这个试验里面,我们学习T0工作于计数方式时的编程方法。
在本试验中,我们用T0对外部按键的动作进行计数。看一下定时/计数器的逻辑图如下图所示:
我们发现当C/T=1的时候,定时/计数器T0可对T0(P3.4)端计数,每当T0端产生一个负跳变的时候,计数器执行一次加1的运算。为了让k0按键按下的时候,在p3.4端产生一个负跳变,我们首先要做的是把p1.1和p3.4用导线短路,如下图13-2所示,这样才能满足试验要求。
这个试验的思路如下:让T0在计数2次时,产生溢出中断,在T0的中断服务程序我们启动T1开始计数,然后在T1的溢出中断里面把P0.0取反,这样就可以产生符合我们实验要求的信号
为了让k0按下2次后T0产生溢出中断,我们可以让T0工作于计数方式,并选择可重新置入计数初值的8位计数器模式2;为了产生100ms的方波信号,我们让T1工作于定时方式,选择16位计数器模式。所以tmod的初值应该是:0001 0110,即16h。
四、实验程序
org 0000h
ajmp main
org 000bh ;T0溢出中断入口地址
ajmp time0
org 001bh
ajmp time1 ;T1溢出中断入口地址
org 0020h
main: clr p1.5
setb p0.0
mov sp,#70h ;设置堆栈
mov tmod,#16h ;T0、T1初始化,T0工作在计数方式,T1工作在定时方式
mov tl0,#0feh ;T0置计数初值,计数2次后产生溢出中断
mov th0,#0feh ;计数初值置入常数缓冲区
mov th1,#3ch ;T1置入计数初值,产生50ms定时
mov tl1,#0b0h
setb et0 ;允许T0溢出中断
setb et1 ;允许T1溢出中断
setb tr0 ;启动T0计数
setb ea cpu开中断
ajmp $
time0: setb tr1 ;启动T1计数
reti
time1: mov th1,#3ch ;T1重装计数初值
mov tl1,#0b0h
cpl p0.0 ;P0.0取反
reti
end
五、几点说明
在运行该程序时,有时可能会发现并不是按键按下两次后产生信号,这是因为手动按键的时候可能会发生抖动情况,导致计数器计数的缘故。