Chap4_2 8051内部资源的C编程-文档资料

上传人:日度 文档编号:143661874 上传时间:2020-09-01 格式:PPT 页数:138 大小:2.92MB
返回 下载 相关 举报
Chap4_2 8051内部资源的C编程-文档资料_第1页
第1页 / 共138页
Chap4_2 8051内部资源的C编程-文档资料_第2页
第2页 / 共138页
Chap4_2 8051内部资源的C编程-文档资料_第3页
第3页 / 共138页
Chap4_2 8051内部资源的C编程-文档资料_第4页
第4页 / 共138页
Chap4_2 8051内部资源的C编程-文档资料_第5页
第5页 / 共138页
点击查看更多>>
资源描述

《Chap4_2 8051内部资源的C编程-文档资料》由会员分享,可在线阅读,更多相关《Chap4_2 8051内部资源的C编程-文档资料(138页珍藏版)》请在金锄头文库上搜索。

1、8051内部资源,常熟理工学院 物理与电子工程学院 2011.4,Chap8 8051内部资源,8.1 外部中断:INT0、INT1 8.2 定时/计数器:T0、T1 8.3 串行口:RXD、TXD,8.1 外部中断,8051外部中断,中断 中断源 中断优先级 中断嵌套,8051外部中断,中断:当CPU正处理某项事务时,若外界或内部发生紧急事件,要求CPU暂停正在处理的工作转而去处理这个紧急事件,待处理完以后再回到原来被中断的地方,继续执行原来被中断了的程序,这样的过程称为中断。(堆栈) 中断源:向CPU提出中断请求的源称为中断源 外部跳变信号(下降延) 外部低电平等 (0),8051外部中断

2、,中断优先级:当几个中断源同时请求中断时,CPU应优先响应最需紧急处理的中断请求。为此,需要规定各个中断源的优先级。在优先级高的中断请求处理完了以后。再响应优先级低的中断请求。 中断嵌套:当CPU正在处理一个优先级低的中断请求的时,如果发生另一个优先级比它高的中断请求,CPU能暂停当前处理的中断,转去处理优先级高的中断请求,待处理完以后,再回到原来正在处理的低级中断程序,这种高级中断源能中断低级中断源的中断处理称为中断嵌套。,8051中断,8051单片机有 5个中断源 2个中断优先级(2级中断嵌套),优先级可通过编程实现 IE(中断允许寄存器):中断源的中断请求是否能得到响应,受IE的控制;

3、IP(中断优先级寄存器):各个中断源的优先级可由IP的各位来确定;同一优先级中的各中断源同时请求中断时,由内部的查询逻辑来确定响应的次序。,8051中断源,8051五个中断源 INT0中断(P3.2) T0中断 (P3.4) INT1中断(P3.3) T1中断 (P3.5) 串行中断(P3.0、P3.1),8051中断入口(ROM)地址和优先级,8051 INT0中断机理,当INT0引脚输入如下信号: 下降沿(IT0=1)或 低电平(IT0=0) CPU自动(硬件)产生中断标志(IE0=1),此时 若INT0中断允许(使能EX0=1,EA=1),则CPU立即停止当前程序,跳转到INT0对应的中

4、断入口(ROM保留地址0 x0003)执行中断服务程序(中断服务程序后CPU自动对中断标志清零:IE0=0),待INT0中断服务程序执行完毕后再回原执行程序处; 若若INT0中断未允许,则程序不能跳转到INT0中断入口,不执行中断服务程序(中断标志IE0不能自动清0)。 问提:中断标志IE0的产生与中断使能是否有关?,INT0中断方式执行流程,#include reg51.h unsigned char i=0; /*int0中断服务程序*/ void INT0_ISR(void) interrupt 0 delay(200); if((P3 /等待中断 ,INT0 查询方式,void mai

5、n(void) IT0=1; /EX0=1;EA=1; while(1) /查询方式1: if(IE0= =1) IE0=0;/手动清中断标志 /P1=+I; _- P2=LED_segbufi P0=LED_biti I+; If(I=6) I=0 delay(500); ,void main(void) while(1) /查询方式2: while(IE0= =0) ; /等待INT0外部中断 IE0=0; /手动清中断标志 / ,8051中断系统,与中断有关的SFR,注:*表示可以位寻址,TCON:定时计数器控制寄存器,TF1、TF0 :T1、T0溢出标志 TR1、TR0 :T1、T0启

6、动控制位(TR=1:启动定时器) IE1、IE0 :INT1、INT0中断标志 IT1、IT0 :INT1、INT0触发方式控制位(IT=1:下降沿触发,IT=0:低电平触发) TF1、TF0、IE1、IE0都具有自动清零功能。,SCON:串行口控制寄存器,SM0 SM1串行模式选择 SM2 多机通讯允许位:方式0时,此位应该为0;模式1时,当接收到停止位时,该位将置位;方式2或方式3时,当接收的第9位数据为1时,将置位 REN 串行接收允许位 TB8 在模式2和模式3中,将被发送数据的第9位 RB8:在方式0中,该位不起作用;在方式1中该位为接收数据的停止位;在方式2和方式3 中为接收数据的

7、第9 位 TI 串行发送结束标志,由软件清零 RI 串行接收结束标志,由软件清零,IE:中断允许寄存器,EA: 使能标志位。 1:所有中断使能;0:禁止所有中断 ET2:T2中断使能 ES: 串行通信中断使能 ET1:T1中断使能 EX1:INT1中断使能 ET0:T0中断使能 EX0:INT0中断使能,IP:中断优先级寄存器,- 保留 - 保留 PT2:T2中断优先级 PS: 串行通信中断优先级 PT1:T1中断优先级 PX1:INT1优先级 PT0:T0中断优先级 PX0:INT0优先级,与中断有关的各位,PX0、PT0、PX1、PT1、PS EX0、ET0、EX1、ET1、ES、EA I

8、T0、IT1 TR0、TR1 IE0、 IE1 、TF0、TF1、 TI 、RI 以上各位可位寻址,且均为高电平有效,8051外部中断编程示例,#include reg51.h /C51 中断程序框架 /*int0中断服务程序*/ void INT0_ISR (void) interrupt 0 using 0 /中断服务程序 / /*主函数*/ void main (void) IT0=1; EX0 = 1; EA = 1; / 打开中断源 while (1) ; /等待中断 ,中断服务函数与寄存器的定义,为了满足在C语言源程序中直接编写中断服务程序的要求,C51编译器对函数的定义进行了扩展

9、,增加了一个扩展关键字interrupt。它是函数定义时的一个选项,加上这个选项即可将一个函数定义成中断服务函数。 定义格式为: 函数类型 函数名(形式参数表) interrupt n using n ,中断服务函数与寄存器的定义,函数类型 函数名(形式参数表) interrupt n using n 关键字interrupt后面的n是中断号,n的范围为031。编译器从8n+3处产生中断向向量,具体的中断号n和中断向量取决于8051单片机芯片型号,常用中断源和中断向量如表所示。,中断服务函数与寄存器的定义,工作寄存器:8051片内RAM中有4个工作寄存器组,每个寄存器组中含8个工作寄存器(R0

10、R7)。 C51编译器扩展了一个关键字using,专门用来选择8051单片机的工作寄存器组。 在定义一个函数时,using后面的n是一个03的常数,分别表示4个功能完全一样的工作寄存器组。 在定义一个函数时,using是一个选项,若缺省编译器自动分配一个寄存器组作绝对寄存器组访问。需要注意的是,关键字using和interrupt的后面都不允许跟带运算符的表达式。,中断服务函数与寄存器的定义,void INT0_ISR(void) interrupt 0 void TIMER0_ISR(void) interrupt 1 void INT1_ISR(void) interrupt 2 void

11、 TIMER1_ISR(void) interrupt 3 void UART_ISR(void) interrupt 4 ,中断服务函数与寄存器的定义_ Keil C51命令,DEFINE BUTTON(定义按钮)命令 定义:DEFINE BUTTON “按钮名”,“命令” 在Debug-Function Editor(Open Ini File)中定义外中断按钮: define button INT0(P3.2) , PORT3=PORT30 x04 define button T0(P3.4) , PORT3=PORT30 x10 define button INT1(P3.3) , P

12、ORT3=PORT30 x08 define button T1(P3.5) , PORT3=PORT30 x20 每按钮一次对P3.2取反 删除:KILL BUTTON n define button “clr drtr”,”dptr=0” kill button 1,中断服务函数与寄存器的定义_ Keil C51命令,EVAL EVAL (1/256) 0 x00 EVAL (256/256) 0 xFF PORT3 0 xFF ex0_isr_counter 询问变量的值,中断如何扩充1,定时器中断作为外部中断使用 把8051的T1 、T0用作对外部脉冲计数方式。每当P3.4(T0)或P

13、3.3(T1)引脚上发生负跳变时, T1 和T0的计数器加1。利用这个特性,可以把P3.4和P3.3引脚作为外部中断请求输入线,而定时器的溢出中断作为外部中断请求标志。,中断如何扩充1,定时器中断作为外部中断使用(软件) 定时器T1对外部计数 /*TH1、TL1采用16进制赋值*/ void int0(void) interrupt 3 /*中断服务程序*/ void main(void) TMOD=(TMOD /*TL1=-1%256; */ while(1) ; ,中断如何扩充2,中断和查询结合的方式,中断如何扩充2,#include sbit LED_A=P10; sbit LED_B=

14、P11; sbit LED_C=P12; sbit IA=P13; sbit IB=P14; sbit IC=P15;,中断如何扩充2,void main(void) IT0=1;IT1=1; EX0=1;EX1=1; EA=1; LED_A=0;LED_B=0;LED_C=0; IA=1;IB=1;IC=1; while(1); ,中断如何扩充2,void int0(void) interrupt 0 LED_A=0;LED_B=0;LED_C=0; IE1=0; EX1=1; void int1(void) interrupt 2 EX1=0; if(IA=0) LED_A=1; else

15、 if(IB=0) LED_B=1; else if(IC=0) LED_C=1; ,中断如何扩充3,利用硬件扩充多个中断源 采用一个8/3优先编码器74LS148,把多个中断源信号作为一个中断效果很好。 I7-I0优先级逐步降低 GS为标志位:判断是否有有效输入,中断如何扩充3,软件设计思路 #include unsigned char status; bit flag; void int1(void) interrupt 2 using 2 flag=1; /*设置标志*/ status=P1; /*存状态*/ ,中断如何扩充3,软件设计思路 void main(void) PX1=1;

16、/*置INT1高优先级中断*/ EX1=1; EA=1; /*INT1开中断,CPU开中断*/ while(1) if(flag) /*有中断*/ switch(status) /*根据中断源分支*/ case 0: break; /*处理0*/ case 1: break; /*处理1*/ case 2: break; case 3: break; default:; flag=0; ,8.2 定时器,问题提出,void delay(unsigned char n) unsigned char i; for(i=0;in;i+) ; ,void delay(unsigned int n) unsigned int i; fo

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

当前位置:首页 > 电子/通信 > 数据通信与网络

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