文档库 最新最全的文档下载
当前位置:文档库 › 第5章 单片机的中断系统题解

第5章 单片机的中断系统题解

本文由zg1236706贡献
doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。
第 5 章 单片机的中断系统 习题
1.什么是中断、中断源、中断优先级和中断嵌套? 答:中断是指单片机内部有一个中断管理系统,它对内部的定时器事件、串行通 信的发送和接收及外部事件(如键盘按键动作)等进行自动的检测判断。当 CPU 正在处理某件事情(例如正在执行主程序)的时候,外部或内部发生的某一事件 (如某个引脚上电平的变化,一个脉冲沿的发生或计数器的计数溢出等)请求 CPU 迅速处理,于是,中断管理系统会置位相应标志通知 CPU 暂时中止当前的工 作,迅速转去处理所发生的事件。处理完该事件后,再回到原来被中止的地方, 继续原来的工作,这样的过程称为中断。 引发中断的事件称为中断源。 将中断事件按轻重缓急分若干级别叫中断优先级。 允许中断优先级高的中断源中断正在执行的低优先级的中断服务程序叫中断嵌 套。 2.什么叫中断源?MCS-51 有哪些中断源?各有什么特点?它们的中断向量地址 分别是多少? 答:中断源即引发中断的事件。 MCS-51 单片机有 5 个中断源,它们是外部中断 0,定时器 T0,外部中断 1, 定时器 T1,串行口。 外部中断源是由引脚的触发信号引起的中断, 定时器中断源是由于定时器计 数器的溢出引发的中断,串行口是由于串行通信的发送或接收引发的中断。 外部中断 0,定时器 T0,外部中断 1,定时器 T1,串行口五个中断源的中断 向量地址依次为:0003H,000BH,0013H,001BH,0023H。 3.MCS-51 中断的中断响应条件是什么? 答:(1) 中断源有中断请求; (2) 此中断源允许位为 1,即中断源可以向 CPU 发中断请求; (3) CPU 开总中断,即 EA=1; (4) 无同级或者更高级中断正在服务 4.MCS-51 的中断响应过程是怎样的? 答:(1) 将相应的中断优先级状态触发器置 1,以阻断后来的同级和低级中断请 求; (2) 由硬件清除相应的中断请求标志,串行口的发送和接收中断除外; (3) 执行一条硬件 LCALL 指令,即把程序计数器 PC 的内容压入堆栈保存, 再将相应的中断服务程序的入口地址送入 PC; 5.编写出外部中断 1 为下跳沿触发的中断初始化程序。 解: void Int1_init(){ IT1=1; EA=1;EX1=1; //IE=0x84;// IE|=0x84; } 6.有一外部中断源,接入 INT 0 端,当其中有中断请求时,要求 CPU 把一个从内
部 RAM 30H 单元开始的 50 个字节的数据块传送到外部 RAM 从 1000H 开始的连续 存储区。请编写对应的程序。 解: #include void main(){ IT0=1 ; EA=1; EX0=1; while(1) ; } void intx0() interrupt 0 using 1{ char * ptr1=0x30; char xdata * ptr2=0

x1000; for(i=0;i<50;i++) *ptr2++=*ptr1++; } 7.设 fosc = 12MHz,利用定时器,TO(工作在方式 2)在 P1.1 引脚上获取输出周 期为 O.4ms 的方波信号,定时器溢出时采用中断方式处理,请编写,T0 的初始 化程序及中断服务程序。 解:fosc = 12MHz,则机器周期=1us;当 T0 工作在方式 2 时,其最大定时时间 为 256us,要输出周期为 0.4mS 即 400us 的方波信号,则其高、低电平应各为 200us,显然当定时器 T0 按方式 2 工作时,只需计数达到 200 次即可,因此其时 间常数初值为 256-200=56。在 T0 的中断服务程序中,只需将 P1.1 引脚求反即 可。 #include sbit P1_1=P1^1; void timer0()interrupt 1 using 1{ P1_1=!P1_1; } void main(){ P1_1=0; TMOD=0x02; TH0=56; TL0=56; IE=0x82; TR0=1; for(;;){} } 8.设 fosc = 6MHz,要求每隔 50ms,从内部 RAM 以 30H 开始的数据存储区传送 一个字节数据到外部 RAM 以 2000H 开始的连续存储区,共传送 50 个数据。要求: 采用定时器 T1 以方式 2 实现定时,数据传送在中断服务程序中完成。 解:fosc = 6MHz,机器周期=12/6*10-6S=2us,T1 工作在方式 2 时,最大定时时 间为 512us,要定时 50ms,可以计数 100 次,每次定时 500us 来实现,方式 2 定
时 500us 需计数 250 次,故其时间常数为 256-250=6。 #include char intcnt=0; char movcnt=0; char * ptr1=0x30; char xdata *ptr2=0x2000; void timer1()interrupt 3 using 1{ intcnt++; if(intcnt==100){ if(mocnt<50){ *ptr2++=*ptr1++; movcnt++; } else EX1=0; intcnt=0; } } void main(){ TMOD=0x20; TH1=6; TL1=6; IE=0x84; TR1=1; for(;;){} } 9.805l 单片机只有两个外部中断源,若要扩展成 8 个外部中断源,请画出实现 这种扩展的硬件线路图,并说明如何确定各中断源的优先级。 解:用按钮开关模拟中断源的中断请求,INT0 单独作为一个中断源,INT1 扩展 成 7 个中断源,有中断请求时,借助于 P2 口识别是这七个中断源是哪个请求中 断,为了验证正确性,如果是 INT0 中断,则在 P0 口的数码管上显示 0,是 INT1 中断,则根据从上到下是哪个中断源在 P0 口的数码管上显示 1—7。具体电路和 程序如下:
#include char led_mod[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07}; void INT0_srv (void) interrupt 0 using 1 //外部中断 0 处理程序 { P0=led_mod[0]; } void INT1_srv (void) interrupt 2 using 2 //外部中断 1 处理程序 { char intnum; intnum=P2; switch(intnum){ case 0xfe:P0=led_mod[1];break; case 0xfd:P0=led_mod[2];break; case 0xfb:P0=led_mod[3];break; case 0xf7:P0=led_mod[4];break; case 0xef:P0=led_mod[5];break; case 0xdf:P0=led_mod[6];break; case 0xbf:P0=led_mod[7]; } } void main(){ EA=1; EX0=1; EX1=1; P0=0; while(1); }
1本文由zg1236706贡献
doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。
第 5 章 单片机

的中断系统 习题
1.什么是中断、中断源、中断优先级和中断嵌套? 答:中断是指单片机内部有一个中断管理系统,它对内部的定时器事件、串行通 信的发送和接收及外部事件(如键盘按键动作)等进行自动的检测判断。当 CPU 正在处理某件事情(例如正在执行主程序)的时候,外部或内部发生的某一事件 (如某个引脚上电平的变化,一个脉冲沿的发生或计数器的计数溢出等)请求 CPU 迅速处理,于是,中断管理系统会置位相应标志通知 CPU 暂时中止当前的工 作,迅速转去处理所发生的事件。处理完该事件后,再回到原来被中止的地方, 继续原来的工作,这样的过程称为中断。 引发中断的事件称为中断源。 将中断事件按轻重缓急分若干级别叫中断优先级。 允许中断优先级高的中断源中断正在执行的低优先级的中断服务程序叫中断嵌 套。 2.什么叫中断源?MCS-51 有哪些中断源?各有什么特点?它们的中断向量地址 分别是多少? 答:中断源即引发中断的事件。 MCS-51 单片机有 5 个中断源,它们是外部中断 0,定时器 T0,外部中断 1, 定时器 T1,串行口。 外部中断源是由引脚的触发信号引起的中断, 定时器中断源是由于定时器计 数器的溢出引发的中断,串行口是由于串行通信的发送或接收引发的中断。 外部中断 0,定时器 T0,外部中断 1,定时器 T1,串行口五个中断源的中断 向量地址依次为:0003H,000BH,0013H,001BH,0023H。 3.MCS-51 中断的中断响应条件是什么? 答:(1) 中断源有中断请求; (2) 此中断源允许位为 1,即中断源可以向 CPU 发中断请求; (3) CPU 开总中断,即 EA=1; (4) 无同级或者更高级中断正在服务 4.MCS-51 的中断响应过程是怎样的? 答:(1) 将相应的中断优先级状态触发器置 1,以阻断后来的同级和低级中断请 求; (2) 由硬件清除相应的中断请求标志,串行口的发送和接收中断除外; (3) 执行一条硬件 LCALL 指令,即把程序计数器 PC 的内容压入堆栈保存, 再将相应的中断服务程序的入口地址送入 PC; 5.编写出外部中断 1 为下跳沿触发的中断初始化程序。 解: void Int1_init(){ IT1=1; EA=1;EX1=1; //IE=0x84;// IE|=0x84; } 6.有一外部中断源,接入 INT 0 端,当其中有中断请求时,要求 CPU 把一个从内
部 RAM 30H 单元开始的 50 个字节的数据块传送到外部 RAM 从 1000H 开始的连续 存储区。请编写对应的程序。 解: #include void main(){ IT0=1 ; EA=1; EX0=1; while(1) ; } void intx0() interrupt 0 using 1{ char * ptr1=0x30; char xdata * ptr2=0x1000; for(i=0;i<50;i++) *ptr2++=*ptr1++; } 7.设 fosc = 12MHz,利用定时器,TO(工作在方式 2)在 P1.1 引脚上获取输出周 期为 O.4ms 的方波信号

,定时器溢出时采用中断方式处理,请编写,T0 的初始 化程序及中断服务程序。 解:fosc = 12MHz,则机器周期=1us;当 T0 工作在方式 2 时,其最大定时时间 为 256us,要输出周期为 0.4mS 即 400us 的方波信号,则其高、低电平应各为 200us,显然当定时器 T0 按方式 2 工作时,只需计数达到 200 次即可,因此其时 间常数初值为 256-200=56。在 T0 的中断服务程序中,只需将 P1.1 引脚求反即 可。 #include sbit P1_1=P1^1; void timer0()interrupt 1 using 1{ P1_1=!P1_1; } void main(){ P1_1=0; TMOD=0x02; TH0=56; TL0=56; IE=0x82; TR0=1; for(;;){} } 8.设 fosc = 6MHz,要求每隔 50ms,从内部 RAM 以 30H 开始的数据存储区传送 一个字节数据到外部 RAM 以 2000H 开始的连续存储区,共传送 50 个数据。要求: 采用定时器 T1 以方式 2 实现定时,数据传送在中断服务程序中完成。 解:fosc = 6MHz,机器周期=12/6*10-6S=2us,T1 工作在方式 2 时,最大定时时 间为 512us,要定时 50ms,可以计数 100 次,每次定时 500us 来实现,方式 2 定
时 500us 需计数 250 次,故其时间常数为 256-250=6。 #include char intcnt=0; char movcnt=0; char * ptr1=0x30; char xdata *ptr2=0x2000; void timer1()interrupt 3 using 1{ intcnt++; if(intcnt==100){ if(mocnt<50){ *ptr2++=*ptr1++; movcnt++; } else EX1=0; intcnt=0; } } void main(){ TMOD=0x20; TH1=6; TL1=6; IE=0x84; TR1=1; for(;;){} } 9.805l 单片机只有两个外部中断源,若要扩展成 8 个外部中断源,请画出实现 这种扩展的硬件线路图,并说明如何确定各中断源的优先级。 解:用按钮开关模拟中断源的中断请求,INT0 单独作为一个中断源,INT1 扩展 成 7 个中断源,有中断请求时,借助于 P2 口识别是这七个中断源是哪个请求中 断,为了验证正确性,如果是 INT0 中断,则在 P0 口的数码管上显示 0,是 INT1 中断,则根据从上到下是哪个中断源在 P0 口的数码管上显示 1—7。具体电路和 程序如下:
#include char led_mod[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07}; void INT0_srv (void) interrupt 0 using 1 //外部中断 0 处理程序 { P0=led_mod[0]; } void INT1_srv (void) interrupt 2 using 2 //外部中断 1 处理程序 { char intnum; intnum=P2; switch(intnum){ case 0xfe:P0=led_mod[1];break; case 0xfd:P0=led_mod[2];break; case 0xfb:P0=led_mod[3];break; case 0xf7:P0=led_mod[4];break; case 0xef:P0=led_mod[5];break; case 0xdf:P0=led_mod[6];break; case 0xbf:P0=led_mod[7]; } } void main(){ EA=1; EX0=1; EX1=1; P0=0; while(1); }

1

相关文档