单片机原理与应用基于汇编C及混合编程章习题解答.docx
- 文档编号:30617662
- 上传时间:2023-08-18
- 格式:DOCX
- 页数:98
- 大小:535.54KB
单片机原理与应用基于汇编C及混合编程章习题解答.docx
《单片机原理与应用基于汇编C及混合编程章习题解答.docx》由会员分享,可在线阅读,更多相关《单片机原理与应用基于汇编C及混合编程章习题解答.docx(98页珍藏版)》请在冰豆网上搜索。
单片机原理与应用基于汇编C及混合编程章习题解答
习题一
1.什么是单片机?
单片机全称单片微型计算机。
它是把计算机中的微处理器、只读存储器(ROM)、随机访问存储器(RAM)、I/O接口、串行接口、中断系统、定时/计数器等基本功能部件微型化并集成到一块芯片上构成的小而完善的计算机。
2.单片机的主要用途是什么?
单片机有体积小、功耗低、面向控制、抗干扰能力强、性价比高等优点,被广泛应用于家用电器、办公自动化、工业控制、智能仪器仪表与集成智能传感器、汽车电子与航空航天电子系统等各种控制系统中。
习题二
2-1.STC12C5A60S2单片机的内部集成了哪些功能部件?
各个功能部件的具体功能是什么?
在STC12C5A60S2单片机内部,其基本结构主要有中央处理器CPU、程序存储器、数据存储器、定时/计数器、UART串行口、I/O接口、高速A/D转换、同步串行外围接口、PCA、看门狗WDT及片内RC振荡器和外部晶体震荡电路等模块组成。
各部件功能:
中央处理器CPU:
负责运算控制和调度,使整个系统协调工作。
程序存储器:
用于存放用户程序、数据和表格等信息。
数据存储器:
用于存放单片机运行过程中的运算数据及运算地址等。
定时/计数器:
常用定时器时钟来实现定时检测、定时控制;还可以用定时器产生毫秒宽的脉冲,来驱动步进电机一类的电器机械。
计数器主要用于外部事件的计数。
看门狗WDT:
在单片机出现运行紊乱时,可以使单片机重新启动,恢复正常运行。
I/O接口:
单片机通过I/O引脚进行输入,输出操作。
振荡器:
产生单片机运行所需要的时钟信号。
2-2.封装模式为LQFP-48、PDIP-40的STC12C5A60S2单片机的I/O引脚各有多少?
P0、P2口各有什么功能?
封装模式为LQFP-48的STC12C5A60S2单片机有48个引脚,44个I/O引脚。
封装模式为PDIP-40的STC12C5A60S2单片机有40个引脚,36个I/O引脚。
P0口和P2口都可以作为通用的I/O口使用;当单片机访问外部扩展电路或设备时,P0口可以作为地址总线的低8位及数据总线接口,地址/数据分时复用,P2口作为地址总线的高8位。
2-3.简述PSW寄存器各位的作用。
若寄存器A中的内容为63H,P标志位为何值?
CY:
进位或借位标志位,简称C。
在执行8位的加、减法指令时,用于记录最高位的进位或借位。
有进位或借位时则置位,否则清零。
AC:
辅助进位标志位,在执行加减法时,若D3向D4有进位或借位时,AC置位,否则AC清零。
OV:
溢出标志位。
在执行加减法运算时,若运算的结果超出8位有符号数表示的范围-128-+127,表示溢出,OV置1,否则OV清零。
P:
奇偶校验标志位。
用于记录A寄存器中的1的个数的奇偶性。
若A寄存器中1的个数为奇数,则P置位,为偶数则清零。
RS1、RS0:
寄存器组选择位,用来选择当前的工作寄存器组。
F0、F1:
用户标志位。
若寄存器A中的内容为63H(01100011B),A中“1”的个数为4,所以P=0。
2-4.STC12C5A60S2单片机内部有哪几类存储器?
中断服务程序的入口地址分布在哪个区域?
STC12C5A60S2单片机内部有程序存储器、数据存储器RAM、特殊功能寄存器、扩展RAM。
中断服务程序的入口地址位于程序存储器的首部。
2-5.STC系列单片机系统复位后,程序存储器指针PC的值是多少?
当单片机正在执行某一条指令时,PC指向哪里?
STC系列单片机系统复位后,程序存储器指针PC的值是0000H。
当单片机正在执行某一条指令时,PC指向下一条指令的地址。
2-6.片内RAM中,数据存储器的低128字节、高128字节和特殊功能寄存器可以使用什么寻址方式?
哪些单元可作为工作寄存器区,那些单元可以位寻址?
访问低128字节RAM时,既能采用寄存器直接寻址,又可寄存器间接寻址。
访问高128字节RAM时,只能采用寄存器间接寻址,但可以作为堆栈区。
访问特殊功能寄存器,只能直接寻址。
00H-1FH为工作寄存器组区;片内RAM中20H-2FH单元为位寻址区。
2-7.在片内RAM中,位地址为30H的位属于字节地址为多少的单元?
字节地址为26H。
2-8.STC系列单片机复位后,使用了哪一工作寄存器组?
当CPU使用的工作寄存器组为2组时,R2对应的RAM地址是多少?
STC系列单片机复位后,所使用的工作寄存器组为0组;当CPU使用的工作寄存器组为2组时,R2对应的RAM地址是12H。
2-9.什么是堆栈?
简述STC12C5A60S2单片机的堆栈处理过程。
堆栈是在RAM中开辟的一片数据缓冲区,常用于保护CPU现场及临时数据,其操作遵循先进后出、后进先出的原则。
STC12C5A60S2单片机的堆栈处理过程:
数据入栈时,SP指针内容先自动加1,然后再将数据推入到SP指针指向的单元;出栈时,先将SP指针所指向单元的数据弹出,然后SP指针的内容自动减1.
2-10.以下关于数据指针DPTR和程序指针PC的概述是否正确?
(1)DPTR是可以访问的,而PC不能访问;√
(2)它们都是16位的寄存器;√
(3)它们都具有临时存储数据的功能;×
(4)DPTR可以分成2个8位的寄存器使用,而PC不能。
√
2-11.单片机与外部存储器连接时,P0口用作地址/数据复用,需要添加什么芯片才能锁存8位地址信息?
单片机与外部存储器连接时,P0口用作地址/数据复用,需要添加地址锁存器,如74LS373。
2-12.如何设置STC12C5A60S2单片机I/O口工作模式?
若设置P1.7为强推挽输出,P1.6为开漏,P1.5为弱上拉,P1.4,P1.3,P1.2,P1.1,和P1.0为高阻输入,应如何设置相关寄存器?
STC12C5A60S2单片机上电复位后所有引脚都默认为准双向(弱上拉)方式。
根据具体应用可由软件配置成:
准双向、强推挽、仅为输入或开漏输出4种工作方式。
Px(x=0,1,2,3,4,5)口引脚的工作方式由特殊功能寄存器PxM1和PxM0相应位的配置决定
I/O口工作模式设定
PxM1[7:
0]
PxM0[7:
0]
I/O口模式
0
0
准双向口(传统8051I/O口模式),灌电流可达20mA,拉电流为230uA
0
1
强推挽输出,输入输出电流都能可达20mA。
1
0
仅为输入(高阻)
1
1
开漏,内部上拉电阻断开
若设置P1.7为强推挽输出,P1.6为开漏,P1.5为弱上拉(准双向),P1.4,P1.3,P1.2,P1.1,和P1.0为高阻输入,可通过以下的两条指令来完成:
MOVP1M1,#01011111B;
MOVP1M0,#11000000B;
2-13.I/O口作为输入引脚,应工作在何种方式?
读外部引脚状态时,为何要先向相应引脚对应的锁存器写入“1”?
I/O口作为输入引脚,应工作在准双向或仅为输入状态;
在准双向口配置情况下,先输出高电平,使d管截止,才可读到正确的外部输入状态。
2-14.STC12C5A60S2单片机复位方式有哪些?
复位后单片机的初始状态如何?
STC12C5A60S2单片机复位方式有上电复位、看门狗复位、外部低压检测复位、软件复位。
复位后,单片机从用户程序区0000H处开始正常工作;堆栈指针SP指向07H,P0~P3为FFH。
习题三
3-1使用Proteus对电路进行仿真,有哪些步骤?
使用Proteus进行单片机系统设计、仿真主要有七个步骤,依次是新建设计文件,选取元件并加入列表区,将元件摆放到图形编辑窗口,放置电源、地线、布线、加载目标程序代码,运行仿真。
3-2在Keil中,源程序文件从编辑到生成*.hex文件,经过哪些过程?
在Keil中,源程序文件从编辑到生成*.hex文件要经过建立工程,建立源程序文件,建立文件和程序的连接,工作环境和参数的设置,再进行编译、连接可以生成目标文件。
3-3在Keil中,如何对源程序文件进行软件模拟调试?
Keil软件中有一个仿真CPU用来模拟程序的执行,可以在没有硬件和仿真器的情况下进行程序的调试,这就是软件模拟调试的方法。
对源文件进行软件模拟调试,首先要启动调试。
对工程编译、连接成功以后,使用菜单“Debug”—>“Start/StopDebugSession”进入调试状态,按“Ctrl+F5”组合键或者使用
按钮也能进入调试状态。
这时,源程序窗口的左侧出现一个黄色箭头,指向main()函数的第一行,该箭头总是指向即将要运行的语句行。
退出调试状态和启动调试状态方法一致。
调试过程中使用最多的是“Debug”菜单,而该菜单上的大部分命令可以在“debug”工具栏中找到对应的快捷按钮。
常用按钮有:
运行,单步,过程单步,单步跳出,执行到当前,反汇编窗口,观察窗口,存储器窗口。
其中单步调试方式特别常用。
单步执行后,可以通过各个窗口观察执行结果,从而判断该条语句是否出现问题。
如果程序较长,可以采用下面的方法来调试。
首先,在合适的位置设置断点,方法为:
在某一行上右击,弹出的快捷菜单中选择“Insert/RemoveBreakpoint”。
设置成功后,该行的前面会有红色方块指示。
这时如果单击“运行”按钮,程序运行到断点处会自动停止。
删除断点也需使用同样的方法。
如果程序的运行要依赖于外围接口,例如并行口、串行口、中断、定时/计数器等,Keil的“Peripherals”菜单中提供了一些选项,通过这些选项打开对应外围接口的对话选框,可以观察外围接口的状态,或者更改外围接口的运行情况。
习题四
4-151内核单片机有哪几种寻址方式?
片内RAM低128字节及高128字节分别支持哪些寻址方式?
片内扩展RAM、片外RAM及特殊功能寄存器分别支持哪些寻址方式?
51内核单片机的寻址方式有:
立即(数)寻址、寄存器寻址、直接寻址、寄存器间接寻址、变址寻址、相对寻址、位寻址。
片内RAM低128字节支持直接寻址、寄存器间接寻址。
片内RAM高128字节支持寄存器间接寻址。
片内扩展RAM及片外RAM支持间接寻址。
特殊功能寄存器支持直接寻址。
4-2区分下列指令有什么不同?
(1)MOVA,#22H和MOVA,22H
MOVA,#22H;将立即数22H送入A寄存器中,第二操作数为立即寻址。
MOVA,22H;把片内RAM字节地址为22H单元的内容送入A寄存器中,第二操作数为直接寻址。
(2)MOVA,R1和MOVA,@R1
MOVA,R1;把R1的内容送入A寄存器中,第二操作数为寄存器寻址。
MOVA,@R1;将寄存器R0的内容作为RAM某单元的地址,将该单元的内容传送给A寄存器,第二操作数为寄存器间接寻址。
(3)MOVA,@R1和MOVXA,@R1
MOVA,@R1;将寄存器R1的内容作为片内RAM某单元的地址,将该单元的内容传送给A寄存器
MOVXA,@R1;将寄存器R1的内容作为片内扩展或外部RAM某单元的地址,将该单元的内容传送给A寄存器
两者的区别是:
MOV访问的是内部RAM,MOVX访问的是片内扩展或外部RAM。
(4)MOVXA,@R1和MOVXA,@DPTR
主要的区别在于对外输出地址的方式上。
如果是访问片外扩展RAM,
MOVXA,@R1
只是占用P0口,输出R1中的8位地址。
而MOVXA,@DPTR要占用P0、P2口,输出DPTR中的16位地址。
(5)MOVCA,@A+DPTR和MOVXA,@DPTR
MOVCA,@A+DPTR;功能是A寄存器的内容作为无符号数和DPTR内容相加后得到一个16位的地址,将程序存储器中该地址的内容传送给A。
MOVXA,@DPTR;以DPTR寄存器的值作为片内扩展RAM或者片外RAM的地址,将该地址单元的内容送入A。
两者的区别是MOVC访问的是整个ROM的64KB空间;MOVX访问的是整个片内扩展RAM或片外扩展RAM。
4-3写出完成下列各项任务的指令。
(1)片内RAM30H单元的内容送到片内RAM50H单元中。
MOV50H,30H
(2)片内RAM40H单元的内容送到片内扩展RAM50H单元中。
ANLAUXR,#11111101B
MOVA,40H
MOVDPTR,#50H
MOVX@DPTR,A
(3)片内RAM50H单元的内容送到片外RAM2000H单元中。
ORLAUXR,#00000010B
MOVA,50H
MOVDPTR,#2000H
MOVX@DPTR,A
(4)片外RAM2000H单元的内容送到片外RAM4000H单元中。
ORLAUXR,#00000010B
MOVDPTR,#2000H
MOVXA,@DPTR
MOVDPTR,#4000H
MOVX@DPTR,A
(5)ROM1000H单元的内容送到片外RAM8000H单元中。
MOVDPTR,#1000H
MOVA,#0
MOVCA,@A+DPTR
MOVDPTR,#8000H
ORLAUXR,#00000010B
MOVX@DPTR,A
(6)将程序状态字寄存器PSW内容传送到片内扩展RAM0D0H单元中。
ANLAUXR,#11111101B
MOVA,PSW
MOVDPTR,#0D0H
MOVX@DPTR,A
(7)将片内RAM01H~FFH单元内容清零。
ANLPSW,#11100111B
MOVR0,#0FFH
MOVA,#0
LOOP:
MOV@R0,A
DJNZR0,LOOP
(8)使片内RAM20H单元的b7、b6位清零,b5、b4位置1,b3、b2位取反,其余各位保持不变。
ANL20H,#00111111B
ORL20H,#00110000B
XRL20H,#00001100B
4-4下列各条伪指令前的标号各代表的地址是多少?
ORG0100H
TABLE:
DS4;TABLE代表的的地址是0100H
WORD:
DB15,0FFH,30;WORD代表的地址是0104H
BINEQU0200H
TAB1:
DW07H;TAB1代表的地址是0107H
4-5假设程序头文件中含有如下变量定义伪指令
DBUFDATA40H
BDATADATA60H
(1)请指出如下指令中源操作数的寻址方式。
MOVR0,#DBUF;立即(数)寻址
MOVR0,DBUF;直接寻址
(2)执行如下程序段后,片内RAM40H~4FH单元的内容是什么?
60H单元的内容又是什么?
MOVBDATA,#10H
MOVR0,#DBUF
CLRA
LOOP:
MOV@R0,A
INCA
INCR0
DJNZBDATA,LOOP
执行以上程序段后,片内RAM40H~4FH单元的内容是:
0-0FH;
60H单元的内容为0。
4-6编写一个延时10ms的子程序。
选择STC12C5A60S2单片机,系统时钟频率为12MHz,程序如下:
DELAY_10ms:
MOVR7,#120;2T
DL:
MOVR6,#250;2T
DJNZR6,$;4T
DJNRR7,DL;4T
RET;4T
4-7编程实现的逻辑运算。
MOVC,P1.1
ORLC,P1.2
CPLC
MOVPSW.5,C
MOVC,P1.4
ANLC,/P1.3
ORLC,PSW.5
MOVP1.0,C
4-8将存放在片内RAM51H、52H和片外RAM2000H、2001H的四位BCD码相加,结果存放在片内RAM50H、51H、52H单元中(假设低位字节存放在高地址中,高位字节存放在低地址中)。
ORLAUXR,00000010B
MOVDPTR,#2001H
MOVXA,@DPTR
ADDA,52H
DAA
MOV52H,A
MOVDPTR,#2000H
MOVXA,@DPTR
ADDCA,51H
DAA
MOV51H,A
MOVA,#00H
ADDCA,#00H
MOV50H,A
4-9编程实现将片内扩展RAM0200H~0220H单元的内容,全部移到片内RAM30H单元开始的位置,并将原位置清零。
MOV R0,#30H
MOV DPTR,#0200H
MOV R1,#21H
ANLAUXR,#11111101B
LOOP:
MOVX A,@DPTR
MOV @R0,A
MOV A,#0
MOVX@DPTR,A
INC R0
INC DPTR
DJNZ R1,LOOP
4-10将存放在R3、R2中的三位压缩BCD码转换为二进制形式。
W_BCD_BI:
LCALLB_BCD_BI;调用将R2中单字节BCD码转换为二进制数的子程序,
;转换的结果存放于A寄存器中
MOVR4,A;把转换结果暂时保存到R4
MOVA,R3;取BCD码的高1位
MOVB,#100
MULAB;计算(a3*10+a2)*100
ADDA,R4;加低2位转换结果
MOVR2,A;保存转换结果的低8位
MOVA,B;取(a3*10+a2)*100的高8位
ADDCA,#0;加进位位
MOVR3,A;保存转换结果的高8位
......
B_BCD_BI:
MOVA,R2;取BCD码
ANLA,#0F0H;保留高4位(即十位)
SWAPA
MOVB,#10
MULAB;十位*10,最大为90(即5AH),因此高8位为0
MOVB,A;乘积暂存到B寄存器
MOVA,R2;取BCD码
ANLA,#0FH;保留个位
ADDA,B;个位加“十位*10”,结果在A寄存器中
RET
4-11编写程序完成运算R0R1×R2R3,乘积存R4、R5、R6和R7中。
MUL:
CLRA
MOVR4,A
MOVR5,A
MOVR6,A
MOVR7,A
MUL1:
MOVA,R1
MOVB,R3
MULAB
MOVR7,A
MOVR6,B
MUL2:
MOVA,R0
MOVB,R3
MULAB
ADDA,R6
MOVR6,A
CLRA
ADDCA,B
MOVR5,A
MUL3:
MOVA,R1
MOVB,R2
MULAB
ADDA,R6
MOVR6,A
MOVA,R5
ADDCA,B
MOVR5,A
CLRA
ADDCA,0
MOVR4,A
MUL4:
MOVA,R0
MOVB,R2
MULAB
ADDA,R5
MOVR5,A
MOVA,R4
ADDCA,B
MOVR4,A
RET
习题五
5-1在C51语言中支持哪些数据类型?
C51特有的数据类型有哪些?
在C51语言中支持的数据类型有:
char(字符型)、int(整型)、long(长整形)、float(浮点型)、特殊功能寄存器类型和位类型。
C51特有的数据类型有:
特殊功能寄存器类型和位类型。
5-2C51中的存储器类型有几种,它们分别表示的存储器区域是什么?
C51中的存储器类型有:
data、bdata、idata、pdata、xdata、code
存储器类型
与硬件存储器空间的对应关系
data
直接寻址的片内RAM低128B,访问速度快
bdata
片内RAM可位寻址区(20H-2FH),允许字节和位混合访问
idata
用Ri间接寻址的片内RAM全部地址空间
pdata
用Ri间接访问的片内扩展RAM或片外扩展RAM低256B
xdata
用DPTR间接访问的片内扩展RAM或片外扩展RAM(64K)
code
程序存储器ROM空间(64KB)
5-3在C51中,bit位与sbit位有什么区别?
两种位变量的区别在于,用bit定义的位变量,其地址由C51编译时予以安排,而用sbit定义位变量时必须同时定义其位地址,在C51编译器编译时,其位地址不可变化。
5-4在C51中,中断函数与一般函数有什么不同?
(1)中断函数不能进行参数传递
(2)中断函数没有返回值
(3)在任何情况下都不能直接调用中断函数
(4)如果在中断函数中调用了其他函数,则被调用函数使用的工作寄存器必须与中断函数相同。
否则会产生不正确的结果。
(5)在中断函数中调用其他函数,被调函数最好设置为可重入的,因为中断是随机的,有可能中断函数所调用的函数出现嵌套调用。
(6)C51编译器对中断函数编译时会自动在程序开始和结束处加上相应的内容。
(7)中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明。
5-5请分别定义下列变量:
(1)片内RAM中无符号字符型变量x;
unsignedcharidatax;
(2)片内RAM中位寻址区无符号字符型变量y,将y.0-y.2再分别定义为位变量key_in、key_up、key_down;
片内RAM中位寻址区无符号字符型变量y:
unsignedcharbdatay;
定义y.0-y.2为位变量key_in、key_up、key_down:
sbitkey_in=y^0;
sbitkey_up=y^1;
sbitkey_down=y^2;
(3)片外RAM中整型变量x,并指定变量x的绝对地址为4000H;
#definexXWORD[0X2000]
或:
xdataintx_at_0x4000;
(4)特殊功能寄存器变量PCON;
sfrPCON=0X87
5-6用C51语言写出整型变量a左移4位的语句。
inta;
a=a<<4;
5-7用C51语言编程实现,片内扩展RAM的000EH单元和000FH单元的内容交换。
#include
#include
voidswap()
{
chardatac,d;
AUXR&=0xFD;
c=XBYTE[0x000E];
d=XBYTE[0x000F];
XBYTE[0x000E]=d;
XBYTE[0x000F]=c;
}
5-8已知x=375,y=589,用C51语言编写程序,计算z=x+y的结果。
intadd()
{
intx,y,z;
x=375;
y=589;
z=x+y;
returnz;
}
5-9试用C51语言编写程序实现将片内RAM21H单元存放的两位BCD码数转换为十六进制数存入30H单元。
dataunsignedchary1_at_0x21;
dataunsignedchary2_at_0x30;
voidtrans()
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 原理 应用 基于 汇编 混合 编程 习题 解答