单片机学习之十六:定时器应用3(模式3)
在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,就会发现两者的误差基本一致拉。
单片机定时器模式 相关文章:
- 51单片机定时器模式1使用(11-30)
- 单片机定时器(更准确的模式1操作)(11-18)
- 单片机学习之十四:定时器应用(模式1)(11-18)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)