a=*ptr; ptr=0x30; b=*ptr; x=a*b; }
7.8051的片内数据存储器25H单元中存放有一个0~10的整数,编程求其平方根(精确到5位有效数字),将平方根放到30H单元为首址的内存中。 解:方法二:单用C语言编程实现 //MAIN.C #include
8.将外部RAM 10H~15H单元的内容传送到内部RAM 10H~15H单元。 解:方法二:单用C语言编程实现 //MAIN.C #include
char n=6; char *ptr1=0x10; char xdata *ptr2; ptr2=0x20; while(n--){ *ptr2++=*ptr1++;
} }
9.内部RAM 20H、21H和22H、23H单元分别存放着两个无符号的16位数,将其中的大数置于24H和25H单元。 解:方法一: #include
//设置一个内部RAM指针
unsigned int *ptr; unsigned int x,y,z; ptr=0x20; x=*ptr; y=*ptr;
ptr=0x22; z=(x>y)?x:y; ptr=0x24; *ptr=z; }
第5章 单片机的中断系统 习题
1.什么是中断、中断源、中断优先级和中断嵌套?
答:中断是指单片机内部有一个中断管理系统,它对内部的定时器事件、串行通信的发送和接收及外部事件(如键盘按键动作)等进行自动的检测判断。当CPU正在处理某件事情(例如正在执行主程序)的时候,外部或内部发生的某一事件(如某个引脚上电平的变化,一个脉冲沿的发生或计数器的计数溢出等)请求CPU迅速处理,于是,中断管理系统会置位相应标志通知CPU暂时中止当前的工作,迅速转去处理所发生的事件。处理完该事件后,再回到原来被中止的地方,继续原来的工作,这样的过程称为中断。 引发中断的事件称为中断源。
将中断事件按轻重缓急分若干级别叫中断优先级。
允许中断优先级高的中断源中断正在执行的低优先级的中断服务程序叫中断嵌套。
2.什么叫中断源?MCS-51有哪些中断源?各有什么特点?它们的中断向量地址分别是多少?
答:中断源即引发中断的事件。
MCS-51单片机有5个中断源,它们是外部中断0,定时器T0,外部中断1,定时器T1,串行口。
外部中断源是由引脚的触发信号引起的中断,定时器中断源是由于定时器计数器的溢出引发的中断,串行口是由于串行通信的发送或接收引发的中断。
//指向0x20单元 //取第一个数 //指向0x22单元 //取第二个数
//将两数中的较大者赋给z //指向地址为0x24的目标单元 //将大数存入目标单元
外部中断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(){ }
6.有一外部中断源,接入 端,当其中有中断请求时,要求CPU把一个从内部RAM 30H单元开始的50个字节的数据块传送到外部RAM从1000H开始的连续存储区。请编写对应的程序。 解:
7.设fosc = 12MHz,利用定时器,TO(工作在方式2)在P1.1引脚上获取输出周期为O.4ms
#include
void intx0() interrupt 0 using 1{ char * ptr1=0x30; char xdata * ptr2=0x1000; for(i=0;i<50;i++) *ptr2++=*ptr1++; }
IT0=1 ; EX0=1; while(1) ;
IT1=1; EA=1;EX1=1;
//IE=0x84;// IE|=0x84;
EA=1;
的方波信号,定时器溢出时采用中断方式处理,请编写,T0的初始化程序及中断服务程序。 解:fosc = 12MHz,则机器周期=1us;当T0工作在方式2时,其最大定时时间为256us,要输出周期为0.4mS即400us的方波信号,则其高、低电平应各为200us,显然当定时器T0按方式2工作时,只需计数达到200次即可,因此其时间常数初值为256-200=56。在T0的中断服务程序中,只需将P1.1引脚求反即可。 #include
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
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
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];