当前位置:
文档之家› 项目5 定时器与脉冲计数器的设计
项目5 定时器与脉冲计数器的设计
X= 213-T/(时钟周期×12) = 0110001100011000B = 0x6318
所以TH1赋值0x63 ,TL1赋值0x18。
注意:定时/计数器的方式0为13位计数器,其不用的是低 8位中的高三位,一般补三个0。
3. 任务设计 (1)硬件原理图设计
(2)软件程序设计
#include<AT89X51.h>
计数器脉冲来源:
➢振荡器脉冲经过12分频 ➢T0或T1引脚的外部脉冲
计数值:溢出时计数器值-计数初值。
计数器全1时,再输入1个脉冲就回零,并发生 溢出(TCON中TF0或TF1置1), 发中断请求 。
5.1.1.3 时/计数器的初始化
1.工作方式控制寄存器TMOD
D7
D6
D5
D4
D3
D2
D1
D0
//流水灯定时1s滚动主程序
void main( )
{ uchar T_Count = 0;
//累加计数溢出发生的次数
P0 = 0xFE;
//点亮D1灯
P2 = 0xFE;
//点亮D16灯
TMOD = 0x01;
//定时器0工作于方式1
TH0 =(65536-50000)/256; //50ms定时初值
任务5.1 定时器的设计 5.1.1 MCS-51单片机内部定时/计数器的原理
5.1.1.1 单片机定 时/计数器的结构
加1计数器(高8位、低8位); 工作方式控制寄存器TMOD,工作方式设置; 定时器控制寄存器TCON,启动、停止及设置溢出标志。
5.1.1.2 定时/计数器工作原理
TMOD中,各有一个控制位(C/T),分别用于控制定 时/计数器T0和T1工作在定时器方式还是计数器方式。
GATE C/T
M1
M0 GATE C/T
M1
M0
T1控制
GATE—门控位 C/T—计数/定时选择 M1 M0—工作方式选择
T0控制 注意:不能进行位寻址
定时/计数器的工作方式
M1 M0 00 01 10 11
工作方式 方式0 方式1 方式2 方式3
功能说明
13位计数器
16位计数器
自动重装初值的8位计数器
振荡器
计数脉冲输入
T0 TR0 GATE 1 INT0
定时
1/12
C/T=0 器
TL0 TH0 TF0
C/T=1
低5位 8位
& ≥1
13位计数器
计数 器
➢定时/计数器工作方式0 定时方式:
计数初值:X= 213-T/(时钟周期×12) 定时=(213-X)×时钟周期×12
=(213 –X)*12*1/fosc 例:8*10-3=(213-X)*12*1/(12*106)
方式1—16位方式 16位计数,由TL0作为低8位、TH0作为高8位。 16位计数,由TL1作为低8位、TH1作为高8位。
振荡器
T0 TR0 GATE 1 INT0
1/12 ≥1
定时
C/T=0 器
TL0 TH0 TF0
C/T=1
低8位 8位
&
16位计数器
计数 器
定时/计数器工作方式1
定时方式: 定时=(216-X)×时钟周期 ×12
试计算X的初值。
解:采用定时器0的方式0:
500*10-6=(213-X)*12*1/fosc
x=7692=1E0CH=1 1110 000 0 1100
F0H
0CH
即 TH0=F0H , TL0 =0CH
TMOD=GATE C/T M1M0 GATE C/T M1M0
0 0 00
0 0 00 00H
方式3只针对T0,T0分成两个 独立的8位定时/计数器;T1
无式3
2.定时器控制寄存器TCON
D7 D6 D5 D4 D3 D2 D1 D0 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
中断请求标志 启动定时/计数器 触发方式选择
0 停止
0 低电平
1 启动
1 下降沿
3.定时/计数器的初始化
初值X分别送给TL0(TL1)和TH0(TH1)。
1.任务要求
本任务要求用AT89C51的定时器1方式2设计一只1 秒 的定时器,用定时器的查询方式,使AT89C51控制的一只 发光二极管定时1秒闪烁。
= 65536-50000=15536 = 0x6318
所以TH1赋值0x63 ,TL1赋值0x18。
TH0 =(65536-40000)/256; TL0 =(65536-40000)%256;
3. 任务设计 (1) 硬件原理图设计
C1
22pF
X1
C2
12M
22pF
R1
10k
C3
10uF
U1
19 XTAL1 18 XTAL2
2.任务分析 ① 确定TMOD控制字:
采用AT89C51的定时器0方式1定时, TMOD = 0x01。
②计算计数器的计数初值:
因为方式1采用16位计数器,其最大定时时间为: 65536×1 ms =65.536ms,可选择定时时间为5 ms,再循环 200次就可以定时为1s了。
X = 216-T/(时钟周期×12)
39 1 38 2 37 3 36 4 35 5 34 6 33 7 32 8
P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15
21 9 22 10 23 11 24 12 25 13 26 14 27 15 28 16
{ P0 = _crol_(P0,1);
P2 = _crol_(P2,1);
T_Count = 0;
}
}
}
}
5.1.2.3 用定时/计数器的工作方式2设计定时器
方式2—8位自动装入时间常数方式 自动重装初值的8位计数方式 ,适合于用作较
精确的脉冲信号发生器。
振荡器
T0 TR0 GATE 1 INT0
1/12 ≥1
C/T=0
C/T=1 &
TL0 TF0 TH0
TH0(TH1)中保留初值
定时/计数器工作方式1
定时方式: 定时=(28-X)×时钟周期×12 =(28 –X)*12*1/fosc
计数初值:X= 28-T/(时钟周期×12) 计数方式: 计数次数值N=28-X
计数初值:X= 28-计数次数值N
9 RST
29 30 31
PSEN ALE EA
1 2 3 4 5 6 7 8
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
AT89C51
P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7
中断服务程序中重新装入定时初值
void timer0() interrupt 1 {
TH0=0xFE; //定时器0高8位给初值 TL0=0xC0; //定时器0低8位给初值 }
5.1.2 用单片机定时/计数器设计定时器(查询方式)
5.1.2.1 用定时/计数器的工作方式0设计定时器
方式0—13位方式。由TL0的低5位和TH0的8位组成。 TH0溢出时,置位TF0标志,向CPU发出中断请求。
P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1
P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD
10 11 12 13 14 15 16 17
16
1
R2
R3
R4
R5
R6
R7
R8
R9
280
280
280
280
280
280
280
280
D1
D2
D3
D4
D5
D6
D7
D8
定时功能----计数输入信号是内部时钟脉冲,每个机器周期使 寄存器的值加1。所以,计数频率是振荡频率的1/12。 定时模式,对内部机器周期计数 定时时间 t =计数值N x Tcy
计数功能----计数脉冲来自相应的外部输入引脚,T0为P3.4, T1为P3.5。 计数模式,对外部事件脉冲计数 计数脉冲周期要大于2 Tcy
可编程器件在使用前需要进行初始化:
① 确定TMOD控制字:编程时将控制字送TMOD;
② 计算计数器的计数初值: 编程时将计数初值送TH0、TL0或TH1、TL1;
③ 开中断(如果使用中断方式): 编程实置位EA、ETi
④ TR0或TR1位置位控制定时器的启动和停止。
【例】若单片机晶振为12MHz,要求产生5ms的定时,
一只1 秒的定时器,用定时器的查询方式,使 AT89C51控制的一只发光二极管定时1秒闪烁。
2.任务分析 ① 确定TMOD控制字: 采用AT89C51的定时器1方式0定时, TMOD = 0x00
② 计算计数器的计数初值:
因为方式0采用13位计数器,其最大定时时间为:8192×1 ms = 8.192 ms,可选择定时时间为5 ms,再循环200次就可以定 时为1s了。
8
7
6
5
4
3
2
9
10
11
12
13
14
15
D9
D10
D11
D12
D13
D14
D15
D16
R10
R11
R12
R13
R14
R15
R16
R17
280