单片机部分习题答案Word格式.docx

上传人:b****5 文档编号:20751356 上传时间:2023-01-25 格式:DOCX 页数:18 大小:79.56KB
下载 相关 举报
单片机部分习题答案Word格式.docx_第1页
第1页 / 共18页
单片机部分习题答案Word格式.docx_第2页
第2页 / 共18页
单片机部分习题答案Word格式.docx_第3页
第3页 / 共18页
单片机部分习题答案Word格式.docx_第4页
第4页 / 共18页
单片机部分习题答案Word格式.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

单片机部分习题答案Word格式.docx

《单片机部分习题答案Word格式.docx》由会员分享,可在线阅读,更多相关《单片机部分习题答案Word格式.docx(18页珍藏版)》请在冰豆网上搜索。

单片机部分习题答案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个引脚)。

另外将外部存储器解耦配置为复用方式并使用低端口。

同时还将、、配置为模拟输入,以便用ADC1测量加在这些引脚上的电压。

试用Config软件进行优先权交叉开关译码器的配置,写出配置步骤,配置XBR0~XBR2等相关SFR的值。

(1)按UART0EN=1()、SMB0EN=1()、SPI0EN=1()、CP0E=1()、EMIFLE=1()设置XBR0、XBR1、XBR2得XBR0=0x87、XBR1=0x00、XBR2=0x02;

(2)存储器接口配置为复用方式并使用低端口,有PTRSEL=0()、EMD2=0();

(3)~配置为模拟输入方式有:

P1MDIN=0xe3;

(4)设置XBARE=1使能交叉开关,则XBR2=0x42。

UART0优先级最高,、分配给TX0、RX0;

SPI优先权次之,~分配给SCK、MISO、MOSI、~分配给ALE、/RD、/WR、分配给NSS;

下一个优先的是SMBUS,分配给SDA、~做模拟量输入,跳过,分配给SCL;

再下面的优先权是CP0,分配给CP0;

(5)UART0的TX0()、ALE()、/RD()、/WR()的输出设置为推挽方式,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单元开始的区域中。

$INCLUDE

org0000h

movdptr,#1000h

movr2,#256(movr2,#0)

movr3,#25h

movr4,#00h

loop:

movxa,@dptr

pushdph

pushdpl或者

movdph,r3

movdpl,r4

movx@dptr,A

popdpl

popdph

incdptr

incr4

djnzr2,loop

sjmp$

end

3、用汇编语言编写将累加器A的一位十六进制数(A的高4位为0)转换为ASC

码的程序,转换结果仍存放在累加器A中,要求用查表和非查表两种方式实现。

ADDA,#30H

CJNEA,#3AH,CONT

CONT:

JNCADD7

JMPEXIT

ADD7:

ADDA,#7

EXIT:

SJMP$

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

JNB,POSI

MOVA,#-1(0FFH)

SJMPDONE

POSI:

MOVA,#1

DONE:

MOV36H,A

END

MOVR0,#0FFH

JB,NEG

MOVR0,#01H

NEG:

MOVA,R0

NEXT4:

MOVA,#0;

5到10之间

NEXT2:

ADDA,#1;

大于10

NEXT5:

MOV36H,A

SJMP$

END

或(同学作业):

XEQU35H

YEQU36H

ORG0000H

AJMPSTART

ORG0100H

START:

MOVA,X

CLRC

SUBBA,#05H

JNCNEXT

MOVY,#0FFH

AJMPDONE

NEXT:

SUBBA,#0BH

JNCNEXT1

MOVY,#00H

INCA

MOVY,A

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;

第一个数据

LOOP:

CLRC

MOVB,A

MOVA,@R0

SUBBA,B;

两个比较,也可以用CJNE实现

MOVA,B

SJMPNEXT1

ADDA,B

DJNZR7,LOOP(下一行)RET

第4章:

5.利用C8051F020单片机的T0计数,每计10个脉冲,取反一次,试用查询和中断两种方式编程。

确定工作方式,计算初值:

选方式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,编写程序使和分别输出周期为2ms和50μs的方波。

解:

和分别每1ms和25μs取反一次即可。

选T0方式1定时25μs,每溢出40次取反一次。

初值计算:

由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<

>

unsignedcharxdatatbuf[]={0x0,0x1,…,0x1f};

unsignedchari;

unsignedcharxdata*p=tbuf;

XBR0=0x04;

//配置交叉开关

P0MDOUT|=0x01;

//TX0为推挽输出方式

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例

正弦波发生器程序:

DAC0输出更新发生在写DAC0H时:

#include<

sfr16DAC0=0xd2

voiddac0_init(void);

uninsignedinti;

floatx,y;

dac0_init();

//DAC0初始化

while

(1)

for(x=0;

x<

(2*;

x+=

//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:

查表实验

$INCLUDE

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

MOVX@DPTR,A

MOVA,R3

INCDPTR

SEARCH:

MOVDPTR,#table

RLA

RET

MOVXA,@A+DPTR

MOVR2,A

MOVR3,A

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 兵器核科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1