第4章单片机原理课后答案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
TH0=0xD8;TL0=0xf0;
i++;
if (i==100) {P1_1=! P1_1;i=0;}
}
15.8051系统中,已知振荡频率为6MHz,用定时器T0,使P1.0输出周期为400s的方波。用定时器T1,使P1.1输出周期为1ms的方波。要求分别用汇编语言和C语言进行编程。
解:分析:从P1.0输出周期为400s的方波,只须P1.0每200s取反一次则可。当系统时钟为12MHZ,定时/计数器T0工作于方式2时,最大的定时时间为256s,满足200s的定时要求,所以定时/计数器T0选择方式2;
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单元的开始位置,并将原位置清零。
程序:
MOVR0,#20H
MOVDPTR,#20H
MOVR2,#11H
LOOP:MOVXA,@DPTR
MOV @R0,A
MOVA,#00
MOVX@DPTR,A
INCDPTR
INCR0
DJNZR2,LOOP
SJMP$
9.编程将片外RAM的1000H单元开始的50个字节的数据相加,结果存放于R7R6中。
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>//包含特殊功能寄存器库
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;
对于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
答:bit位类型符用于定义一般的位变量,定义的位变量位于片内数据存储器的位寻址区。定义时不能指定地址,只能由编译器自动分配。
sbit位类型符用于定义位地址确定的位变量,定义的位变量可以在片内数据存储器位寻址区,也可为特殊功能寄存器中的可位寻址位。定义时必须指明其位地址,可以是位直接地址,也可以是可位寻址的变量带位号,还可以是可位寻址的特殊功能寄存器变量带位号。
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;
4.在C51中,通过绝对地址来访问的存储器有几种?
答:绝对地址访问形式有三种:宏定义、指针和关键字“_at_”。
5.在C51中,中断函数与一般函数有什么不同?
答:中断函数是C51的一个重要特点,C51允许用户创建中断函数。中断函数用interrupt m修饰符,m的取值为0~31,对应的中断情况如下:

1.C51特有的数据类型有哪些?
答:C51特有的数据类型有位型bit、特殊位型sbit、8位特殊功能寄存器型sfr和16位特殊功能寄存器型sfr16。
2.C51中的存储器类型有几种,它们分别表示的存储器区域是什么?
答:C51中的存储器类型有6种,分别表示的存储器区域是:
data:直接寻址的片内RAM低128B,访问速度快
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
0——外部中断0
1——定时/计数器T0
2——外部中断1
3——定时/计数器T1
4——串行口中断
5——定时/计数器T2
中断函数需要注意如下几点。
(1)中断函数不能进行参数传递
(2)中断函数没有返回值
(3)在任何情况下都不能直接调用中断函数
(4)如果在中断函数中调用了其他函数,则被调用函数所使用的寄存器必须与中断函数相同
解:分析:从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。
}
voidtime0_int(void) interrupt1//定时计数器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:
MOVDPTR,#1000H
MOVR2,#50
MOVR7,#00
MOVR6,#00
LOOP:MOVXA,@DPTR
ADDA,R6
MOVR6,A
MOVA,R7
ADDCA,#0
MOVR7,A
INCDPTR
DJNZR2,LOOP
SJMP$
10.编程实现R4R3R2,结果存放于R7R6R5中。
程序:
ORG0100H
while(1);
}
voidtime0_int(void) interrupt1//定时计数器0中断服务程序
{
P1_0=!P1_0;
}
voidtime0_int(void) interrupt 3//定时计数器1中断服务程序
{
TH1=0XFE;TL1=0x0C;
P1_1=!P1_1;
}
16.8051系统中,已知振荡频率为6MHz,用定时/计数器T1,使P1.1输出高电平宽度为10ms,低电平宽度为20ms的矩形波。要求用C语言进行编程。
从P1.1输出周期为1ms的方波,只须P1.0每0.5ms取反一次则可。当系统时钟为12MHZ,定时/计数器T1工作于方式1时,最大的定时时间为65.536ms,满足0.5ms的定时要求,所以定时/计数器T1选择方式1;
方式控制字应设定为00100001B(21H)。对于T0,定时200s,计数值N为200,初值X=256-200=56,则TH0=38H,TL0=38H。
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语言进行编程。
(5)C51编译器对中断函数编译时会自动在程序开始和结束处加上相应的内容
(6)C51编译器从绝对地址8m+3处产生一个中断向量
(7)中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明
6.按给定的存储类型和数据类型,写出下列变量的说明形式。
(1)在data区定义字符变量val1。
char data varl;
(6)定义特殊功能寄存器变量P3。
sfrP3=0xb0;
(7)定义特殊功能寄存器变量SCON。
sfrSCON=0x98;
(8)定义16位的特殊功能寄存器T0。
sfr16 T0=0x8a;
7.下列程序段汇编后,从2000H单元开始的单元内容是什么?
ORG 2000H
TAB:DB 01H,34H,’a’,’C’
(2)在idata区定义整型变量val2。
int idata var2;
(3)在xdata区定义无符号字符型数组val3[4]。
unsigned char xdataval3[4];
(4)在xdata区定义一个指向char类型的指针px。
char xdata*px;
(5)定义可寻址位变量flag。
bitfllag;
ADDC A,#00
MOV R7,A
SJMP$
11.用查表的方法实现将R2中一位十六进制数转换成ASCII码并放回R2。
程序:(设一位十六进制数放在R2中,轮换的ASCII也放于R2中)
C16STASC:MOVDPTR,#TAB
MOVA,R2
MOVCA,@A+DPTR
MOVR2,A
RET
TAB:DB 30H,31H,32H,33H,34H,35H,36H,37H
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);
}
voidtime0_int(void) interrupt1//中断服务程序
bdata:片内RAM的可位寻址区(20H~2FH),允许字节和位混合访问
idata:间接寻址访问的片内RAM,允许访问全部片内RAM
pdata:用Ri间接访问的片外RAM低256B
xdata:用DPTR间接访问的片外RAM,允许访问全部64KB片外RAM
code:程序存储器ROM64KB空间
3.在C51中,bit位与sbit位有什么区别?
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);
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
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
采用中断处理方式:
程序如下:
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
MUL1:MOV A,R2
MOV B,R3
MUL AB;R2R3,结果的低字节直接存入积的R5
MOV R5,A;结果的高字节存入R6中暂存起来
MOV R6,B
MUL2:MOV A,R2
MOV源自文库B,R4
MUL AB;R2R4,结果的低字节与R6相加后,再存入R6中
ADD A,R6
MOV R6,A
MOV A,B;结果的高字节加上进位位后存入R7中
相关文档
最新文档