第5章 定时器0_第1页
第5章 定时器0_第2页
第5章 定时器0_第3页
第5章 定时器0_第4页
第5章 定时器0_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、上次课回顾XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A

2、1326P2.6/A1427U1AT89C51R2560R3560R4560R5560VCCD5LED-YELLOWD1LED-YELLOWD2LED-YELLOWD3LED-YELLOWR104.7kR114.7k12456U2:A744091012138U2:B7440R110kR610kR710k单片机的定时/计数器本章内容5.1 任务4引入5.2 定时/计数器的结构和工作原理5.3 定时器/计数器的寄存器(重点) 5.4 定时器/计数器的工作方式(难点)5.5 编程实例本次课内容5.1 通过任务4,引入定时/计数中断方式。5.2 简要介绍定时/计数器的结构和工作原理。5.3 介绍定时/

3、计数器的2个寄存器,TCON和TMOD,其中TMOD是重点。5.4 定时/计数器的工作方式。重点讲方式1和方式2。 在计算机控制领域,如检测、控制及智能仪器等,常常需要实时时钟来实现定时或延时控制,也常常要对外部事件进行计数。MCS-51单片机中就有两个定时/计数器,可以实现这些功能。5.1 5.1 任务任务4 4:信号灯的控制:信号灯的控制一、要求一、要求按照图任务1中图1.7的电路,不用任务2中的软件延时,也不用任务3中的按键,而用其它硬件方式来完成发光二极管的闪烁,间隔时间为100ms(假如使用的晶振频率为6MHz)。二、任务分析与实现二、任务分析与实现在计算机中也经常要用到定时。定时的

4、方法一般有2种:1 1、采用软件定时、采用软件定时 软件定时是通过反复地执行一个循环程序以进行时间的延迟,特点是时间精确,不需外加硬件电路。 但要注意的是,延时程序实际上是“耗时”,要白白地占用CPU一段时间。此时CPU不能做任何其他的工作,就像机器在不停空转一样,这是程序延时的缺点。因此软件定时的时间不宜过长。 在任务2中,我们使用了一个延时子程序的方式来完成发光二极管闪烁的,通过反复执行一个循环体内的指令以累计机器周期数而实现延时。可以通过改变延时程序的参数来改变延时时间。2 2、采用可编程定时器定时、采用可编程定时器定时 在任务3中,我们是用手动按键模拟一个中断请求来完成发光二极管的亮、

5、灭变化,时间间隔由我们手动控制。但是这样不可能达到间隔时间的精确,显然达不到任务定时间隔100ms的要求。 因此若要在延时时间精确,而在定时过程中需要CPU还能做其它的工作,就需要采用单片机内部的硬件定时器或外接其他定时芯片。比如8253芯片,就是一个定时芯片。 MCS-51单片机内部有两个定时器,这样我们就不要外接定时芯片。本次任务就可以采用这两个定时器中的任何一个来完成“定时”,而不是延时。 利用单片机的开发系统输入下面的程序:#include void main ( void ) TMOD = 0 x01;TH0 = 0 x3C;TL0 = 0 xB0;EA = 1;ET0 = 1;TR

6、0 = 1;while(1);void timer0_int (void)interrupt 1 P1 = P1;1. 21. 2个个1616位定时器位定时器/ /计数器计数器 (52系列有3个16位Timer)定时器:对片内机器时钟(周期方波)进行计数计数器:对Tx引脚输入的负脉冲进行计数 T0引脚输入端:P3.4 T1引脚输入端:P3.52. 2. 与与TimerTimer工作有关的特殊功能寄存器:工作有关的特殊功能寄存器: TCON 和 TMOD5.2 5.2 定时定时/ /计数器的结构和原理计数器的结构和原理5.3 5.3 定时定时/ /计数器的寄存器计数器的寄存器TF1 TR1 TF

7、0 TR0 IE1 IT1 IE0 IT01.1.定时器控制寄存器定时器控制寄存器TCON (88H)TCON (88H)(1 1)TFx: Timer0/1TFx: Timer0/1计数溢出标志位计数溢出标志位 =1 计数溢出; =0 计数未满 TFx标志位可用于申请中断或供CPU查询。 在进入中断服务程序时会自动清零;但在 查询方式时必须软件清零。(2 2)TRx: Timer0/1TRx: Timer0/1运行控制位运行控制位 =1 启动计数; =0 停止计数(3 3)定时器)定时器T0/T1 T0/T1 中断申请过程中断申请过程 在已经开放在已经开放T0/T1T0/T1中断允许且已被启

8、动的前提下:中断允许且已被启动的前提下: T0/T1T0/T1加满溢出时加满溢出时 TF0/TF1TF0/TF1标志位自动置标志位自动置“1” 1” 检测到检测到TCONTCON中中TF0/TF1TF0/TF1变变“1”1”后后, ,将产生指令:将产生指令: LCALL 000BH/LCALL 001BH LCALL 000BH/LCALL 001BH 执行中断服务程序执行中断服务程序, , TF0/TF1TF0/TF1标志位会自动清标志位会自动清“0”,0”,以备下次中断申以备下次中断申 请。请。 定时定时/ /计数器可按片内机器周期定时,也可对由计数器可按片内机器周期定时,也可对由T0/T

9、1T0/T1引脚输入一个负脉冲进行加法计数引脚输入一个负脉冲进行加法计数GATE C / T M1 M0 GATE C / T M1 M02.2.定时器方式寄存器定时器方式寄存器TMOD (89H)TMOD (89H)T1T1T0T0(1 1)M1,M0M1,M0:工作方式定义位:工作方式定义位 (4 (4 种方式种方式 ):):(2 2)C/T C/T :计数器:计数器/ /定时器选择位定时器选择位 = 1 = 1 外部事件计数器。对外部事件计数器。对TxTx引脚的负脉冲计数;引脚的负脉冲计数; = 0 = 0 片内时钟定时器。对机器周期脉冲计数定时片内时钟定时器。对机器周期脉冲计数定时0

10、00 0:1313位位 TimerTimer用它无益用它无益, ,不要记它!不要记它!0 10 1:1616位位 TimerTimer经常用到经常用到1 01 0:可自动重装的:可自动重装的 8 8位位 TimerTimer经常用到经常用到1 11 1:T0 T0 分为分为2 2个个8 8位位 TimerTimer;T1 T1 此时不工作此时不工作 因为没有带来甚么好处,几乎因为没有带来甚么好处,几乎无无用用(3)GATE(3)GATE门控位门控位: Timer: Timer可由软件与硬件两者控制可由软件与硬件两者控制 GATE = 0 GATE = 0 普通用法普通用法 TimerTimer

11、的启的启/ /停由软件对停由软件对TRxTRx位写位写“1”/“0”1”/“0”控制控制2.2.定时器方式寄存器定时器方式寄存器TMODTMOD(续)(续) GATE = 1 GATE = 1 门控用法门控用法 TimerTimer的启的启/ /停由软件对停由软件对TRxTRx位写位写“1”/“0” 1”/“0” 和在和在INTxINTx引脚上出现的信号的高引脚上出现的信号的高/ /低共同控制低共同控制5.4 定时/计数器的工作方式1.1.工作方式工作方式1 1:1616位的定时位的定时/ /计数器计数器振荡器振荡器 12TLx THx (8位位) (8位位)TFx申请申请中断中断TxTx端端

12、TRxTRx位位GATEGATE位位INTxINTx端端11& &C/T=0C/T=1控制控制 =1开关接通开关接通或门或门与门与门 THx/TLxTHx/TLx赋初值:赋初值:THxTHx赋高赋高8 8位,位,TLxTLx赋低赋低8 8位位(1 1)工作方式)工作方式1 1 的编程要点:的编程要点: TMODTMOD选方式:选方式: 写写“M1,M0”=01 , M1,M0”=01 , 选方式选方式1 1 若不用门控位若不用门控位, ,直接用软件写直接用软件写TRxTRx控制启控制启/ /停停 若使用门控位,先置位若使用门控位,先置位TRxTRx,然后由,然后由INTxINT

13、x端端 的高的高/ /低电平来控制其启低电平来控制其启/ /停停 若要允许中断,还须先置位若要允许中断,还须先置位ETxETx、EAEA等中断等中断 允许控制位,并编写中断服务程序允许控制位,并编写中断服务程序 若不用中断,可查询若不用中断,可查询“计数溢出标志计数溢出标志TFx”TFx” 的方式工作,但溢出标志的方式工作,但溢出标志TFxTFx须软件清须软件清0 0 由于在方式由于在方式1 1工作模式下,工作模式下,TLxTLx、THxTHx计数寄计数寄存器各使用存器各使用8 8位,而位,而2 28 8=256=256,我们要把计数起点,我们要把计数起点的值除以的值除以256256,将余数放

14、入,将余数放入TLxTLx计数寄存器,将计数寄存器,将商数放入商数放入THxTHx计数寄存器。例如要使用计数寄存器。例如要使用Timer 0Timer 0计数计数5000050000,则填入计数寄存器的指令如下:,则填入计数寄存器的指令如下: MOV TL0MOV TL0,#(65536-50000) MOD 256 #(65536-50000) MOD 256 ;取;取8 8位的余数位的余数 MOV TH0MOV TH0,#(65536-50000)#(65536-50000)256 256 ;取;取8 8位的商数位的商数 TL0=B0 HTH0=3C HT0=65536-50000=3CB

15、0 H(2 2)计数初值的设定)计数初值的设定(3 3)定时器)定时器( (方式方式1)1)应用程序举例应用程序举例:分析分析:已知已知foscfosc = 6MHz = 6MHz 则:则: (振荡周期)(振荡周期)1Tc=1/6MHz1Tc=1/6MHz (机器周期)(机器周期)1Tm=12Tc=12/6MHz=21Tm=12Tc=12/6MHz=2 S S 粗略地说:粗略地说:Tmin Tmin 2 2 S S 16 16位定时器最大数值为:位定时器最大数值为:2 21616=65536=0FFFFH+1=65536=0FFFFH+1 故选择方式故选择方式 1 1 工作可以得到:工作可以得

16、到: Tmax = 65536Tmax = 65536 2 = 1310722 = 131072 S S131.072mS131.072mS例例:若晶振频率为:若晶振频率为6MHz6MHz,计算单片机的最小与,计算单片机的最小与最大定时时间:最大定时时间:分析分析:已知已知foscfosc = 6MHz = 6MHz 则:则: (机器周期)(机器周期)1Tm=12Tc=12/6MHz=21Tm=12Tc=12/6MHz=2 S S 100mS 100mS2 2 S = 50000S = 50000 16 16位定时器最大数值为:位定时器最大数值为: 2 216 16 = 65536 (=0FF

17、FFH+1)= 65536 (=0FFFFH+1) 故选择方式故选择方式1 1工作可以满足要求。工作可以满足要求。计算初值计算初值:655366553650000=15536=3CB0H50000=15536=3CB0H例例:要求对:要求对T0T0产生产生100mS100mS定时进行初始化。定时进行初始化。 ( (晶振晶振=6MHz)=6MHz)(3 3)定时器)定时器( (方式方式1)1)应用程序举例:应用程序举例:GATE C / T M1 M0 GATE C / T M1 M0定时器方式定时器方式寄存器寄存器TMOD初始化初始化 X X X X 0 0 0 1X X X X 0 0 0

18、1初始化初始化:TMOD=0 x01 ;TMOD=0 x01 ;选选 T0 T0 方式方式 1 1 TH0=0 x3C ; TH0=0 x3C ;赋初值高赋初值高8 8位位 TL0=0 xB0 ;TL0=0 xB0 ;赋初值低赋初值低8 8位位 TR0=1 ;TR0=1 ;启动启动 T0T0定时定时若需要定时器若需要定时器0 0产生中断还应当写如下语句:产生中断还应当写如下语句: ET0=1 ; ET0=1 ;开开T0T0中断允许中断允许 EA=1 ;EA=1 ;开总中断允许开总中断允许以及相应的中断服务程序。以及相应的中断服务程序。#include void main ( void ) TM

19、OD = 0 x01;TH0 = 0 x3C;TL0 = 0 xB0;EA = 1;ET0 = 1;TR0 = 1;while(1);void timer0_int (void)interrupt 1 P1 = P1;2.2.工作方式工作方式2 2:8 8 位自动重装的定时位自动重装的定时/ /计数器计数器振荡器振荡器 12TLx (8位位)TFx申请申请中断中断TxTx端端TRxTRx位位GATEGATE位位INTxINTx端端11& &C/T=0C/T=1控制控制 =1开关接通开关接通或门或门与门与门THx (8位位)溢溢出出位位门开门开 THx/TLxTHx/TLx赋相同

20、初值赋相同初值 在在TLxTLx计数达到计数达到0FFH 0FFH 再加再加“1”1”时,时,TLxTLx 将溢出将溢出, ,进位位直接进入进位位直接进入“TFx”TFx”去申请去申请 中断中断, ,同时打开三态门,使同时打开三态门,使THxTHx中的值中的值 自动重装自动重装(Copy)(Copy)进进TLxTLx(1 1)工作方式)工作方式2 2 的编程要点:的编程要点: TMODTMOD寄存器选方式:寄存器选方式: 写写“M1M1,M0” = 10 , M0” = 10 , 选中方式选中方式2 2 其他用法与各种方式其他用法与各种方式1 1完全相同完全相同分析:分析:foscfosc =

21、 6MHz = 6MHz 1 1机器周期机器周期 = 2 = 2 S S 1KHz 1KHz方波周期方波周期 = 1 mS = 1 mS 半个方波周期半个方波周期 =500=500 S S 500uS 500uS2 uS = 250 2 uS = 250 若选择方式若选择方式2 2 工作工作,8,8位位定时器最大数值为:定时器最大数值为: 2 28 8 =256 =0FFH + 1 =256 =0FFH + 1 可以满足要求。可以满足要求。计算初值:计算初值:256256250=6250=6例例1:1:从从P1.0 P1.0 脚输出频率脚输出频率=1KHz=1KHz方波。方波。设:晶振设:晶振

22、=6MHz=6MHz。利用。利用T1T1定时中断。定时中断。Th:半周期:半周期T:周期:周期(2 2)定时器(方式)定时器(方式2 2)应用程序举例:)应用程序举例: #include#include sbit P1_0=P10; sbit P1_0=P10; void main() void main() TMOD=0 x20; TMOD=0 x20; TH0=0 x06; TH0=0 x06; TL0=0 x06; TL0=0 x06; EA=1; EA=1; ET1=1; ET1=1; TR1=1; TR1=1; while(1); while(1); void Timer1_2()

23、interrupte 3 void Timer1_2() interrupte 3 P1_0=! P1_0; P1_0=! P1_0; 初初始始化化/选选T1T1方式方式/赋重装值赋重装值/赋初值赋初值/开开T1T1中断中断/开总中断开总中断/启动启动T1T13.3.定时器小结:定时器小结: (2 2个个1616位加法计数器)位加法计数器)运行运行/ /停止由停止由TRxTRx位控制,位控制,( (当当GATE=1GATE=1时:时: 由由TRxTRx位和位和INTxINTx引脚上的信号共同控制引脚上的信号共同控制) )工作方式由工作方式由TMODTMOD决定决定; ; 计数计数/ /定时由定

24、时由C/TC/T位决定位决定 工作方式工作方式0 0(1313位)位) 永远不用永远不用 工作方式工作方式3 3(T0T0拆为双拆为双8 8位)位) 几乎几乎无无用用 工作方式工作方式1 1(1616位)位) 经常用到经常用到 工作方式工作方式2 2(8 8位自动重装)位自动重装) 经常用到经常用到从初值按机器周期或外部脉冲递加,溢出位从初值按机器周期或外部脉冲递加,溢出位 TFxTFx申请中断;中断允许由申请中断;中断允许由ETxETx位和位和EAEA位控制位控制 当定时计数器设置为计数工作方式时,计数器对来自输入引脚TO(P3.4)和Tl(P3.5)的外部信号计数,外部脉冲的下降沿将触发计

25、数。在每个机器周期的S5P2期间采样引脚输入电平,若前一个机器周期采样值为l,后一个机器周期采样值为O,则计数器加l。新的计数值是在检测到输入引脚电平发生l到0的负跳变后,于下一个机器周期的S3P1期间装入计数器中的,可见,检测一个由l到O的负跳变需要两个机器周期。 所以,最高检测频率为振荡频率的最高检测频率为振荡频率的1 12424。计数器对外部输入信号的占空比没有特别的限制,但必须保证输入信号的高电平与低电平的持续时间在一个机器周期以上。 当设置了定时器的工作方式并启动定时器工作后,定时器就按被设定的工作方式独立工作,不再占用CPU的操作时间,只有在计数器计满溢出时才可能中断CPU当前的操

26、作。5.4 5.4 定时定时/ /计数器的编程和应用计数器的编程和应用 定时/计数器是单片机应用系统中的重要部件,灵活应用定时/计数器可提高编程技巧,减轻CPU的负担,简化外围电路。【例5.2】电路连接仍如任务3。编写程序,使定时器0的中断方式产生100ms的延时,实现8个发光二极管的亮点流动。在亮点流动的过程中,如果按下单脉冲键,8个发光二极管的发光状态将改变为同时闪烁,闪烁8次恢复亮点流动(闪烁时间间隔由延时程序完成)。分析:显示结果同分析:显示结果同【例例4.44.4】。【例例4.44.4】电路连接仍如任务电路连接仍如任务3 3。编写程序,假设在单。编写程序,假设在单脉冲键按下之前,脉冲

27、键按下之前,LEDLED处于一个亮点流动的状态。采用处于一个亮点流动的状态。采用中断方式,当按下单脉冲键时,中断方式,当按下单脉冲键时,LEDLED状态改为同时闪烁。状态改为同时闪烁。闪烁闪烁8 8次再恢复原来的亮点流动。次再恢复原来的亮点流动。#include #include #include #include void delay ( unsigned int d )void delay ( unsigned int d ) /延时函数延时函数 whilewhile(-d 0-d 0);); void main ( ) void main ( ) /主函数主函数 unsigned cha

28、r temp unsigned char temp; temp = 0 xfe temp = 0 xfe; EA = 1 EA = 1; EX0 =1 EX0 =1; IT0 =1 IT0 =1; for for (;)(;) P1 = temp P1 = temp; temp = _crol_ temp = _crol_ (temp temp ,1 1);); delay delay(5000050000);); void INT0_ISR( ) interrupt 0 using 1void INT0_ISR( ) interrupt 0 using 1/中断服务函数中断服务函数 unsi

29、gned char i unsigned char i,selsel; sel = 0 xff sel = 0 xff; for for(i=0i=0;i16i16;i+i+) P1 = sel P1 = sel; sel = sel sel = sel; delay delay(5000050000);); 不同的是不同的是【例例4.44.4】中的亮点流动是通过程序延时实中的亮点流动是通过程序延时实现,这里是要通过定时器的中断实现。现,这里是要通过定时器的中断实现。 很显然按下单脉冲键产生的外部中断可能是在单很显然按下单脉冲键产生的外部中断可能是在单片机执行定时器的中断服务程序时产生的,这是

30、一个片机执行定时器的中断服务程序时产生的,这是一个中断嵌套的情况。因此这里要设置定时器中断和外部中断嵌套的情况。因此这里要设置定时器中断和外部中断中断0 0的优先级。根据实验要求,将定时器中断的优的优先级。根据实验要求,将定时器中断的优先级设置为低,将外部中断先级设置为低,将外部中断0 0的优先级设置为高。的优先级设置为高。编程如下:编程如下:#include #include #include #include unsigned char temp;unsigned char temp;void delay(unsigned int d) void delay(unsigned int d)

31、 /延时函数延时函数 while while(-d 0-d 0); ; void main ( ) void main ( ) /主函数主函数 temp = 0 xfe; temp = 0 xfe; EA = 1; EA = 1; EX0 =1; EX0 =1; ET0 =1; ET0 =1; PX0 =1; PX0 =1; IT0 =1; IT0 =1; TH0 = 0 x3C TH0 = 0 x3C; TL0 = 0 xB0 TL0 = 0 xB0; TR0 = 1 TR0 = 1; While(1 While(1);); void Timer0_ISR( ) interrupt 1voi

32、d Timer0_ISR( ) interrupt 1/定时器定时器0 0中断服务函数中断服务函数 TH0 = 0 x3C TH0 = 0 x3C; TL0= 0 xB0 TL0= 0 xB0; temp= _crol_ temp= _crol_ (temp,1temp,1); ; P1 = temp P1 = temp; void INT0_ISR( ) interrupt 0void INT0_ISR( ) interrupt 0 using 1using 1/外部中断外部中断0 0中断服务函数中断服务函数 unsigned char i,sel; unsigned char i,sel;

33、 sel = 0 xff; sel = 0 xff; for for(i=0;i16;i+i=0;i16;i+) P1 = sel; P1 = sel; sel = sel sel = sel; delay delay(5000050000); ; 【例5.3】利用T0的方式1产生频率为50Hz、占空比为50%的方波,由P1.0输出。假定CPU使用中断方式进行控制。仍采用6MHz的晶体。 分析:方波频率是50Hz,周期为20ms。由于占空比为50%,高电平部分和低电平部分所占时间都为方波周期的一半(10ms)。因此定定时时间可设置为10ms。由于晶振6M, 1 1机器周期机器周期 2 2 S

34、S,那么初值: X = 65536-10000 / 2 = 60536 = EC78HX = 65536-10000 / 2 = 60536 = EC78H 可编程如下:#include sbit P1_0 = P10; void main ( void ) /主函数TMOD = 0 x01;TH0 = 0 xEC;TL0 = 0 x78;EA = 1;ET0 = 1;TR0 = 1;while(1);void timer0_int(void)interrupt 1/定时器0中断函数 P1_0 = !P1_0;【例例5.45.4】利用T0的方式1产生一个50Hz、占空比为25%的方波,由P1.

35、0输出。假定CPU用查询方式进行控制。仍采用6MHz的晶体。 分析分析:方波频率是50Hz,周期为20ms。由于占空比为25%,则一个周期中高电平时间为5ms,低电平时间为15ms。因此定时初值有两个: X1= 65536-5000/2 =63036 = F63CH X2= 65536-15000/2 =58036= E2B4H 采用查询方式来控制,就必须要知道单片机根据什么知道定时时间是否到了。因为在计数满时,会将TF0置1,这是不以人的意志为转移的。采用中断方式时,是通过硬件检测TF0为1后自动进入中断服务程序。采用查询方式时,可通过软件查询采用查询方式时,可通过软件查询TF0TF0标志是

36、否为标志是否为1 1来可以判断定时时间是否来可以判断定时时间是否到了。到了。 由于仅使用查询方式,不开中断,T0定时时间到时,TF0标志出现,但不会进入中断服务,所以要人工用指令清除TF0标志。程序如下:#include sbit P1_0 = P10;void main ( void ) /主函数 TMOD = 0 x01; TR0 = 1; for(;) TH0 = 0 xF6; TL0 = 0 x3C; P1_0 = 1; while(TF0 = = 0); TF0 = 0; TH0 = 0 xE2; TL0 = 0 xB4; P1_0 = 0; while(TF0 = = 0); TF

37、0 = 0; 【例例5.5 5.5 】设定时器T0工作于方式2,产生500s定时中断,在中断服务程序中将累加器A的内容减1,并送P1口显示。已知晶振频率为6MHZ。 时间常数为:28 500 / 26=06H。#include unsigned char data temp _at_ 0 x30;void main ( void ) /主函数 TMOD = 0 x02;TH0 = 0 x06;TL0 = 0 x06;EA = 1;ET0 = 1;TR0 = 1;while(1);void timer0_int(void)interrupt 1/定时器0中断函数 temp=temp-1;看一看这

38、个程序和前面的程序有什么不同的地方。前面的在中断服务程序中有给TL0、TH0重新赋值的过程,在本例中没有。这是因为【例5.3】中采用的是方式1,不具备本例中方式2的“自动再装入功能自动再装入功能”。既然没有这种功能,只有人工进行,否则在第一次计数溢出后就会从0开始重新计数。导致后面的定时时间和第一次不一样,不再是10ms,而是最大的定时时间。 【例例5.65.6】将任务3扩展一下,将图4.1所表示的单脉冲电路的负脉冲端接在单片机的P3.4引脚。编写程序,使每按动图4.1中的按键5次,P1口的8个发光二极管亮、灭切换一次。 分析分析:按照题目要求,计数脉冲是来自于外部的负脉冲,因此应当设置定时器

39、工作于计数状态。 由于P3.4、P3.5分别是T0和T1的外部计数脉冲输入端,本例中外部脉冲是从P3.4输入的,也就是说应该使用T0来进行计数。中断服务程序的入口编号为 1 。为了免去每次在累加溢出时的重新赋初值的过程,可以设T0工作在方式2,因此给TMOD赋以06H。 为了使每来5个脉冲T0计数溢出,给TL0、TH0赋值为28-5 = 251 = FBH。 #include void main ( void ) /主函数 TMOD = 0 x06;TH0 = 0 xFB;TL0 = 0 xFB;EA = 1;ET0 = 1;TR0 = 1;while(1);void timer0_int(v

40、oid)interrupt 1 /定时器0中断函数P1 = P1;* *【例例5.95.9】设外部正脉冲由/INT0(P3.2)输入,编写程序,测量这个外部正脉冲的宽度,并将测量结果放在20H、21H两单元中。 分析分析:测量宽度,可以理解成测量这个外部正脉冲维持的时间是多少个Tp。这样我们就可以采用定时器的定时状态(累加Tp)。 根据题意,定时器的启动和停止必须取决于这个外部正脉冲。它开始,定时器就开始工作,它结束,定时器就停止工作。 什么时候定时器的启动和停止和外部脉冲有关呢? GATE=1GATE=1 一般情况下,应使GATE0,这样,定时器是否运行仅由TRx位的状态决定。在前面的几个例子中,我们都是直接用SETB TR0这样的指令来控制T0的开和关的。反之如果反之如果GATE=1GATE=1, 一旦一旦 “ “TRxINTxTRxINTx”=1 ”=1 时,时,TxTx立刻启动。立刻启动。 利用这一特点我们就可以测试外部输入脉冲的宽度。怎么处理呢? 设T0工作于方式1,这样可以使测

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论