当前位置:文档之家› 第05章单片机定时计数器

第05章单片机定时计数器


4.工作方式3的应用
【例】假设有一个用户系统中已使用了两个外部中断源, 并 置定时器 T1 于方式 2, 作串行口波特率发生器用, 现要求 再增加一个外部中断源,当有中断时,累加器加1。并由P1.0 口输出一个5KHz的方波(假设晶振频率为 6 MHz)。
思路
在不增加其它硬件开销时,可把定时/计数器 T0置于工作方式3,利用外部引脚T0端作附加 的外部中断输入端,把TL0预置为0FFH,这样 在T0端出现由1至0的负跳变时,TL0溢出,申 请中断,相当于边沿触发的外部中断源。 在方式3下,TH0总是作8位定时器用,可以 靠它来控制由P1.0输出的5kHz方波。由P1.0输 出5kHz的方波,即每隔100μs使P1.0求反一次。 则TH0的初始值: (256-N)×2×10-6=100×10-6 N=206
SETB TR0 HERE: SJMP HERE ORG 0500H LOOP0: CPL RETI END P1.0
C语言参考程序: #
include <reg51.h> //包含特殊功能寄存器库 sbit P1_0=P1^0; //定义P1.0口,程序中用P1_0代替P1.0。 void main() //主函数 { TCON=0x00 //清TCON,定时器中断标志清 零及不允许计数 TMOD=0x02; //设定时器T0工作方式2 TH0=0x9c;TL0=0x9c; //设初值 EA=1;ET0=1; //开中断 TR0=1; //启动计数 while(1); //无限循环,结束主函数 } void time0_int(void) interrupt 1 //中断函数 { P1_0=!P1_0; }
T
= 0 定时方式;C/
T
= 1 计数方式。
M1M0:工作模式选择位。
M1 0 0 1 1 M0 0 1 0 1 工作方 方式说明 式 方式0 方式1 方式2 方式3 13位定时器/计数器 16位定时器/计数器 具有自动重装初值的8位定时器/ 计数器 T0为两个独立的8位计数器,T1 为波特率发生器
1.工作方式寄存器(TMOD
89H)

位符号
D7
GATE
D6
C/T
D5
M1
D4
M0
D3
GATE
D2
C/T
D1
M1
D0
M0
←T1方式字段→
←T0方式字段→
GATE:门控位。GATE = 0 启动不受 /INT0或 /INT1的控制;GATE = 1 启动受 /INT0 或 /INT1 的控制。 C/ T : 外部计数器 / 定时器方式选择位。C/
ORG 0000H JMP START ORG 000BH LJMP LOOP0
ORG 0200H
START: MOV TCON,#00H
;停止
MOV TMOD,#02H ;定时器方式2 MOV TH0,#9CH MOV TL0,#9CH SETB SETB EA ET0 ;允许总中断 ;T0中断允许 ;启动T0 ;等待中断 ;中断服务程序 ;计数初值
ORG START: MOV 1000H TCON,#00H ;清TCON,停止定时/计数 ;工作方式设定 ;计数初值设定
MOV TMOD,#00H MOV TH1,#0FBH MOV TL1,#0AH
MOV IE,00H
SETB TR1 LOOP0: JBC TF1,LOOP1 SJMP LOOP0

MOV IE, #9FH SJMP $
ORG 0200H
TL0INT: MOV INC A RETI ORG 0300H
TH0INT: MOV
CPL RETI
外部中断
TL0, #0FFH ;重新设置初值
5KHz方波
TH0,
P1.0
#206
;重新设置初值
END
T1做波特率发生器,设定好后,不需管理
;关中断,用查询方式
;启动TR1 ;查询是否溢出
LOOP1: MOV TH1,#0FBH MOV TL1,#0AH CPL P1.7 SJMP LOOP0 END
;重设初值
;输出取反
C语言参考程序
#
include <reg51.h> //包含特殊功能寄存器库 sbit P1_7=P1^7; //定义P1.7口,程序中用P1_7代替P1.7。 void main() //主函数 { IE=0x00; //关中断 TMOD=0x00; //工作方式设定 TR0=1; //启动定时 for(;;) //无限循环体 { TH1=0xFB;TL1=0x0A; //计数初值设定 do { } while (!TF1) //查询是否溢出,当TF0=1时溢出 来,则跳出do- while循环。 { P1_7=! P1_7; TF1=0;} //溢出,P1.7取反,中断标志TF1 清0。 } }
2.工作方式1 应用
定时计数器的工作方式1与方式0基本相同,区别只 是方式0是13位计数器,而方式1为了16位计数器。 当要求定时时间较长,13位计数器不能满足要求时, 可改用方式1,用16位计数器计数。
【例】设单片机晶振频率fosc=6MHZ,使用 定时器1以方式1产生周期为600μs的等宽方波脉 冲,并由P1.7输出,以查询方式完成。 该题目就是用方式1实现例5-1的功能。原理与 例5-1相似,只需修改工作方ห้องสมุดไป่ตู้和计数初值设置 即可。
第05章 单片机定时计数器
5.1 定时/计数器结构 5.2 定时/计数器工作方式 5.2.1 工作方式0 5.2.2 工作方式1 5.2.3 工作方式2 5.2.4 工作方式3 5.3 定时/计数器应用举例 5.4 全自动洗衣机定时控制Proteus仿真 习 题
5.1 定时/计数器结构
MCS-51单片机定时器/计数器的逻辑结构如图5-1所示。主要由工作方式寄存器 TMOD、控制寄存器TCON和初值寄存器TLX、THX等工作部件组成。
1.工作方式0的应用
【例】设单片机晶振频率fosc=6MHZ,使用定时器1以方式0产生周
期为600μ s的等宽方波脉冲,并由P1.7输出,以查询方式完成。 解:计算计数初值.欲产生周期为600μ s的等宽方波脉冲,只需在 P1.7端以300μ s为周期交替输出高低电平即可,因此定时时间应为 300μ s。设待求计数初值为N,则: (213-N)×2×10-6=300×10-6 N=8042=1F6AH=0001111101101010B 用T1实现。将低5位01010B=0A写入TL1,将高8位有效值 11111011B=FBH写入TH1中。
ORG 0000H LJMP START ORG 000BH ;T0中断 LJMP TL0INT ORG 001BH ;T1中断 LJMP TH0INT ORG 0100H START: MOV TL0, #0FFH ;外部中断源 MOV TH0, #206 ;5KHz方波 MOV TL1, #BAUD MOV TH1, #BAUD MOV TMOD, #27H MOV TCON, #50H ;置T0工作方式3,TL0工作于计数器方式,T1方式2 ; 启动定时器 T0、 T1 ; 开放全部中断 ;BAUD根据波特率要求设置常数
(2)TMOD初始化 为把定时/计数器1设定为方式0,则M1M0=00。为实现定时功能应使 C/T=0,为实现内部定时器启动应使GATE=0,因此设定工作方式控制寄存器 TMOD=00H。 (3)由TR1启动和停止定时器 TR1=1为启动,TR1=0为停止 参考程序如下:
ORG 0000H JMP START
工作在方式2下,计数器的计数值由下式确定:
N=28-X=256-X
计数范围为: 1~256
定时准确
定时器的定时值由下式确定:
T=N*Tcy=(256-X)*Tcy
5.2.4.定时/计数器工作方式3
功能多
当M1,M0=10时,定时/计数器处于工作方式2,此时,定时/及数器的 等效电路如图所示





(1)计算计数初值 欲在P1.7引脚输出周期为600μs的等宽方波脉冲,只需在P1.7端交 替输出300μs的高低电平即可,因此定时时间应为300μs。设计数 初值为N,则: (216-N)×2×10-6=300×10-6 N=8042=1F6AH 将计数初值N的低8位6AH写入TL1;将计数初值N的高8位1FH写 入TH1。 (2)TMOD初始化 题目要求定时器/计数器1为工作方式1,所以M1M0=01;为实现定 时功能应使C/=0;为实现定时器内启动,应使GATE=0。此题目不 涉及定时器/计数器0,为方便起见,设其各控制位均为0。则工作方 式控制寄存器TMOD=10H。 (3)启动和停止控制 因为定时器/计数器1作定时器,故当TR1=1时,启动计数;当 TR1=0时,停止计数。 (4)中断的开放/禁止 题目中要求用查询方式检查T1的计数溢出状态,故设置IE=00H, 以关中断。 请读者自行修改程序。此处不再赘述。
3.工作方式2的应用
【例】使用定时器T0以方式2产生200微秒定时,在P1.0输出周期为400微秒的连续方波。 已知晶振频率fosc=6MHz。 (1)计算计数初值 (256-N)×2×10-6=200×10-6 N=156=9CH (2)TMOD初始化 工作方式2时,M1M0=10,实现定时功能C/T=0,内部启动GATE=0。定时器1不 用,无关位设定为0,可得TMOD=02H。 (3)允许中断 (4)TR0 启动定时 参考程序如下:
C语言参考程序: #
include <reg51.h> //包含特殊功能寄存器库 sbit P1_0=P1^0; //定义P1.0口,程序中用P1_0代替P1.0 void main() //主函数 { TMOD=0x27; //置T0工作方式3,TL0计数器方式;TH0为8位定时器 TL0=0xFF; //送初值,用于外部引脚T0口(P3.4)做新增外部中断 TH0=206; //送定时100μs的初值 TL1=BAUD; //BAUD是根据波特率要求设置的常数 TH1=BAUD; TCON=0x55; //启动定时器 T0、 T1, 置边沿触发 IE=0x9F; //开放全部中断 while(1); //无限循环,结束主函数 } void TL0INT (void) interrupt 1 //中断函数, 处理新增的外部中断源 { TL0=0xFF; // 外部引脚T0引起中断处理程序 } void TH0INT (void) interrupt 3 //中断函数, 处理输出5kHz的方波 { TH0=206; //重送初值 P1_0=!P1_0; //P1.0口取反 }
相关主题