MOV B,A LOOP:INC DPTR
MOVX A,@DPTR CJNE A,B,LOOP1 LOOP1:JNC LOOP2
MOV B,A
LOOP2:DJNZ R7,LOOP
MOV R7,B RET
第四章习题参考答案
1.是在外部RAM中的xdata区定义了无符号字符型的字变量OUTX2,它的地址是(1002H)。 2.(1)编程容易 ;(2)容易实现复杂的数值计算;(3)容易阅读、调试、维护程序; (4)容易实现模块化开发;(5)程序可移植性好。
3.bit,data,idata,pdata,code,xdata,sbit,sfr,sfr16 4.bit和sbit都是C51扩展的变量类型。 bit是位变量,编译器在编译过程中分配地址。除非指定,否则这个地址是随机分配的。这个地址是整个可寻址空间,也就是内部RAM、外扩RAM和ROM。 sbit是对应可位寻址空间的一个位,包括可位寻址区:20H~2FH和特殊功能寄存器区。一旦用了形如sbi xxx = REGE^6的定义,这个sbit量就确定地址了。 bit和sbit的最大区别在于,bit是定义一个变量;sbit经常用在寄存器中的,方便对寄存器的某位进行操作。
5.(1)使用C51运行库中的预定义宏;(2)通过指针访问;(3)使用C51扩展关键字_at_。
6.(1)中断函数不能进行参数传递,如果中断函数中包含任何参数声明都将导致编译出错。
(2)中断函数没有返回值,如果企图定义一个返回值将得不到正确的结果,建议在定义中断函数时将其定义为void类型,以明确说明没有返回值。
(3)在任何情况下都不能直接调用中断函数,否则会产生编译错误。因为中断函数的返回是由8051单片机的RETI指令完成的,RETI指令影响8051单片机的硬件中断系统。如果在没有实际中断情况下直接调用中断函数,RETI指令的操作结果会产生一个致命的错误。
(4)如果在中断函数中调用了其它函数,则被调用函数所使用的寄存器必须与中断函数相同。否则会产生不正确的结果。
(5)C51编译器对中断函数编译时会自动在程序开始和结束处加上相应的内容,具体如下:在程序开始处对ACC、B、DPH、DPL和PSW入栈,结束时出栈。中断函数未加using m修饰符的,开始时还要将R0~R1入栈,结束时出栈。如中断函数加using m修饰符,则在开始将PSW入栈后还要修改PSW中的工作寄存器组选择位。
(6)C51编译器从绝对地址8n+3处产生一个中断向量,其中n为中断号,也即interrupt后面的数字。该向量包含一个到中断函数入口地址的绝对跳转。
(7)中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明。防止其它程序调用。
7.有small,compact和large三种存储器模式。Small存储器模式参数及局部变量放入可直接寻址的内部存储器(最大128B,默认存储器类型为data)
compact存储器模式参数及局部变量放入分页外部数据存储器(最大256B,默认存储
器类型为pdata)
large存储器模式参数及局部变量直接放入外部数据存储器(最大64KB,默认存储器类型为xdata)
8. #include
int i;
unsigned char xdata *p=0x2000; /* 指针指向2000H单元 */ for(i=0;i<256;i++) /*清零2000H-20FFH单元*/ {*p=0; p++;} }
9.(1)unsigned char code dis_code[10]={0x3f,0x06,0x5b,0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
(2)unsigned char data TL0_L _at_ 0x30; unsigned char data TH0_H _at_ 0x31; (3)unsigned char idata data_buf[20]; (4)unsigned char xdata data_array[100]; (5)unsigned char bdata status;
sbit flag_lamp1=status^0;
sbit flag_lamp2=status^1; sbit flag_machine1=status^2; sbit flag_machine2=status^3; sbit flag_port1=status^4; sbit flag_port2=status^5; sbit flag_calcu1=status^6; sbit flag_calcu2=status^7;
第五章习题参考答案
1. MCS-51单片机有5个中断源,2 个中断优先级。优先级由软件填写特殊功能寄存器IP加以选择。
2.外部中断请求标志位是IE0和IE1。
3. 8051 单片机响应中断后,产生长调用指令LCALL,执行该指令的过程包括:首先把当前PC的内容压入堆栈,对断点保护,然后把长调用指令的16位地址送PC,使程序转向执行中断入口地址区。
4.8051单片机的IP寄存器功能是设置中断优先级 5.用指令完成下列要求。
⑴.INT1、T0开中断,其余禁止中断; MOV IE, #86H ⑵.全部开中断 MOV IE, #FFH
⑶.INT0、T0开中断,其余保持不变; SETB EA SETB EX0 SETB ET0
⑷.INT1、串行口为高优先级,其余为低优先级; MOV IP, #85H
5.子程序和中断程序有何异同,为什么子程序返回指令RET和中断返回指令RETI不能相互替代?
答:中断类似于子程序设计中的调用子程序,但它们有着本质的区别。调用子程序是程序员事先安排好的,而中断是由一些特殊事件触发的,是随机的。RET功能是恢复堆栈中PC的值,从调用指令的下一条指令开始运行程序,不影响标志位。RETI除了具有RET指令功能外,还清除内部相应的中断状态触发器,因此中断服务程序必须以RETI为指令结束。CPU执行RETI指令后至少再执行一条指令,才能响应新的中断请求,因此不能互换。
1. 外部中断有几种中断触发方式?对跳变触发和电平触发信号有什么要求?如何设置? 答:外部中断有低电平触发和边沿触发两种触发方式。
低电平触发时,施加在相应引脚上的低电平在中断返回前必须撤消,否则将再次申请中断造成出错。即施加在INTi引脚上的低电平持续时间应大于一个机器周期,且小于中断服务程序的执行时间。在边沿触发方式中,为了保证CPU在两个机器周期内能够检测到由高至低跳变的电平,输入的高电平和低电平的持续时间至少要保持12个振荡周期(即一个机器周期的时间)。
通过TCON寄存器的IT1和IT0来设置。ITi设置为“0”时,相应的外部中断为低电平触发方式;设置为“1”时,相应的外部中断为边沿触发方式,
7.为何要在程序的首地址安排一条跳转到主程序的指令?在响应中断的过程中为什么要保护现场?应如何保护?
答:因为程序的首地址与外中断0的入口地址之间只相差3各单元,放不下完整的主程序,一般将主程序放到0030H以后的单元,故要安排一条跳转到主程序的指令。
主程序中通常用到PSW、工作寄存器和特殊功能寄存器等。如果在中断服务程序中要用这些寄存器,会造成这些现场寄存器中数据的混乱,在中断服务前应将它们的内容保护起来称保护现场。通常利用堆栈操作来保护现场。
8. 利用INT0做一个计数器。当INT0有脉冲时,A的内容加1。并且当A的内容大于或等于100时将P1.0置位。
ORG 0000H LJMP MIN0 ORG 0003H LJMP INTB0
ORG 0030H
MIN0: MOV SP,#30H ;主程序 SETB IT0 SETB EX0 SETB EA MOV A,#00 MIN1: NOP
LJMP MIN1 ORG 0100H
INTB0: PUSH PSW ;INT0的中断服务程序 ADD A,#01
CJNE A,#100,INTB1
LJMP INTB2 INTB1:JC INTB3 INTB2:SETB P1.0 INTB3:POP PSW RETI END
第六章习题答案
1.当定时器T0工作在方式3时,要占用定时器T1的TF1和TR1两个控制位。
2.在定时器工作在方式1下,计数器的计数器的宽度为16 位,若fosc=12MHz,最大定时时间为1μs ,若fosc=6MHz,则最大定时时间为2μs 。
3.定时时间与定时器的工作方式、计数初值及晶振频率有关。
4.MCS-51的定时器/计数器作计数器使用时,计数脉冲由外部信号通过引脚P3.4和P3.5提供。
5.MCS-51的定时器/计数器T0门控信号GATE设置为1时,只有INT0引脚为高电平且由软件使TR0置1时,才能启动定时器工作。
6.MCS-51系列单片机内部设有几个定时器/计数器?它们是由哪些专用寄存器组成?有哪几种工作方式?简述各种工作方式的功能特点。
MCS-51单片机内部设有两个16位定时器/计数器T0和T1。分别有的8位计数器TH0、TL0和TH1、 TL1组成,各有4种工作方式。
方式0是一个13位的定时器/计数器。只用了16位寄存器中的高8位(THi)和低5位(TLi的D4~D0位),TLi的高3位未用。
方式1为16位定时器/计数器方式,由THi的8位和TLi的8位构成16位加1计数器, ,当16位计数满溢出时,溢出标志位TFi置“1”。
方式2为8位自动重装计数器。仅TLi作为计数器,而THi的值在计数中不变。TLi溢出时,THi中的值自动装入TLi中。
方式3只适用定时器/计数器T0。T0在该方式下被拆成两个独立的8位计数器TH0和TL0,TL0可作8位的定时器或计数器用,而TH0借用T1的控制位和溢出标志位TR1和TF1,只可用作简单的定时器使用。该方式下T1可用作串行口波特率发生器。
7.MCS-51系列单片机定时器/计数器作定时器或计数器使用时,其计数脉冲分别由谁提供?
作定时器使用时,其实质是在单片机内部对机器周期进行计数,计数脉冲输入信号由内部时钟提供,每一个机器周期计数器自动加1。
作计数器使用时,其实质是对外部事件进行计数,计数脉冲来自相应的外部输入引脚T1或T0,当外部输入脉冲信号由1至0的跳变时,计数器自动加1。
8.采用程序查询方式,由T1产生一个50Hz的方波,从P1.1输出,fosc=12MHz。 解:方波周期T=1/50=0.02s=20ms,用T1定时10ms,计数初值为:
216-10×10-3×12×106/12=65536-10000=55536=D8F0H 源程序如下:
ORG 0000H
LJMP T1BUS ORG 0030H
T1BUS: MOV TMOD,#10H ;T1方式1,定时模式 SETB TRl ;启动T1
相关推荐: