完整word版第4章单片机原理课后答案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

习题
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
DPTR
R0
INC
R2,LOOP
DJNZ
SJMP $
9. 编程将片外RAM的1000H单元开始的50个字节的数据相加,结果存放于R7R6中。

MOV DPTR,#1000H
R2MOV ,#50
R7MOV ,#00
#00
MOV
,R6
LOOP:MOVX A,@DPTR
ADD A,R6
MOV R6,A
MOV A,R7
ADDC A,#0
MOV R7,A
INC DPTR
R2,LOOP
DJNZ
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 <reg51.h> //包含特殊功能寄存器库
void delay(unsigned int x);
void main()
{
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
MOV TH0,#0FCH
MOV TL0,#18H
SETB EA
SETB ET0
SETB TR0
SJMP $
END
C语言程序:
#include <reg51.h> //包含特殊功能寄存器库
sbit P1_0=P1^0; //P1口0位定义成位变量P1_0
void main()
{
TMOD=0x01;
TH0=0xFC;TL0=0x18;
EA=1;ET0=1;
TR0=1;
while(1);
}
void time0_int(void) interrupt 1 //定时计数器0中断服务程序
{
TH0=0xFC;TL0=0x18;
P1_0=!P1_0;
}
14. 8051系统中,已知振荡频率为12MHz,用定时/计数器T1,使P1.1输出周期为2s的方波。

要求分别用汇编语言和C语言进行编程。

解:
从P1.1产生2s的方波,应产生500ms的周期性的定时,定时到对P1.1取反就可实现。

由于定时时间较长,一个定时/计数器T1不能直接实现,采用定时/计数器T1产生周期性为10ms的定时,然后用一个寄存器R2对10ms计数100次来实现。

系统时钟为12MHZ,定时/计数器T1定
时10ms,计数值N为10000,只能选方式1,方式控制字为00010000B(10H),初值X:X=65536-10000=55536=1101100011110000B
则TH1=11011000B=D8H,TL1=11110000B=F0H。

定时/计数器T1采用中断处理方式。

汇编程序:
ORG 0000H
LJMP MAIN
ORG 001BH
LJMP INTT1
ORG 0100H
MAIN:MOV TMOD,#10H
MOV TH1,#0D8H
MOV TL1,#0F0H
MOV R2,#00H
SETB EA
SETB ET1
SETB TR1
SJMP $
INTT1:MOV TH1,#0D8H
MOV TL1,#0F0H
INC R2
CJNE R2,#64H,NEXT
CPL P1.1
MOV R2,#00H
NEXT:RETI
END
C语言程序:
#include <reg51.h> //包含特殊功能寄存器库
sbit P1_1=P1^1;
char i;
void main()
{
TMOD=0x01;
TH0=0xD8;TL0=0xf0;
EA=1;ET0=1;
i=0;
TR0=1;
while(1);
}
void time0_int(void) interrupt 1 //中断服务程序
{
TH0=0xD8;TL0=0xf0;
i++;
if (i= =100) {P1_1=! P1_1;i=0;}
}
15. 8051系统中,已知振荡频率为6MHz,用定时器T0,使P1.0输出周期为400?s的方波。

用定时器T1,使P1.1输出周期为1ms的方波。

要求分别用汇编语言和C语言进行编程。

解:分析:从P1.0输出周期为400?s的方波,只须P1.0每200?s取反一次则可。

当系统时钟为12MHZ,定时/计数器T0工作于方式2时,最大的定时时间为256?s,满足200?s的定时要求,所以定时/计数器T0选择方式2;
从P1.1输出周期为1ms的方波,只须P1.0每0.5ms取反一次则可。

当系统时钟为12MHZ,定时/计数器T1工作于方式1时,最大的定时时间为65.536ms,满足0.5ms的定时要求,所
以定时/计数器T1选择方式1;
方式控制字应设定为00100001B(21H)。

对于T0,定时200?s,计数值N为200,初值X=256-200=56,则TH0=38H,TL0=38H。

对于T1,定时0.5ms,计数值N为500,初值X=65536-500=65036,则TH1=FEH,TL1=0CH。

采用中断处理方式:
程序如下:
ORG 0000H
LJMP MAIN
ORG 000BH ;中断处理程序
CPL P1.0
RETI
ORG 001BH ;中断处理程序
MOV TH1,#0FEH
MOV TL1,#0CH
CPL P1.1
RETI
ORG 0100H ;主程序
MAIN:MOV TMOD,#21H
MOV TH0,#38H
MOV TL0,#38H
MOV TH1,#0FEH
MOV TL1,#0CH
SETB EA
SETB ET0
SETB TR0
SETB ET1
SETB TR1
SJMP $
END
C语言程序:
#include <reg51.h> //包含特殊功能寄存器库
sbit P1_0=P1^0; //P1口0位定义成位变量P1_0
sbit P1_1=P1^1; //P1口1位定义成位变量P1_1
void main()
{
TMOD=0x21;
TH0=0x38;TL0=0x38;
TH1=0XFE;TL1=0x0C;
EA=1;ET0=1; ET1=1;
TR0=1; TR1=1;
while(1);
}
void time0_int(void) interrupt 1 //定时计数器0中断服务程序
{
P1_0=!P1_0;
}
//定时计数器1中断服务程序void time0_int(void) interrupt 3
{
TH1=0XFE;TL1=0x0C;
P1_1=!P1_1;
}
16. 8051系统中,已知振荡频率为6MHz,用定时/计数器T1,使P1.1输出高电平宽度为10ms,低电平宽度为20ms的矩形波。

要求用C语言进行编程。

解:
本题处理方式有多种,这里采用对定时/计数器T1形成10ms周期定时,用R2对10ms计数,当计到1,则对P1.1置1,当计到2和3,则对P1.1置0来实现。

用定时/计数器T1形成10ms周
期定时见上题。

程序如下:
ORG 0000H LJMP MAIN
ORG 001BH
LJMP INTT1
ORG 0100H
MAIN:MOV TMOD,#10H
MOV TH1,#0D8H
MOV TL1,#0F0H
MOV R2,#00H
SETB EA
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
C语言程序:
#include <reg51.h> //包含特殊功能寄存器库
sbit P1_1=P1^1;
char i;
void main()
{
TMOD=0x10;
TH1=0xD8;TL1=0xf0;
EA=1;ET1=1;
i=0;
TR1=1;
while(1)
{
if (i= =0) {P1_1=1;}
if (i= =1) {P1_1=0;}
if (i= =2) {P1_1=0;}
}
;
}
void time0_int(void) interrupt 3 //中断服务程序
{
TH1=0xD8;TL1=0xf0;
i++;
if (i= =3) {i=0;}
}
17. 用8051单片机的串行口扩展并行I/O接口,控制16个发光二极管依次发光,画出电路图,用汇编语言和C语言分别编写相应的程序。

解:
采用在串口连接两个CD4094来实现,电路图如下:
程序如下;0000H ORG
MAIN LJMP
0100H
ORG
#00H
SCON,MOV MAIN:
#10H ,MOV R4#00H
R3MOV ,
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
C语言程序:
#include <reg51.h>
void delay(unsigned int x);
union
{
unsigned int word;
struct{unsigned char high;unsigned char low;}bytes; }number;
void main()
{
int i;
SCON=0x00;
while(1)
{
number.word=0x01;
for (i=0;i<16;i++)
{SBUF=number.bytes.low;
while(!TI);
TI=0;
SBUF=number.bytes.high;
while(!TI);
TI=0;
delay(10);
number.word=number.word*2;
}
}
}
void delay(unsigned int x) {
unsigned char j;
while(x--)
{for (j=0;j<125;j++);}
}。

相关文档
最新文档