c语言 中断与定时器计数器

上传人:小** 文档编号:89544611 上传时间:2019-05-27 格式:PPT 页数:70 大小:555.50KB
返回 下载 相关 举报
c语言 中断与定时器计数器_第1页
第1页 / 共70页
c语言 中断与定时器计数器_第2页
第2页 / 共70页
c语言 中断与定时器计数器_第3页
第3页 / 共70页
c语言 中断与定时器计数器_第4页
第4页 / 共70页
c语言 中断与定时器计数器_第5页
第5页 / 共70页
点击查看更多>>
资源描述

《c语言 中断与定时器计数器》由会员分享,可在线阅读,更多相关《c语言 中断与定时器计数器(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( ) i

4、nterrupt 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( ) interru

5、pt 0 using 0 int 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、方式与工作模式 6.3.3定时器/计数器的初始化,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=(65

7、536N)/256; TL=(65536N)%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,

8、则 Td=(2n-X) Tcy,那么定时器的初值为: 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

9、位,因此计数寄存器初值分别为: TH0 = (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。 初

10、值的确定 模式2为8位初值自动重载方式,计数寄存器初值分别为: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

11、=01H。,32,初值的确定,外部晶振频率fosc=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;

12、/启动计数器 ET0=1;/开计数器中断 EA=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) int

13、errupt 3 Wave=Wave; /反向 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,

14、#include void main( ) TMOD=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,#inclu

15、de sbit P1_7=P17; void interrupt0( ) interrupt 0 using 2 /外部中断0 P1_7=!P1_7; void main( ) EA=1; /开中断 IT0=1; /外部中断0脉冲触发 EX0=1; /外部中断0 P1_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=!P17; 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; /熄灭LED IT0=1; IT1=1; /外中断0、1脉冲触发方

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号