模块六单片机的定时器计数器.docx
《模块六单片机的定时器计数器.docx》由会员分享,可在线阅读,更多相关《模块六单片机的定时器计数器.docx(54页珍藏版)》请在冰点文库上搜索。
模块六单片机的定时器计数器
模块六单片机的定时器/计数器
【教学聚焦】
知识目标:
1、了解单片机的中断定时计数器系统的结构
2、掌握单片机的定时计数器控制
3、掌握在程序设计中应用定时计数器的方法
技能目标:
1、能够熟悉单片机的定时计数器
2、能够掌握输入/输出的控制方式
3、能在程序设计中应用中断方式
【课时建议】6课时
教学重点:
单片机的定时计数器
教学难点:
应用中断定时计数器方式进行程序设计
【课堂随笔】
项目6.1定时器/计数器
6.1.1定时器/计数器概述
之前我们学习过用延时子程序实现一段时间的定时功能,但这种方法有它的局限性,在定时的过程中因延时子程序的运行会一直占用CPU,在延时时间段内单片机无法再做其它的事情了。
如果我们需要用到一种不占用CPU的定时方法,就要用到单片机自带的定时/计数器进行定时工作。
80C51的中断系统有5个中断源,2个优先级,可实现二级中断嵌套。
器属于五个中断源包含两个外部中断,两个定时/计数器,一个串行中断。
图1
如图1所示,80C51单片机共有五个中断源,每个中断源都可根据相应条件产生中断请求,中断请求会将相应的标志位置1,当单片机允许使用中断源时,会每过一个指令周期对相应中断标志位进行一次查询。
如发现该标志位为1,则会停下当前工作转到中断子程序处进行程序处理,之后再返回刚才中断处继续执行。
从中断请求的发生到处理完中断返回这一过程成为一个完整的中断过程。
图2
定时/计数器的原理图如图2所示,单片机共有两个定时计数器,每一个定时/计数器的主要组成部分是两个连续的8位的存储单元,这两个存储单元分为低8位和高8位,低位可向高位进位。
在定时计/数器进行定时工作时,每过一个机器周期(6MHZ晶振-----2us,12MHZ晶振-----1us),定时计数器的低8位存储单元会自动加一;当低8位(TL0或TL1)加满溢出后会向高8位存储单元(TH0或TH1)进位;当高、低两个8位存储单元全部加满溢出后会将与之对应的中断标志位(TF0或TH1)置1;当单片机允许使用定时/计数器这一中断源时,CPU会每过一个指令周期对与被使用的定时/计数器相应的中断标志位进行一次查询。
如发现中断标志位为1,则说明定时到时,会停下当前工作,进入中断子程序进行相应的中断处理,之后返回原来的工作位置继续之前的工作。
因此如果使用定时/计数器进行定时工作,在定时到时之前的时间里CPU可以不间断其他的程序运行,当定时到时后,因中断请求被CPU查询到,这时CPU会短暂地停下当前的程序任务转而执行中断子程序,之后返回原来的位置继续工作。
尽管用定时/计数器进行定时也会中断程序运行,但子程序的内容有限,而且执行速度较快,往往几十us即可完成,故不会对原来的程序造成什么影响。
6.1.2定时器/计数器控制分析
AT89S51单片机内部定时器/计数器结构如图3所示。
内部设有两个16位的可编程定时器/计数器。
可编程是指其功能(如工作方式、定时时间、量程、启动方式等)均可由指令来确定和改变。
在定时器/计数器中除了有两个16位的计数器之外,还有两个特殊功能寄存器(控制寄存器和方式寄存器)。
图3定时/计数器的内部结构
从图3可看出,16位的定时/计数器分别由两个8位专用寄存器组成,即:
T0由TH0和TL0构成;T1由TH1和TL1构成。
每个寄存器均可单独访问。
这些寄存器是用于存放定时或计数初值的。
此外,其内部还有一个8位的定时器方式寄存器TMOD和一个8位的定时控制寄存器TCON。
这些工作方式;TCON主要是用于控制定时器的启动停止,此外TCON还可以保存T0、T1的溢出和中断标志。
定时/计数器的的控制就是要对这些寄存器进行相应的赋值,使定时/计数器按照需要完成初始化,起到定时/技术作用。
6.1.3定时器/计数器的工作模式
定时计数器在使用时首先要对其工作模式进行设定,与之有关的特殊功能寄存器在上一节已经有了介绍,下面我们就对其各自的作用做详细的介绍。
1.定时/计数器控制寄存器TCON
TCON是定时/计数器控制寄存器,它包含两个定时/计数器的溢出中断标志及外部中断
和
的中断标志。
,TCON的内部结构如表1所示,TCON位定义如表2所示。
表1TCON位格式
TCON
D7
D6
D5
D4
D3
D2
D1
D0
位符号
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
位地址
8FH
8EH
8DH
8CH
8BH
8AH
89H
88H
表2TCON位定义
位符号
位功能描述
TF1
定时/计数器T1溢出标志位。
当定时/计数器1计满溢出时,由硬件使TF1置“1”,并且申请中断。
进入中断服务程序后,由硬件自动清“0”,在查询方式下用软件清“0”。
TR1
定时/计数器T1运行控制位。
由软件清“0”关闭定时器1。
当GATE=1,且
为高电平时,TR1置“1”启动定时器1;
当GATE=0,TR1置“1”启动定时器1。
IE1
外部中断
请求标志。
IT1
外部中断
触发方式选择位。
IT1=0,低电平触发;
IT1=1,下降沿触发。
TF0
定时器/计数T0溢出标志,其功能及操作情况同TF1。
TR0
定时/计数器T0运行控制位,其功能及操作情况同TR1。
IE0
外部中断
请求标志。
IT0
外部中断
触发方式选择位,其功能及操作情况同IT1。
2.定时/计数器工作模式控制寄存器TMOD
定时器方式控制寄存器TMOD,其结构如表3所示。
表3TMOD格式
位数
D7
D6
D5
D4
D3
D2
D1
D0
位符号
GATE
C/
M1
M0
GATE
C/
M1
M0
定时器
T1
T0
TMOD的高4位用控制于T1,低4用于控制T0,每一位的具体作用如下:
GATE:
门控制位。
GATE和软件控制位TR0(或TR1)、外部引脚信号
(或
)的状态,共同控制定时器/计数器的打开或关闭。
C/
:
定时器/计数器选择位。
C/
=1,为计数器方式;C/
=0,为定时器方式。
M1M0:
工作方式选择位,定时器/计数器工作方式由M1M0设定。
具体如表4所示。
表4定时/计数器的工作方式
M1M0
工作方式
功能描述
00
工作方式0
13位计数器
01
工作方式1
16位计数器
10
工作方式2
自动装入初值的8位计数器
11
工作方式3
定时器0:
分成两个8位计数器,定时器1:
停止计数
3.中断允许寄存器IE
IE控制CPU总断源的允许或禁止以及每个中断源是否允许中断。
IE内部结构如表5所示,IE位定义如表6所示。
IE
D7
D6
D5
D4
D3
D2
D1
D0
位符号
EA
—
—
ES
ET1
EX1
ET0
EX0
位地址
AFH
AEH
ADH
ACH
ABH
AAH
A9H
A8H
表5IE格式
表6IE位定义
IE位符号
功能描述
EA
EA=0:
关所有中断
EA=1:
开所有中断
ES
ES=0:
关串行通信中断
ES=1:
开串行通信中断
ET1
ET1=0:
关T1中断
ET1=1:
开T1中断
EX1
EX1=0:
关
中断
EX1=1:
开
中断
ET0
ET0=0:
关T0中断
ET0=1:
开T0中断
EX0
EX0=0:
关
中断
EX0=1:
开
中断
4.中断优先寄存器IP
IP用来控制各中断源优先级的选择,即设定中断源的中断响应优先级别,IP内部结构如表7所示,IP位定义如表8所示。
表7IP位格式
IP
D7
D6
D5
D4
D3
D2
D1
D0
位符号
—
—
—
PS
PT1
PX1
PT0
PX0
位地址
BFH
BEH
BDH
BCH
BBH
BAH
B9H
B8H
表8IP位定义
IP符号
IP定义
PS
PS=0:
串行口中断低优先级
PS=1:
串行口中断高优先级
PT1
PT1=0:
定时/计数器T1中断低优先级
PT1=1:
定时/计数器T1中断高优先级
PX1
PX1=0:
外部中断
中断低优先级
PX1=1:
外部中断
中断高优先级
PT0
PT0=0:
定时/计数器T0中断低优先级
PT0=1:
定时/计数器T0中断高优先级
PX0
PT1=0:
外部中断
中断低优先级
PT1=1:
外部中断
中断高优先级
单片机复位后,IP低五位全部清零,并将所有中断源设置为低优先级中断。
如果几个同优先级的中断源同时向CPU申请中断,哪一个申请得到服务,取决于它们在CPU内部登记排队的序号。
CPU通过内部硬件查询登记序号,按自然优先级响应各个中断请求。
其内部登记序号是由硬件形成的,先后顺序如下:
→T0→
→T1→RI/TI
6.1.4定时器/计数器的容量
在使用AT89S51的定时器/计数器之前,一般完成以下几个步骤:
1)确定定时/计数器工作方式,对TMOD赋值;
2)计算定时/计数器的初值,对TH0、TL0或TH1、TL1赋值;
3)开放CPU、定时/计数器中断,对IE中的EA、ET0、ET1赋值;
4)启动定时器/计数器,对TCON中TRl或TR0位赋值。
下面我们来学习定时/计数器的初值的具体方法:
因为在不同工作方式下计数器位数不同,因而最大计数值也不同。
现假设最大计数值为M,那么各方式下的最大值M值如下:
方式0:
M=213=8192
方式1:
M=216=65536
方式2:
M=28=256
方式3:
定时器0分成两个8位计数器,所以两个M均为256。
因为定时器/计数器是作“加1”计数,并在计数满溢出时产生中断,因此初值X可以这样计算:
X=M-N/(12/fosc)
其中N为定时时间,fosc为晶振频率。
在实际应用中经常采用16位的方式1,下面以16位的方式1说明如何确定初值。
例如,T0选用方式1用于定时,外接晶振频率为12MHz,定时时间为10ms,计算过程如下:
方式1时,M=65536,定时时间N=10×10-3s,fosc=12MHz=12×106Hz
X=M-N/(12/fosc)=65536-10×10-3/(12/12×106)
=65536-10000=55536
拆分X的高八位送TH0,低八位送TL0:
MOVTH0,#0D8H;
MOVTL0,#0F0H;
项目6.2应用项目五电子钟的制作及应用
6.2.1定时器/计数器应用步骤
经过以上学习我们知道要想使用定时/计数器必须先对其进行初始化,流程图如图4。
图4定时/计数器初始化流程
在初始化过程的每一步所对应的特殊功能寄存器已经列出,下面我们一起来学习怎样完成定时/计数器初始化程序的编写。
定时器/计数器初始化函数及中断服务函数格式:
T0方式1:
以10ms定时时间、12MHz晶振为例
ORG0000H
LJMPSTART
ORGOO13H
LJMPINTT0
ORG0040H
LCALLCSH
.....
SJMP$;
ORG0100H
CSH:
MOVEA,01H;
MOVET0,01H;
MOVTMOD,01H;
MOVTH0,0D8H;
MOVTL0,0F0H;
MOVTR0,01H;
RET
ORG0200H
INTT0:
MOVTH0,0D8H;
MOVTL0,0F0H;
...
RETI
6.2.2电子钟系统制作分析
1.任务要求
六位数码显示,采用动态扫描方式,两位显示时位,两位显示分位,两位显示秒位,初始时间为23点58分46秒,如图5所示。
2.任务分析
在本任务中要解决两个问题,一个是显示问题,一个是定时问题。
断码显示器的使用在之前的学习中我们已经掌握了,在本任务中我们要同时显示六位不同的数字,但是80C51单片机只有4组I/O驱动引脚,无法同时对六位断码显示器输出显示数据,这就需要用到动态扫描的方法来完成显示功能。
下面以两位数显示为例来说明动态扫描在断码显示中的应用。
电路图如图6所示。
图6动态扫描显示电路
ORG0000H
LJMPSTART
ORG0030H
START:
MOVR0,#40H;40H.41H是显示缓冲区,依次存放十,个位
MOVA,#06H;十位
MOV@R0,A;
INCR0;个位
MOVA,#00H
MOV@R0,A
DS1:
MOVR0,#40H;置显示缓冲区首址
MOVR2,#02H;置扫描初值,点亮最左边的LED6
DS2:
MOVA,@R0;得到的段显码输出到段数据口
ACALLTABLE
MOVP0,A
MOVA,R2;向位数据口P1输出位显码
CPLA
MOVP2,A
MOVR3,#0ffH;延时一小段时间
DEL:
NOP
DJNZR3,DEL
INCR0;显示缓冲字节加一
CLRC
MOVA,R2
RRCA;显码右移一位
MOVR2,A;最末一位是否显示完毕?
如无则
JNZDS2;继续往下显示
MOVA,TBF
MOVB,#10
DIVAB
MOV40H,A
MOVA,B
MOV41H,A
SJMPDS1
TABLE:
INCA;取与数字对应的段码
MOVCA,@A+PC
RET
DB0EDH,48H,0E6H,6EH,4BH
DB2FH,0AFH,68H,0EFH,6FH
END
图中使用两位共阳极段码显示器,P1口用来提供显示断码,P2.0、P2.1两位引脚用来提供显示器位选择码。
在显示时,先由P2.0引脚输出高电平,P2.1引脚输出低电平选择个位显示器工作,这时让P1口输出“0”的断码使各位显示内容为“0”。
这时开始一小段时间的延时(在视觉残留允许范围内,如10ms),之后改变P2.0、P2.1、P1的值使十位显示器工作,并显示“6”,再加入一小段时间的延时。
这时只要重复上面的过程就可以让两位显示器交替显示,达到同时显示“60”的动态显示效果了。
程序如下。
在动态扫描显示的时候,程序进入了无限循环的状态,无法在进行其他的工作了,要想完成一秒钟的定时以及到时后的显示内容修改工作就要中断当前的循环工作进程,在1S到时的时候进行中断,处理完显示内容修改后再返回动态扫描的显示程序中,这样就可以实现任务要求的数字钟设计了。
下面以60S倒计时为例,编程实现动态扫描与定时/计数器中断的使用方法。
BUFEQU23H;存放计数值
TBFEQU22H;存放显示值
ORG0000H
LJMPSTART
ORG000BH
LJMPCLOCK
ORG0030H
START:
MOVR0,#40H;40H.41H是显示缓冲区,依次存放十,个位
MOVA,#06H;十位
MOV@R0,A;
INCR0;个位
MOVA,#00H
MOV@R0,A
MOVTMOD,#01H;定时器0初始化为方式1
MOVTH0,#0D8H;置时间常数,延时0.1秒
MOVTL0,#0F0H
MOVBUF,#00H;置0
MOVTBF,#60
SETBET0
SETBEA
SETBTR0
DS1:
MOVR0,#40H;置显示缓冲区首址
MOVR2,#02H;置扫描初值,点亮最左边的LED6
DS2:
MOVA,@R0;得到的段显码输出到段数据口
ACALLTABLE
MOVP0,A
MOVA,R2;向位数据口P1输出位显码
CPLA
MOVP2,A
MOVR3,#0ffH;延时一小段时间
DEL:
NOP
DJNZR3,DEL
INCR0;显示缓冲字节加一
CLRC
MOVA,R2
RRCA;显码右移一位
MOVR2,A;最末一位是否显示完毕?
如无则
JNZDS2;继续往下显示
MOVA,TBF
MOVB,#10
DIVAB
MOV40H,A
MOVA,B
MOV41H,A
SJMPDS1
TABLE:
INCA;取与数字对应的段码
MOVCA,@A+PC
RET
DB0EDH,48H,0E6H,6EH,4BH
DB2FH,0AFH,68H,0EFH,6FH
CLOCK:
MOVTL0,#0D0H;置时间常数
MOVTH0,#0F0H
PUSHPSW
PUSHACC
INCBUF;计数加一
MOVA,BUF;计到10否?
没有则转到QUIT退出中断
CJNEA,#02H,QUIT
MOVBUF,#00H;置初值
MOVA,TBF
DECA;
MOVTBF,A
CJNEA,#00H,QUIT
CLRTR0
QUIT:
POPACC
POPPSW
RETI;中断返回
END
6.2.3编制程序
将这样的动态扫描内容进行扩充即可实现六位数的动态扫描显示效果。
在上一节两位数码显示中已经学习了如何显示、如何产生1秒计时,数字钟在此基础上又增加了分位和时位,我们知道当秒位计够60秒时,自身归0,同时让分位上加1,当分位计够60时,分为归0,时位加1,当时位计够24时,时位归0,数字钟的程序就是按照这样的逻辑关系进行编写的。
BUFEQU23H;存放计数值
SBFEQU22H;存放秒值
MBFEQU21H;存放分值
HBFEQU20H;存放时值
CSEGAT0000H
LJMPSTART
CSEGAT01BH
LJMPCLOCK
CSEGAT0030H
START:
MOVR0,#40H;40H-45H是显示缓冲区,依次存放时分秒
MOVA,#02H;时高位
MOV@R0,A;
INCR0;时、底位
MOVA,#03H
MOV@R0,A
INCR0;分高位
MOVA,#05H
MOV@R0,A
INCR0;存分低位
MOVA,#08H
MOV@R0,A
INCR0;秒高位
MOVA,#04H
MOV@R0,A
INCR0;秒低位
MOVA,#06H
MOV@R0,A
MOVTMOD,#10H;定时器1初始化为方式1
MOVTH1,#0D8H;置时间常数,延时0.1秒
MOVTL1,#0F0H
MOVBUF,#00H;置0
MOVHBF,#23
MOVSBF,#58
MOVMBF,#46
SETBET1
SETBEA
SETBTR1
DS1:
MOVR0,#40H;置显示缓冲区首址
MOVR2,#20H;置扫描初值,点亮最左边的LED6
DS2:
MOVA,@R0;得到的段显码输出到段数据口
ACALLTABLE
MOVP0,A
MOVA,R2;向位数据口P1输出位显码
CPLA
MOVP1,A
MOVR3,#0FFH;延时一小段时间
DEL:
NOP
DJNZR3,DEL
INCR0;显示缓冲字节加一
CLRC
MOVA,R2
RRCA;显码右移一位
MOVR2,A;最末一位是否显示完毕?
如无则
JNZDS2;继续往下显示
MOVR0,#45H
MOVA,SBF;把秒值分别放于44H,45H中
ACALLGET
MOVA,MBF;把分值分别放入40H,41H中
ACALLGET
MOVA,HBF
ACALLGET
SJMPDS1;转DS1从头显示起
TABLE:
INCA;取与数字对应的段码
MOVCA,@A+PC
RET
DB3FH
DB06H
DB5BH
DB4FH
DB66H
DB6DH
DB7DH
DB07H
DB7FH
DB6FH
DB40H
GET:
MOVR1,A;把从时。
分或秒字节中取来的值的高
ANLA,#0FH;位屏蔽掉,并送入缓冲区
MOV@R0,A
DECR0
MOVA,R1;把时。
从分或秒字节中取来的值的低
SWAPA;位屏蔽掉,并送入缓冲区
ANLA,#0FH
MOV@R0,A
DECR0;R0指针下移一位
RET
CLOCK:
MOVTL1,#0D8H;置时间常数
MOVTH1,#0F0H
PUSHPSW
PUSHACC
CPLP1.0
CPLP1.1
CPLP1.2
CPLP1.3
INCBUF;计数加一
MOVA,BUF;计到10否?
没有则转到QUIT退出中断
CJNEA,#0AH,QUIT
MOVBUF,#00H;置初值
MOVA,SBF
INCA;秒值加一,经十进制调整后放入
DAA;秒字节
MOVSBF,A
CJNEA,#60H,QUIT;计到60否?
没有则转到QUIT退出中断
MOVSBF,#00H;是,秒字节清零
MOVA,MBF
INCA;分值加一,经十进制调整后放入
DAA;分字节
MOVMBF,A
CJNEA,#60H,QUIT;分值为60否?
不是则退出中断
MOVMBF,#00H;是,清零
MOVA,HBF
INCA
DAA
MOVHBF,A
CJNEA,#24H,QUIT
MOVHBF,#00H
QUIT:
POPACC
POPPSW
RETI;中断返回
END
6.2.4系统调试
在Proteuse软件上自行设计电路图,并根据自己设计的电路图在Keilc软件中编译程序进行调试,观察仿真运行结果。
在程序中修改使数字钟的显示初始值为18点26分56秒,在进行运行观察变化。
项目6.3应用项目六智能抢答器的制作及应用
6.3.1电路原理分析及设计
抢答器可同时供不大于8名选手或8个代表队参加比赛,各用一个抢答按钮,按钮的编号与选手的编号是相对应的,分别是S1、S2、S3、S4、S5、S6、S7、S8;给节目主持人设置二个控制按钮开关,用来控制系统的清零和抢答的开始;抢答开始后,若有选手按动抢答按钮,在数码管上显示出选手的编号,同时蜂鸣器给出音响提示,禁止其他选手抢答,优先抢答选手的编号一直保持到