单片机原理与应用及C51程序设计 杨加国主编 完整版答案 - 图文

更新时间:2023-11-02 21:41:02 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

单片机原理与应用及C51程序设计

第一章

第二章

第三章

1.在MCS-51单片机中,寻址方式有几种?其中对片内RAM可以用哪几种寻址方式?对片外RAM可以用哪几种寻址方式?

答:寻址方式可分为数的寻址和指令寻址,数的寻址有:常数寻址(立即寻址)、寄存器数寻址(寄存器寻址)、存储器数寻址(直接寻址方式、寄存器间接寻址方式、变址寻址方式)和位寻址,指令的寻址有绝对寻址和相对寻址。片内RAM寻址有:寄存器寻址、直接寻址方式和寄存器间接寻址方式。片外RAM寻址有:寄存器间接寻址方式。

2.在对片外RAM单元寻址中,用Ri间接寻址与用DPTR间接寻址有什么区别?

答:片外数据存储器寻址中,用Ri间接寻址只能访问低端的256字节单元,而用DPTR作指针间接访问可访问整个64K字节。 3.在位处理中,位地址的表示方式有哪几种?

答:1.直接位地址(00H~0FFH)。例如:20H

2.字节地址带位号。例如:20H.3表示20H单元的3位。 3.特殊功能寄存器名带位号。例如:P0.1表示P0口的1位。

4.位符号地址。例如:TR0是定时/计数器T0的启动位。 4.写出完成下列操作的指令。 (1)R0的内容送到R1中。

MOV A,R0 MOV R1,A

(2)片内RAM的20H单元内容送到片内RAM的40H单元中。

MOV 40H,20H

(3)片内RAM的30H单元内容送到片外RAM的50H单元中。

MOV A,30H MOV R0,#50H MOVX @R0,A

(4)片内RAM的50H单元内容送到片外RAM的3000H单元中。

MOV A,50H MOV DPTR,#3000H MOVX @DPTR,A

(5)片外RAM的2000H单元内容送到片内RAM的20H单元中。

MOV DPTR,#2000H MOVX A,@DPTR MOV 20H,A

(6)片外RAM的1000H单元内容送到片外RAM的4000H单元中。

MOV DPTR,#1000H MOVX A,@DPTR

MOV DPTR,#4000H MOV @DPTR,A

(7)ROM的1000H单元内容送到片内RAM的50H单元中。

MOV A,#0 MOV DPTR,#1000H MOVC A,@A+DPTR MOV 50H,A

(8)ROM的1000H单元内容送到片外RAM的1000H单元中。

MOV A,#0 MOV DPTR,#1000H MOVC A,@A+DPTR MOVX @DPTR,A

5.区分下列指令有什么不同? (1)MOV A,20H和MOV A,#20H

答:前者源操作数是直接寻址,后者源操作数立即寻址。

(2)MOV A,@R1和MOVX A,@R1

答:前者源操作数是访问片内数据存储器,后者源操作数访问片

外数据存储器低256字节。

(3)MOV A,R1和MOV A,@R1

答:前者源操作数是寄存器寻址,后者源操作数寄存器间接寻址。

(4)MOVX A,@R1和MOVX A,@DPTR

答:前者源操作数是访问片外数据存储器低256字节,后者源操

MOV R6,#00 LOOP:

MOVX A,@DPTR

ADD A,R6 MOV R6,A MOV A,R7 ADDC A,#0 MOV R7,A INC

DPTR

DJNZ R2,LOOP SJMP $

18.编程实现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 $

19.编程实现把片内RAM的20H单元的0位、1位,21H单元的2位、3位,22H单元的4位、5位,23H单元的6位、7位,按原位置关系拼装在一起放于R2中。 程序:

MOV C,20H.0 MOV A.0,C MOV C,20H.1 MOV A.1,C MOV C,21H.2 MOV A.2,C MOV C,21H.3 MOV A.3,C MOV C,22H.4 MOV A.4,C

MOV C,22H.5 MOV A.5,C MOV C,23H.6 MOV A.6,C MOV C,23H.7 MOV A.7,C MOV R2,A

20.用查表的方法实现一位十六进制数转换成ASCII。

程序:(设一位十六进制数放在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

21.编程统计从片外RAM2000H开始的100个单元中“0”的个数放于R2中。 程序:

MOV DPTR,#2000H MOV R3,#100 MOV R2,#00

LOOP: JNZ INC

MOVX A,@DPTR NEXT R2 DPTR

NEXT:INC

DJNZ R3,LOOP SJMP $

第四章

4-2有哪里些数据类型是MCS-51系列单片机直接支持的?

答:见P89,基本类型:字符型,整型,长整型,浮点型,特殊功能寄存器;

构造类型:数组类型,结构体类型,共用体,枚举 指针类型 空类型

4-3 C51特有的数据结构类型有哪些? 答:特殊功能寄存器,位类型

4-4 C51的存储类型有几种?它们分别表示的存储器区域是什么? 答:见P94页:存储器类型有:data, bdata,idata,pdata,xdata 4-5 C51中bit位与sbit位有什么区别?

答:bit是定义一个一般的位变量;而使用sbit定义可位寻址字节或是特殊功能寄存器的的位,定义时必指定其位地址,其存储空间为内部RAM中的位寻址区20H-2FH(位地址为:00H~7FH),

4-6 在C51通过绝对地址来访问的存储器有几种方式?

答:使用C51运行库中预定义宏,通过指针访问,使用C51扩展关键字_at_

4-7 在C51中,中断函数与一般函数有什么不同? 答:见P112页:7点

4-8 按指定存储器类型和数据类型,写出下列变量的说明形式 答:(1)在data定义字符变量var11: char data var11 (2)在idata定义整型变量var12: char idata var12

(3)在xdata定义无符号字符数组var11[4]: unsigned char xdata var13[4]

(4) 在 xdata定义一个指向无符号字符的指针px: unsigned char xdata* px

(5)定义可寻址位变量flag: bit flag;

(6)定义特殊功能寄存器变量p3: sfr p3=0xb0 (7) 定义特殊功能寄存器变量SCON:sfr SCON = 0x98 (8)定义16位特殊功能寄存器变量T0:sfr16 T0=0x8a (无法真正与实际相匹配)

4-9 设a=3,b=4,c=5,写出下列关系表达式或逻辑表达式的结果 答: (1) a+b>c && b==c (False) (2) a||b+c&&b-c (True) (3)!(a>b) && !c|| 1 (True)

(4)!(a+b)+c-1&&b+c/2 (True)

4-10 break与continue语句的区别是什么?

答:见P110; 使用break语句可以跳出switch和循环体,提前结束循环而接着执行循环结构下面的语句

continue语句使用在循环体结构中,用于结束本次循环,跳过该语句下面尚未执行的语句,直接进行下一否执行循环的判断。 4-11用分支结构编程实现,输入”1”时显示“A”,输入”2”时显示“B”,输入”3”时显示“C”,输入”4”时显示“D”,输入”5”时结束。 答:#include

#include #define uchar unsigned char #define uint unsigned int uchar I; void main() {

scanf(“%d”,&i); swtch (i) {

case 1: printf(“A”),break; case 2: printf(“B”),break; case 3: printf(“C”),break; case 4: printf(“D”),break; case 5: break;

default: printf(“Error!”); } While(1); }

4-12 输入3无符号数据,要求按由大到小的顺序输出。 解:#include

#include #define uchar unsigned char #define uint unsigned int uint a,b,c; void main() {

uint max, min, med; scanf(\ if (a>b && b>c)

{ max=a; med=b; min=c;} else if (a>b && bc) { max=a; med=c; min=b;} else if (a>b && b

else if (b>a && ba && b>c && a>c) { max=b; med=a; min=c;} else

{ max=b; med=c; min=a;}

printf(\}

4-13 用3种循环结构编写程序实现输出1-10的平方和 解:#include

#include

#define uchar unsigned char #define uint unsigned int uint sum=0; void main {

uchar i,Square; for (i=1;i<=10;i++) {

sum = sum +i*i; }

printf(”sum=%d,”sum); i=1; while (i<=10) {

sum = sum +i*i; i++; }

printf(”sum=%d,”sum); i=1; do {

sum = sum +i*i; i++;

printf(”i%d^2=%d,”i,Square); } while (i>10)

printf(”sum=%d,”sum); }

4-14 对一个5个元素的无符号字符数组按由大到小的顺序输出 解:

#include #include

#define uchar unsigned char #define uint unsigned int uint i, n=5, j, m;

uint a[]={210,108,65,49,72}; void main() {

for (i=1; i

for (j=0; j

if (a[j]

printf(\ for (i=0; i

SETB ET1 SETB TR1 SJMP $

INTT1: MOV TH1,#0D8H

MOV TL1,#0F0H INC R2

CJNE R2,#01H,NEXT SETB P1.1 SJMP EXIT NEXT:

CJNE R2,#02H,NEXT1

CLR P1.1 SJMP EXIT

NEXT1:CJNE R2,#03H,NEXT

SETB P1.1 MOV R2,#00 EXIT: RETI

END

21. 用8051单片机的串行口扩展并行I/O接口,控制16个发光二极管依次发光,画出电路图,用汇编语言和C语言分别编写相应的程序。

解:

采用在串口连接两个CD4094来实现,电路图如下:

CLK STB CLK STB

程序如下; ORG 0000H LJMP MAIN

ORG 0100H

MAIN: MOV SCON,#00H

MOV R4,#10H MOV R3,#00H MOV R2,#01H CLR P1.0 START:MOV A,R3

MOV SBUF,A LOOP:

JNB TI,LOOP

MOV A,R2

LOOP1:JNB TI,LOOP1

SETB P1.0

ACALL DELAY CLR TI CLR C MOV A,R2 RLC A MOV R2,A MOV A,R3 RLC A MOV R3,A CLR P1.0 DJNZ R4,START1 SJMP MAIN DELAY:MOV R7,#05H LOOP2:MOV R6,#0FFH LOOP1:DJNZ R6,LOOP1

DJNZ R7,LOOP2 RET END

22. 用汇编语言编程设计一个8051双机通信系统,将A机的片内RAM中30H~3FH的数据块通过串行口传送到B机的片内RAM的40H~4FH中,并画出电路图。

解:线路连接如图所示。

8051 RXD 甲机 TXD GND 8051 TXD 乙机 RXD GND

分析:甲、乙两机都选择方式1即8位异步通信方式,最高位用作奇偶校验,波特率为1200bps,甲机发送,乙机接收,因此甲机的串口控制字为40H,乙机的串口控制字为50H。

由于选择的是方式1,波特率由定时/计数器T1的溢出率和电源控制寄存器PCON中的SMOD位决定,则需对定时/计数器T1初始化。 设SMOD=0,甲、乙两机的振荡频率为12MHz,由于波特率为1200bps。定时/计数器T1选择为方式2,则初值如下。

初值=256 - fosc×2SMOD /(12×波特率×32)

=256-12000000/(12×1200×32)≈230=E6H

根据要求,定时/计数器T1的方式控制字为20H。 甲机的发送程序:

TSTART: MOV TMOD,#2H MOV TL1,#0E6H MOV TH1,#0E6H MOV PCON,#00H MOV SCON,#40H MOV R0,#30H MOV R7,#10H SETB TR1 LOOP: MOV A,@R0 MOV C,P

MOV ACC.7,C MOV SBUF,A

WAIT: JNB TI,WAIT CLR TI INC R0

DJNZ R7,LOOP RET

乙机的接收程序:

RSTART: MOV TMOD,#2H MOV TL1,#0E6H MOV TH1,#0E6H MOV PCON,#00H MOV R0,#40H MOV R7,#10H SETB TR1 WAIT: JNB RI,WAIT MOV A,SBUF MOV C,P JC ERROR ANL A,#7FH MOV @R0,A INC R0

DJNZ R7,LOOP RET

{

printf(\ } }

4-15 用指针实现输入设备个无符号字符数据按由大到小的顺序输出。 #include #include

#define uchar unsigned char #define uint unsigned int uint i, n=5, j, m;

uint a[]={210,108,65,49,72}; uint *p; void main() { p=a;

for (i=1;i

for (j=0;j

if (*(p+j)<*(p+j+1)) {

m=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=m; } } }

printf(\ for (i=0; i

printf(\ } }

第六章

1. 何为“准双向I/O接口”?在MCS-51单片机的四个并口中,哪些是“准双向I/O接口”?

答:准双向I/O接口是能实现输入输出功能,但在使用时只能从输入和输出中选择一个。MCS-51单片机的四个并口中P1、P2、P3是准双向I/O接口。

2. 80C51单片机内部有几个定时/计数器?它们由哪些功能寄存器组成?怎样实现定时功能和计数功能?

答:80C51单片机内部有两个16位的可编程定时/计数器,由TH0,TL0,TH1,TL1,TMOD和TCON功能寄存器组成。通过TMOD中的C/T

位选择对机器周期计数实现计数功能,选择对外部脉冲计数实现计数功能。

3. 定时/计数器T0有几种工作方式?各自的特点是什么? 答:有四种工作方式,特点见下表: M1 0 0 1 1 0 1 0 1 M0 工作方式 0 1 2 3 方式说明 13位定时/计数器 16位定时/计数器 8位自动重置定时/计数器 两个8位定时/计数器(只有T0有)

4. 定时/计数器的四种工作方式各自的计数范围是多少?如果要计10个单位,不同的方式初值应为多少?

答:有四种方式。方式0计数范围:1~8192;方式1计数范围:1~65536;方式2计数范围:1~256;方式3计数范围:1~256。

如果计10个单位,方式0初值为:8192-10=8182;方式1初

值为:65536-10=65526;方式2初值为:256-10=246;方式2初值为:256-10=246。

5. 设振荡频率为12MHz,如果用定时/计数器T0产生周期为100ms的方波,可以选择哪几种方式,其初值分别设为多少? 答:只能选择方式1,初值为65536-50000=15536。 6. 何为同步通信?何为异步通信?各自的特点是什么?

答:异步通信方式的特点是数据在线路上传送时是以一个字符(字节)为单位,未传送时线路处于空闲状态,空闲线路约定为高电平“1”。特点是对发送时钟和接收时钟的要求相对不高,线路简单,但传送速度较慢。

同步通信方式的特点是数据在线路上传送时以字符块为单位,一次传送多个字符,传送时须在前面加上一个或两个同步字符,后面加上校验字符。特点是对发送时钟和接收时钟要求较高,往往用同一个时钟源控制,控制线路复杂,传送速度快。 7. 单工、半双工和全双工有什么区别?

答:单工方式只有一根数据线,信息只能单向传送;半双工方式也只有一根数据线,但信息可以分时双向传送;全双工方式有两根数据线,在同一个时刻能够实现数据双向传送。

8. 设某异步通信接口,每帧信息格式为10位,当接口每秒传送1000个字符时,其波特率为多少? 答:10000波特

9. 串行口数据寄存器SBUF有什么特点?

答:发送数据寄存器和接收数据寄存器合起用一个特殊功能寄存器SBUF(串行口数据寄存器),执行MOV SBUF,A发送时为发送数据寄存器,执行MOV A, SBUF接收时为接收数据寄存器。

10. MCS-51单片机串行口有几种工作方式?各自特点是什么? 答:有四种工作方式,分别是方式0、方式1、方式2和方式3。其中:

方式0,称为同步移位寄存器方式,一般用于外接移位寄存器芯片扩展I/O接口。

方式1,称为8位的异步通信方式,通常用于双机通信。 方式2和方式3,称为9位的异步通信方式,通常用于多机通信。 11. 说明SM2在方式2和方式3对数据接收有何影响。

答:通过SM2对方式2和方式3数据接收进行控制, SM2=1,那么只有接收的第9位为“1”才接收有效。如SM2=0,接收的第9位无论为1还是0都接收有效。

12. 怎样来实现利用串行口扩展并行输入/输出口?

答:利用串行口在方式0时,当外接一个串入并出的移位寄存器,就可以扩展并行输出口;当外接一个并入串出的移位寄存器时,就可以扩展并行输入口。

13. 什么是中断、中断允许和中断屏蔽?

答:在计算机中,由于计算机内外部的原因或软硬件的原因,使CPU从当前正在执行的程序中暂停下来,而自动转去执行预先安排好的为处理该原因所对应的服务程序。执行完服务程序后,再返回被暂停的位置继续执行原来的程序,这个过程称为中断,实现中断的硬件系统和软件系统称为中断系统。中断允许是允许中断请求送CPU产生中断,中断屏蔽是禁止中断请求信号送CPU产生中断。 14. 8051有几个中断源?中断请求如何提出?

答:MCS-51单片机提供5个硬件中断源:两个外部中断源INT0(P3.2)和INT1(P3.3),两个定时/计数器T0和T1中断;1个串行口中断。

本文来源:https://www.bwwdw.com/article/t552.html

Top