当前位置:首页 > (完整word版)第4章单片机原理课后答案
习 题
1. C51特有的数据类型有哪些?
答:C51特有的数据类型有位型bit、特殊位型sbit、8位特殊功能寄存器型sfr和16位特殊功能
寄存器型sfr16。
2. C51中的存储器类型有几种,它们分别表示的存储器区域是什么? 答:C51中的存储器类型有6种,分别表示的存储器区域是:
data:直接寻址的片内RAM低128B,访问速度快
bdata:片内RAM的可位寻址区(20H~2FH),允许字节和位混合访问 idata:间接寻址访问的片内RAM,允许访问全部片内RAM pdata:用Ri间接访问的片外RAM低256B
xdata:用DPTR间接访问的片外RAM,允许访问全部64KB片外RAM code:程序存储器ROM 64KB空间
3. 在C51中,bit位与sbit位有什么区别?
答:bit位类型符用于定义一般的位变量,定义的位变量位于片内数据存储器的位寻址区。定义时不能指定地址,只能由编译器自动分配。
sbit位类型符用于定义位地址确定的位变量,定义的位变量可以在片内数据存储器位寻址区,也可为特殊功能寄存器中的可位寻址位。定义时必须指明其位地址,可以是位直接地址,也可以是可位寻址的变量带位号,还可以是可位寻址的特殊功能寄存器变量带位号。
4. 在C51中,通过绝对地址来访问的存储器有几种?
答:绝对地址访问形式有三种:宏定义、指针和关键字“_at_”。 5. 在C51中,中断函数与一般函数有什么不同?
答:中断函数是C51的一个重要特点,C51允许用户创建中断函数。中断函数用interrupt m修饰符, m的取值为0~31,对应的中断情况如下: 0——外部中断0 1——定时/计数器T0 2——外部中断1 3——定时/计数器T1 4——串行口中断 5——定时/计数器T2
中断函数需要注意如下几点。 (1) 中断函数不能进行参数传递 (2) 中断函数没有返回值
(3) 在任何情况下都不能直接调用中断函数 (4) 如果在中断函数中调用了其他函数,则被调用函数所使用的寄存器必须与中断函数相同
(5) C51编译器对中断函数编译时会自动在程序开始和结束处加上相应的内容 (6) C51编译器从绝对地址8m+3处产生一个中断向量
(7) 中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明
6. 按给定的存储类型和数据类型,写出下列变量的说明形式。 (1) 在data区定义字符变量val1。
char data varl;
(2) 在idata区定义整型变量val2。
int idata var2;
(3) 在xdata区定义无符号字符型数组val3[4]。 unsigned char xdata val3[4];
(4) 在xdata区定义一个指向char类型的指针px。 char xdata *px;
(5) 定义可寻址位变量flag。 bit fllag;
(6) 定义特殊功能寄存器变量P3。 sfr P3=0xb0;
(7) 定义特殊功能寄存器变量SCON。 sfr SCON=0x98;
(8) 定义16位的特殊功能寄存器T0。
sfr16 T0=0x8a;
7. 下列程序段汇编后,从2000H单元开始的单元内容是什么?
ORG 2000H
TAB:DB 01H,34H,’a’,’C’
DW 5567H,87H
(2000H)=01H; (2001H)=34H; (2002H)=61H; (2003H)=43H; (2004H)=55H; (2005H)=67H; (2006H)=00H; (2007H)=87H;
8. 编程实现将片外RAM的20H~30H单元的内容,全部移到片内RAM的20H单元的开始位置,并将原位置清零。
程序:
MOV R0,#20H MOV DPTR,#20H MOV R2,#11H
LOOP: MOVX A,@DPTR MOV @R0,A MOV A,#00 MOVX @DPTR,A
INC
INC DJNZ
DPTR R0
R2,LOOP
SJMP $
9. 编程将片外RAM的1000H单元开始的50个字节的数据相加,结果存放于R7R6中。
MOV MOV MOV MOV
DPTR,#1000H R2,#50 R7,#00 R6,#00
LOOP: MOVX A,@DPTR ADD A,R6 MOV R6,A MOV A,R7 ADDC A,#0 MOV R7,A
INC DJNZ
DPTR
R2,LOOP
SJMP $
10. 编程实现R4R3?R2,结果存放于R7R6R5中。 程序:
ORG 0100H
MUL1:MOV A,R2
MOV B,R3
MUL AB ;R2?R3,结果的低字节直接存入积的R5 MOV R5,A ;结果的高字节存入R6中暂存起来 MOV R6,B
MUL2:MOV A,R2
MOV B,R4
MUL AB ;R2?R4,结果的低字节与R6相加后,再存入R6中 ADD A,R6 MOV R6,A
MOV A,B ;结果的高字节加上进位位后存入R7中 ADDC A,#00 MOV R7,A
SJMP
$
11. 用查表的方法实现将R2中一位十六进制数转换成ASCII码并放回R2。
程序:(设一位十六进制数放在R2中,轮换的ASCII也放于R2中) C16STASC:MOV DPTR,#TAB MOV A,R2 MOVC A,@A+DPTR MOV R2,A RET
TAB:DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,391H,41H,42H,43H,44H,45H,46H
12. 设8051的P1中各位接发光二极管,分别用汇编语言和C语言编程实现逐个轮流点亮二极管,并循环显示。
参考程序:
ORG 0000H LJMP MAIN
ORG 0100H ;主程序
MAIN: MOV A,#01H LOOP:MOV P1,A CALL DELAY RL A
SJMP LOOP SJMP $
DELAY:MOV R7,#0FFH DJNZ R7,$
RET
END C语言程序:
#include
unsigned char i,j; while(1) {i=01;
for (j=0;j<8;j++)
{P1=i;
delay(100); i=i*2; }
} }
void delay(unsigned int x) {
unsigned char j; while(x--)
{for (j=0;j<125;j++);} }
13. 8051系统中,已知振荡频率为12MHz,用定时/计数器T0,使P1.0输出周期为2ms的方波。要求分别用汇编语言和C语言进行编程。
解:分析:从P1.0输出周期为2ms的方波,只须P1.0每1ms取反一次则可。当系统时钟为12MHZ,定时/计数器T0工作于方式1时,最大的定时时间为65.536ms,满足1ms的定时要求,方式控制字应设定为00000001B(01H)。定时1ms,计数值N为1000,初值X=65536-1000=64536,则TH0=FCH,TL0=18H。
采用中断处理方式: 程序如下:
ORG 0000H LJMP MAIN
ORG 000BH ;中断处理程序 MOV TH0,#0FCH MOV TL0,#18H
CPL P1.0 RETI
ORG 0100H ;主程序
MAIN: MOV TMOD,#01H
共分享92篇相关文档