《5[1].2定时器应用举例》由会员分享,可在线阅读,更多相关《5[1].2定时器应用举例(40页珍藏版)》请在金锄头文库上搜索。
1、定时器及应用定时定时/ /计数器的基本结构如图所示计数器的基本结构如图所示 :l例1、设单片机晶振频率为6MHZ,使 用定时器1以方式0产生周期为500us的等 宽正方波连续脉冲,并由P1.0输出,以查 询方式完成。解:1、计算计数初值 要产生500us的等宽正方波脉冲,只需在 P1.0端以250us为周期交替输出高低电平即 可实现,为此定时时间为250us。使用 6MHZ晶振,则一个机器周期为2us,方式 0为13位计数结构,设初值为X,则: (213-X)*12*1/6 =250 得:X=8067,二进制数表示为: 11111100 00011,十六进制表示为,高8 位为:0FCH,低5位
2、为:03H。其中高8位 装入TH1,即TH1 = 0FCH,低5位装入TL1, 即TL1 = 03H。2、TMOD寄存器初始化为把定时器/计数器设定为方式0,则 M1M0= 00 ;为实现定时功能,应使 C/T=0;为实现定时器/计数器1的运行控 制,则GATE =0。定时器/计数器T0不用 ,有关位设定为0,因此TMOD寄存器初 始化为00H。 3、由定时器控制器TCON中的TR1位控 制定时的启动和停止,TR1=1启动 , TR1=0停止。 4、使用查询就禁止中断 IE=00Hl5、程序设计:l MOV TMOD ,#00H ; 设置T1为工作方式 0l MOV TH1 ,#0FCH ;设
3、置计数初值l MOV TL1,#03Hl MOV IE ,#00H ;禁止中断 SETB TR1 ;启动定时lLOOP: JBC TF1,LOOP1 ;查询计数溢出l AJMP LOOPlLOOP1:MOV TH1,#0FCH ;重新设置计数初 值 l MOV TL1,#03Hl CPL P1.0 ;输出取反l AJMP LOOP ;重复循环例3、使用定时器0以工作方式2产生 100us定时,在P1.0输出周期为200us的连续 方波脉冲,已知晶振频率fosc=6MHZ。解: 1、计算计数初值6MHZ晶振下,一个机器周期为2us,以TH0作重 装载的预置寄存器,TL0作8位计数器,则:(28-
4、X)*12*1/6=100 ,得 X=206=11001110B=0CEH把0CEH分别装入TH0和TL0中。 2、TMOD初始化为把定时器/计数器设定为方式2,则M1M0=10 ;为实现定时功能,应使C/T=0;为实现定时器/计 数器0的运行控制,则GATE=0。定时器/计数器T1 不用,有关位设定为0,因此TMOD寄存器初始化 为0000 0010,即:02H3、由定时器控制器TCON中的TR0位 控制定时的启动和停止,TR0=1启动 , TR0=0停止。 4、使用中断方式,应开中断EA 位和ET0位置“1”l5、程序设计(查询方式)l MOV TMOD ,#02H ; 设置T0为工作方
5、式2l MOV TH0 ,#0CEH ;设置计数初值l MOV TL0,#0CEHl MOV IE ,#00H ;禁止中断l SETB TR0 ;启动定时l LOOP: JBC TF0,LOOP1 ;查询计数溢出l AJMP LOOPlLOOP1:CPL P1.0 ;输出取反l AJMP LOOP ;重复循环l5、程序设计(中断方式)l MOV TMOD ,#02H ; 设置T0为工作 方式2l MOV TH0 ,#0CEH ;设置计数初值l MOV TL0,#0CEHl SETB EA ;开中断l SETB ET0 ; 定时器1允许中 断l SETB TR0 ;启动定时l SJMP $ ;
6、等待中断l l ORG 000BHl CPL P1.0 ;输出取反l RETI ;中断返回l设某用户系统中已使用了两个外部中断 源,并置定时器T1工作在模式2,作串行 口波特率发生器用。现要求再增加一个外 部中断源,并由P1.0输出一个5KHz的方 波。Fosc = 12MHz。l分析: 目的:1) 增加一个外部中断;2) 使P1.0输出一个方波。 条件:1)两个外部中断源已被使用2)定时器T1已用于串行口波特率发生 器因此:可利用定时/计数器T0,使之工作在模 式3,1)利用TL0扩展外部中断源2)利用TH0作定时器使用,输出方波l 设置初值:1) TL0 = 0FFH2) 因为输出方波f
7、= 5kHz,故方波周期 为200us,用TH0产生100us的定时,故 TH0的初值X = 256 (定时时间/机器周期)= 256 - (100us*晶振频率/12)= 156l设定T0工作方式,TMOD,TCON.l程序:MOV TMOD,#27H ;T0:模式3,计数方式;T1:模式2,定时方式MOV TL0,#0FFH ;一旦加1,马上溢出,申请中断MOV TH0,#156 ;TH0初值MOV TH1,#data ;根据波特率要求而定MOV TL1, #dataMOV TCON,#55H ;01010101MOV IE,#9FH ;开放全部中断 .ORG 000BH TL0INT:
8、MOV TL0,#0FFH ;TL0重新赋值RETIORG 001BH TH0INT: MOV TH0,#156 ;TH0重新赋值CPL P1.0RETI l低频信号发生器驱动程序设计一个控制程序,使89c51的P1口输 出8路低频方波脉冲,频率分别为100, 50,25,20,10,5,2,1Hz。1. 计算定时器初值使用T0,产生5ms的定时,若晶振选12MHz,则5ms相 当于5000个机器周期,T0应工作在模式1,初值x为: x= 65536-5000=60536,用十六进制表示,则x=0EC78H。(注意TH,TL分开赋值-因为T0/T1都是16位)2 . 设立8个计数器对应于P1.
9、0P1.7,设立8个计数器,初值分别为1,2, 4,5,10,20,50,100,由T0的溢出中断服务程序对它们 减“1”计数,当减为0时恢复初值,并使相应的口引脚改变状 态,这样就可以使P1口输出所要求的方波。l程序:ORG 0 START: AJMP MAINORG 0BH PTP0: MOV TL0,#78H ;T0中断服务程序MOV TH0,#0ECHCPL P1.0DJNZ 31H, PF01 ;对各路时间计数器进行减1 计数MOV 31H,#2 ;计数器减为1,恢复计数初 值CPL P1.1 ;输出取反 PF01: DJNZ 32H, PF02MOV 32H, #4CPL P1.2
10、 PF02: DJNZ 33H, PF03MOV 33H, #5CPL P1.3PF03: DJNZ 34H, PF04MOV 34H, #10CPL P1.4 PF04: DJNZ 35H, PF05MOV 35H, #20CPL P1.5 PF05: DJNZ 36H, PF06MOV 36H, #50CPL P1.6 PF06: DJNZ 37H, PF07MOV 37H, #100CPL P1.7 PF07: RETIMAIN: MOV SP, #70H ;主程序栈指针初始化MOV 31H, #2 ;各路计数器置初值MOV 32H, #4MOV 33H, #5MOV 34H, #10
11、MOV 35H, #20MOV 36H, #50MOV 37H, #100MOV TMOD, #1 ;GATE = 0, C/T=0, M1M0 = 01MOV TL0, #78H ;初值T0MOV TH0, #0ECHMOV IE, #82H ;允许T0中断SETB TR0 ;允许T0计数 HERE: SJMP HERE ;以踏步表示CPU可以处理其他 工作例 利用定时器T1的模式2对外部信 号计数,要求每计满100次对P1.0端取 反。解:(1)计算计数初值X100=28-X X=256-100=156=9CH(2)模式字TMOD=0110*B=60H(3)程序清单 ;用中断方式ORG 0
12、000H MAIN:MOV TMOD,#60HMOV TL1,#156MOV TH1,#156MOV IE,#88HSETB TR1SJMP $ORG 001BHCPL P1.0RETI 例 脉冲参数测量GATE功能的使用。脉冲高电平(计数)长度值存于21H、20H中,脉冲低电平长度存于23H、22H中。电路连接如下图所示。解: 复习GATE的用法:GATE = 0时,TRi = 1,即可启动Ti定时 / 计数GATE = 1时,TRi = 1,且 =1,才启动定时 / 计数。89C51P3.2P3.31被测信号 21a3T0计数T1计数ORG 0000HLJMP MAINORG 2000HM
13、AIN:MOV TMOD,#99H ;T0、T1均工作在定时,;模式1,GATE=1MOV A,#00H ;T0、T1赋计数初值00H,; 定时最长时间为0000 65536MOV TL0,A MOV TH0,AMOV TL1,AMOV TH1,A TEST0: JB P3.2,TEST0 ;检测是否到a点SETB TR0 ;到a点,TR0 = 1,做好取计时值准备。TEST1: JNB P3.2,TEST1 ;检测是否到1点SETB TR1 ;到1点T0计时;TR1 = 1,做好T1计时准备。TEST2:JB P3.2,TEST2 ;检测是否到2点CLR TR0 ;到2点,停止T0计时,T1
14、开始计时。MOV 20H,TH0 ;保存T0计时结果MOV 21H,TL0TEST3:JB P3.3,TEST3 ;检测是否到3点CLR TR1 ;到3点,停止T1计数MOV 22H,TH1 ;保存T1计数结果MOV 23H,TL1 LCALL DISPSJMP 运行中读定时器/计数器l80C51可以随时读写计数寄存器TLx和 THx (x为0或1) ,用于实时显示计数值 等。l办法是:先读THx,后读TLx,再重 读THx,若两次读得的THx值是一样的 ,则可以确定读入的数据是正确的;若 两次读得的THx值不一致,则必须重读 。 例. 飞读RDTIME:MOV A,TH0;读TH0MOV R0,TL0;读TL0并存入R0CJNE A,TH0,RDTIME ;再读TH0,与上次 ;读入的TH0比较,若不等,重读MOV R1,A;存TH0在R1中RET实时时钟的设计(1)实时时钟实现的基本思想如何获得1秒的定时,可把定时时间定为100ms,采用中断 方式进行溢出次数的累计,计满10次,即得到秒计时。 片内RAM中规定3个单元作为秒、分、时单元,具体安排如 下:32H:“秒”单元 ;31H:“