第6章 定时器/计数器 (课时:8学时)
教学目的 学习重点和难点 了解定时器/计数器的结构与工作原理。 掌握定时器/计数器的四种工作方式的特点及应用。 用定时器/计数器设计一个可产生一定频率方波的信号源。 用定时器/计数器设计一个脉冲宽度调制(PWM)信号以控制直流电动机转速。 用定时器/计数器设计一个用于流水生产线上的产品自动计数器。 用定时器/计数器设计一个测量电平脉冲宽度的程序。 用定时器/计数器设计一个电子音乐程序。 学习重点和难点 定时器/计数器的初始化。 定时器/计数器与中断的综合应用。
第6章 定时器/计数器 6.1 定时器/计数器的结构与原理 6.2 定时器/计数器的控制 6.3 定时器/计数器的四种工作方式及应用 第6章 定时器/计数器 6.1 定时器/计数器的结构与原理 6.2 定时器/计数器的控制 6.3 定时器/计数器的四种工作方式及应用 本章小结 习题
6.1 定时器/计数器的 结构与原理 6.1.1 定时器/计数器的结构 6.1.2 定时器/计数器的原理 6.1.3 定时器/计数器的功能
6.1.1 定时器/计数器的结构 8051单片机内部设有两个16位可编程定时器/计数器,简称为定时器0(T0)和定时器1(T1)。 6.1.1 定时器/计数器的结构 8051单片机内部设有两个16位可编程定时器/计数器,简称为定时器0(T0)和定时器1(T1)。 16位的定时器/计数器分别由两个8位寄存器组成,即:T0由TH0和TL0构成,T1由TH1和TL1构成。每个寄存器均可单独访问,这些寄存器是用于存放定时初值或计数初值的。 有一个8位的定时器方式寄存器TMOD和一个8位的定时器控制寄存器TCON。这些寄存器之间是通过内部总线和控制逻辑电路连接起来的,定时器/计数器的工作方式、定时时间和启停控制通过由指令来确定这些寄存器的状态来实现。TMOD主要用于设定定时器的工作方式,TCON主要用于控制定时器的启动与停止,并保存T0、T1的溢出和中断标志。
6.1.1 定时器/计数器的结构 定时器/计数器结构框图
6.1.2 定时器/计数器的原理 16位的定时器/计数器实质上是一个加l计数器,可实现定时和计数两种功能,其功能由软件控制和切换。定时器属硬件定时和计数,是单片机中效率高而且工作灵活的部件。 在定时器/计数器开始工作之前,CPU必须将一些命令(称为控制字)写入定时器/计数器。将控制字写入定时器/计数器的过程叫定时器/计数器的初始化。 在初始化程序中,要将工作方式控制字写入定时器方式寄存器(TMOD),工作状态控制字(或相关位)写入定时器控制寄存器(TCON),赋定时/计数初值给TH0(TH1)和TL0(TL1)。
6.1.2 定时器/计数器的原理 定时器/计数器的定时功能。 6.1.2 定时器/计数器的原理 定时器/计数器的定时功能。 计数器的加1信号由振荡器的12分频信号产生,即每过一个机器周期,计数器加1,直至计满溢出。 定时器的定时时间与系统的时钟频率有关。因一个机器周期等于12个时钟周期,所以计数频率应为系统时钟频率的十二分之一。如果晶振频率为12MHz,则机器周期为1s。通过改变定时器的定时初值,并适当选择定时器的长度(8位、13位或16位),可以调整定时时间。
6.1.2 定时器/计数器的原理 定时器/计数器的计数功能。 6.1.2 定时器/计数器的原理 定时器/计数器的计数功能。 通过外部计数输入引脚T0(P3.4)和T1(P3.5)对外部信号计数,外部脉冲的下降沿将触发计数。计数器在每个机器周期的S5P2期间采样引脚输入电平,若一个机器周期S5P2期间采样值为1,下一个机器周期S5P2期间采样值为0,则计数器加1,再下一个机器周期S3P1期间,新的计数值装入计数器。 因检测一个由1至0的跳变需要两个机器周期,故外部信号的最高计数频率为时钟频率的二十四分之一。如果晶振频率为12MHz,则最高计数频率为0.5MHz。虽然对外部输入信号的占空比无特殊要求,但为了确保给定电平在变化前至少被采样一次,外部计数脉冲的高电平与低电平保持时间均需在一个机器周期以上。
6.1.3 定时器/计数器的功能 定时器/计数器具有定时和计数两种功能,应用范围如下。 1. 定时与延时控制方面 6.1.3 定时器/计数器的功能 定时器/计数器具有定时和计数两种功能,应用范围如下。 1. 定时与延时控制方面 可产生定时中断信号,以设计出各种不同频率的信号源;产生定时扫描信号,对键盘进行扫描以获得控制信号,对显示器进行扫描以不间断地显示数据。 2. 测量外部脉冲方面 对外部脉冲信号进行计数可测量脉冲信号的宽度、周期,也可实现自动计数。 3. 监控系统工作方面 对系统进行定时扫描,当系统工作异常时,使系统自动复位,重新启动以恢复正常工作。
6.2 定时器/计数器的控制 6.2.1 定时器方式寄存器TMOD 6.2.2 定时器控制寄存器TCON
6.2.1 定时器方式寄存器TMOD 定时器方式寄存器TMOD的作用是设置T0、T1的工作方式。 TMOD的格式: 各位的功能说明: (1) GATE:门控位。 GATE=0:软件启动定时器,即用指令使TCON中的TR1(TR0)置1即可启动定时器1(定时器0)。 GATE=1:软件和硬件共同启动定时器,即用指令使TCON中的TR1(TR0)置1时,只有外部中断INT0(INT1)引脚输入高电平时才能启动定时器1(定时器0)。
6.2.1 定时器方式寄存器TMOD (2) C/T:功能选择位。 C/T=0时,以定时器方式工作。 C/T=1时,以计数器方式工作。 (3) M1、M0:方式选择位。 定时器工作方式选择位定义 M1 M0 工作方式 功能描述 0 0 方式0 13位计数器 0 1 方式1 16位计数器 1 0 方式2 自动重装初值8位计数器 1 1 方式3 定时器0:分为两个独立的8位计数器 定时器1:无中断的计数器
6.2.2 定时器控制寄存器TCON 定时器控制寄存器TCON的作用是控制定时器的启动与停止,并保存T0、T1的溢出和中断标志。 各位的功能说明: (1) TF1(TCON.7):定时器1溢出标志位。当定时器1计满溢出时,由硬件自动使TF1置1,并申请中断。对该标志位有两种处理方法,一种是以中断方式工作,即TF1置1并申请中断,响应中断后,执行中断服务程序,并由硬件自动使TF1清0;另一种以查询方式工作,即通过查询该位是否为1来判断是否溢出,TF1置1后必须用软件使TF1清0。
6.2.2 定时器控制寄存器TCON 各位的功能说明: (2) TR1(TCON.6):定时器1启停控制位。 GATE=0时,用软件使TR1置1即启动定时器1,若用软件使TR1清0则停止定时器1。 GATE=1时,用软件使TR1置1的同时外部中断INT1的引脚输入高电平才能启动定时器1。 (3) TF0(TCON.5):定时器0溢出标志位。其功能同TF1。 (4) TR0(TCON.4):定时器0启停控制位。其功能同TR1。 (5) IE1(TCON.3):外部中断1请求标志位。 (6) IT1(TCON.2):外部中断1触发方式选择位。 (7) IE0(TCON.1):外部中断0请求标志位。 (8) IT0(TCON.0):外部中断0触发方式选择位。
6.3 定时器/计数器的四种 工作方式及应用 6.3.1 定时器/计数器的初始化 6.3.2 方式0及应用实例 6.3.3 方式1及应用实例 6.3 定时器/计数器的四种 工作方式及应用 6.3.1 定时器/计数器的初始化 6.3.2 方式0及应用实例 6.3.3 方式1及应用实例 6.3.4 方式2及应用实例 6.3.5 方式3
6.3.1 定时器/计数器的初始化 1. 定时器/计数器的初始化步骤 6.3.1 定时器/计数器的初始化 1. 定时器/计数器的初始化步骤 定时器/计数器是一种可编程部件,在使用定时器/计数器前,一般都要对其进行初始化,以确定其以特定的功能工作。初始化的步骤如下。 (1) 确定定时器/计数器的工作方式,确定方式控制字,并写入TMOD。 (2) 预置定时初值或计数初值,根据定时时间或计数次数,计算定时初值或计数初值,并写入TH0、TL0或TH1、TL1。 (3) 根据需要开放定时器/计数器的中断,给IE中的相关位赋值。 (4) 启动定时器/计数器,给TCON中的TR1或TR0置1。
6.3.1 定时器/计数器的初始化 2. 定时初值或计数初值的计算方法 不同工作方式的定时初值或计数初值的计算方法如下表所示。 6.3.1 定时器/计数器的初始化 2. 定时初值或计数初值的计算方法 不同工作方式的定时初值或计数初值的计算方法如下表所示。 表中T 表示定时时间,T机表示机器周期。 工作方式 计数位数 最大计数值 最大定时时间 定时初值计算公式 计数初值计算公式 方式0 13 213=8192 213T机 X=213-T/T机 X=213-计数值 方式1 16 216=65536 216T机 X=216-T/T机 X=216-计数值 方式2 8 28=256 28T机 X=28-T/T机 X=28-计数值
6.3.1 定时器/计数器的初始化 【例1】 用定时器0方式0,定时5ms,以中断方式工作,进行程序初始化设计,晶振频率为6MHz。 6.3.1 定时器/计数器的初始化 【例1】 用定时器0方式0,定时5ms,以中断方式工作,进行程序初始化设计,晶振频率为6MHz。 解:用定时器0方式0时,定时器/计数器方式寄存器TMOD低4位中的M1M0应取00;可设定为软件启动定时器,故GATE取0;因用定时功能,C/T取0;定时器方式寄存器TMOD高4位为无关位,一般都取0,所以TMOD应为00H。 晶振频率为6MHz,T机=12/fosc=12/(6106)=2s 定时初值X=213-T/T机=213-5103/2=8192-2500=5692 =163CH=1011000111100B 因TL0的高3位未用,对计算出的定时初值X要进行修正,即在低5位前插入3个0,修正后的定时初值 X=1011000100011100B=B11CH
6.3.1 定时器/计数器的初始化 定时器以中断方式工作,故将中断总允许位EA和定时器0的中断允许位ET0置1。 参考程序: 6.3.1 定时器/计数器的初始化 定时器以中断方式工作,故将中断总允许位EA和定时器0的中断允许位ET0置1。 参考程序: 75 89 00 MOV TMOD,#00H ;置定时器0为工作方式0 75 8C B1 MOV TH0,#0B1H ;定时初值的高8位 75 8A 1C MOV TL0,#1CH ;定时初值的低8位 D2 AF SETB EA ;开放中断总允许位 D2 A9 SETB ET0 ;开放定时器0的中断允许位 D2 8C SETB TR0 ;启动定时器0
6.3.2 方式0及应用实例 在方式0下,以定时器0为例,定时器/计数器是一个由TH0中的8位和TL0中的低5位组成的13位加1计数器(TL0中的高3位不用);若TL0中的第5位有进位,直接进到TH0中的最低位。定时器/计数器0方式0逻辑结构如下图所示。 当门控位GATE=0时,或门输出始终为1,与门被打开,与门的输出电平始终与TR0的电平一致,实现由TR0控制定时器/计数器的启动和停止。若软件使TR0置1,接通控制开关,启动定时器0,13位加1计数器在定时初值或计数初值的基础上进行加1计数;溢出时,13位加1计数器为0,TF0由硬件自动置1,并申请中断,同时13位加1计数器继续从0开始计数。若软件使TR0清0,关断控制开关,停止定时器0,加1计数器停止计数。
6.3.2 方式0及应用实例 定时器/计数器0方式0逻辑结构 C/T C/T
6.3.2 方式0及应用实例 【例2】 在P1.0输出周期为1 ms(频率1kHz)的方波,采用定时器1方式0设计程序,晶振频率为12MHz。 解:根据题意,只要使P1.0每隔500s取反一次即可得到周期1 ms的方波,因而T1的定时时间为500s。 用定时器1方式0时,定时器/计数器方式寄存器TMOD高4位中的M1M0应取00;可设定为软件启动定时器,故GATE取0;因为用定时功能,C/T取0;定时器方式寄存器TMOD低4位为无关位,一般都取0,所以TMOD应为00H。 晶振频率为12MHz,T机=12/fosc=12/(12106)=1s 定时初值 X=213-T/T机=213-500/1=8192-500=7692 =1E0CH=1111000001100B 因TL1的高3位未用,对计算出的定时初值X要进行修正,即在低5位前插入3个0,修正后的定时初值 X=1111000000001100B=F00CH
6.3.2 方式0及应用实例 参考程序: 地址 机器码 程序 注释 ORG 0000H 0000H 02 00 50 LJMP MAIN 6.3.2 方式0及应用实例 地址 机器码 程序 注释 ORG 0000H 0000H 02 00 50 LJMP MAIN ORG 0050H 0050H D2 90 MAIN: SETB P1.0 ;置P1.0初始状态 0052H 75 89 00 MOV TMOD,#00H ;置定时器1为工作方式0 0055H 75 8D F1 MOV TH1,#0F0H ;置500s定时初值 0058H 75 8B 0C MOV TL1,#0CH 005BH D2 8E SETB TR1 ;启动定时器1 005DH 10 8F 02 LP1: JBC TF1,LP2 ;查询计数溢出 0060H 80 FB SJMP LP1 ;未到500s继续计数 0062H LP2: MOV TH1,#0F0H ;重新置500s定时初值 0065H 0068H B2 90 CPL P1.0 ;输出取反 006AH 80 E4 ;重复循环 END
6.3.2 方式0及应用实例 【例3】 P1口做输出口,控制八只灯(P1口输出低电平时灯被点亮),同一时间只有两盏灯点亮,按一定的规律每隔1秒循环点亮下一盏灯;采用定时器0方式0设计延时子程序,定时时间为5ms,晶振频率为6MHz。 解:延时子程序要求延时1s,又规定定时时间5ms,可在硬件定时的基础上再加软件计数来实现1s的延时;5ms定时初值的计算参见例1,软件计数值为200。 用定时器0方式0时,定时器/计数器方式寄存器TMOD低4位中的M1M0应取00;可设定为软件启动定时器,故GATE取0;因用定时功能,C/T取0;定时器方式寄存器TMOD高4位为无关位,一般都取0;所以TMOD应为00H。 设定时器0的溢出标志位以查询方式工作。
主程序: ORG 0000H 0000H 21 50 AJMP MAIN ORG 0150H 0150H 7A 06 21 50 AJMP MAIN ORG 0150H 0150H 7A 06 MAIN: MOV R2,#06H 0152H 74 FC MOV A,#0FCH ;灯点亮的初始状态 0154H F5 90 NEXT: MOV P1,A 0156H 51 00 ACALL DELAY 0158H 23 RL A ;点亮左边一盏灯 0159H DA F9 DJNZ R2,NEXT 015BH MOV R2,#06H 015DH NEXT1: MOV P1,A 015FH 03 RR A ;点亮右边一盏灯 0160H 0162H DJNZ R2,NEXT1 0164H 80 EA SJMP MAIN
延时子程序: ORG 0200H 0200H 79 C8 DELAY: MOV R1,#200 ;置5ms计数循环初值 0202H 75 89 00 MOV TMOD,#00H ;置定时器0为工作方式0 0205H 75 8C B1 MOV TH0,#0B1H ;置5ms定时初值 0208H 75 8A 1C MOV TL0,#1CH 020BH D2 8C SETB TR0 ;启动定时器1 020DH 10 8D 02 LP1: JBC TF0,LP2 ;查询计数溢出 0210H 80 FB SJMP LP1 ;未到5ms继续计数 0212H LP2: MOV THO,#0B1H ;重新置5ms定时初值 0215H 0218H D9 F3 DJNZ R1,LP1 ;未到1s继续循环 021AH 22 RET ;返回主程序 END
6.3.2 方式0及应用实例 【例4】 每隔1秒使P1.1输出取反一次同时使片内RAM区20H单元中的内容加1,采用定时器0方式0设计程序,晶振频率6MHz。 解:根据题意,定时时间为1s,因方式0最大计数值为8192,机器周期为2s,则方式0的最大定时时间为16.384ms;显然不能满足本题的定时时间要求,因而需另设软件计数器,即在硬件定时的基础上再加软件计数。 设硬件定时时间10 ms,软件计数的次数则为100次。 定时初值 X=213-T/T机=213-10103/2=8192-5000 =3192=0C78H=0110001111000B 因TL0的高3位未用,对计算出的定时初值X要进行修正,即在低5位前插入3个0,修正后的定时初值 X=0110001100011000B=6318H 定时器以中断方式工作。
参考程序: 主程序: ORG 0000H 0000H 02 00 50 LJMP MAIN ORG 000BH ;定时器0的中断入口地址 02 00 50 LJMP MAIN ORG 000BH ;定时器0的中断入口地址 000BH 02 02 00 LJMP SER0 ;指向中断服务程序 ORG 0030H 0030H D2 90 MAIN: SETB P1.1 ;置P1.1初始状态 0032H 75 20 00 MOV 20H,#00H ;20H单元清0 0035H 78 64 MOV R0,#64H ;软件计数100次 0037H 75 89 00 MOV TMOD,#00H ;置定时器0为工作方式0 003AH 75 8C 63 MOV TH0,#63H ;置10ms定时初值 003DH 75 8A 18 MOV TL0,#18H 0040H D2 AF SETB EA 0042H D2 A9 SETB ET0 0044H D2 8C SETB TR0 0046H 80 FE SJMP $
参考程序: 中断服务程序: ORG 0000H 0000H 02 00 50 LJMP MAIN ORG 0100H 0100H 02 00 50 LJMP MAIN ORG 0100H 0100H 75 8C 63 SER0:MOV TH0,#63H ;重新置10ms定时初值 0103H 75 8A 18 MOV TL0,#18H 0106H D8 04 DJNZ R0,EXIT ;未到1s继续计数 0108H B2 91 CPL P1.1 010AH 05 20 INC R0 010CH 32 EXIT: RETI END
6.3.3 方式1及应用实例 在方式1下,以定时器0为例,定时器/计数器是一个由TH0中的8位和TL0中的8位组成的16位加1计数器。 6.3.3 方式1及应用实例 在方式1下,以定时器0为例,定时器/计数器是一个由TH0中的8位和TL0中的8位组成的16位加1计数器。 方式1与方式0基本相似,最大的区别是方式1的加1计数器位数是16位。 定时器/计数器0方式1逻辑结构 C/T C/T
6.3.3 方式1及应用实例 【例5】 利用定时器1测量高电平脉冲的宽度,采用定时器1方式1设计程序,晶振频率6MHz。 6.3.3 方式1及应用实例 【例5】 利用定时器1测量高电平脉冲的宽度,采用定时器1方式1设计程序,晶振频率6MHz。 解: 根据题意,用定时器1方式1时,被测高电平脉冲从外部中断INT1(P3.3)引脚输入,门控位GATE取1,即由软件和硬件共同启动定时器;被测脉冲为高电平时,启动定时器1,开始计数;被测脉冲变为低电平时,停止定时器1,停止计数,计数值分别存放到片内RAM区40H、41H、42H单元中;计数值与机器周期的乘积就是所测脉冲的宽度。 用定时器1方式1时,定时器/计数器方式寄存器TMOD 高4位中的M1M0应取01,GATE取1;因为用定时功能,C/T取0;定时器方式寄存器TMOD低4位取0,所以TMOD应为90H。 定时初值为00H。 定时器以查询方式工作。
参考程序: ORG 0000H 0000H 02 00 50 LJMP MAIN ORG 0050H 0050H 75 40 00 02 00 50 LJMP MAIN ORG 0050H 0050H 75 40 00 MAIN: MOV 40H,#00H ;数据存储单元清0 0053H 75 41 00 MOV 41H,#00H 0056H 75 42 00 MOV 42H,#00H 0059H 75 89 90 MOV TMOD,#90H ;置定时器1为工作方式1 005CH 75 8D 00 MOV TH1,#00H ;定时初值清0 005FH 75 8B 00 MOV TL1,#00H 0062H 20 B3 FD JB P3.3,$ ;查询低电平 0065H D2 8E SETB TR1 ;准备启动定时器1 0067H 30 B3 FD JNB P3.3,$ ;高电平到,启动定时器1
参考程序: 006AH 10 8F 05 LP1: JBC TF1,LP2 006DH 20 B3 FA JB P3.3, LP1 ;低电平到,停止定时器1 0070H 80 04 SJMP LP3 0072H 05 40 LP2: INC 40H ;存储区最高位加1 0074H 80 F4 SJMP LP1 0076H C2 8E LP3: CLR TR1 ;停止定时器1 0078H 85 8D 41 MOV 41H,TH1 ;计数值高8位放入存储区 007BH 85 8B 42 MOV 42H,TL1 ;计数值低8位放入存储区 007EH 12 01 00 LCALL DIS ;调用显示子程序 0081H 80 DD SJMP MAIN ;重复循环 ORG 0100H DIS: (略) ;显示子程序 END
6.3.3 方式1及应用实例 【例6】 P1.0口做输出口,接一只喇叭,利用定时器中断方式编写程序,使喇叭放出悦耳的音乐。晶振频率6MHz。 6.3.3 方式1及应用实例 【例6】 P1.0口做输出口,接一只喇叭,利用定时器中断方式编写程序,使喇叭放出悦耳的音乐。晶振频率6MHz。 解:音乐是由高低长短相同或不同的音符,按一定的规律组织起来的。每个音符都包括两个要素:第一是音调,即音符的频率,频率越高音调越高,频率越低音调越低;第二是节拍,即音符的时间长短。 利用定时器/计数器可以产生不同频率的音频脉冲,也可以控制音频脉冲的延时时间。不同的音符对应的频率不同,用定时器T1方式1可以产生与各音符对应频率的方波,C调各音符频率与定时器定时初值对应关系如下表所示;不同的节拍对应的延时时间不同,通过循环调用一个基本延时子程序可以产生不同的节拍,各曲调与节拍的时间对应关系如下表所示。
C调各音符频率与定时器定时初值对照表 曲调与节拍的时间对照表 曲调 4/4 3/4 2/4 1/4拍时间(ms) 125 187 250 62 94 曲调与节拍的时间对照表
(1) 根据歌谱编制唱名与唱名码的对照表。 把歌谱中所有的不同音符的频率相对应的定时器定时初值进行编码,称为唱名码,唱名与唱名码对照表如下表所示。 生日快乐歌歌谱如下:1=C 3/4
(2) 编制节拍与节拍码对照表。 根据曲调和歌谱要求,确定最小节拍数为1/4拍,基本延时子程序延时时间为187 ms;对不同节拍对应的循环次数进行编码,称为节拍码,节拍与节拍码对照表如下表所示。 1/2拍 3/4拍 1拍 1 1/4拍 1 1/2拍 2拍 2 1/2拍 3拍 节拍码 1 2 3 4 5 6 8 9 C
(3) 编制简谱码表。 歌谱中每个音符中与频率和延时有关的参数可用一个字节来表述,称为简谱码,字节的高4位存放与音符的频率相对应的唱名码,字节的低4位存放与音符的节拍相对应的节拍码。根据歌谱,编制每个音符的简谱码,并编成简谱码表。 歌谱中每个音符的简谱码可做成表格存放到程序存储器中,唱名码、节拍码也可做成表格存放到程序存储器中。编写程序通过查表从表格中得到简谱码,从简谱码中分解出唱名码和节拍码,再通过查表从表格中得到唱名码和节拍码所包含的定时初值和循环次数。
参考程序:主程序 ORG 0000H 0000H 02 00 30 LJMP MAIN ORG 001BH 001BH 02 01 50 LJMP INT1 ORG 0030H 0030H 75 81 30 MAIN:MOV SP,#30H 0033H 75 89 10 MOV TMOD, #10H ;设T1工作方式1 0036H 75 A8 88 MOV IE, #88H ;允许中断 0039H 75 40 00 LOOP1:MOV 40H, #00H ;简谱码指针清0 003CH E5 40 LOOP2:MOV A, 40H ;简谱码指针放入A 003EH 90 02 00 MOV DPTR, #TABLE1 0041H 93 MOVC A,@A+DPTR ;到表格TABLE1中取简谱码 0042H F9 MOV R1, A ;取到的简谱码暂存于R1 0043H 60 2B JZ FINISH ;简谱码是00H(结束码),转移 0045H 54 0F ANL A, #0FH ;不是00H,取低4位(节拍码) 0047H FA MOV R2, A ;将节拍码存入R2中 0048H E9 MOV A, R1 ;将取到的简谱码再放入A 0049H C4 SWAP A ;高低4位交换 004AH ;取低4位(唱名码) 004CH 70 04 JNZ SING ;唱名码不是00H,转移 004EH C2 8E CLR TR1 ;唱名码是00H,则不发音 0050H 80 17 SJMP WY ;转移至WY
参考程序:主程序 0052H 14 SING:DEC A ;唱名码减1 0053H F5 50 MOV 50H,A ;唱名码存入50H 23 RL A ;乘2 0056H 90 02 50 MOV DPTR, #TABLE2 0059H 93 MOVC A,@A+DPTR ;到表格TABLE2取计数值高8位 005AH F5 8D MOV TH1, A ;计数值高8位存入TH1 005CH F5 51 MOV 51H, A ;计数值高8位存入51H 005EH E5 50 MOV A, 50H ;将取到的唱名码再放入A 0060H 0061H 04 INC A ;唱名码加1 0062H ;到表格TABLE2取计数值低8位 0063H F5 8B MOV TL1, A ;计数值低8位存入TL1 0065H F5 52 MOV 52H, A ;计数值低8位存入52H 0067H D2 8E SETB TR1 ;启动T1 0069H 12 01 00 WY: LCALL DELAY ;调用基本单位时间(1/4拍) 006CH 05 40 INC 40H ;简谱码指针加1 006EH 80 CC SJMP LOOP2 ;取下一个简谱码 0070H C2 8E FINISH: CLR TR1 ;停止T1 0072H 80 C5 SJMP LOOP1 ;重复播放
参考程序:延时子程序 ORG 0100H ;基本单位时间子程序(1/4拍) 0100H 7C C8 DELAY: MOV R4,#200 ;延时187ms的循环次数 0102H 7D E9 LP1: MOV R5,#232 ;延时0.935ms的循环次数 0104H DD FE DJNZ R5,$ 0106H DC FA DJNZ R4,LP1 0108H DA F6 DJNZ R2,DELAY ;节拍数未到,转移 010AH 22 RET ORG 0150H 0150H C0 E0 INT1: PUSH ACC ;将A的值暂存于堆栈 0152H C0 D0 PUSH PSW ;将PSW的值暂存于堆栈 0154H 85 52 8B MOV TL1, 52H ;重置定时器初值 0157H 85 51 8D MOV TH1, 51H 015AH B2 90 CPL P1.0 ;将P1.0取反 015CH D0 D0 POP PSW ;至堆栈取回PSW值 015EH D0 E0 POP ACC ;至堆栈取回A值 0160H 32 RETI ;返回主程序
参考程序:简谱码表 ORG 0200H 0200H TABLE1:DB 82H,01H,81H,94H,84H ;简谱码表 0205H DB 0B4H,0A4H,04H 0208H DB 82H,01H,81H,94H,84H 020DH DB 0C4H,0B4H,04H 0210H DB 82H,01H,81H,0F4H,0D4H 0215H DB 0B4H,0A4H,94H 0218H DB 0E2H,01H,0E1H,0D4H,0B4H 021DH 0220H 0225H 0228H 022DH 0230H 0235H 0238H 023DH 0240H DB 00H
参考程序:唱名码表 ORG 0250H 0250H TABLE2:DW FD82H,FDC8H,FE06H ;唱名码表 0256H DW FE22H,FE56H,FE85H 025CH DW FE9AH,FEB2H,FEE4H 0262H DW FF03H,FF11H,FF2BH 0268H DW FF42H,FF4DH,FF61H END ;程序结束
6.3.3 方式1及应用实例 【例6】 P1.0口做输出口,接一只喇叭,利用定时器中断方式编写程序,使喇叭放出悦耳的音乐。晶振频率6MHz。 6.3.3 方式1及应用实例 【例6】 P1.0口做输出口,接一只喇叭,利用定时器中断方式编写程序,使喇叭放出悦耳的音乐。晶振频率6MHz。 解:音乐是由高低长短相同或不同的音符,按一定的规律组织起来的。每个音符都包括两个要素:第一是音调,即音符的频率,频率越高音调越高,频率越低音调越低;第二是节拍,即音符的时间长短。 利用定时器/计数器可以产生不同频率的音频脉冲,也可以控制音频脉冲的延时时间。不同的音符对应的频率不同,用定时器T1方式1可以产生与各音符对应频率的方波,C调各音符频率与定时器定时初值对应关系如下表所示;不同的节拍对应的延时时间不同,通过循环调用一个基本延时子程序可以产生不同的节拍,各曲调与节拍的时间对应关系如下表所示。
6.3.4 方式2及应用实例 在方式1下,以定时器0为例,定时器/计数器是一个能自动装入初值的8位加1计数器,TH0中的8位用于存放定时初值或计数初值,TL0中的8位用于加1计数器。 方式2与方式0基本相似,最大的区别除方式2的加1计数器位数是8位外,加1计数器溢出后,硬件使TF0自动置1,同时自动将TH0中存放的定时初值或计数初值再装入TL0,继续计数。 定时器/计数器0方式2逻辑结构 C/T C/T
6.3.4 方式2及应用实例 【例7】 P1.1输出脉冲宽度调制(PWM)信号,即脉冲频率为1kHz、占空比为2∶5的矩形波,以控制直流电动机按一定的速度转动,晶振频率为6MHz。 解:直流电动机具有优良的调速特性,调速方法也从模拟化逐步向数字化转化,采用脉冲宽度调制(PWM)的方法可以实现平滑调速,电机转速由脉冲的占空比决定。 频率为1kHz,周期为1ms,占空比为2:5的P1.1输出矩形波的波形如下图所示。 对P1.1取反时,由于高、低电平的时间不同,可找出一个时间基准,如100s、200s。 本例设定时间基准200s,即定时时间为200s。 定时初值 X=28-T/T机=28-200/2=256-100=156=9CH 高电平的软件计数为2,低电平的软件计数为3。 定时器以查询方式工作。
6.3.4 方式2及应用实例 主程序: ORG 0000H 0000H 02 00 30 LJMP MAIN ORG 000BH 6.3.4 方式2及应用实例 ORG 0000H 0000H 02 00 30 LJMP MAIN ORG 000BH ;定时器0的中断入口地址 000BH 02 00 50 LJMP INT0 ORG 0030H 0030H D2 91 MAIN:SETB P1.1 ;设置P1.1初始状态 0032H 7A 02 MOV R2, #02H ;给R2赋高电平计数值 0034H 75 89 02 MOV TMOD, #02H ;定时器0工作方式2 0037H 75 8C 9C MOV TH0, #9CH ;置200s定时初值 003AH 75 8A 9C MOV TL0, #9CH 003DH D2 AF SETB EA 003FH D2 A9 SETB ET0 0041H D2 8C SETB TR0 0043H 80 FE SJMP $ ;动态暂停
6.3.4 方式2及应用实例 定时器0中断服务程序: 矩形波的波形图 ORG 0050H 0050H DA 0B INT0:DJNZ R2,EXIT 0052H B2 91 CPL P1.1 ;P1.1取反 0054H 30 91 04 JNB P1.1,L1 ;判断P1.1电平高低 0057H 7A 02 MOV R2, #02H ;若P1.1=1,给R2赋高电平计数值 0059H 80 02 SJMP EXIT 005BH 7A 04 L1:MOV R2, #03H ;若P1.1=0,给R2赋低电平计数值 005DH 32 EXIT:RETI END 6.3.4 方式2及应用实例 矩形波的波形图
6.3.4 方式2及应用实例 【例8】 定时器0外部输入端(P3.4) 作为计数脉冲输入端,利用手控单脉冲信号作为计数输入脉冲,编写控制程序,每输入十个脉冲,工作寄存器R0的内容加一,晶振频率为6MHz。 解:用定时器0方式2时,定时器/计数器方式寄存器TMOD低4位中的M1M0应取10; 可设定为软件启动定时器,故GATE取0; 因用计数功能,C/T取1; 定时器方式寄存器TMOD高4位为无关位,一般都取0,所以TMOD应为06H。 计数初值 X=28-计数值=28-10=256-0=246=F6H 定时器以中断方式工作。
参考程序: ORG 0000H 0000H 02 00 50 LJMP MAIN ORG 000BH ;定时器0的中断入口地址 000BH 02 00 50 LJMP MAIN ORG 000BH ;定时器0的中断入口地址 000BH 02 02 00 LJMP SER0 ;转向中断服务程序 ORG 0050H 0050H 78 00 MAIN: MOV R0,#00H 0052H 75 89 06 MOV TMOD,#06H ;置计数器0为工作方式2 0055H 75 8C F6 MOV TH0,#0F6H ;置10次计数初值 0058H 75 8A F6 MOV TL0,#0F6H 005BH D2 AF SETB EA 005DH D2 A9 SETB ET0 005FH D2 8C SETB TR0 0061H 80 FE SJMP $ ORG 0200H 0200H 08 SER0: INC R0 ;中断服务程序 0201H 32 RETI END
6.3.4 方式2及应用实例 【例9】 利用定时器/计数器扩展一个外部中断源,用手控单脉冲信号作为外部中断信号,P1口控制八只灯(P1口输出低电平时灯被点亮),同一时间只有一盏灯点亮,编写控制程序,每发一个单脉冲信号,循环点亮下一盏灯。 解:定时器/计数器0以计数功能工作,当计数初值为FFH时,只要外部计数输入引脚T0(P3.4)输入一个计数脉冲,8位加1计数器TL0变为00H,TF0由硬件自动置1,并申请中断。利用这一特点,将外部中断请求信号作为计数脉冲送入外部计数输入引脚T0(P3.4),就可实现中断功能。 定时器/计数器0以方式2工作。
参考程序: ORG 0000H 0000H 01 50 AJMP MAIN ORG 000BH ;定时器0的中断入口地址 000BH 01 50 AJMP MAIN ORG 000BH ;定时器0的中断入口地址 000BH 21 00 AJMP INT ;转向中断服务程序 ORG 0050H 0050H 75 89 06 MAIN: MOV TMOD,#06H ;置计数器0为工作方式2 0053H 75 8C FF MOV TH0,#0FFH 0056H 75 8A FF MOV TL0,#0FFH 0058H D2 AF SETB EA 005AH D2 A9 SETB ET0 005CH D2 8C SETB TR0 005EH 74 FE MOV A,#0FEH 0060H F5 90 MOV P1,A 0062H 80 FE SJMP $ ORG 0100H 0100H 23 INT: RL A ;中断服务程序 0101H 0103H 32 RETI END
6.3.5 方式3 1. T0方式3的结构特点 在方式3下,定时器0分为两个独立的8位加1计数器TH0和TL0。其中TL0既可用于定时,也能用于计数;TH0只能用于定时。定时器/计数器0方式3逻辑结构如下图所示。 在方式3下,加1计数器TL0占用了T0除TH0外的全部资源,原T0的控制位和信号引脚的控制功能与方式0、方式1相同;与方式2相比,只是不能自动将定时初值或计数初值再装入TL0,而必须用程序来完成。加1计数器TH0只能用于简单的内部定时功能,它占用了原T1的控制位TR1和TF1,同时占用了T1中断源。
6.3.5 方式3 定时器/计数器0方式3逻辑结构 C/T C/T
6.3.5 方式3 2. T0方式3下T1的结构特点 T1不能工作在方式3下,因为在T0工作在方式3下时, T1的控制位TR1、TF1和中断源被T0占用。T1可工作在方式0、方式1、方式2下,但其输出直接送入串行口。设置好T1的工作方式,T1就自动开始计数;若要停止计数,可将T1设为方式3。 T1通常用作串行口波特率发生器,以方式2工作会使程序简单一些。
C/T 6.3.5 方式3 C/T 定时 器/ 计数 器0 方式 3下 的T1 逻辑 结构 C/T C/T C/T C/T
本章小结 8051单片机共有两个可编程的定时器/计数器,分别称为定时器0和定时器1,它们都是16位加1计数器。定时器/计数器的工作方式、定时时间、计数值和启停控制由程序来确定。 定时器/计数器有四种工作方式,工作方式由定时器方式寄存器TMOD中的M1、M0位确定。方式0是13位计数器,方式1是16位计数器,方式2是自动重装初值8位计数器;方式3时,定时器0被分为两个独立的8位计数器,定时器1是无中断的计数器,此时定时器1一般用作串行口波特率发生器。 定时器/计数器有定时和计数两种功能,由定时器方式寄存器TMOD中的C/T位确定。当定时器/计数器工作在定时功能时,通过对单片机内部的时钟脉冲计数来实现可编程定时;当定时器/计数器工作在计数功能时,通过对单片机外部的脉冲计数来实现可编程计数。
本章小结 当定时器/计数器的加1计数器计满溢出时, 溢出标志位TF1(TF0)由硬件自动置1,对该标志位有两种处理方法。一种是以中断方式工作,即TF1(TF0)置1并申请中断,响应中断后,执行中断服务程序,并由硬件自动使TF1(TF0)清0;另一种以查询方式工作,即通过查询该位是否为1来判断是否溢出,TF1(TF0)置1后必须用软件使TF1清0。 定时器/计数器的初始化实际上就是对定时器/计数器进行编程,以实现设计者所要求的控制功能。这通过对TMOD、TH0(TH1)、TL0(TL1)、IE、TCON专用寄存器中相关位的设置来实现,其中IE、TCON专用寄存器可进行位寻址。
习 题 1. 8051单片机的定时器/计数器的定时和计数两种功能各有什么特点? 习 题 1. 8051单片机的定时器/计数器的定时和计数两种功能各有什么特点? 2. 当定时器/计数器的加1计数器计满溢出时, 溢出标志位TF1由硬件自动置1,简述对该标志位的两种处理方法。 3. 当定时器/计数器工作于方式0时,晶振频率为12MHz,请计算最小定时时间、最大定时时间、最小计数值和最大计数值。 4. 8051单片机的定时器/计数器四种工作方式各有什么特点? 5. 硬件定时与软件定时的最大区别是什么? 6. 根据定时器/计数器0方式1逻辑结构图,分析门控位GATE取不同值时,启动定时器的工作过程。
习 题 7. 用方式0设计两个不同频率的方波,P1.0输出频率为200Hz,P1.1输出频率为 100Hz,晶振频率12MHz。 习 题 7. 用方式0设计两个不同频率的方波,P1.0输出频率为200Hz,P1.1输出频率为 100Hz,晶振频率12MHz。 8. P1.0输出脉冲宽度调制(PWM)信号,即脉冲频率为2kHz、占空比为7:10的矩形波,晶振频率12MHz。 9. 两只开关分别接入P3.0、P3.1,在开关信号4种不同的组合逻辑状态,使P1.0分别输出频率0.5kHz、1kHz、2kHz、4kHz的方波,晶振频率为12MHz。 10. 有一组高电平脉冲的宽度在50~100ms之间,利用定时器0测量脉冲的宽度,结果存放到片内RAM区以50H单元为首地址的单元中,晶振频率12MHz。
Q & A? Thanks!