1、概述通常采用以下三种方法来实现定时或计数:通常采用以下三种方法来实现定时或计数: 1 1硬件法硬件法 硬件定时功能完全由硬件电路完成,不占硬件定时功能完全由硬件电路完成,不占用用CPUCPU时间。但当要求改变定时时间时,只能通时间。但当要求改变定时时间时,只能通过改变电路中的元件参数来实现,很不灵活。过改变电路中的元件参数来实现,很不灵活。 2 2软件法软件法 软件定时是执行一段循环程序来进行时间软件定时是执行一段循环程序来进行时间延时,优点是无额外的硬件开销,时间比较精延时,优点是无额外的硬件开销,时间比较精确。但牺牲了确。但牺牲了CPUCPU的时间。的时间。 3 3可编程定时器计数器可编程
2、定时器计数器MSC-51MSC-51单片机定时单片机定时/ /计数器的结构计数器的结构返回 定时电路集成在芯片中,称为定时器/计数器。MCS-51的单片机内有两个16位可编程的定时器/计数器,分别称为定时器/计数器0和定时器/计数器1,它们具有四种工作方式,其控制字和状态均在相应的特殊功能寄存器中,通过对控制寄存器的编程,就可方便地选择适当的工作方式。 图-:定时/计数器结构定时器/计数器的控制寄存器v1工作方式控制寄存器(TMOD)位D7D6D5D4D3D2D1D0位符号GATAM1M0GATAM1M0T1方式字段T0方式字段 GATE:门控位。GATE = 0 启动不受 /INT0或 /I
3、NT1的控制;GATE = 1 启动受 /INT0 或 /INT1 的控制。C/ : 外部计数器 / 定时器方式选择位。C/ = 0 定时方式;C/ = 1 计数方式。M1M0:工作模式选择位。 M1 M0 模式 说明 0 0 0 13位定时/计数器,高八位TH(7 0)+ 低五位TL(4 0) 0 1 1 16位定时/计数器,TH(7 0)+ TL(7 0) 1 0 2 8位计数初值自动重装,TL(7 0) TH(7 0) 1 1 3 T0运行,而T1停止工作,8位定时/计数。TTTv定时/计数器控制寄存器(TCON) 位D7D6D5D4D3D2D1D0位符号TF1TR1TF0TR0IE1I
4、T1IE0IT0TR0:定时 / 计数器0运行控制位。软件置位,软件复位。与GATE有关,分两种情况: GATE = 0 时:若TR0 = 1,开启T0计数工作;若TR0 = 0,停止T0计数。 GATE = 1 时:若TR0 = 1 且/INT0 = 1时,开启T0计数; 若TR0 = 1 但 /INT0 = 0,则不能开启T0计数。 若TR0 = 0, 停止T0计数。TR1:定时 / 计数器1运行控制位。用法与TR0类似。定时器/计数器的工作方式v定时/计数器工作方式 工作方式0是13位计数结构的工作方式,其计数器由TH的全部8位和TL的低5位构成,TL的高3位没有使用。当C/T=0时,多
5、路开关接通振荡脉冲的12分频输出,13位计数器以次进行计数。这就是定时工作方式。当C/T=1时,多路开关接通计数引脚(To),外部计数脉冲由银南脚To输入。当计数脉冲发生负跳变时,计数器加1,这就是我们常称的计数工作方式 图-2:定时/计数器工作方式0逻辑结构v在工作方式0下,计数器的计数值由下式确定:213-X=8192-X计数值范围是: 18192(213)v定时器的定时值由下式确定:T=N*Tcy=(8192-X)*Tcy v2.定时/计数器工作方式1 当M1,M0=01时,定时/计数器处于工作方式1,此时,定时/及数器的等效电路如图所示 可以看出,方式0和方式1的区别仅在于计数器的位数
6、不同,方式0为13位,方式1则为16位,由TH0作为高8位,TL0为低8位,有关控制状态字与方式0相同。则只需将工作方式0的计算公式中的213改为216就可得到工作方式1的计数值计算公式和定时时间计算公式。图-:定时/计数器工作方式逻辑结构v3定时/计数器工作方式2当M1,M0=10时,定时/计数器处于工作方式2,此时,定时/及数器的等效电路如图所示图-:定时/计数器工作方式逻辑结构具有自动重装载功能,即自动加载计数初值 ,在这种工作方式中,16位计数器分为两部分,以TL0为计数器,以TH0作为预置寄存器 ,当计数溢出时 ,TH以硬件方法自动给计数器TL0重新加载 。v工作在方式下,计数器的计
7、数值由下式确定: 28-X=256-X 计数范围为: 1256 v定时器的定时值由下式确定: T=N*Tcy=(256-X)*Tcy v定时/计数器工作方式当M1,M0=10时,定时/计数器处于工作方式2,此时,定时/及数器的等效电路如图所示 图-5:定时/计数器工作方式3等效电路v工作方式3只适用于定时/计数器T0。当T0工作在方式3时,TH0和TL0被分为两个独立的8位计数器。TL0可作为定时器或计数器使用,占用了T0本身的控制信号TF0和TR0。TH0只能作为定时器使用,且占用了定时/计数器T1的两个控制信号TR1和TF1。v当T0工作于方式3时,T1只能工作在方式0、方式1或方式2,并
8、且由于已没有计数溢出标志位TF1可供使用,只能把计数溢出直接送给串行口,作串行口的波特率发生器使用。等效电路图如下 图-:方式下的作为波特率发生器等效电路TH1(8位)TL1(8位或5位)12分频OSCTL1(8位)TH1(8位)12分频OSCC/T=0C/T=1C/T=0C/T=1串行口串行口T1(P3.5)T1(P3.5)T1工作方式0(或1)T1工作方式2定时/计数器应用举例v在使用定时/计数器时,应做好四件事:设置TMOD以选择工作方式;计算并设置计数初值THX,TLX;设置IE、IP以规定中断的开放/禁止及优先级;设置TCON以启动/停止定时/计数器的工作。v工作方式的应用【例例】设
9、单片机晶振频率fosc=6MHZ,使用定时器1以方式0产生周期为600s的等宽方波脉冲,并由P1.7输出,以查询方式完成。解:解:(1)计算计数初值欲产生周期为600s的等宽方波脉冲,只需在P1.7端以300s为周期交替输出高低电平即可,因此定时时间应为300s。设待求计数初值为N,则:(213-N)210-6=30010-6N=8042=1F6AH0001111101101010B将低5位01010B=0A写入TL1,将高8位有效值11111011B=FBH写入TH1中。(2)TMOD初始化为把定时/计数器1设定为方式0,则M1M0=00。为实现定时功能应使C/=0,为实现定时器启动应使GA
10、TE=0,因此设定工作方式控制寄存器TMOD=00H。(3)由TR1启动和停止定时器TR1=1为启动,TR1=0为停止参考程序如下: ORG 1000H START: MOV TCON,#00H ;清TCON MOV TMOD,#00H ;工作方式设定 MOV TH1,#0FBH ;计数初值设定 MOV TL1,#0AH MOV IE,00H ;关中断 SETB TR1 ;启动TR1LOOP0: JBC TF1,LOOP1 ;查询是否溢出 SJMP LOOP0LOOP1: MOV TH1,#0FBH ;重设初值 MOV TL1,#0AH CPL P1.7 ;输出取反 SJMP LOOP0 EN
11、Dv工作方式应用【例例】已知某生产线的传送带上不断地有产品单向传送,产品之间有较大间隔,如图6-6所示。使用光电开关统计一定时间内的产品个数。假定红灯亮时停止统计,红灯灭时才在上次统计结果的基础上继续统计,试用单片机定时/计数器T1的方式1完成该项产品的计数任务。解:解:(1) 初始化: GATE=1, C/T=1, M0M1=01,故TMOD=11010000B=0D0H,TCON=00(2)T1在方式1时, 溢出产生中断, 且计数器回零, 故在中断服务程序中, 需用R0计数中断次数,以保护累积计数结果。 (3) 启动T1计数, 开T1中断。v参考程序如下: ORG 0000H AJMP S
12、TART ORG 001BH AJMP T1INT ORG 0100HSTART: MOV SP, #60H MOV TCON, #00H MOV TMOD, #0D0H MOV TH1, #0FFH 图-:产品传送带原理图MOV TL1, #0FFH MOV R0, #00H MOV P3, #28H ;置P3.5,P3.3为输入状态 SETB TR1 SETB ET1 SETB EA MAIN: LCALL DISP ORG 0A00HT1INT: INC R0 MOV TH1, #0FFH MOV TL1, #0FFH RETI DISP: RET ENDv工作方式的应用【例例】使用定时
13、器T0以方式2产生200微秒定时,在P1.0输出周期为400微秒的连续方波。已知晶振频率fosc=6MHz。(1)计算计数初值(256-N)210-6=20010-6 N=156=9CH(2)TMOD初始化工作方式2时,M1M0=10,实现定时功能C/=0,GATE=0。定时器1不用,无关位设定为0,可得TMOD=02H。参考程序如下:ORG 000BHLJMP LOOP0ORG 0200HSTART: MOV TCON,#00H MOV TMOD,#02H ;定时器方式2 MOV TH0,#9CH ;计数初值 MOV TL0,#9CH SETB EA ;允许总中断 SETB ET0 ;T0中
14、断允许 SETB TR0 ;启动T0HERE: SJMP HERE ;等待中断 ORG 0500H ;中断服务程序LOOP0: CPL P1.0 RETI ENDv工作方式的应用【例例】假设有一个用户系统中已使用了两个外部中断源, 并置定时器 T1 于方式 2, 作串行口波特率发生器用, 现要求再增加一个外部中断源, 并由P1.0 口输出一个5 Hz的方波(假设晶振频率为 6 MHz)。 在不增加其它硬件开销时,可把定时/计数器T0置于工作方式3,利用外部引脚T0端作附加的外部中断输入端,把TL0预置为0FFH,这样在T0端出现由1至0的负跳变时,TL0溢出,申请中断,相当于边沿激活的外部中断
15、源。在方式3下,TH0总是作8位定时器用,可以靠它来控制由P1.0输出的5kHz方波。由P1.0输出5kHz的方波,即每隔100s使P1.0的电平发生一次变化。则TH0中的初始值:X=M-N=256-100/2=206。下面是有关的程序:MOV TL0, 0FFH MOV TH0, 206 MOV TL1, BAUD ; BAUD根据波特率要求设置常数 MOV TH1, BAUD MOV TMOD, 27H ; 置T0工作方式3,TL0工作于计数器方式 MOV TCON, 55H ; 启动定时器 T0、 T1, 置外部中断 0 和 1为边沿激活方式MOV IE, 9FH ; 开放全部中断TL0
16、 溢出中断服务程序(由 000BH单元转来): TL0INT: MOV TL0, 0FFH ; 外部引脚 T0 引起中断处理程序 RETITH0 溢出中断服务程序(由 001BH转来): TH0INT: MOV TH0, 206 CPL P1.0 RETI此处串行口中断服务程序、 外中断0和外中断1的中断服务程序没有列出。 v5. 5. 定时器作外部中断源应用定时器作外部中断源应用MCS51MCS51单片机有两个定时器计数器,当单片机有两个定时器计数器,当它们选择计数工作方式时,它们选择计数工作方式时,T0T0或或T1T1引脚上的负跳引脚上的负跳变将使变将使T0T0或或T1T1计数器加计数器加
17、1 1,若把定时器计数器,若把定时器计数器设置成计数工作方式,计数初值设定为满量程,设置成计数工作方式,计数初值设定为满量程,一旦计数从外部引脚输入一个负跳变信号,计数一旦计数从外部引脚输入一个负跳变信号,计数器器ToTo或或T1T1加加1 1,产生溢出中断,这样,便可把外,产生溢出中断,这样,便可把外部计数输入端部计数输入端T0(P3T0(P34)4)或或T1(P3T1(P35)5)扩展为外部扩展为外部中断源输入。中断源输入。 【例】将T1设置为工作方式2(自动恢复常数)及外部计数方式,计数器TH1、TLl初值设置为FFH,当计数输入端T1(P35)发生一次负跳变,计数器加1并产生溢出标志,
18、向 CPU申请中断,中断处理程序使累加器A内容加1,送P1口输出,然后返回主程序。编程如下: ORG 0000H AJMP MAIN ORG 0013H AJMP INT MAIN: MOV SP, #53H MOV TMOD, #60H ;T1方式2,计数 MOV TL1,#0FFH MOV TH1, #0FFHSETB TR1 ;启动T1 SETB ET1 ;T1中断允许 SETB EA ;CPU中断开放LOOP: SJMP LOOP ;等待INT: INC A ;T1中断处理 MOV P1, A RETI ;中断返回 END单片机音乐 声音的频谱范围为20Hz-200KHz,人的耳朵能辨
19、别的声音频率大概在200Hz-20KHz。利用定时/计数器可以方便地产生一定频率的矩形波,接上喇叭就能发出一定频率的声音,改变定时/计数器的初值,即可改变频率,即改变音调。用延时程序或另一个定时器控制某一频率信号持续的时间长短,就可以控制节拍。音调和节拍是音乐的两大要素,有了音调和节拍,就可以演奏音乐了。用单片机产生音频脉冲,只要算出该音频的周期T,然后用定时器定时1/2 T,定时时间到时,将输出脉冲的I/O管脚反相,再重新计时输出,定时时间到再反相,重复此过程就可在此I/O管脚得到此音频脉冲。乐曲中,每个音符都对应着确定的频率,每一频率都对应定时器的一个频率初值。每个节拍都有固定的时间,都对
20、应延时程序的一个参数或定时器的一个节拍初值。可以将每一音符对应的定时器频率初值和节拍参数或节拍初值计算出来,把乐谱中所有音符对应的定时器频率初值和节拍参数按顺序排列成表格,然后用查表程序依次取出,产生指定频率的音符并控制节奏,就可以实现演奏效果。为了控制演奏的结束,结束符和休止符可以分别用代码00H和FFH来表示,若查表结果为00H,则表示曲子终了;若查表结果为FFH,则产生相应的停顿效果。为了产生节奏感,在某些音符(例如两个相同音符)间可以插入一个时间单位的频率略有不同的音符,以示区别。 乐曲的12平均率规定:每2个八度音(如简谱中的中音1与高音1)之间的频率相差1倍。在2个八度音之间,又可
21、分为12个半音。音符A(简谱中的低音6)的频率为440Hz,音符B到C之间、E到F之间为半音,其余为全音。【例】 用单片机演奏“生日快乐”歌曲 设用定时器T0工作于方式1产生频率,用T1控制节拍,P2.5驱动蜂鸣器,晶振频率为6MHz。节拍以1/8拍为基准,其它节拍为该节拍的N倍,用循环N次1/8基准节拍实现。电路如上图所示所示。表6-1列出了C调各音符频率与T0初值N的对照表。“#”表示半音,用于上升或下降半个音。 参考程序如下: BASE EQU 62500 ;设定1/8拍 SPEAKER EQU P2.5 ;设定输出口 ;主程序 ORG 0000H ;从0地址开始 JMP INITIAL
22、 ;跳至INITIAL ORG 000BH ;TIMER0中断向量 JMP TONEINT ;跳至TIMER0中断子程序 ORG 001BH ;TIMER1中断向量 JMP BEATINT ;跳至TIMERl中断子程序INITIAL: MOV TMOD,#11H ;设定定时器模式;启用定时器 MOV IE,#10001010B ;定时器中断开放 MOV SP,#70H ;移开堆栈START: CLR F0 ;节拍结束标志 MOV R7,#0 ;音阶起始间距 MOV R6,#0 ;节拍起始间距 LOOP : LCALL LOADTONE ;载入音阶 LCALL LOADBEAT1 ;载入节拍 J
23、NB F0,$ ;节拍结束? CLR F0 JMP LOOP ;下一个音节;载入音节LOADTONE: MOV DPTR,#TONE ;指定音阶起始地址 MOV A, R7;指定间距 MOVC A,A+DPTR;读取音阶 JNZ CONTINUE;判断是否为最后一个音? MOV R6,#0;节拍从头开始 MOV R7,#0;音阶从头开始 JMP LOADTONE;跳到LOADTONECONTINUE: MOV 20H,A;储存定时器值高字节 MOV TH0,A;指定定时器值高字节 INC R7;下一个间距 MOV A,R7;指定间距 MOVC A,A+DPTR;读取定时器值低字节 MOV 21
24、H,A ;储存定时器值低字节 MOV TL0,A;指定定时器值低字节 INC R7;下一个间距 SETB TR0;启动TIMER0 RET;返回;载入节拍LOADBEAT1: MOV DPTR,#BEAT ;指定节拍起始地址 MOV A,R6 ;指定间距 MOVC A,A+DPTR ;读取节拍 MOV R5,A ;指定节拍 MOV TH1,#BASE ;指定定时器初值高字节 MOV TL1,#BASE ;指定定时器初值低字节 SETB TR1 ;启动TIMERl RET ;返回;音符中断子程序TONEINT: CLR TR0;关闭TIMER0 CPL SPEAKER;驱动喇叭 MOV A, 2
25、0H;取回定时器初值高字节 MOV TH0, A ;指定定时器初值高字节 MOV A, 21H;取回定时器初值低字节 MOV TL0, A;指定定时器初值低字节 SETB TR0;启动TIMER0 RETI;T0中断返回;节拍中断子程序BEATINT: CLR TR1;关闭TIMERl DJNZ R5, AGAIN;循环结束? CLR TR0;关闭TIMBR0 SETB F0;F01,结束节拍 JMP EXIT1;跳至EXIT1AGAIN: MOV TH1,#BASE ;指定定时器初值高字节 MOV TL1,#BASE ;指定定时器初值低字节 SETB TR1;启动TIMERlEXIT1: R
26、ETI;音符表TONE;第一小节 DB 252,68, 252,68 DB 252,173, 252,68;第二小节 DB 253,52, 253,10;第三小节 DB 252,68,252,68 DB 252,173,252,68;第四小节 DB 253,131, 253,52;第五小节 DB 252,68, 252,68 DB 254,34, 253,200;第六小节 DB 253,52, 253,10 DB 254,87 ;第七小节 DB 254,6, 254,6 DB 253,200, 253,52;第八小节 DB 253,131,253,52,0 ;节拍表BEAT:;第一小节 DB 4,4,8,8;第二小节 DB 8,16 ;第三小节 DB 4,4,8,8;第四小节 DB 8,16;第五小节 DB 4,4,8,8;第六小节 DB 8,8,8 ;第七小节 DB 4,4,8,8;第八小节 DB 8,16,0; ENDv题目:音乐程序设计 v内容:声音的产生是一种音频振动的效果,振动的频率高则为高音,振动的频率低则为低音。音频的频率范围为20Hz200KHz。以不同频率的信号驱动喇叭,喇叭即可发出不同的声音。音乐的核心要素是音调和节拍,在单片机上演奏音乐的基本原理是用定时器产生不同频率(音调)的信号驱动喇叭,以延时程序控制节拍。设计一个单片机音乐系统,演奏“雪绒花”歌曲。