微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机学习之十七:计数器的应用

单片机学习之十七:计数器的应用

时间:11-18 来源:互联网 点击:
一、实验现象

每次按下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

五、几点说明

在运行该程序时,有时可能会发现并不是按键按下两次后产生信号,这是因为手动按键的时候可能会发生抖动情况,导致计数器计数的缘故。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top