收藏 分享(赏)

C语言 中断与定时器计数器.ppt

上传人:精品资料 文档编号:8552367 上传时间:2019-07-02 格式:PPT 页数:70 大小:555.50KB
下载 相关 举报
C语言 中断与定时器计数器.ppt_第1页
第1页 / 共70页
C语言 中断与定时器计数器.ppt_第2页
第2页 / 共70页
C语言 中断与定时器计数器.ppt_第3页
第3页 / 共70页
C语言 中断与定时器计数器.ppt_第4页
第4页 / 共70页
C语言 中断与定时器计数器.ppt_第5页
第5页 / 共70页
点击查看更多>>
资源描述

1、第6章 中断与定时器/计数器的C51编程,6.1 中断系统基本知识 6.2 外部中断源的C51编程 6.3 定时器/计数器基本知识 6.4 定时器/计数器不同工作模式下的C51编程 6.5 中断与定时器/计数器综合编程示例,1,6.1 中断系统基本知识,6.1.1中断系统结构与中断控制 6.1.2中断优先级与中断请求的撤除 6.1.3中断函数的结构形式,2,6.1.1中断系统结构与中断控制,3,有关的寄存器:,4,6.1.2中断优先级与中断请求的撤除,5,6.1.3中断函数的结构形式,函数类型 函数名(形式参数表) interrupt n using n,6,6.2 外部中断源的C51编程,6

2、.2.1外部中断源初始化 6.2.2外部中断源的C51编程示例2个外部中断源: /INT0中断,外部中断0请求,占用P3.2引脚,其中断请求号为0。 /INT1中断,外部中断1请求,占用P3.3引脚,其中断请求号为2。,7,6.2.1外部中断源初始化,(1)TCO寄存器中的IT0、IT1位 (2)IP寄存器中的PX0、PX1位 (3)IE寄存器中的EA、EX0、EX1位 6.2.2外部中断源的C51编程示例 例6-1 P104 假设外部中断0和外部中断1均为下降沿触发,当外部中断0发生时,P0端口的电平反向,当外部中断1发生时,P1端口的电平反向。,8,9,#include void IS0(

3、void) interrupt 0 P0=P0; /P0端口反向 void IS1(void) interrupt 2 P1=P1; /P1端口反向 void main( ) P0=0x00; P1=0xFF;IT0=1; IT1=1;EX0=1; EX1=1; EA=1;while(1); ,10,例6-2:外部中断0示例,该程序实现外部中断0的模拟及中断服务程序的响应。 #include #include uart_init( ); void main( ) uart_init( );EX0=1; EA=1;IT0=0; while(1); ,11,void int0( ) interru

4、pt 0 using 0 printf(“External Interrupt 0 respondedn”); uart_init( ) SCON=0X50;TMOD=0X20;TH1=TL1=0XF4;TR1=1;TI=1; ,12,例6-3 中断嵌套示例,外部中断0与外部中断1的中断嵌套示例 #include #include uart_init( ); void main( ) uart_init( );EX0=1; EX1=1; EA=1;IT0=0; IT1=0;PX0=0; PX1=1;while(1); ,13,void int0( ) interrupt 0 using 0 i

5、nt i; EX0=0;while(1) for(i=0;i1000;i+);printf(“External Interrupt 0 respondedn”); void int1( ) interrupt 2 using 1 EX1=0;printf(“External Interrupt 1 respondedn”);EX1=1; ,14,uart_init( ) SCON=0X50;TMOD=0X20;TH1=TL1=0XF4;TR1=1;TI=1; ,15,6.3 定时器/计数器基本知识,6.3.1定时器/计数器的结构与控制 6.3.2工作方式与工作模式 6.3.3定时器/计数器的初

6、始化,16,6.3.1定时器/计数器的结构与控制,17,TCON:TF、TR,TMOD:,18,6.3.2工作方式与工作模式,19,20,21,6.3.3定时器/计数器的初始化,1初始化步骤 编程TMOD(在工作模式的选择中,应用比较多的是模式2和模式1); 计算定时器/计数器中的计数初值,并装载到TH和TL; 定时器/计数器在中断方式工作时,需开CPU中断和源中断编程IE寄存器; 启动定时器/计数器编程TCON中的TR1或TR0位。,22,2计数初值的计算,(1)计数器的计数初值 模式1:16位计数器的最大计数值为216=65536。 TH=(65536N)/256; TL=(65536N)

7、%256; 或者采用下面的方式装载计数寄存器初始值: TH=N/256; TL=N%256;,23,模式2:8位计数器的最大计数值为28=256。 计数器工作于模式2情况下,可按下式装载计数寄存器初始值: TH=TL=256N; 或者采用下面的方式装载计数寄存器初始值: TH=TL=N,24,(2)定时器的计数初值,fosc=12MHz,那么一个机器周期为1微妙, 则:模式1: 16位定时器的最大定时间隔为 216=65 536。 模式2:8位定时器的最大定时间隔为28=256。,25,如果定时器计数初值为X,机器周期为Tcy,定时器定时时间为Td,则 Td=(2n-X) Tcy,那么定时器的

8、初值为:X=2n-Td/Tcy 计算得到定时器计数寄存器的初始值X,就可根据定时器的工作方式装载TH和TL,编程方法类似于计数器方式。,26,【例6-4】计数器工作方式初始化示例,定时器/计数器0工作于计数方式,且允许中断,计数值N=100,分别令其工作在模式1和模式2,用C语言进行初始化编程。 (1)模式1初始化编程 TMOD的确定 定时器/计数器0工作于计数方式,则C/=1;门控位不起作用,则GATE=0;计数器0工作于模式1,所以M1M0=01。计数器1不用,TMOD的高4位取0000,则TMOD=05H。,27,初值的确定,计数寄存器为16位,因此计数寄存器初值分别为: TH0 = (

9、65 536-100)/256,TL0 = (65 536-100)%256 或者为: TH0 = -100/256,TL0 = -100%256,28,初始化程序,TMOD=0x05; /设置计数器工作方式 TH0=(65536-100)/256; /TH0赋初值 TL0=(65536-100)%256; /TL0赋初值 TR0=1; /启动计数器 ET0=1; /开计数器中断 EA=1; /CPU开中断,29,(2)模式2编程,TMOD的确定 计数器0工作于模式2,所以M1M0=10。计数器1不用,TMOD的高4位取0,则TMOD=06H。 初值的确定 模式2为8位初值自动重载方式,计数寄

10、存器初值分别为:TH0=TL0=256-100 或者初值分别为:TH0=TL0=-100。,30,初始化程序 TMOD=0x06; TH0=156; TL0=156; 其余语句与前面相同。,31,【例6-5】定时器工作方式初始化,单片机外接晶振频率fosc=12MHz,定时器/计数器0工作于定时方式,且允许中断,定时时间为20ms,令其工作在模式1。用C语言进行初始化编程。 TMOD的确定 定时器/计数器0工作于定时方式,从而C/=0;门控位不起作用,则GATE=0。定时器0工作于模式1,所以M1M0=01。定时器1不用,TMOD=00000001=01H。,32,初值的确定,外部晶振频率fo

11、sc=12MHz,则MCS-51单片机机器周期为1。计数寄存器为16位,因此定时器的计数初值为:X=(65 536-20 000)/1。 计数寄存器初值分别为:TH0 = (65 536-20 000)/256,TL0 = (65 536-20 000)%256 或者计数寄存器初值分别为:TH0 =-20 000/256,TL0 = -20 000%256。,33,初始化程序,TMOD=0x01;/设置定时器工作方式 TH0=(65536-20000)/256;/TH0赋初值 TL0=(65536-20000)%256;/TL0赋初值 TR0=1;/启动计数器 ET0=1;/开计数器中断 EA

12、=1;,34,6.4 定时器/计数器不同工作模式下的C51编程,6.6.1工作模式1的C51编程 6.6.2工作模式2的C51编程 6.6.3工作模式3的C51编程,35,6.6.1工作模式1的C51编程,【例6-6】 假定MCS-51单片机外接12MHz晶振,需要在P1.0上输出频率为50Hz的方波,即周期为20ms。此时可以采用定时器T1工作于模式1,使定时器产生10ms的定时,通过定时中断来产生P1.0端口的方波信号输出。,36,37,#include /头文件 sbit Wave=P10; /位定义 void T1ISR(void) interrupt 3 Wave=Wave; /反向

13、TL1=0x0F0; /重置计数初值TH1=0x0D8; ,38,void main(void) /主函数 Wave=0; /初始化P1.0=0 TMOD=0x10; /设置定时器T1为模式1 TL1=0x0F0; TH1=0x0D8; TR1=1; ET1=1; EA=1; /开中断 while(1) /主循环 ,39,6.6.2工作模式2的C51编程,【例6-7】假定MCS-51单片机的定时器/计数器0和1都工作计数器工作方式、模式2,定时器/计数器0有一个计数值时,让P0口去反;当定时器/计数器1有3个计数值时,P1口取反。,40,41,#include void main( ) TMO

14、D=0x66; TH0=255; TL0=255; /T0一个计数值 TH1=-3; TL1=-3;/T1三个计数值 TR1=1; TR0=1; EA=1; ET1=1; ET0=1; while(1); ,42,void t0int( ) interrupt 1 P0=P0 ; void t1int( ) interrupt 3 P1=P1; ,43,6.5 中断与定时器/计数器综合编程示例,【例6-9】外部中断示例 在本实例中,首先通过P1.7口点亮发光二极管D1,然后外部输入一脉冲串,则发光二极管D1亮、暗交替。,44,45,#include sbit P1_7=P17; void in

15、terrupt0( ) interrupt 0 using 2 /外部中断0 P1_7=!P1_7; void main( ) EA=1; /开中断IT0=1; /外部中断0脉冲触发EX0=1; /外部中断0P1_7=0; do while(1); ,46,如果有3个脉冲,则灯亮、暗交替一次,可如下面编程:,#include Sbit P17=P17; unsigned char i=3; void main( ) EA=1; IT0=1; EX0=1;P17=0; do while(1); void interrupt0( ) interrupt 0 i=i-1;if(i=0) P17=!P

16、17; i=3; ,47,【例6-10】,如图6-18所示,8只LED阴极接至单片机P0口,两开关S0、S1分别接至单片机引脚P3.2()和P3.3()。编写程序控制LED状态。按下S0后,点亮8只LED;按下S1后,变为闪烁状态。,48,49,#include sbit P32=P32; void delay(unsigned int d) /定义延时子函数 while(-d0); void main( ) P0=0xFF; /熄灭LEDIT0=1; IT1=1; /外中断0、1脉冲触发方式EA=1; EX0=1; EX1=1; /开中断for( ; ; ) /延时等待中断发生; ,50,v

17、oid INT0_ISR( ) interrupt 0/外中断0中断服务函数 P0=0x00; void INT1_ISR( ) interrupt 2/外中断1中断服务函数 while(P32!=0) /如果有外部中断0,则退出 delay(5000); P0=0x00;delay(5000);P0=0xFF; ,51,外部中断的扩展:,(1)利用定时器/计数器 (2)利用外部中断和查询相结合 (3)利用优先编码器,52,【例6-11】利用定时器/计数器,(1)硬件上把信号接到计数器相应的引脚上(T0或T1)。 (2)将定时器/计数器设置为计数方式,模式2 (3)初值OFFH 当计时器检测到

18、从高到低的脉冲时,定时器将溢出,这时将产生一个中断请求。,53,【例6-12】利用外部中断和查询相结合,如果系统有多个外中断请求源,可以按照它们的轻重缓急进行排队,把其中最高级别的中断源直接连接到单片机外中断0输入引脚,其余的外部中断请求可以用利用逻辑器件通过“与”或者“或”的办法连接到单片机外中断1引脚,同时还连接到输入/输出端口(如P0或P1)的若干引脚,用来查询判断具体是哪一个中断请求源发生的中断事件。,54,55,#include sbit P1_0=P10; /定义位变量 sbit P1_1=P11; sbit P1_2=P12; sbit P1_3=P13; sbit P1_4=P

19、14; sbit P1_5=P15; sbit P1_6=P16; sbit P1_7=P17;,56,void main( ) P1=0xFF; /熄灭LED IT0=1; IT1=1;/外中断0、1脉冲触发方式 EA=1; EX0=1; EX1=1;/中断管理 for( ; ; ) /延时等待中断发生 ; ,57,void INT0_ISR( ) interrupt 0/外中断0中断服务函数 P1=0x0F; /P1口高4位置0,点亮4个LED void INT1_ISR( ) interrupt 2/外中断1中断服务函数 if (P1_0=0) P1=0xef; /如果为中断S11,点亮

20、D1else if (P1_1=0) P1=0xdf; else if (P1_2=0) P1=0xbf; else if (P1_3=0) P1=0x7f; ,58,【例6-13】利用优先编码器扩展外部中断,从上例可以看出,利用与门、或门扩展外中断所占端口引脚较多,在实际应用中,还可以采用优先级解码芯片如74LS148,把多个中断源信号作为一个中断。如图在有8个中断源(S0S7)的情况下,经74LS148优先译码后,只占3个I/O引脚,即用3根引脚可分辨8个中断源,从而节省了I/O口资源(8个中断源的响应用D1D7模拟)。,59,60,#include unsigned char statu

21、s;/定义一变量,用来读取P0口状态 void main( ) EA=1; EX0=1; IT0=1; for( ; ; ) ; ,61,void INT0_ISR( ) interrupt 0/外中断0中断服务函数 status=P0 /处理中断源7 ,62,定时器/计数器应用例子:,【例6-15】设系统时钟频率为12MHz,用定时器/计数器T0编程实现从P1.0输出周期为500ms的方波。 分析:从P1.0输出周期为500的方波,只需P1.0每250取反一次则可。当系统时钟为满足250ms的定时要求,方式控制字应设定为00000010B(02H)。系统时钟为12MHz,定时250ms,计数

22、值N为250,初值X=256-250=6,则TH0=TL0=06H。,63,【例6-16】设单片机的fosc=12MHz,要求在P1.0上产生周期为2ms的方波。,要在P1.0上产生周期为2ms的方波,定时器应产生1ms的周期性定时,定时到对P1.0取反。 要产生1ms的定时,应选择方式1,定时器方式。 TMOD的确定:选择定时器/计数器T0,定时器方式。方式1,GATE不起作用,高4位为0000,TMOD=01H。 TH、TL的确定:单片机的fosc=12MHz,则单片机的机器周期为1ms,1ms=1000ms,计数器的计数初值为65 536-1000,TH0=(65 536-1000)/2

23、56,TL0=(65 536-1000)%256。,64,【例6-17】设系统时钟频率为12MHz,编程实现从P1.1输出周期为1s的方波。,要输出周期为1s的方波,应产生500ms的周期性定时,定时到则对P1.1取反即可实现。 由于定时时间较长,一个定时器/计数器不能直接实现,一个定时器/计数器最长定时时间为65ms多一点,可以用以下两种方法实现。,65,(1)方法一,用定时/计数器T0产生周期性为10ms的定时,然后用一个变量对10ms计数50次。系统时钟为12MHz,定时/计数器T0定时10ms,计数值N为10000,选方式1,方式控制字为00000001B(01H),则初值X为X=65

24、 536-10 000。,66,(2)方法二,用定时/计数器T1计数实现,对10ms计数50次。定时/计数器T1工作于计数方式时,计数脉冲通过T1(P3.5)输入。设定时/计数器T0定时时间到对P1.0取反一次,则T1(P3.5)每10ms产生一个计数脉冲,那么定时500ms只需计数25次,设定时/计数器T1工作于方式2,初值X=256-25=231,TH1=TL1=231。因为定时/计数器T0工作于方式1,定时方式,则这时方式控制字为01100001B(61H)。定时/计数器T0和T1都采用中断方式工作。,67,【例6-18】设系统时钟频率为12MHz,编程实现:P1.1引脚上输出周期为1s

25、,占空比为20%的脉冲信号,根据输出要求,脉冲信号在一个周期内高电平占0.2s,低电平占0.8s,超出了定时器的最大定时间隔,因此利用定时器0产生一个基准定时配合软件计数来实现。取50ms作为基准定时,采用工作方式1,这样这个周期需要20个基准定时,其中高电平占4个基准定时。,68,【例6-21】利用定时器的门控位GATE测量正脉冲宽度,脉冲从(P3.3)引脚输入。门控位GATE=1,定时器/计数器T1的启动受到外中断1引脚的控制,当GATE=1,TR1=1时,只有引脚为高电平时,T1才被允许计数(定时器/计数器0具有同样特性),利用GATE的这个功能,可以测量引脚(P3.3)上正脉冲的宽度(机器周期数),其方法如图6-22所示。,69,70,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报