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