INC DPTR DJNZ R3,LOP
7. 已知A=83H,R0=17H,(17H)=34H,写出下列程序段执行完后的A中的内容。
ORL A, #17H ANL 17H, A XRL A, @R0 CPL A
(A)=11001011B=0CBH
8. 已知单片机的fosc=6MHz,分别设计延时0.1s、1s、1min的子程序。
这里取单片机常用的晶振频率为12MHz,一个机器周期为1μs。 (若fosc=6MHz,读者可参考下列程序修改)
延时1ms的子程序:
DELAY: MOV R7, #0FFH LOOP: NOP NOP DJNZ R7, LOOP RET
执行时间(机器周期) 1 1 1 2 2
该程序段的总的执行时间为:
(1+4×255+2)?s=1023μs≈1ms
延时时间为100ms的子程序:
DELAY: LOP1: LOOP:
MOV R5,#64H 对延时1ms的子程序循环100次。
MOV R7, #0FFH NOP NOP DJNZ R7, LOOP DJNZ R5,LOP1 RET
延时时间为1s的子程序:
DELAY1: MOV R3, #0AH 对延时100ms的子程序循环10次 DELAY:
LOP1: LOOP:
MOV R5,#64H 。
MOV R7, #0FFH NOP NOP DJNZ R7, LOOP DJNZ R5,LOP1
DJNZ R3, DELAY RET
延时时间为60s的子程序: 对延时1s的子程序循环60次 9. MCS-51汇编语言中有哪些常用的伪指令?各起什么作用? BIT(地址符号命令)
END(结束汇编) EQU(等值) DB(定义字节)
DW(定义字)
DS(定义存储单元) ORG(汇编起始地址)
10. 比较下列各题中的两条指令是否相同,若不同,请指出其区别?
① MOV A, R1; ② MOV A, P0;
LOOP; ③ LOOP: SJMP
MOV ACC, R1 指令功能相同,寻址方式表示不同
MOV A, 80H 指令功能相同,寻址方式表示不同 SJMP $ 指令功能相同
11. 下列程序段汇编后,从3000H开始各有关存储单元的内容是什么?
ORG 3000H
TAB1 EQU 1234H TAB2 EQU 5678H DB 65,13,\ DW TAB1,TAB2,9ABCH ORG TAB1: TAB2:
3000H
EQU EQU DB DW
1234H 5678H
65,13,\
TAB1,TAB2,9ABCH
3000H: 65 3001H: 13 3002H: ?A? 3003H: 34H 3004H: 12H 3005H: 78H 3006H: 56H 3007H: BCH 3008H: 9AH
12. 为了提高汇编语言程序的可读性和编译效率,在编写时应注意哪些问题? (1) 把要解决的问题化成一个个具有一定独立性的功能模块,各模块尽量采用子程序完成其功能。
(2) 力求少用无条件转移指令,尽量采用循环结构。
(3) 对主要的程序段要下功夫精心设计,这样会收到事半功倍的效果。 (4) 能用8位数据解决问题的就不要使用16位数据。 (5) 累加器是信息传递的枢纽,在调用子程序时应通过累加器传送子程序的参数,通过累加器向主程序传送返回参数。所以,在子程序中一般不把累加器推入堆栈。若需保护累加器的内容时,应先把累加器的内容存入其他寄存器单元,然后再调用子程序。
(6)为了保证程序运行的安全可靠,应考虑使用软件抗干扰技术,如数字滤波技术、指令冗余技术、软件陷井技术,用汇编语言程序实现这些技术,不需要增加硬件成本,可靠性高,稳定性好,方便灵活。
13. 有一输入设备,其端口地址为20H,要求在1秒钟时间内连续采样10次读取该端口数据,求其算术平均值,结果存放在内部RAM区20H单元。
MOV R0,#20H MOV R2,#0 MOV A,#0 MOV R4,#0 LOP : MOV R3,#0AH
IN : ACALL DELAY
MOVX A, @R0 MOV R2 , A MOV A, R4 ADD A, R2 MOV R4, A DJNZ R3, IN MOV B,#0AH DIV AB MOV 20H,A
AJMP LOP
DELAY: MOV R5,#64H 延时时间为0.1s的子程序:
LOP1: MOV R7, #0FFH LOOP: NOP NOP DJNZ R7, LOOP
DJNZ R5,LOP1
RET END
14. 现需对外部某2个信号进行异或操作,请使用单片机完成其要求。 MOV DPTR,#2000H MOVX A,@DPTR MOV 20H, A INC DPTR
MOVX A, @DPTR XRL A,20H
15. 简单说明两条查表指令使用上的区别。 查表是程序设计中使用的基本方法。只要适当地组织表格,就可以十分方便地利用表格进行多种代码转换和算术运算等。
MOVC A,@A+PC与MOVC A, @A+DPTR两条指令的区别: 前者查表的范围与存放该指令的地址有关,由于PC的值已经确定及8位累加器A的限制,数据表格只能存放在该指令后面的256个字节单元之内。而后者查表范围通过改变DPTR的值可达整个程序存储器64KB的任何地址空间(即DPTR的值为表格的首地址),其数据表格可以为各个程序模块共享。
将要查表的数据字作为偏移量送累加器A中,通过改变变址寄存器A的内容即可改变表格中的位置,执行该指令即可获得所需的内容(即将该位置单元的内容传送给A)。因此,可以根据需要设计表格的内容,将A的内容实现换码。
第4章
1. C51扩展了哪些数据类型?
sbit sfr sfr16 bit
2. 简述C51存储器类型关键字与8051存储空间的对应关系。 程序存储器(code)
内部数据存储器:
data 内部RAM直接寻址128B(0x00~0x7F) idata 内部RAM间接寻址256B(0x00~0xFF)
bdata 内部RAM 16B(0x20~0x2F)的128位进行位寻址 外部数据存储器:
xdata 外部存储器64KB的任何单元 pdata 访问外部存储器(一页)低256B
3. 在定义int a=1,b=1后,分别指出表达式b=a、b=a++和b=++a执行后变量a和b的值。
b=a;
b=a++; a=2 b=1 b=++a; a=2 b=2
4. 用C51编程实现当P1.0输入为高电平时,P1.2输出控制信号灯点亮。
#include
for( ; ; ) {key1=1; a=key1;
if(a) led=1; else led=0; } while(1); }
5. 使用选择结构编写程序,当输入的数字为“1”、“2”、“3”、“4”时,输出显示“A”、“B”、“C”、“D”,当输入数字“0”时,程序结束。
#include
SCON=0x52; /*对串口实现初始化,以便调试时调用scanf()和printf()*/ TMOD=0x20; /*在keil c串行窗口#0中输入或显示数据*/
TH1=0Xf3; /*若不使用scanf()和printf()函数,则程序中不需要蓝色语句*/
TR1=1;
printf(\请输入:\ while(1)
{ scanf(\ switch(ch) {
case ?1? : printf(\ case ?2? : printf(\
case ?3? : printf(\