外部中断1的中断服务子程序序

君,已阅读到文档的结尾了呢~~
题目答案:【11】A题目解析: 8253工作于方式l时,在整个计数期间,其输出为低电平 ...
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
第五次作业 一、单选题 1.(1分)8086CPU从中断服务子程序返回主程序
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口作者:江苏科技大学&机械工程学院 赵长金
1、51单片机的5大中断源:串行口中断、定时中断1、外部中断1、定时中断0、外部中断0;2、中断源的编号: 串行口中断为4、定时中断1为3、外部中断1为2、定时中断0为1、外部中断0为0;3、中断源的优先级:按以上顺序排列,串行口中断最低、外部中断0最高;4、使用外部中断0和1,必须TCON寄存器设置其触发方式是低电平触发(0)还是下降沿触发(1);5、使用前必须通过IE寄存器打开总中断和自己的中断;
一、外部中断基本例程(未使用中断,键盘扫描为一般端口扫描)#include &reg52.h&sbit k1=P3^2;sbit led=P2^7;void delay_ms(unsigned int xms); //ms级延时子程序void key_scan();&& //声明键盘扫描子函数void main(){led=1; //上电初始化,led灯不亮while(1){key_scan();delay_ms(3000);}}void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;&for(x=x&0;x--)for(y=130;y&0;y--);}void key_scan() //键盘扫描子函数{ if(k1==0) //有键按下吗?(k1=0 ?){ delay_ms(10); //延时消抖if(k1==0) &&& //确实是有键按下,则:{led=! //翻转灯的状态&&& while(!k1);} //等待按键放开}&}
二、外部中断基本例程 (单个键盘的外部中断0扫描处理)//用一个按键控制一个灯的亮灭#include &reg52.h&sbit k1=P3^2;sbit led=P2^7;void delay_ms(unsigned int xms); //ms级延时子程序void key_scan() interrupt 0 //使用了外部中断0的键盘扫描子函数。也可放在主函数而不需要预先声明{ if(k1==0) //有键按下吗?(k1=0 ?){ delay_ms(10); //延时消抖if(k1==0) &&& //确实是有键按下,则:{led=! //翻转灯的状态&&& while(!k1);} //等待按键放开}&}void main(){led=1; && //上电初始化,led灯不亮TCON=0x01; //打开外部中断0,并设置为下降沿触发IE=0x81; //开总中断while(1){delay_ms(3000); //注意主函数这里没有键盘扫描程序了}}void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;&for(x=x&0;x--)for(y=130;y&0;y--);
三、外部中断基本例程 (单个键盘的外部中断1扫描处理)
作者:江苏科技大学&机械工程学院 赵长金//功能跟上例一样,都是用一个按键控制一个灯的亮灭,但是使用的是外部中断1#include &reg52.h&sbit k2=P3^3;&&sbit led=P2^7;void delay_ms(unsigned int xms); //ms级延时子程序void main(){led=1; && //上电初始化,led灯不亮TCON=0x04; //打开外部中断1,并设置为下降沿触发IE=0x84; //开总中断和外部中断1while(1){delay_ms(3000);}}void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;&for(x=x&0;x--)for(y=130;y&0;y--);}void key_scan() interrupt 2 //使用了外部中断1的键盘扫描子函数{ if(k2==0) //有键按下吗?(k1=0 ?){ delay_ms(10); //延时消抖if(k2==0) &&& //确实是有键按下,则:{led=! //翻转灯的状态&&& while(!k2);} //等待按键放开}&}
&四、外部中断基本例程(同时使用外部中断0和外部中断1)//用一个键控制接在P0口的八个灯的亮灭,另外一个按键控制一个灯的亮灭#include &reg52.h&sbit k1=P3^2;sbit k2=P3^3;&sbit led=P2^7;void delay_ms(unsigned int xms); //ms级延时子程序void main(){P0=0 //上电初始化,P0全灭led=1; && //上电初始化,led灯不亮TCON=0x05; //打开外部中断1、2,并设置为下降沿触发IE=0x85; //开总中断和外部中断1、2
while(1){delay_ms(3000);}}void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;&for(x=x&0;x--)for(y=130;y&0;y--);}void key_scan_1() interrupt 0 //使用了外部中断0的键盘扫描子函数{ if(k1==0) //有键按下吗?(k1=0 ?){ delay_ms(10); //延时消抖if(k1==0) &&& //确实是有键按下,则:{P0=~P0; //翻转8个灯的状态&&& while(!k1);} //等待按键放开}&}void key_scan_2() interrupt 2 //使用了外部中断1的键盘扫描子函数{ if(k2==0) //有键按下吗?(k1=0 ?){ delay_ms(10); //延时消抖if(k2==0) &&& //确实是有键按下,则:{led=! //翻转单个灯的状态&&& while(!k2);} //等待按键放开}&}
五、外部中断扩展应用例程(8个按钮分别去控制8个灯的亮灭)
作者:江苏科技大学&机械工程学院 赵长金//八个按钮通过8个二极管接到外部中断0脚进行中断扩展,从而解决外部中断口不够用的问题#include &reg52.h&sbit k0=P2^0; //八个按键分别接到P2口各个脚上,sbit k1=P2^1; //同时还通过二极管连接到外部中断0脚(P3.2)sbit k2=P2^2;sbit k3=P2^3;sbit k4=P2^4;sbit k5=P2^5;sbit k6=P2^6;sbit k7=P2^7;sbit led0=P0^0; //接在P0脚上的8个LED灯,分别受控于上述8个按键sbit led1=P0^1;sbit led2=P0^2;sbit led3=P0^3;sbit led4=P0^4;sbit led5=P0^5;sbit led6=P0^6;sbit led7=P0^7;void delay_ms(unsigned int xms); //ms级延时子程序void main(){&& //上电初始化,led灯不亮TCON=0x01; //打开外部中断0,并设置为下降沿触发IE=0x81; //开总中断while(1){delay_ms(3000);}}void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;&for(x=x&0;x--)for(y=130;y&0;y--);
}void key_scan() interrupt 0 //使用了外部中断0的键盘扫描子函数{ if(k0==0) //有键按下吗?(k0=0 ?){ delay_ms(10); //延时消抖if(k0==0) &&& //确实是有键按下,则:{led0=~led0; //翻转灯的状态&&& while(!k0);} //等待按键放开}if(k1==0) //有键按下吗?(k1=0 ?){ delay_ms(10); //延时消抖if(k1==0) &&& //确实是有键按下,则:{led1=!led1; //翻转灯的状态&&& while(!k1);} //等待按键放开}if(k2==0) //有键按下吗?(k2=0 ?){ delay_ms(10); //延时消抖if(k2==0) &&& //确实是有键按下,则:{led2=!led2; //翻转灯的状态&&& while(!k2);} //等待按键放开}if(k3==0) //有键按下吗?(k3=0 ?){ delay_ms(10); //延时消抖if(k3==0) &&& //确实是有键按下,则:{led3=!led3; //翻转灯的状态&&& while(!k3);} //等待按键放开}if(k4==0) //有键按下吗?(k4=0 ?){ delay_ms(10); //延时消抖if(k4==0) &&& //确实是有键按下,则:{led4=!led4; //翻转灯的状态&&& while(!k4);} //等待按键放开}if(k5==0) //有键按下吗?(k5=0 ?){ delay_ms(10); //延时消抖if(k5==0) &&& //确实是有键按下,则:{led5=!led5; //翻转灯的状态&&& while(!k5);} //等待按键放开}if(k6==0) //有键按下吗?(k6=0 ?){ delay_ms(10); //延时消抖if(k6==0) &&& //确实是有键按下,则:{led6=!led6; //翻转灯的状态&&& while(!k6);} //等待按键放开}if(k7==0) //有键按下吗?(k7=0 ?){ delay_ms(10); //延时消抖if(k7==0) &&& //确实是有键按下,则:{led7=!led7; //翻转灯的状态&&& while(!k7);} //等待按键放开
作者:江苏科技大学&机械工程学院 赵长金
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:41816次
积分:2213
积分:2213
排名:第12596名
原创:188篇
(5)(184)(1)君,已阅读到文档的结尾了呢~~
80C51单片机外部中断的应用及其程序调试
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
80C51单片机外部中断的应用及其程序调试
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口中断处理过程 - 博客频道 - CSDN.NET
wjonuee的博客
分类:嵌入式
部分摘自:/post-12643-1.shtml
中断:所谓中断就是指CPU在正常执行程序的时候,由于内部/外部事件的出发、或由程序预先设定而引起CPU暂时中止当前正在执行的程序,保存被执行程序相关信息到栈中,转而去执行为内部/外部事件、或由程序预先设定的事件的中断服务子程序,待执行完中断服务子程序后,CPU再获取被保存在栈中被中断的程序的信息,继续执行被中断的程序,这一过程叫做中断。
中断向量:中断服务程序的入口地址。
中断向量表:把系统中所有的中断类型码及其对应的中断向量按一定的规律存放在一个区域内,这个存储区域就叫做中断向量表。
中断源:IA32中有三大类中断源:1、软中断/内中断。&2、外中断/硬件中断&
中断处理过程:
请求中断→响应中断→关闭中断→保留断点→中断源识别→保护现场→中断服务子程序→恢复现场→中断返回。
(1)某一中断源向CPU发起中断请求,对于外部中断CPU在当前指令最后一个时钟周期查询中断请求信号的
& &有效性,在系统开中断的情况下,CPU向中断源回送中断应答信号,系统进入中断响应周期。(CPU对
& &系统内部中断源提出的中断请求必须响应,而且自动取得中断服务子程序的入口地址,执行中断服务
& & 子程序);
(2)CPU响应中断后,将状态标志寄存器压入堆栈保护;
(3)再将其中的中断标志位清除从而关闭中断;
(4)CPU将当前CS(代码段地址)和IP(将要执行的下一条地址)压入堆栈保护断点;
(5)CPU确定提出请求的中断源,获得中断向量号,在对应的中断向量表获得中断入口地址,
& &装入CS和IP中;
(6)将断点处各寄存器的内容压入堆栈保护现场;
(7)此时程序跳转至中断服务子程序执行;
(8)中断处理完毕,将堆栈各寄存器内容弹栈,恢复断点处各寄存器的值;
(9)在中断服务子程序最后安排一条返回指令,执行该指令将堆栈中CS和IP的值弹出,恢复主程序
& &断点处地址值,同时恢复标志寄存器的内容。程序转至被中断的程序继续执行。
排名:千里之外
(1)(5)(4)(1)【求助提问】单片机中断程序的问题 | DIY小组 | 果壳网 科技有意思
1143684人加入此小组
我单片机入门小白,最近学习到中断的应用,在实验中有一些问题,希望得到各位大神的帮助!!!图中的蓝色led代表主程序,绿色的led代表int1中断子程序,红色则代表in0中断子程序。很奇怪的是,只要一打开int0中断,则系统就一直留在子程序中,不会返回主程序。我个人觉得是我的子程序编写有问题,但是自己找不出来,请各位教导一下~~~~~~#include&STC12C2052AD.H& //头文件 sbit green=P1^5;/*****毫秒级延时函数***********/void DELAY_MS (unsigned int a){ while( a-- != 0){ for(i = 0; i & 600; i++); }}/*********************************************************************************************函数名:PWM初始化函数调 用:PWM_init();参 数:无返回值:无结 果:将PCA初始化为PWM模式,初始占空比为0备 注:需要更多路PWM输出直接插入CCAPnH和CCAPnL即可/**********************************************************************************************/void PWM_init (void){CMOD=0x02; //设置PCA定时器 CL=0x00;
CH=0x00; CCAPM0=0x42; //PWM0设置PCA工作方式为PWM方式() CCAP0L=0x00; //设置PWM0初始值与CCAP0H相同 CCAP0H=0x00; // PWM0初始时为0CCAPM1=0x42; //PWM1设置PCA工作方式为PWM方式(使用时删除//) CCAP1L=0x00; //设置PWM1初始值与CCAP0H相同 CCAP1H=0x00; // PWM1初始时为0CR=1; //启动PCA定时器}/**********************************************************************************************/ /*********************************************************************************************函数名:PWM0占空比设置函数调 用:PWM0_set();参 数:0x00~0xFF(亦可用0~255)返回值:无结 果:设置PWM模式占空比,为0时全部高电平,为1时全部低电平备 注:如果需要PWM1的设置函数,只要把CCAP0L和CCAP0H中的0改为1即可/**********************************************************************************************/void PWM0_set (unsigned char a){ CCAP0L= //设置值直接写入CCAP0L CCAP0H= //设置值直接写入CCAP0H}/**********************************************************************************************/void PWM1_set (unsigned char a){ CCAP1L= //设置值直接写入CCAP0L CCAP1H= //设置值直接写入CCAP0H}/*************************外部中断0中断子程序********//******说明:应用调节PWM功能实现红色led灯的呼吸亮灭************/void DIANredDEGN (void) interrupt 0 using 1{ for(r=255;r&0;r--){ PWM1_set(r); //设置PWM占空比 DELAY_MS(5); }for(r=0;r&255;r++){ PWM1_set(r); //设置PWM占空比 DELAY_MS(5); }}/*************************外部中断1中断子程序********/void DIANgreenDEGN (void) interrupt 2 using 2{ green=0; //设置为低电平触发绿色led灯 DELAY_MS(500); green=1; }/***********************主函数*******************/void main (void){ PWM_init(); //PWM初始化 EA=1; //打开总中断开关 EX1=1; //打开外部中断1开关 EX0=1; //打开外部中断0开关 IT1=1; //设置外部中断1触发方式为低电平触发 IT0=1; //设置外部中断1触发方式为低电平触发while(1){ //使得蓝色led灯循环呼吸亮灭 for(b=0;b&255;b++){ PWM0_set(b); //设置PWM占空比 DELAY_MS(5); }for(b=255;b&0;b--){ PWM0_set(b); //设置PWM占空比 DELAY_MS(5); } }}
+ 加入我的果篮
我去,中断里一个刺眼的DELAY_MS(500);。。。。
引用 的话:为什么中断里不能加延时函数?中断响应函数要的就是实时性高,这样才能实时响应中断事件,你中间delay个500mS,这500mS中间发生的事情就都错过了。中断函数要写得简洁一点,要很快完成必要的事情,不做其他无意义的事情
引用 的话: 我做这个实验纯粹就是想测试一下自己是否会用外部中断~~~按照您的说法,是不是中断子程序中就不应该出现长时间的延时???我是小白,还望见谅,这么多问题中断程序中尽量不出现或长或短的延时,要尽可能的简洁,完成必要的任务即可。你要测试外部中断,只要简单地做个端口取反就行,有中断LED有反应就行,其他我不深入。我记得51中断里加延时会跑得不正常。当然,你只是做一个简单的测试,能跑起来就行,但是我还是不建议你在中断里加延时。
(C)2016果壳网&&&&京ICP证100430号&&&&京网文[-239号&&&&新出发京零字东150005号

我要回帖

更多关于 51外部中断1 的文章

 

随机推荐