项目5 定时器与脉冲计数器的设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机控制技术 项目式教程 (C语言版)
项目5 定时器与脉 冲计数器的设计
➢ 学习目标
能了解单片机定时/计数器的组成; 能理解单片机定时/计数器的工作原理和4种工作方式; 能掌握单片机定时/计数器的初始化方法; 能恰当运用单片机定时/计数器的功能; 能掌握定时器的设计方法; 能掌握脉冲计数器的硬件电路和软件设计方法; 能熟练编写单片机定时/计数器工作的程序。
➢ 工作任务
叙述单片机定时/计数器4种工作方式的工作原理; 叙述单片机定时/计数器的初始化方法; 设计定时器的工作程序; 设计脉冲计数器的电路和工作程序。
项目5 定时器与脉冲计数器的设计
任务5.1 定时器的设计 任务5.2 脉冲计数器的设计 项目拓展 实验板分频器的设计 项目小结 思考与训练
TL0 =(65536-50000)%256;
TR0 = 1;
//启动定时器
while(1) {
if(TF0 = = 1) //定时溢出标志位为1时表示计时溢出 { TF0 = 0; //软件清零 TH0 =(65536-50000)/256; //重置50ms定时 TL0 =(65536-50000)%256; if(++T_Count == 20) //50*20=1000ms后LED滚动一次
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
{ P0 = _crol_(P0,1);
P2 = _crol_(P2,1);
T_Count = 0;
}
}
}
}
5.1.2.3 用定时/计数器的工作方式2设计定时器
方式2—8位自动装入时间常数方式 自动重装初值的8位计数方式 ,适合于用作较
精确的脉冲信号发生器。
振荡器
T0 TR0 GATE 1 INT0
初值X分别送给TL0(TL1)和TH0(TH1)。
1.任务要求
本任务要求用AT89C51的定时器1方式2设计一只1 秒 的定时器,用定时器的查询方式,使AT89C51控制的一只 发光二极管定时1秒闪烁。
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
280
280
280
280
280
280
280
(2) 软件程序设计
#include<AT89X51.h> #include<intrins.h> #define uchar unsigned char
可编程器件在使用前需要进行初始化:
① 确定TMOD控制字:编程时将控制字送TMOD;
② 计算计数器的计数初值: 编程时将计数初值送TH0、TL0或TH1、TL1;
③ 开中断(如果使用中断方式): 编程实置位EA、ETi
④ TR0或TR1位置位控制定时器的启动和停止。
【例】若单片机晶振为12MHz,要求产生5ms的定时,
X = 213 – 8000 =192 =0xC0
计数方式:
计数次数值N=213-X 计数初值:X= 213-计数次数值N
注意:X的低5位送TL0(TL1),TL0(TL1)的高 3位数为任意值,常取0,高8位送TH0(TH1)。
任务操作
1.任务要求 本任务要求用AT89C51的定时器1,方式0设计
方式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.定时/计数器的初始化
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
void sTime ( ) //定时1s子程序
{ unsigned int i; TMOD=0x00; //设定时器1为方式0 TH1=0x63; //置定时器初值
TL1=0x18;
TR1=1;
//启动T1
for(i=0; i<=200 ; )
{ if ( TF1 == 1) //查询计数溢出
{ i++;
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
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
试计算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 பைடு நூலகம் 00
0 0 00 00H
定时功能----计数输入信号是内部时钟脉冲,每个机器周期使 寄存器的值加1。所以,计数频率是振荡频率的1/12。 定时模式,对内部机器周期计数 定时时间 t =计数值N x Tcy
计数功能----计数脉冲来自相应的外部输入引脚,T0为P3.4, T1为P3.5。 计数模式,对外部事件脉冲计数 计数脉冲周期要大于2 Tcy
任务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工作在定时器方式还是计数器方式。
X= 213-T/(时钟周期×12) = 0110001100011000B = 0x6318
所以TH1赋值0x63 ,TL1赋值0x18。
注意:定时/计数器的方式0为13位计数器,其不用的是低 8位中的高三位,一般补三个0。
3. 任务设计 (1)硬件原理图设计
(2)软件程序设计
#include<AT89X51.h>
TF1=0;
TH1=0x63; //重新置定时器初值
TL1=0x18;}
}
return ;
}
//发光二极管定时1s闪烁主程序 void main() { for( ; ; )
{ P1_0=!P1_0; //取反P1.0 使发光二极管闪烁 sTime (); //调用1s定时
} }
5.1.2.2 用定时/计数器的工作方式1设计定时器
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位计数器
方式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
//流水灯定时1s滚动主程序
void main( )
{ uchar T_Count = 0;
//累加计数溢出发生的次数
P0 = 0xFE;
//点亮D1灯
P2 = 0xFE;
//点亮D16灯
TMOD = 0x01;
//定时器0工作于方式1
TH0 =(65536-50000)/256; //50ms定时初值
计数初值:=X(=221166-–XT/)(*1时2*钟1周/fo期s×c 12) 计数方式: 计数次数值N=216-X
计数初值:X= 216-计数次数值N
X的低8位送TL0(TL1),高8位送TH0(TH1)。
1.任务要求
本任务要求用AT89C51的定时器0方式1设计一只1 秒 的定时器,使AT89C51的P0和P2端口控制的2组16只LED 流水灯定时1秒滚动点亮。
一只1 秒的定时器,用定时器的查询方式,使 AT89C51控制的一只发光二极管定时1秒闪烁。
2.任务分析 ① 确定TMOD控制字: 采用AT89C51的定时器1方式0定时, TMOD = 0x00
② 计算计数器的计数初值:
因为方式0采用13位计数器,其最大定时时间为:8192×1 ms = 8.192 ms,可选择定时时间为5 ms,再循环200次就可以定 时为1s了。
中断服务程序中重新装入定时初值
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发出中断请求。
振荡器
计数脉冲输入
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)
= 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)
采用定时器1方式1:
500*10-6=(216-X )*12*1/fosc
x=65036=FE0CH
即TH1=FEH, TL1 =0CH
TMOD=GATE C/T M1M0 GATE C/T M1M0
0 0 01
0 0 0 0 10H
初始化程序编写
main()函数中: TMOD=0x01;//设置定时器0为工作方式1 TH0=0xFE; //定时器0高8位给初值 TL0=0xC0; //定时器0低8位给初值 EA=1; //开总中断 ET0=1; //开定时器0中断 TR0=1; //启动定时器0
计数器脉冲来源:
➢振荡器脉冲经过12分频 ➢T0或T1引脚的外部脉冲
计数值:溢出时计数器值-计数初值。
计数器全1时,再输入1个脉冲就回零,并发生 溢出(TCON中TF0或TF1置1), 发中断请求 。
5.1.1.3 时/计数器的初始化
1.工作方式控制寄存器TMOD
D7
D6
D5
D4
D3
D2
D1
D0
项目5 定时器与脉 冲计数器的设计
➢ 学习目标
能了解单片机定时/计数器的组成; 能理解单片机定时/计数器的工作原理和4种工作方式; 能掌握单片机定时/计数器的初始化方法; 能恰当运用单片机定时/计数器的功能; 能掌握定时器的设计方法; 能掌握脉冲计数器的硬件电路和软件设计方法; 能熟练编写单片机定时/计数器工作的程序。
➢ 工作任务
叙述单片机定时/计数器4种工作方式的工作原理; 叙述单片机定时/计数器的初始化方法; 设计定时器的工作程序; 设计脉冲计数器的电路和工作程序。
项目5 定时器与脉冲计数器的设计
任务5.1 定时器的设计 任务5.2 脉冲计数器的设计 项目拓展 实验板分频器的设计 项目小结 思考与训练
TL0 =(65536-50000)%256;
TR0 = 1;
//启动定时器
while(1) {
if(TF0 = = 1) //定时溢出标志位为1时表示计时溢出 { TF0 = 0; //软件清零 TH0 =(65536-50000)/256; //重置50ms定时 TL0 =(65536-50000)%256; if(++T_Count == 20) //50*20=1000ms后LED滚动一次
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
{ P0 = _crol_(P0,1);
P2 = _crol_(P2,1);
T_Count = 0;
}
}
}
}
5.1.2.3 用定时/计数器的工作方式2设计定时器
方式2—8位自动装入时间常数方式 自动重装初值的8位计数方式 ,适合于用作较
精确的脉冲信号发生器。
振荡器
T0 TR0 GATE 1 INT0
初值X分别送给TL0(TL1)和TH0(TH1)。
1.任务要求
本任务要求用AT89C51的定时器1方式2设计一只1 秒 的定时器,用定时器的查询方式,使AT89C51控制的一只 发光二极管定时1秒闪烁。
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
280
280
280
280
280
280
280
(2) 软件程序设计
#include<AT89X51.h> #include<intrins.h> #define uchar unsigned char
可编程器件在使用前需要进行初始化:
① 确定TMOD控制字:编程时将控制字送TMOD;
② 计算计数器的计数初值: 编程时将计数初值送TH0、TL0或TH1、TL1;
③ 开中断(如果使用中断方式): 编程实置位EA、ETi
④ TR0或TR1位置位控制定时器的启动和停止。
【例】若单片机晶振为12MHz,要求产生5ms的定时,
X = 213 – 8000 =192 =0xC0
计数方式:
计数次数值N=213-X 计数初值:X= 213-计数次数值N
注意:X的低5位送TL0(TL1),TL0(TL1)的高 3位数为任意值,常取0,高8位送TH0(TH1)。
任务操作
1.任务要求 本任务要求用AT89C51的定时器1,方式0设计
方式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.定时/计数器的初始化
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
void sTime ( ) //定时1s子程序
{ unsigned int i; TMOD=0x00; //设定时器1为方式0 TH1=0x63; //置定时器初值
TL1=0x18;
TR1=1;
//启动T1
for(i=0; i<=200 ; )
{ if ( TF1 == 1) //查询计数溢出
{ i++;
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
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
试计算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 பைடு நூலகம் 00
0 0 00 00H
定时功能----计数输入信号是内部时钟脉冲,每个机器周期使 寄存器的值加1。所以,计数频率是振荡频率的1/12。 定时模式,对内部机器周期计数 定时时间 t =计数值N x Tcy
计数功能----计数脉冲来自相应的外部输入引脚,T0为P3.4, T1为P3.5。 计数模式,对外部事件脉冲计数 计数脉冲周期要大于2 Tcy
任务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工作在定时器方式还是计数器方式。
X= 213-T/(时钟周期×12) = 0110001100011000B = 0x6318
所以TH1赋值0x63 ,TL1赋值0x18。
注意:定时/计数器的方式0为13位计数器,其不用的是低 8位中的高三位,一般补三个0。
3. 任务设计 (1)硬件原理图设计
(2)软件程序设计
#include<AT89X51.h>
TF1=0;
TH1=0x63; //重新置定时器初值
TL1=0x18;}
}
return ;
}
//发光二极管定时1s闪烁主程序 void main() { for( ; ; )
{ P1_0=!P1_0; //取反P1.0 使发光二极管闪烁 sTime (); //调用1s定时
} }
5.1.2.2 用定时/计数器的工作方式1设计定时器
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位计数器
方式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
//流水灯定时1s滚动主程序
void main( )
{ uchar T_Count = 0;
//累加计数溢出发生的次数
P0 = 0xFE;
//点亮D1灯
P2 = 0xFE;
//点亮D16灯
TMOD = 0x01;
//定时器0工作于方式1
TH0 =(65536-50000)/256; //50ms定时初值
计数初值:=X(=221166-–XT/)(*1时2*钟1周/fo期s×c 12) 计数方式: 计数次数值N=216-X
计数初值:X= 216-计数次数值N
X的低8位送TL0(TL1),高8位送TH0(TH1)。
1.任务要求
本任务要求用AT89C51的定时器0方式1设计一只1 秒 的定时器,使AT89C51的P0和P2端口控制的2组16只LED 流水灯定时1秒滚动点亮。
一只1 秒的定时器,用定时器的查询方式,使 AT89C51控制的一只发光二极管定时1秒闪烁。
2.任务分析 ① 确定TMOD控制字: 采用AT89C51的定时器1方式0定时, TMOD = 0x00
② 计算计数器的计数初值:
因为方式0采用13位计数器,其最大定时时间为:8192×1 ms = 8.192 ms,可选择定时时间为5 ms,再循环200次就可以定 时为1s了。
中断服务程序中重新装入定时初值
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发出中断请求。
振荡器
计数脉冲输入
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)
= 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)
采用定时器1方式1:
500*10-6=(216-X )*12*1/fosc
x=65036=FE0CH
即TH1=FEH, TL1 =0CH
TMOD=GATE C/T M1M0 GATE C/T M1M0
0 0 01
0 0 0 0 10H
初始化程序编写
main()函数中: TMOD=0x01;//设置定时器0为工作方式1 TH0=0xFE; //定时器0高8位给初值 TL0=0xC0; //定时器0低8位给初值 EA=1; //开总中断 ET0=1; //开定时器0中断 TR0=1; //启动定时器0
计数器脉冲来源:
➢振荡器脉冲经过12分频 ➢T0或T1引脚的外部脉冲
计数值:溢出时计数器值-计数初值。
计数器全1时,再输入1个脉冲就回零,并发生 溢出(TCON中TF0或TF1置1), 发中断请求 。
5.1.1.3 时/计数器的初始化
1.工作方式控制寄存器TMOD
D7
D6
D5
D4
D3
D2
D1
D0