单片机原理及应用 - 基于Proteus和Keil C林立版课后习题答案- 下载本文

char xdata *ptr2; ptr2=0x20; while(n--){

*ptr2++=*ptr1++; } }

9.内部RAM 20H、21H和22H、23H单元分别存放着两个无符号的16位数,将其中的大数置于24H和25H单元。 解:方法一:

#include void main() {

unsigned int *ptr; //设置一个内部RAM指针 unsigned int x,y,z;

ptr=0x20; //指向0x20单元 x=*ptr; //取第一个数 ptr=0x22; //指向0x22单元 y=*ptr; //取第二个数

z=(x>y)?x:y; //将两数中的较大者赋给z ptr=0x24; //指向地址为0x24的目标单元 *ptr=z; //将大数存入目标单元 }

方法二:

#include #include void main() {

unsigned int x,y,z;

x=DBYTE[0X20]*256+DBYTE[0X21]; y=DBYTE[0X22]*256+DBYTE[0X23];

z=(x>y)?x:y; //将两数中的较大者赋给z DBYTE[0X24]=z/256; DBYTE[0X25]=z%6; }

方法三:

#include

unsigned int x _at_ 0x20; unsigned int y _at_ 0x22; unsigned int z _at_ 0x24; void main() {

z=(x>y)?x:y; }

第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.有一外部中断源,接入INT0端,当其中有中断请求时,要求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。具体电路和程序如下: