单片机原理及应用 - 基于Proteus和Keil C 下载本文

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 sbit key1=P1^0; sbit led=P1^2; void main() { bit a;

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 void main( ) { char ch;

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(\