第10讲-C8051F单片机定时器计数器分析
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
TMOD=0x01; //T0,方式1
TH0=0xf8;
//初值
TL0=0x30; TCON|=0x10;
//启动T0,可用TR0=1代替
}
给定时器赋初值的语句也可以采用如下方法: TH0=(65536-2000)/256; TL0=(65536-2000)%256;
或 TH0=-2000/256; TL0=-2000%256;
//允许T1中断 //TF1中断为高级中断 //启动T1 //死循环,等待中断,产生方波
}
中断服务程序
void Timer1_ISR (void) interrupt 3
{
TH1=0x3c;
//重装初值
TL1|=0xb0;
count--;
//中断计数
if (count==0) //500ms到,重赋计数初值,P1.0取反
(2) C8051F020单片机定时器/计数器资源
C8051F020内部有5 个定时器/计数器:其中三个16 位定时器/计数器与标准8051 中 的计数器/定时器兼容, 还有两个16 位自动重装载定时器可用于ADC、SMBus、 UART1 或作 为通用定时器使用。
C8051F020定时器/计数器的工作方式
{ WDTCN = 0xde; //关看门狗
WDTCN = 0xad; XBR2 = 0x40; CKCON&=0xef; TMOD=0x10;
//使能端口输出 //T1的计数源选择系统脉冲的12分频 //T1方式1
P1_0=0; TH1=0x3c;
//初值
TL1=0xb0; IE|=0x88; IP|=0x08; TCON|=0x20; while(1);
10.2 定时器的一般结构和工作原理
启/停控制
查询 溢出标志
中断
定时器 方式选择
计数器
执行机构 加1计数器:如T0~T4
实质是计数器,脉冲每一次下降沿,计数寄存器数值将加1。
计数的脉冲如果来源于单片机内部的晶振,由于其周期极为 准确,这时称为定时器。
计数的脉冲如果来源于单片机的引脚,由于其周期一般不 确定,可表示事件发生,这时称为计数器。
(2) 定时方式
每一个计数周期计数器加1,直至计满溢出,产生中断请求。 对于一个N位的加1计数器,若计数周期Tclock是已知的,则从初值a 开始加1计数至溢出所占用的时间为:
TT clock ( 2na )
则,最大定时时间:
Tm ax2nTclock
式中n由工作方式决定,Tclock为定时器/计数器的计数脉冲周期, 由C8051F的系统时钟或系统时钟经12分频提供,是否需要12分 频取决于对时钟控制寄存器CKCON的设定。
时钟控制寄存器CKCON
➢位7:未用。读=0b,写=忽略。 ➢位6-3:T4M-T0M:T4到T0的时钟选择(不包含T3,
T3的时 钟选择由T3控制寄存器TMR3CN的第0位 T3XCLK决定)。 0:定时器按系统时钟的12分频计数 1:定时器按系统时钟频率计数
➢位2-0:保留。读=000b,写入值必须是000b。
用于需要重复定时和计数的场合。 最大计数值:256 (28)
工作方式 2 的编程:
TMOD寄存器选方式: 写“M1,M0” = 10 b 选中方式2
THx/TLx赋相同初值 在TLx计数达到0FFH 再加“1”时,TL0 将溢出, “TFx”置1去申请中断,同时THx中的 值自动重装(Copy)进TLx
例1 若fOSC=12MHz,用系统时钟的十二分频作为计数源, 请计算定时2ms所需的初值,并给出初始化程序。
解:(1)工作方式的选择
∵ fOSC= 12MHz,用系统时钟的十二分频作为计数源时,方式2、3的 最大定时时间只有0.256ms,因此要想获得2ms的定时时间,必须用 方式0或方式1。
(2)定时器初值计算
(1) 计数方式
外部输入信号的下降沿触发计数。 计数器在每个时钟周期或时钟周期的12分频采样外部输 入信号,若一个周期的采样值为1,下一个周期的采样值为0, 则计数器加1,故识别一个从1到0的跳变需2个周期。 所以,对外部输入信号最高的计数速率是时钟频率的1/2 或1/24(取决于是否12分频)。同时,外部输入信号的高电 平与低电平保持时间均需大于一个周期。
89H
00:方式0
门控位
方式选择
定时/计数选择
0:定时器 1:计数器
01:方式1 10:方式2 11:方式3
定时器T0、T1的工作方式
10.3.2 T0和T1的工作方式和电路结构
(1)工作方式1:——16位的定时/计数器
时基选择
定时/计数选择 16位计数器
启/停控制
GATE0=0时:TR0=1 启动计数 GATE0=1时: TR0=1且INT0=1 启动计数
TL0 = ( 65536 – 10000 ) % 256;
if( ++overflow_count == high ) WAVE = 0;
else if ( overflow_count == period ) { overflow_count=0; WAVE = 1; }
}
10.4 定时器/计数器T2和T4
10.3.1 与定时器有关的特殊功能寄存器
1、计数寄存器TH与TL
2、定时器控制寄存器TCON (88H)
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
TRx: Timer0/1运行控制位。 =1 启动计数; =0 停止计数
TFx: Timer0/1计数溢出标志位。 =1 计数溢出; =0 计数未满
10.3 定时器/计数器T0和T1
➢T0和T1都是16位的加1计数器,访问时以两个字节的形 式出现:TH0+TL0、TH1+TL1 ➢对定时器0 和定时器1 的访问和控制是通过SFR 实现的。 ➢定时器/计数器控制寄存器(TCON)用于允许/禁止定 时器0 和定时器1 以及指示它们的状态.
➢定时器/计数器方式寄存器(TMOD)中的方式选择位M1M0 来选择工作方式。
TL0 = ( 65536 – 10000 ) % 256;
IE|=0x88;
//允许T1中断
IP|=0x08;
//TF1中断为高级中断
while(1);
//死循环,等待中断,产生方波
}
中断服务程序
void timer1_ISR(void) interrupt 1 { TH0 = ( 65536 – 10000 ) / 256;
若不用门控位,直接用软件写TRx控制启/停 若使用门控位,先置位TRx,然后由INTx端
的高/低电平来控制其启/停
若要允许中断,还须先置位ETx、EA等中断 允许控制位,并编写中断服务程序
若不用中断,可查询“计数溢出标志TFx” 的方式工作,但溢出标志TFx须软件清0
2、工作方式2:——8 位自动重装的定时/计数器
例2 若fOSC=12MHz,T1工作于方式1,产生50ms的定时中断, TF1为高级中断源。试编写主程序和中断服务程序,使P1.0 产生周期为1s的方波。
解:让P1.0每500ms取反一次即可实现。定时器的单次定时时间 不可能达到500ms,可让定时器多次定时产生500ms的定时时间, 如让T1工作在方式1,单次定时时间为50ms,那么T1中断10次就 是500ms的时间。
{
count=10; P1_0=!P1_0;
}
}
问题:为什么用TL1|=0xb0; 而非TL1=0xb0?
例3 在频率为12MHz 的标准51单片机上,在P1.0引脚上输出周期为2.5S,
占空比为20%的脉冲信号。
解:
中断次数加1
次数=高电平?
P1.0=0
次数=周期? P1.0=1 返回
#include <c8051f020.h> sbit WAVE = P1^0; uchar period = 250; uchar high = 50; uchar overflow_count = 0; void main( void )
1、初始化步骤
➢ 确定定时器/计数器的工作方式----初始化TMOD ➢ 根据需要初始化CKCON ➢ 计算定时器/计数器的计数初值,装载TH和TL寄存 器。 ➢ 中断设置(IE、IP) ➢ 启动定时/计数器(TCON)
2、计数初值的计算
T12(1T0M) (216a)s
fosc
最大定时时间(设 fOSC=12MHz、T0M=0 ):
(3)中断服务程序
中断服务程序除了完成要求的方波产生这一工作之外,还 要注意将时间常数重新送入T1中,为下一次产生中断作准备。
主程序
#include <c8051f020.h>
sbit P1_0 = P1^0;
int count=10;
//10次T1中断为500ms
void main( void )
方式0: TMAX = 213×1μs = 8.192ms
方式1: TMAX = 216×1μs = 65.536ms
方式2、3:
TMAX = 28 ×1μs = 0.256ms
初值a=M-C
a为计数初值初值 M为计数器的模,与工作方式有关 , C为所需要的计数值
10.3.4 定时器/计数器的应用实例
(1)定时器初值计算
a=216-50ms/1us=63536-50000= 15536=3CB0H 即:TH0=0x3c;TL0=0xb0
(2)初始化程序
包括T1初始化和中断系统初始化,主要是对IP、IE、CKCON、 TCON、TMOD的相应位进行正确的设置,并将时间常数送入T1。
本例中将初始化操作放在主程序中完成,当程序规模较大时, 应编写单独的初始化程序,以利于程序的模块化设计。
其他用法与各种方式1完全相同
3、工作方式3
方式3只适用于定时器0。此时,定时器0的 TH0、TL0成为两个独立的计数器。
➢ TL0可作为定时器/计数器,占用定时器0在 TCON和TMOD中的控制位和标志位。
➢ TH0只能作为定时器使用,占用定时器1在 TCON和TMOD中的控制位和标志位。
10.3.3 T0和T1的编程
TFx标志位可用于申请中断或供CPU查询。 在进入中断服务程序时会自动清零;但在查询方式时必
须软件清零。
3、定时器方式寄存器TMOD (89H)
控制T1
控制T0
D7 D6 TMOD GATE1 C/ T1
D5
T1M1
D4 D3
T1M0 GATE0
D2 D1 D0 字节
C/T0 T0M1 T0M0 地址
第10讲-C8051F单片机定时 器计数器分析
10.1 C8051F020定时器/计数器概述 10.2 定时器的一般结构和工作原理 10.3 定时器/计数器T0和T1 10.4 定时器/计数器T2和T4
10.1 C8051F020定时器/计数器概述
(1) 定时器/计数器的功用
定时操作:定时采样,定时扫描,定时中断 测量外部信号:累加统计,测量周期等 定时输出:PWM等
方式1:定时初值/பைடு நூலகம்时时间计算
若T0的计数初值为a,则T0从初值a加1计数至溢出所需 的时间为:
T12(1T0M) (216a)s
fosc
式中fOSC为系统时钟频率,T0M为T0的时钟选择位。
工作方式1 的编程要点:
THx/TLx赋初值:THx赋高8位,TLx赋低8位
TMOD选方式: 写“M1,M0”=01b选方式1
{ WDTCN = 0xde; //关看门狗
WDTCN = 0xad; XBR2 = 0x40; CKCON&=0xef; TMOD=0x10;
//使能端口输出
//T1的计数源选择系统脉冲的12分频 //T1方式1
WAVE =0;
TH0 = ( 65536 – 10000 ) / 256; //初值
方式0 a=213-2ms/1us=6192=1830H 即:TH0=0C1H;TL0=10H(高三位为0)
方式1 a=216-2ms/1us=63536=F830H 即:TH0=0F8H;TL0=30H
(3)初始化程序
void T0_mode1_2ms_init( void )
{
CKCON&=0xf7; //T0计数源选择系统脉冲的12分频
10.4.1 概 述
定时器/计数器T2 和T4的结构基本相同,具有三种工作方式: ➢ 自动重装初值的16位定时器/计数器方式、 ➢ 带捕捉的16位定时器/计数器方式 ➢ 波特率发生器方式
T2 和T4其主要区别在于:
(1)T2用做UART0的波特率发生器 T4用做UART1的波特率发生器
(2)T2可以用于启动ADC数据转换和触发DAC输出更新 T4可用于触发DAC输出更新