单片机部分习题答案资料Word文档格式.docx
- 文档编号:16350880
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:18
- 大小:32.47KB
单片机部分习题答案资料Word文档格式.docx
《单片机部分习题答案资料Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机部分习题答案资料Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
1个中断检测周期,5个执行RETI的周期,8个执行DIV指令的周期,4个对ISR的调用周期(LCALL)。
9、C8051F020单片机的外部RAM有片内和片外之分,如何实现片外的RAM?
复用与非复用方式的外部RAM是什么意思?
数据总线和地址总线是如何连接的?
通过外部数据存储器接口EMIF实现片外数据存储器,用并行口P0-P3或P4-P7实现数据总线和地址总线,数据线和地址线可以复用也可以非复用,由EMIOCF控制。
复用是指数据总线和地址总线的低8位共用一组端口信号线。
非复用是指数据总线和地址总线的低8位各用单独的一组端口信号线。
若用低端端口实现,复用时用P2口提供地址高8位,P3口提供地址低8位和数据线;
非复用时用P1口提供高8位地址线,P2口提供地址线低8位,P3口提供数据线。
若用高端端口实现,非复用则用P5、P6提供地址高、低8位,P7做数据线,复用则用P6提供地址线高8位,P7提供地址低8位和数据线。
10.什么是优先权交叉开关译码器?
C8051F020单片机有多少数字I/O口?
C8051F单片机的引脚与片内资源是如何对应的?
C8051F单片机没有为定时器、串行口、A/D、D/A等提供单独的引脚信号线,而是用并行口P0-P3提供,C8051F单片机允许使用部分数字和模拟外设,没有用到的就不用分配引脚信号,因此内部提供了一个优先交叉开关译码电路,实现P0-P3和这些资源的可编程连接,这就是优先交叉开关译码器。
C8051F单片机有64位数字I/O端口。
其中P0-P3可以按照优先交叉开关译码的方式为片内资源分配引脚,用端口I/O交叉开关寄存器XBR0-XBR2实现。
11、假如一个单片机应用系统中要用到的资源位UART0、SMBus、SPI、和CP0分配端引口(共9个引脚)。
另外将外部存储器解耦配置为复用方式并使用低端口。
同时还将P1.2、P1.3、P1.4配置为模拟输入,以便用ADC1测量加在这些引脚上的电压。
试用Config软件进行优先权交叉开关译码器的配置,写出配置步骤,配置XBR0~XBR2等相关SFR的值。
(1)按UART0EN=1(XBR0.2)、SMB0EN=1(XBR0.0)、SPI0EN=1(XBR0.1)、CP0E=1(XBR0.7)、EMIFLE=1(XBR2.1)设置XBR0、XBR1、XBR2得XBR0=0x87、XBR1=0x00、XBR2=0x02;
(2)存储器接口配置为复用方式并使用低端口,有PTRSEL=0(EMIOCF.5)、EMD2=0(EMIOCF.4);
(3)P1.2~P1.4配置为模拟输入方式有:
P1MDIN=0xe3;
(4)设置XBARE=1使能交叉开关,则XBR2=0x42。
UART0优先级最高,P0.0、P0.1分配给TX0、RX0;
SPI优先权次之,P0.2~P0.4分配给SCK、MISO、MOSI、P0.5~P0.7分配给ALE、/RD、/WR、P1.0分配给NSS;
下一个优先的是SMBUS,P1.1分配给SDA、P1.2~P1.4做模拟量输入,跳过,P1.5分配给SCL;
再下面的优先权是CP0,P1.6分配给CP0;
(5)UART0的TX0(P0.0)、ALE(P0.5)、/RD(P0.6)、/WR(P0.7)的输出设置为推挽方式,P0MDOUT=0xe1;
(6)P2、P3设置为推挽方式P2MDOUT=0xff、P3MDOUT=0xff;
(7)P1设置为漏极开路方式,并禁止3个模拟输入的输出驱动:
P1MDOUT=0x00、P1=0xff。
13、8051F单片机进入空闲方式时,单片机的振荡器是否工作?
采用何种方法能使单片机退出空闲方式?
工作。
复位或中断。
14、C8051F020有几个复位源,分别是什么?
自己的项目中最常使用的是什么复位源?
7个:
上/电复位、外部/RST引脚复位、外部CNVSTR信号复位、软件命令复位、比较器0复位、时钟丢失检测器复位、WatchDog超时复位。
15、再简单的试验程序中,如果看门狗定时器复位不使用,该如何禁用?
向WDTCN写入0xDE后,4个系统时钟周期内再写入0xAD。
该过程不应被中断。
C51代码:
EA=0;
//禁止中断
WDTCN=0xDE;
WDTCN=0xAD;
EA=1;
//允许中断
第三章:
1、片外RAM从1000H~10FFH单元有一数据块,用汇编语言编写程序将其传送到片外RAM的2500H单元开始的区域中。
ORG0000H
SJMPMAIN
ORG0100H
MAIN:
MOVR4,#0
MOVDPL,#0
NEXT:
MOVDPH,#10H
MOVXA,@DPTR
MOVDPH,#25
MOVX@DPTR,A
INCDPL
DJNZR4,NEXT(CJNEDPL,#0,NEXT)
SJMP$
END;
若两个区域的低8位地址不同,该方法不可以
$INCLUDE(C8051F020.INC)
org0000h
movdptr,#1000h
movEMIOCN,#25H
movr2,#0H
movr0,#00H
loop:
movxa,@dptr
movx@r0,a
incdptr
incr0
djnzr2,loop
sjmp$
end
$INCLUDE(C8051F020.INC)
movr2,#256(movr2,#0)
movr3,#25h
movr4,#00h
pushdph
pushdpl或者
movdph,r3
movdpl,r4
movx@dptr,A
popdpl
popdph
incr4
3、用汇编语言编写将累加器A的一位十六进制数(A的高4位为0)转换为ASC
码的程序,转换结果仍存放在累加器A中,要求用查表和非查表两种方式实现。
ADDA,#30H
CJNEA,#3AH,CONT
CONT:
JNCADD7
JMPEXIT
ADD7:
ADDA,#7
EXIT:
END
4、用汇编语言编程实现函数,设x的值存放在片内RAM的35H单元,y的值存放在片内RAM的36H单元。
y=x+1,x>
10;
0,5<
=x<
=10;
-1,x<
5
MOVA,35H;
取x
CJNEA,#11,NEXT1;
与11比较,不等于11,转NEXT1
NEXT1:
JNCNEXT2;
大于等于11,转NEXT2
CJNEA,#5,NEXT3;
小于11,再与5比较,不等于5转NEXT3
NEXT3:
JNCNEXT4;
无借位(大于等于5),转NEXT4
MOVA,#-1;
小于5
AJMPNEXT5
补充:
符号函数
MOVA,35H
JZDONE
JNBACC.7,POSI
MOVA,#-1(0FFH)
SJMPDONE
POSI:
MOVA,#1
DONE:
MOV36H,A
END
或
MOVR0,#0FFH
JBACC.7,NEG
MOVR0,#01H
NEG:
MOVA,R0
NEXT4:
MOVA,#0;
5到10之间
NEXT2:
ADDA,#1;
大于10
NEXT5:
MOV36H,A
SJMP$
END
或(同学作业):
XEQU35H
YEQU36H
AJMPSTART
START:
MOVA,X
CLRC
SUBBA,#05H
JNCNEXT
MOVY,#0FFH
AJMPDONE
SUBBA,#0BH
JNCNEXT1
MOVY,#00H
INCA
MOVY,A
XDATA30H
YEQU20H
MOVDPTR,#TAB
MOVSP,#3FH
MOVR1,#X
MOVA,R0
LOOP:
MOVB,02H
DIVAB
PUSHACC
MOVA,B
MOVCA,@A+DPTR
MOV@R1,A
POPACC
INCR1
INCY
JNBY.3,LOOP
TAB
:
DB‘0’,’1’
6、用汇编语言编写程序,将R0中的8位二进制数的各位用其ASC
码表示,结果保存到片内RAM的30H开始的单元中。
MOVR1,#30H
MOVR7,#8
MOVA,R0
RLCA
JC0NE
MOV@R1,#30H
JMPEXIT或者
ONE:
MOV@R1,#31H
EXIT:
INCR1
DJNZR7,NEXT
11、用汇编语言编程求两个无符号数据块中最大值的乘积。
数据块的首地址分别为片内RAM的60H和70H,每个数据块的第一字节用来存放数据块的长度。
结果存入片内
MOVR0,#60H
ACALLMAX
MOVB,A;
第一个数据块最大值
MOVR0,#70H
MULAB;
两个数据块最大值相乘
MOV5FH,B
MOV5EH,A
MAX:
MOVA,@R0;
数据块长度
DECA
MOVR7,A
INCR0
MOVA,@R0;
第一个数据
CLRC
MOVB,A
MOVA,@R0
SUBBA,B;
两个比较,也可以用CJNE实现
SJMPNEXT1
ADDA,B
DJNZR7,LOOP(下一行)RET
第4章:
5.利用C8051F020单片机的T0计数,每计10个脉冲,P1.0取反一次,试用查询和中断两种方式编程。
确定工作方式,计算初值:
选方式2计数方式,初值=256-10=246=0xf6;
查询方式程序:
sbitP1_0=P1^0;
voidmain(void)
{
//关看门狗
WDTCN=0xde;
WDTCN=0xad;
//配置交叉开关
XBR1=0x02;
//允许T0外部输入
XBR2=0x40;
//使能交叉开关
//初始化定时器0
TMOD=0x06;
//方式2计数
TL0=OxF6;
TH0=OxF6;
TR0=1;
//启动T0
While
(1)
While(!
TF0);
//等待计数溢出
TF0=0;
P1_0=!
P1_0;
}
IE|=0x82;
//允许T0中断
While
(1);
//等待中断
voidT0_ISR(void)interrupt1
P1_0=!
中断方式程序:
XBR2=0X40;
8.在C8051F020单片机中,已知系统时钟频率为12MHz,编写程序使P1.0和P1.1分别输出周期为2ms和50μs的方波。
解:
P1.0和P1.1分别每1ms和25μs取反一次即可。
选T0方式1定时25μs,每溢出40次P1.0取反一次。
初值计算:
由P157公式:
,选T0M=0得:
a=216-25=65511=0xffe7;
程序:
sbitP1_1=P1^1;
intcount=40;
TMOD=0x01;
//方式1定时
TL0=0xe7;
TH0=0xff;
TL0|=0xe7;
Count--;
If(Count==0){P1_1=!
P1_1;
Count=40;
15.当C8051F020的串行口工作在方式2、3时,它的第9数据位可用作“奇偶校验位”进行传送,接收端用它来核对接收到的数据正确与否。
试编写串行口方式2带奇偶校验的发送和接收程序。
发送程序:
voidsend(charch)
ACC=ch;
TB80=P;
SBUF0=ch;
While(!
TI0);
TI0=0;
接收程序:
charreceive(void)
While(!
RI0);
RI0=0;
ACC=SBUF0;
If(RB80==P)returnch;
16.设甲乙两机采用UART0方式1通信,波特率为4800,甲机发送0、1、2…、1FH,乙机接受并存放在内部RAM以20H为首地址的单元,试用查询和中断两种方式编写甲、乙两机的程序(系统时钟为12MHz)
设利用T1工作在定时方式2(自动重装初值)提供波特率,T1M=0(按振荡器12分频)计数,SMOD0=0,T1初值计算如下:
X=256-
=256-
=250=FAH
#include<
c8051f020.h>
unsignedcharxdatatbuf[]={0x0,0x1,…,0x1f};
unsignedchari;
unsignedcharxdata*p=tbuf;
XBR0=0x04;
//配置交叉开关
P0MDOUT|=0x01;
//TX0(P0.0)为推挽输出方式
TMOD=0x20;
//初始化并启动T1
TH1=0xfa;
TL1=0xfa;
TR1=1;
SCON0=0x40;
//UART0初始化
for(i=0;
i<
32;
i++)
{
SBUF0=*p;
//一字节送发送SBUF0
p++;
while(!
//等待发送完成
TI0=0;
查询方式接收程序:
unsignedchari;
chardata*p;
//发送数据块地址指针
SCON0=0x50;
//UART0初始化,允许接收
p=0x20;
//地址指针初始化
//等待UART0接收一个字符
RI0=0;
*p=SBUF0;
//放入接收缓冲区
}
……参考P195例4.7
正弦波发生器程序:
DAC0输出更新发生在写DAC0H时:
#include<
math.h>
sfr16DAC0=0xd2
voiddac0_init(void);
uninsignedinti;
floatx,y;
dac0_init();
//DAC0初始化
while
(1)
for(x=0;
x<
(2*3.14159);
x+=0.1)
//12位DAC的数字容量为4K(0-0FFFH),y的值最大为4096
y=2048*(sin(x)+1);
DAC0=y;
//设置待转换的值并启动DA转换
for(i=0;
=200;
i++);
//延时可改变正弦波的周期
voiddac0_int(void)
REF0CN=0x03;
DAC0CN|=0x08;
方波输出:
定时器T3溢出时DAC更新。
sfr16TMR3RL=0x92;
srf16DAC0=0xd2;
#defineSYSCLK2000000
voidTimer3_Init(intcounts);
voidTimer3_ISR(void);
voidDAC_Init(void);
unsignedinti;
WDTCN=0xde;
Timer3_Init(SYSCLK/12/5);
DAC_Init();
EA=1;
DAC0L=0xf0;
//设置待转换的值0FF0H
DAC0H=0x0f;
for(i=0;
100;
DAC0L=0x0;
//设置待转换的值0000H
DAC0H=0x0;
voidDAC_init(void)
REF0CN=0x03;
//内部偏压发生器和电压基准缓冲器工作
DAC0CN|=0x88;
//使能DAC0,T3溢出时更新
voidTimer3_Init(intcounts)
TMR3CN=0x00;
//SYSCLK/12作为时基
TMR3RL=-counts;
//重载值
TMR3=0xffff;
//立即重载
EIE2|=0x01;
//允许T3中断
TMR3CN=0x04;
//启动T3
voidTimer3_ISR(void)
TMR3CN&
=~(0x80);
//清TF3
实验2:
查表实验
movdptr,#table
mova,#3
rla
movr1,a
movca,@a+dptr
pushdpl
movdptr,#2000h
movx@dptr,a
mova,r1
movdptr,#2001h
l1:
sjmpl1
table:
dw8000h,8001h,8002h,8003h
或:
MOVA,#3
CALLSEARCH
MOVDPTR,#2000H
MOVA,R2
MOVA,R3
INCDPTR
SEARCH:
MOVDPTR,#table
RLA
RET
MOVXA,@A
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 部分 习题 答案 资料