第4章单片机原理课后答案可编辑修改word版.docx
- 文档编号:29319940
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:14
- 大小:32.31KB
第4章单片机原理课后答案可编辑修改word版.docx
《第4章单片机原理课后答案可编辑修改word版.docx》由会员分享,可在线阅读,更多相关《第4章单片机原理课后答案可编辑修改word版.docx(14页珍藏版)》请在冰豆网上搜索。
第4章单片机原理课后答案可编辑修改word版
习题
1.C51特有的数据类型有哪些?
答:
C51特有的数据类型有位型bit、特殊位型sbit、8位特殊功能寄存器型sfr和16位特殊功能寄存器型sfr16。
2.C51中的存储器类型有几种,它们分别表示的存储器区域是什么?
答:
C51中的存储器类型有6种,分别表示的存储器区域是:
data:
直接寻址的片内RAM低128B,访问速度快
bdata:
片内RAM的可位寻址区(20H~2FH),允许字节和位混合访问idata:
间接寻址访问的片内RAM,允许访问全部片内RAMpdata:
用Ri间接访问的片外RAM低256B
xdata:
用DPTR间接访问的片外RAM,允许访问全部64KB片外RAMcode:
程序存储器ROM64KB空间
3.在C51中,bit位与sbit位有什么区别?
答:
bit位类型符用于定义一般的位变量,定义的位变量位于片内数据存储器的位寻址区。
定义时不能指定地址,只能由编译器自动分配。
sbit位类型符用于定义位地址确定的位变量,定义的位变量可以在片内数据存储器位寻址区,也可为特殊功能寄存器中的可位寻址位。
定义时必须指明其位地址,可以是位直接地址,也可以是可位寻址的变量带位号,还可以是可位寻址的特殊功能寄存器变量带位号。
4.在C51中,通过绝对地址来访问的存储器有几种?
答:
绝对地址访问形式有三种:
宏定义、指针和关键字“_at_”。
5.在C51中,中断函数与一般函数有什么不同?
答:
中断函数是C51的一个重要特点,C51允许用户创建中断函数。
中断函数用interruptm修饰符,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。
chardatavarl;
(2)在idata区定义整型变量val2。
intidatavar2;
(3)在xdata区定义无符号字符型数组val3[4]。
unsignedcharxdataval3[4];
(4)在xdata区定义一个指向char类型的指针px。
charxdata*px;
(5)定义可寻址位变量flag。
bitfllag;
(6)定义特殊功能寄存器变量P3。
sfrP3=0xb0;
(7)定义特殊功能寄存器变量SCON。
sfrSCON=0x98;
(8)定义16位的特殊功能寄存器T0。
sfr16T0=0x8a;
7.下列程序段汇编后,从2000H单元开始的单元内容是什么?
ORG2000H
TAB:
DB01H,34H,’a’,’C’
DW5567H,87H
(2000H)=01H;(2001H)=34H;(2002H)=61H;(2003H)=43H;(2004H)=55H;(2005H)=67H;(2006H)=00H;(2007H)=87H;
8.编程实现将片外RAM的20H~30H单元的内容,全部移到片内RAM的20H单元
的开始位置,并将原位置清零。
程序:
MOVR0,#20HMOVDPTR,#20HMOVR2,#11H
LOOP:
MOVXA,@DPTRMOV@R0,A
MOV
A,#00
MOVX
@DPTR,A
INC
DPTR
INC
R0
DJNZ
R2,LOOP
SJMP
$
9.编程将片外RAM的1000H单元开始的50个字节的数据相加,结果存放于R7R6
中。
MOVDPTR,#1000HMOVR2,#50
MOVR7,#00
MOVR6,#00
LOOP:
MOVXA,@DPTRADDA,R6
MOVR6,A
MOVA,R7
ADDCA,#0MOVR7,A
INCDPTRDJNZR2,LOOPSJMP$
10.编程实现R4R3⨯R2,结果存放于R7R6R5中。
程序:
ORG0100HMUL1:
MOVA,R2
MOVB,R3
MULAB;R2⨯R3,结果的低字节直接存入积的R5MOVR5,A;结果的高字节存入R6中暂存起来
MOVR6,BMUL2:
MOVA,R2
MOVB,R4
MULAB;R2⨯R4,结果的低字节与R6相加后,再存入R6中ADDA,R6
MOVR6,A
MOVA,B;结果的高字节加上进位位后存入R7中ADDCA,#00
MOVR7,ASJMP$
11.用查表的方法实现将R2中一位十六进制数转换成ASCII码并放回R2。
程序:
(设一位十六进制数放在R2中,轮换的ASCII也放于R2中)C16STASC:
MOVDPTR,#TAB
MOVA,R2
MOVCA,@A+DPTRMOVR2,A
RET
TAB:
DB30H,31H,32H,33H,34H,35H,36H,37HDB38H,391H,41H,42H,43H,44H,45H,46H
12.设8051的P1中各位接发光二极管,分别用汇编语言和C语言编程实现逐个轮流点亮二极管,并循环显示。
参考程序:
ORG0000HLJMPMAIN
ORG0100H;主程序
MAIN:
MOVA,#01HLOOP:
MOVP1,A
CALLDELAYRLA
SJMPLOOPSJMP$
DELAY:
MOVR7,#0FFH
DJNZR7,$RET
END
C语言程序:
#include
voidmain()
{
unsignedchari,j;while
(1)
{i=01;
for(j=0;j<8;j++)
{P1=i;
delay(100);i=i*2;
}
}
}
voiddelay(unsignedintx)
{
unsignedcharj;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。
采用中断处理方式:
程序如下:
ORG0000HLJMPMAIN
ORG000BH;中断处理程序
MOVTH0,#0FCHMOVTL0,#18HCPLP1.0
RETI
ORG0100H;主程序
MAIN:
MOVTMOD,#01HMOVTH0,#0FCHMOVTL0,#18HSETBEA
SETBET0SETBTR0
SJMP$END
C语言程序:
#include
sbitP1_0=P1^0;//P1口0位定义成位变量P1_0voidmain()
{TMOD=0x01;
TH0=0xFC;TL0=0x18;EA=1;ET0=1;
TR0=1;
while
(1);
}
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:
X=65536-10000=55536=1101100011110000B
则TH1=11011000B=D8H,TL1=11110000B=F0H。
定时/计数器T1采用中断处理方式。
汇编程序:
ORG0000HLJMPMAIN
ORG001BHLJMPINTT1
ORG0100H
MAIN:
MOVTMOD,#10H
MOV
TH1,#0D8H
MOV
TL1,#0F0H
MOV
R2,#00H
SETB
EA
SETB
ET1
SETB
TR1
SJMP$
INTT1:
MOVTH1,#0D8H
MOVTL1,#0F0HINCR2
CJNER2,#64H,NEXT
CPLP1.1
MOVR2,#00HNEXT:
RETI
END
C语言程序:
#include
chari;
voidmain()
{TMOD=0x01;
TH0=0xD8;TL0=0xf0;EA=1;ET0=1;
i=0;
TR0=1;
while
(1);
}
voidtime0_int(void)interrupt1//中断服务程序
{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。
采用中断处理方式:
程序如下:
ORG0000HLJMPMAIN
ORG000BH;中断处理程序
CPLP1.0RETI
ORG001BH;中断处理程序
MOVTH1,#0FEHMOVTL1,#0CHCPLP1.1
RETI
ORG0100H;主程序
MAIN:
MOVTMOD,#21HMOVTH0,#38HMOVTL0,#38HMOVTH1,#0FEHMOVTL1,#0CHSETBEA
SETBET0SETBTR0SETBET1SETBTR1SJMP$END
C语言程序:
#include
sbitP1_0=P1^0;//P1口0位定义成位变量P1_0
sbitP1_1=P1^1;//P1口1位定义成位变量P1_1voidmain()
{TMOD=0x21;
TH0=0x38;TL0=0x38;TH1=0XFE;TL1=0x0C;EA=1;ET0=1;ET1=1;TR0=1;TR1=1;
while
(1);
}
voidtime0_int(void)interrupt1//定时计数器0中断服务程序
{
P1_0=!
P1_0;
}
voidtime0_int(void)interrupt3//定时计数器1中断服务程序
{
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周期定时见上题。
程序如下:
ORG0000HLJMPMAIN
ORG001BHLJMPINTT1
ORG0100H
MAIN:
MOVTMOD,#10H
MOV
TH1,#0D8H
MOV
TL1,#0F0H
MOV
R2,#00H
SETB
EA
SETB
ET1
SETB
TR1
SJMP
$
INTT1:
MOV
TH1,#0D8H
MOV
TL1,#0F0H
INCR2
CJNER2,#01H,NEXTSETBP1.1
SJMPEXIT
NEXT:
CJNER2,#02H,NEXT1CLRP1.1
SJMPEXITNEXT1:
CJNER2,#03H,NEXT
SETBP1.1MOVR2,#00
EXIT:
RETI
END
C语言程序:
#include
chari;voidmain()
{
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;}
}
;
}
voidtime0_int(void)interrupt3//中断服务程序
{
TH1=0xD8;TL1=0xf0;i++;
if(i==3){i=0;}
}
17.用8051单片机的串行口扩展并行I/O接口,控制16个发光二极管依次发光,画出电路图,用汇编语言和C语言分别编写相应的程序。
解:
采用在串口连接两个CD4094来实现,电路图如下:
程序如下;ORG0000HLJMPMAIN
ORG0100HMAIN:
MOVSCON,#00H
MOVR4,#10HMOVR3,#00HMOVR2,#01HCLRP1.0
START:
MOVA,R3
MOVSBUF,A
LOOP:
JNBTI,LOOP
MOVA,R2LOOP1:
JNBTI,LOOP1
SETBP1.0ACALLDELAYCLRTI
CLRC
MOVA,R2RLCAMOVR2,AMOVA,R3RLCAMOVR3,ACLRP1.0
DJNZR4,START1SJMPMAIN
DELAY:
MOVR7,#05H
LOOP2:
MOVR6,#0FFHLOOP1:
DJNZR6,LOOP1
DJNZR7,LOOP2RET
END
C语言程序:
#include
voiddelay(unsignedintx);union
{
unsignedintword;
struct{unsignedcharhigh;unsignedcharlow;}bytes;
}number;
voidmain()
{
inti;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;
}
}
}
voiddelay(unsignedintx)
{
unsignedcharj;while(x--)
{for(j=0;j<125;j++);}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 原理 课后 答案 编辑 修改 word