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

单片机学习之十六:定时器应用3(模式3)

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

在P0.0和p0.1分别输出一个周期是200us和400us的方波信号。

二、实验目的

掌握内部定时/计数器作定时功能(模式3)的应用

三、实验任务分析:

在这个试验里面,要同时产生两个方波信号。我们可以采用和上面一个试验类似的方法,让T0、T1都工作于模式2,分别产生两个方波信号,但是这样要同时占用两个定时器的资源,比较浪费。

由于T0还有一种工作方式,就是可以分为两个8位的计数器tl0和th0,所以我们就采用这个模式3来产生两个方波信号。(注:这种工作模式只适用于T0,如果把定时器T1定义为模式3的时候,T1是停止计数的。)

T0工作于模式3的逻辑图如下图所示:

从图上我们可以看到,tl0使用T0的状态控制位:gate 、c/t、 tr0、tf0;而th0使用的是T1的状态控制位tr1和tf1,并占用T1的中断源。

所以,启动tl0应该是:setb tr0;而启动th0则是:setb tr1

另外,th0产生计数溢出的时候,是置位tf1,所以th0的溢出中断入口应该是T1的中断入口001bh。

我们用tl0产生100us定时,计数初值是156;用th0产生200us定时,计数初值是56,该程序如下:

四、实验程序

org 0000h

ajmp main

org 000bh ;T0溢出中断入口地址

ajmp time0

org 001bh

ajmp time1 ;T1溢出中断入口地址

org 0020h

main: clr p1.5

mov sp,#70h ;设置堆栈

mov tmod,#03h ;设置T0为定时方式,工作于模式3

mov tl0,#156 ;tl0置计数初值

mov th0,#56h ;th0置计数初值

setb et0 ;允许TL0溢出中断

setb et1 ;允许TH0溢出中断

setb ea ;cpu开中断

setb tr0 ;启动TL0计数

setb tr1 ;启动TH0计数

ajmp $ ;等待

time0:mov tl0,#156 ;tl0定时时间到,重新装入计数初值

cpl p0.0 ;P0.0取反

reti

time1:mov th0,#56 ;th0定时时间到,重新装入计数初值

cpl p0.1 ;P0.1取反

reti

end

五、几点说明

1、当T0工作于模式3的时候,T1可以工作于模式0、模式1、模式2、串行口的波特率发生器、或者不需要中断的场合(由于这时T1的中断资源被TH0占用)。

2、大家如果用示波器看了上一个试验中周期为500us的波形,和这个试验的周期分别为200us和400us的波形,就会发现一个问题。在上一个试验中,产生的500us信号非常标准,但是这个试验里面200us的信号约有14us的误差,而400us的约有26us的误差,这是为什么呢?

由于上一个试验中进入中断后计数值是自动重装的,所以产生的定时非常标准。而在这个试验中,由于每次进入中断都要手动重装计数值,所以就会相应的产生误差。同时,由于400us刚好是200us的两倍,每进入两次tl0的中断才会进入一次th0的中断,所以th0的误差约为tl0的两倍。大家如果把两个信号的周期分别改为200us和300us,就会发现两者的误差基本一致拉。

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

网站地图

Top