1 / 40

定时器及应用

定时器及应用. 定时/计数器的基本结构如图所示 :. 例1、设单片机晶振频率为6 MHZ, 使用定时器1以方式0产生周期为500 us 的等宽正方波连续脉冲,并由 P 1.0 输出,以查询方式完成。. 解:1、计算计数初值 要产生500 us 的等宽正方波脉冲,只需在 P 1.0 端以250 us 为周期交替输出高低电平即可实现,为此定时时间为250 us。 使用6 MHZ 晶振,则一个机器周期为2 us, 方式0为13位计数结构,设初值为 X, 则: (2 13 - X)*12*1/6 =250

randy
Download Presentation

定时器及应用

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 定时器及应用

  2. 定时/计数器的基本结构如图所示 :

  3. 例1、设单片机晶振频率为6MHZ,使用定时器1以方式0产生周期为500us的等宽正方波连续脉冲,并由P1.0输出,以查询方式完成。例1、设单片机晶振频率为6MHZ,使用定时器1以方式0产生周期为500us的等宽正方波连续脉冲,并由P1.0输出,以查询方式完成。

  4. 解:1、计算计数初值 要产生500us的等宽正方波脉冲,只需在P1.0端以250us为周期交替输出高低电平即可实现,为此定时时间为250us。使用6MHZ晶振,则一个机器周期为2us,方式0为13位计数结构,设初值为X,则: (213-X)*12*1/6 =250 得:X=8067,二进制数表示为:11111100 00011,十六进制表示为,高8位为:0FCH,低5位为:03H。其中高8位装入TH1,即TH1 = 0FCH,低5位装入TL1, 即TL1 = 03H。

  5. 2、TMOD寄存器初始化 为把定时器/计数器设定为方式0,则M1M0= 00 ;为实现定时功能,应使C/T=0;为实现定时器/计数器1的运行控制,则GATE =0。定时器/计数器T0不用,有关位设定为0,因此TMOD寄存器初始化为00H。 3、由定时器控制器TCON中的TR1位控制定时的启动和停止,TR1=1启动,TR1=0停止。 4、使用查询就禁止中断 IE=00H

  6. 5、程序设计: • MOV TMOD ,#00H ; 设置T1为工作方式0 • MOV TH1 ,#0FCH ;设置计数初值 • MOV TL1,#03H • MOV IE ,#00H ;禁止中断 SETB TR1;启动定时 • LOOP:JBC TF1,LOOP1 ;查询计数溢出 • AJMP LOOP • LOOP1:MOV TH1,#0FCH ;重新设置计数初值 • MOV TL1,#03H • CPL P1.0 ;输出取反 • AJMP LOOP ;重复循环

  7. 例3、使用定时器0以工作方式2产生100us定时,在P1.0输出周期为200us的连续方波脉冲,已知晶振频率fosc=6MHZ。例3、使用定时器0以工作方式2产生100us定时,在P1.0输出周期为200us的连续方波脉冲,已知晶振频率fosc=6MHZ。

  8. 解: 1、计算计数初值 6MHZ晶振下,一个机器周期为2us,以TH0作重装载的预置寄存器,TL0作8位计数器,则: (28-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,即:02H

  9. 3、由定时器控制器TCON中的TR0位控制定时的启动和停止,TR0=1启动,TR0=0停止。3、由定时器控制器TCON中的TR0位控制定时的启动和停止,TR0=1启动,TR0=0停止。 4、使用中断方式,应开中断 EA 位和ET0位置“1”

  10. 5、程序设计(查询方式) • MOV TMOD ,#02H ; 设置T0为工作方式2 • MOV TH0 ,#0CEH ;设置计数初值 • MOV TL0,#0CEH • MOV IE ,#00H ;禁止中断 • SETB TR0 ;启动定时 • LOOP: JBC TF0,LOOP1 ;查询计数溢出 • AJMP LOOP • LOOP1:CPL P1.0 ;输出取反 • AJMP LOOP ;重复循环

  11. 5、程序设计(中断方式) • MOV TMOD ,#02H ; 设置T0为工作方式2 • MOV TH0 ,#0CEH ;设置计数初值 • MOV TL0,#0CEH • SETB EA ;开中断 • SETB ET0 ; 定时器1允许中断 • LOOP: SETB TR0 ;启动定时 • HERE: SJMP $ ; 等待中断 • AJMP LOOP • 中断服务程序: • CPL P1.0 ;输出取反 • RETI ;中断返回

  12. 设某用户系统中已使用了两个外部中断源,并置定时器T1工作在模式2,作串行口波特率发生器用。现要求再增加一个外部中断源,并由P1.0输出一个5KHz的方波。Fosc = 12MHz。

  13. 分析: 目的:1) 增加一个外部中断; 2) 使P1.0输出一个方波。 条件:1)两个外部中断源已被使用 2)定时器T1已用于串行口波特率发生器 因此:可利用定时/计数器T0,使之工作在模式3, 1)利用TL0扩展外部中断源 2)利用TH0作定时器使用,输出方波

  14. 设置初值: 1) TL0 = 0FFH 2) 因为输出方波f = 5kHz,故方波周期为200us,用TH0产生100us的定时,故TH0的初值X = 256 – (定时时间/机器周期) = 256 - (100us*晶振频率/12) = 156 • 设定T0工作方式,TMOD,TCON.

  15. 程序: MOV TMOD,#27H ;T0:模式3,计数方式 ;T1:模式2,定时方式 MOV TL0,#0FFH ;一旦加1,马上溢出,申请中断 MOV TH0,#156 ;TH0初值 MOV TH1,#data ;根据波特率要求而定 MOV TL1, #data MOV TCON,#55H ;01010101 MOV IE,#9FH ;开放全部中断 TL0INT: MOV TL0,#0FFH ;TL0重新赋值 ….. RETI TH0INT: MOV TH0,#156 ;TH0重新赋值 CPL P1.0 RETI

  16. 低频信号发生器驱动程序 设计一个控制程序,使89c51的P1口输出8路低频方波脉冲,频率分别为100,50,25,20,10,5,2,1Hz。

  17. 1. 计算定时器初值 使用T0,产生5ms的定时,若晶振选12MHz,则5ms相当于5000个机器周期,T0应工作在模式1,初值x为: x= 65536-5000=60536,用十六进制表示,则x=0EC78H。 (注意TH,TL分开赋值---因为T0/T1都是16位) 2 . 设立8个计数器 对应于P1.0~P1.7,设立8个计数器,初值分别为1,2,4,5,10,20,50,100,由T0的溢出中断服务程序对它们减“1”计数,当减为0时恢复初值,并使相应的口引脚改变状态,这样就可以使P1口输出所要求的方波。

  18. 程序: ORG 0 START: AJMP MAIN ORG 0BH PTP0: MOV TL0,#78H ;T0中断服务程序 MOV TH0,#0ECH CPL P1.0 DJNZ 31H, PF01 ;对各路时间计数器进行减1计数 MOV 31H,#2 ;计数器减为1,恢复计数初值 CPL P1.1 ;输出取反 PF01: DJNZ 32H, PF02 MOV 32H, #4 CPL P1.2 PF02: DJNZ 33H, PF03 MOV 33H, #5 CPL P1.3

  19. PF03: DJNZ 34H, PF04 MOV 34H, #10 CPL P1.4 PF04: DJNZ 35H, PF05 MOV 35H, #20 CPL P1.5 PF05: DJNZ 36H, PF06 MOV 36H, #50 CPL P1.6 PF06: DJNZ 37H, PF07 MOV 37H, #100 CPL P1.7 PF07: RETI

  20. MAIN: MOV SP, #70H ;主程序栈指针初始化 MOV 31H, #2 ;各路计数器置初值 MOV 32H, #4 MOV 33H, #5 MOV 34H, #10 MOV 35H, #20 MOV 36H, #50 MOV 37H, #100 MOV TMOD, #1 ;GATE = 0, C/T=0, M1M0 = 01 MOV TL0, #78H ;初值——〉T0 MOV TH0, #0ECH MOV IE, #82H ;允许T0中断 SETB TR0 ;允许T0计数 HERE: SJMP HERE ;以踏步表示CPU可以处理其他工作

  21. 利用定时器T1的模式2对外部信号计数,要求每计满100次对P1.0端取反。

  22. 解:(1)计算计数初值X 100=28-X X=256-100=156=9CH (2)模式字 TMOD=0110****B=60H (3)程序清单 ;用中断方式 ORG 0000H MAIN:MOV TMOD,#60H MOV TL1,#156 MOV TH1,#156 MOV IE,#88H SETB TR1 SJMP $ ORG 001BH CPL P1.0 RETI

  23. 89C51 被测信号 a 1 2 3 P3.2 1 T0计数 T1计数 P3.3 解: 复习GATE的用法: GATE = 0时,TRi = 1,即可启动Ti定时 / 计数 GATE = 1时,TRi = 1,且 =1,才启动定时 / 计数。 例 脉冲参数测量——GATE功能的使用。 脉冲高电平(计数)长度值存于21H、20H中, 脉冲低电平长度存于23H、22H中。 电路连接如下图所示。

  24. ORG 0000H LJMP MAIN ORG 2000H MAIN:MOV TMOD,#99H ;T0、T1均工作在定时, ;模式1,GATE=1 MOV A,#00H ;T0、T1赋计数初值00H, ; 定时最长时间为0000 ~ 65536 MOV TL0,A MOV TH0,A MOV TL1,A MOV TH1,A

  25. 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开始计时。 MOV 20H,TH0 ;保存T0计时结果 MOV 21H,TL0 TEST3:JB P3.3,TEST3 ;检测是否到3点 CLR TR1 ;到3点,停止T1计数 MOV 22H,TH1 ;保存T1计数结果 MOV 23H,TL1 LCALL DISP SJMP $

  26. 运行中读定时器/计数器 • 80C51可以随时读写计数寄存器TLx和THx (x为0或1) ,用于实时显示计数值等。 • 办法是:先读THx,后读TLx,再重读THx,若两次读得的THx值是一样的,则可以确定读入的数据是正确的;若两次读得的THx值不一致,则必须重读。

  27. 例. 飞读 RDTIME: MOV A,TH0 ;读TH0 MOV R0,TL0 ;读TL0并存入R0 CJNE A,TH0,RDTIME ;再读TH0,与上次 ;读入的TH0比较,若不等,重读 MOV R1,A ;存TH0在R1中 RET

  28. 实时时钟的设计 (1)实时时钟实现的基本思想 时钟 就是以秒、分、时为单位进行计时。用定时器与中断的联合应用。 如何获得1秒的定时,可把定时时间定为100ms,采用中断方式进行溢出次数的累计,计满10次,即得到秒计时。 片内RAM中规定3个单元作为秒、分、时单元,具体安排如下: 32H:“秒”单元 ;31H:“分”单元;30H:“时”单元 从秒到分,从分到时是通过软件累加并进行比较的方法来实现的。

  29. ①假定使用定时器T0,以工作模式1进行100ms的定时。如fosc=6MHz,则计数初值X为:①假定使用定时器T0,以工作模式1进行100ms的定时。如fosc=6MHz,则计数初值X为: ∵ (216-X)×12/(6 × 106 )=100×10-3 s ∴ X=15536=3CB0H 因此 : (TL0)=0B0H (TH0)=3CH

  30. 采用定时方式进行溢出次数的累计,计满10次即得到秒计时。 ③ 从秒到分和从分到时的计时是通过累计和数值比较实现的。 ④ 时钟显示即及显示缓冲区部分在这里略,可自行设计。

  31. 设T1为模式1 (2)程序流程及程序清单 设中断次数 ① 主程序(MAIN)的主要功能是进行定时器T1的初始化编程并启动T1,然后通过反复调用显示子程序,等待100ms定时中断的到来。其流程如 图所示。 清计时单元 开中断 启动T1 调用显示子程序 等待定时中断

  32. ② 中断服务程序(PITO)的主要功能 进行计时操作。程序开始先判断计数溢出是否满了10次,不满表明还没达到最小计时单位—秒,中断返回;如满10次则表示已达到最小计时单位—秒,,程序继续向下运行,进行计时操作。 要求满1秒则“秒位”32H单元内容加1,满60s则“分位”31H单元内容加1,满60min则“时位”30H单元内容加1,满24h则30H,31H,332H单元内容全部清0。中断服务程序流程如下图所示。

  33. 入口 a 保护现场 (31H)清0 赋计数初值 (30H)加1 N 到1s? N (30H)=24? Y (32H)加1 Y N (30H)清0 (32H)=60? 恢复现场 Y (32H)清0 返回 (31H)加1 图中断服务程序流程图 N (31H)=60? Y a

  34. ③ 源程序如下: ORG 0000H AJMP MAIN ; 上电,转向主程序 ORG 001BH ;T1的中断服务程序入口地址 AJMP SERVE ;转向中断服务程序

  35. ORG 2000H ;主程序 MAIN: MOV SP,#60H ;设堆栈指针 MOV TMOD,#10H ;设置T1工作于模式1 MOV 20H,#0AH ;设循环次数 CLR A MOV 30H,A ;时单元清0 MOV 31H,A ;分单元清0 MOV 32H,A ;秒单元清0

  36. SETB ET1 ;T1开中断 SETB EA ;CPU开中断 MOV TL1,#0B0H ;装计数值低8位 MOV TH1,#3CH ;装计数值高8位 SETB TR1 ;启动定时 SJMP $ ;等待中断(可反复调用显示子程序)

  37. SERVE: PUSH PSW ;保护现场 PUSH ACC MOV TL1,#0B0H ;重新赋初值 MOV TH1,#3CH DJNZ 20H,RETUNT ;1s未到,返回 MOV 20H,#0AH ;重置中断次数

  38. MOV A,#01H ADD A,32H ;“秒位”加1 DA A ;转换为BCD码 MOV 32H,A CJNE A,#60H,RETUNT ;未满60s,返回 MOV 32H,#00H ;计满60s,“秒位”清0

  39. MOV A,#01H ADD A,31H ;“分位”加1 DA A ;转换为BCD码 MOV 31H,A CJNE A,#60H,RETUNT ;未满60min,返回 MOV 31H,#00H ;计满60min,“分位”清0

  40. MOV A,#01H ADD A,30H ;“时位”加1 DA A ;转换为BCD码 MOV 30H,A CJNE A,#24H,RETUNT ;未满24h,返回 MOV 30H,#00H ;计满24h,“时位”清0 RETUNT: POP ACC ;恢复现场 POP PSW RETI ;中断返回 END

More Related