单片机原理与应用-基于汇编、C51及混合编程1-11章习题解答

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

习题一
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相应位的配置决定
P1.4,P1.3,P1.2,P1.1,和P1.0为高阻输入,可通过以下的两条指令来完成:
MOV P1M1,#01011111B;
MOV P1M0,#11000000B;
2-13.I/O口作为输入引脚,应工作在何种方式?读外部引脚状态时,为何要先向相应引脚对应的锁存器写入“1”?
I/O口作为输入引脚,应工作在准双向或仅为输入状态;
在准双向口配置情况下,先输出高电平,使d管截止,才可读到正确的外部输入状态。

2-14.STC12C5A60S2单片机复位方式有哪些?复位后单片机的初始状态如何?
STC12C5A60S2单片机复位方式有上电复位、看门狗复位、外部低压检测复位、软件复位。

复位后,单片机从用户程序区0000H处开始正常工作;堆栈指针SP指向07H,P0~P3为FF H。

习题三
3-1 使用Proteus对电路进行仿真,有哪些步骤?
使用Proteus进行单片机系统设计、仿真主要有七个步骤,依次是新建设计文件,选取元件并加入列表区,将元件摆放到图形编辑窗口,放置电源、地线、布线、加载目标程序代码,运行仿真。

3-2 在Keil中,源程序文件从编辑到生成*.hex文件,经过哪些过程?
在Keil中,源程序文件从编辑到生成*.hex文件要经过建立工程,建立源程序文件,建立文件和程序的连接,工作环境和参数的设置,再进行编译、连接可以生成目标文件。

3-3 在Keil中,如何对源程序文件进行软件模拟调试?
Keil软件中有一个仿真CPU用来模拟程序的执行,可以在没有硬件和仿真器的情况下进行程序的调试,这就是软件模拟调试的方法。

对源文件进行软件模拟调试,首先要启动调试。

对工程编译、连接成功以后,使用菜单“Debug”—>“Start/StopDebug Session”进入调试状态,按“Ctrl+F5”组合键或者使
用按钮也能进入调试状态。

这时,源程序窗口的左侧出现一个黄色箭头,指
向main( )函数的第一行,该箭头总是指向即将要运行的语句行。

退出调试状态和启动调试状态方法一致。

调试过程中使用最多的是“Debug”菜单,而该菜单上的大部分命令可以在
“debug”工具栏中找到对应的快捷按钮。

常用按钮有:运行,单步,过程单步,单步跳出,执行到当前,反汇编窗口,观察窗口,存储器窗口。

其中单步调试方式特别常用。

单步执行后,可以通过各个窗口观察执行结果,从而判断该条语句是否出现问题。

如果程序较长,可以采用下面的方法来调试。

首先,在合适的位置设置断点,方法为:在某一行上右击,弹出的快捷菜单中选择“Insert/Remove Breakpoint”。

设置成功后,该行的前面会有红色方块指示。

这时如果单击“运行”按钮,程序运行到断点处会自动停止。

删除断点也需使用同样的方法。

如果程序的运行要依赖于外围接口,例如并行口、串行口、中断、定时/计数器等,Keil的“Peripherals”菜单中提供了一些选项,通过这些选项打开对应外围接口的对话选框,可以观察外围接口的状态,或者更改外围接口的运行情况。

习题四
4-1 51内核单片机有哪几种寻址方式?片内RAM低128字节及高128字节分别支持哪些寻址方式?片内扩展RAM、片外RAM及特殊功能寄存器分别支持哪些寻址方式?
51内核单片机的寻址方式有:立即(数)寻址、寄存器寻址、直接寻址、寄存器间接寻址、变址寻址、相对寻址、位寻址。

片内RAM低128字节支持直接寻址、寄存器间接寻址。

片内RAM高128字节支持寄存器间接寻址。

片内扩展RAM及片外RAM支持间接寻址。

特殊功能寄存器支持直接寻址。

4-2 区分下列指令有什么不同?
(1)MOV A,#22H和MOV A,22H
MOV A,#22H ;将立即数22H送入A寄存器中,第二操作数为立即寻址。

MOV A,22H ;把片内RAM字节地址为22H单元的内容送入A寄存器中,第二操作数为直接寻址。

(2)MOV A,R1和MOV A,@R1
MOV A,R1 ;把R1的内容送入A寄存器中,第二操作数为寄存器寻址。

MOV A,@R1 ;将寄存器R0的内容作为RAM某单元的地址,将该单元的内容传送给A寄存器,第二操作数为寄存器间接寻址。

(3)MOV A,@R1和MOVX A,@R1
MOV A,@R1 ;将寄存器R1的内容作为片内RAM某单元的地址,将该单元的内容传送给A寄存器
MOVX A,@R1 ;将寄存器R1的内容作为片内扩展或外部RAM某单元的地址,将该单元的内容传送给A寄存器
两者的区别是:MOV访问的是内部RAM,MOVX访问的是片内扩展或外部RAM。

(4)MOVX A,@R1和MOVX A,@DPTR
主要的区别在于对外输出地址的方式上。

如果是访问片外扩展RAM,
MOVX A,@R1
只是占用P0口,输出R1中的8位地址。

而MOVX A,@DPTR要占用P0、P2口,输出DPTR中的16位地址。

(5)MOVC A,@A+DPTR和MOVX A,@DPTR
MOVC A, @A+DPTR ;功能是A寄存器的内容作为无符号数和DPTR内容相加后得到一个16位的地址,将程序存储器中该地址的内容传送给A。

MOVX A,@DPTR ;以DPTR寄存器的值作为片内扩展RAM或者片外RAM的地址,将该地址单元的内容送入A。

两者的区别是MOVC访问的是整个ROM的64KB空间;MOVX访问的是整个片内扩展RAM或片外扩展RAM。

4-3 写出完成下列各项任务的指令。

(1)片内RAM 30H 单元的内容送到片内RAM 50H单元中。

MOV 50H,30H
(2)片内RAM 40H单元的内容送到片内扩展RAM 50H单元中。

ANL AUXR,#11111101B
MOV A,40H
MOV DPTR,#50H
MOVX @DPTR ,A
(3)片内RAM 50H单元的内容送到片外RAM 2000H单元中。

ORL AUXR,#00000010B
MOV A , 50H
MOV DPTR , #2000H
MOVX @DPTR , A
(4)片外RAM 2000H单元的内容送到片外RAM 4000H单元中。

ORL AUXR , #00000010B
MOV DPTR,#2000H
MOVX A,@DPTR
MOV DPTR,#4000H
MOVX @DPTR,A
(5)ROM 1000H单元的内容送到片外RAM 8000H单元中。

MOV DPTR,#1000H
MOV A , #0
MOVC A , @A+DPTR
MOV DPTR,#8000H
ORL AUXR,#00000010B
MOVX @DPTR , A
(6)将程序状态字寄存器PSW内容传送到片内扩展RAM 0D0H单元中。

ANL AUXR , #11111101B
MOV A,PSW
MOV DPTR , #0D0H
MOVX @DPTR , A
(7)将片内RAM 01H~FFH单元内容清零。

ANL PSW , #11100111B
MOV R0,#0FFH
MOV A,#0
LOOP:MOV @R0,A
DJNZ R0,LOOP
(8)使片内RAM 20H 单元的b7、b6位清零,b5、b4位置1,b3、b2位取反,
其余各位保持不变。

ANL 20H,#00111111B
ORL 20H,#00110000B
XRL 20H,#00001100B
4-4下列各条伪指令前的标号各代表的地址是多少?
ORG 0100H
TABLE:DS 4 ;TABLE代表的的地址是0100H
WORD:DB 15,0FFH,30 ;WORD代表的地址是0104H
BIN EQU 0200H
TAB1: DW 07H ;TAB1代表的地址是0107H 4-5 假设程序头文件中含有如下变量定义伪指令
DBUF DATA 40H
BDATA DATA 60H
(1) 请指出如下指令中源操作数的寻址方式。

MOV R0,#DBUF ;立即(数)寻址
MOV R0,DBUF ;直接寻址
(2) 执行如下程序段后,片内RAM 40H~4FH单元的内容是什么?60H单元的内
容又是什么?
MOV BDATA,#10H
MOV R0,#DBUF
CLR A
LOOP: MOV @R0,A
INC A
INC R0
DJNZ BDATA,LOOP
执行以上程序段后,片内RAM 40H~4FH单元的内容是:0-0FH;
60H单元的内容为0。

4-6 编写一个延时10ms的子程序。

选择STC12C5A60S2单片机,系统时钟频率为12MHz,程序如下:
DELAY_10ms:
MOV R7,#120 ;2T
DL: MOV R6,#250 ;2T
DJNZ R6,$ ;4T
DJNR R7,DL ;4T
RET ;4T
4-7编程实现的逻辑运算。

MOV C,P1.1
ORL C,P1.2
CPL C
MOV PSW.5,C
MOV C,P1.4
ANL C,/P1.3
ORL C,PSW.5
MOV P1.0,C
4-8 将存放在片内RAM 51H、52H和片外RAM 2000H、2001H 的四位BCD码相加,结果存放在片内RAM 50H、51H、52H单元中(假设低位字节存放在高地址中,高位字节存放在低地址中)。

ORL AUXR,00000010B
MOV DPTR,#2001H
MOVX A,@DPTR
ADD A,52H
DA A
MOV 52H,A
MOV DPTR ,#2000H
MOVX A,@DPTR
ADDC A,51H
DA A
MOV 51H,A
MOV A,#00H
ADDC A,#00H
MOV 50H,A
4-9编程实现将片内扩展RAM 0200H~0220H单元的内容,全部移到片内RAM 30H单元开始的位置,并将原位置清零。

MOV R0,#30H
MOV DPTR,#0200H
MOV R1,#21H
ANL AUXR , #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:
LCALL B_BCD_BI;调用将R2中单字节BCD码转换为二进制数的子程序,
;转换的结果存放于A寄存器中
MOV R4, A ;把转换结果暂时保存到R4
MOV A, R3 ;取BCD码的高1位
MOV B, #100
MUL AB ;计算(a3*10+a2)*100
ADD A, R4 ;加低2位转换结果
MOV R2, A ;保存转换结果的低8位
MOV A, B ;取(a3*10+a2)*100的高8位
ADDC A, #0 ;加进位位
MOV R3, A ;保存转换结果的高8位
... ...
B_BCD_BI:
MOV A, R2 ;取BCD码
ANL A, #0F0H ;保留高4位(即十位)
SWAP A
MOV B, #10
MUL AB ;十位*10,最大为90(即5AH),因此高8位为0
MOV B, A ;乘积暂存到B寄存器
MOV A, R2 ;取BCD码
ANL A, #0FH ;保留个位
ADD A, B ;个位加“十位*10”,结果在A寄存器中
RET
4-11 编写程序完成运算R0R1×R2R3,乘积存R4、R5、R6和
R7中。

MUL:
CLR A
MOV R4, A
MOV R5, A
MOV R6, A
MOV R7, A
MUL1:
MOV A, R1
MOV B, R3
MUL AB
MOV R7, A
MOV R6, B
MUL2:
MOV A, R0
MOV B, R3
MUL AB
ADD A, R6
MOV R6, A
CLR A
ADDC A, B
MOV R5, A
MUL3:
MOV A, R1
MOV B, R2
MUL AB
ADD A, R6
MOV R6, A
MOV A, R5
ADDC A, B
MOV R5, A
CLR A
ADDC A, 0
MOV R4, A
MUL4:
MOV A, R0
MOV B, R2
MUL AB
ADD A, R5
MOV R5, A
MOV A, R4
ADDC A, B
MOV R4, A
RET
习题五
5-1 在C51语言中支持哪些数据类型?C51特有的数据类型有哪些?
在C51语言中支持的数据类型有:char(字符型)、int(整型)、long(长整形)、float(浮点型)、特殊功能寄存器类型和位类型。

C51特有的数据类型有:特殊功能寄存器类型和位类型。

5-2 C51中的存储器类型有几种,它们分别表示的存储器区域是什么?
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;
unsigned char idata x;
(2)片内RAM中位寻址区无符号字符型变量y,将y.0-y.2再分别定义为位变量key_in、key_up、key_down;
片内RAM中位寻址区无符号字符型变量y :unsigned char bdata y;
定义y.0-y.2为位变量key_in、key_up、key_down:
sbit key_in=y^0;
sbit key_up=y^1;
sbit key_down=y^2;
(3)片外RAM中整型变量x,并指定变量x的绝对地址为4000H;
#define x XWORD[0X2000]
或:xdata int x _at_ 0x4000;
(4)特殊功能寄存器变量PCON;
sfr PCON=0X87
5-6用C51语言写出整型变量a左移4位的语句。

int a;
a= a<<4;
5-7用C51语言编程实现,片内扩展RAM的000EH单元和
000FH单元的内容交换。

#include <STC12C5A.h>
#include<absacc.h>
void swap()
{
char data c,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的结果。

int add()
{
int x,y,z;
x=375;
y=589;
z=x+y;
return z;
}
5-9 试用C51语言编写程序实现将片内RAM 21H单元存放的两位BCD码数转换为十六进制数存入30H单元。

data unsigned char y1 _at_ 0x21;
data unsigned char y2 _at_ 0x30;
void trans()
{
unsigned char temp;
temp=y1;
y1=(y1&0xf0)>>4;
y2=y1*10+(temp&0x0f);
}
5-10 试用C51语言编写程序实现将片内RAM 30H、31H单元存放的2字节十六进制数转换为十进制数存于21H为首的单元中。

(设低地址存放高位字节)
#include<STC12C5A.h>
#include <absacc.h>
#define uint unsigned int
#define uchar unsigned char
uchar digit_h _at_ 0x30;
uchar digit_l _at_ 0x31;
uchar *p;
int buf;
void H_D()
{
buf= digit_h *256;
buf=buf+ digit_l;
for(p=0x25;p>=0x21;P--)
{
*p=buf%10;
buf=buf/10;
}
}
5-11试用C51语言编写程序实现将0-9,A-F十六进制数转换成相应的ASCII码。

#include<STC12C5A.h>
void H_A(unsigned char X)
{
if(X<=9)
X=X+0x30;
else
X=X+0x37;
return X
}
5-12参见图5-3,通过单片机的并行口P1,控制8路LED灯轮流且循环点亮。

引脚为0时灯亮,为1时灯熄灭。

#include<STC12C5A.h>
#incldue<intrins.h>
unsigned char i=0x7f;
void main()
{
while(1)
{
P1=i;
delay();
i=_cror_(i,1);
}
}
void delay()
{
unsigned char l,m,n;
for(l=0;l<254;l++)
for(m=0;m<254;m++)
for(n=0;n<254;n++);
}
习题6
6-1 如何在C51程序中嵌入汇编?
第一步:通过预编译命令“#pragma asm”和“#pragma endasm”在C语言代码中插入汇编语言代码。

第二步:在KeilC51环境下,在Project窗口中包含汇编代码的C文件上单击右键,在弹出的快捷菜单中选择“Options for…”命令,再次点击选中右边的“Generate Assembler SRC File”和“Assembler SRC file”复选框,使检查框由灰色变成黑色状态。

第三步:根据选择的编译模式,把相应的库文件(如Small模式时,是Keil\C51\Lib\C51S.Lib)加入到工程中,该文件必须作为工程的最后文件。

库文件与编译模式的关系如下:
C51S.LIB_没有浮点运算的 Small 模式
C51C.LIB_没有浮点运算的 Compact 模式
C51L.LIB_没有浮点运算的 Large 模式
C51FPS.LIB_带浮点运算的 Small 模式
C51FPC.LIB_带浮点运算的 Compact 模式
C51FPL.LIB_带浮点运算的 Large 模式
第四步:编译,生成目标代码。

6-2 简述在C51中调用汇编程序的实现方法。

在C51中调用汇编程序,要把用C语言编写的程序保存为扩展名为.C的C 语言文件,把用汇编语言编写的程序保存为扩展名为.asm、.SRC或者.A51的汇编语言文件,然后把这些文件导入到同一个工程下进行编译连接。

在C语言中调用汇编程序时,对被调用函数(汇编语言函数)要在主调函数(C语言函数)所在文件中作出声明,并且对汇编语言程序有一下要求:
(1)要使用SEGMENT伪指令定义可再定位的CODE段。

(2)要根据不同的情况对函数名进行转换,见表6-1。

(3)要使用PUBLIC伪指令将被调用函数说明为外部可用函数。

(4)若有参数传递,按照表6-3所列的规则使用参数。

(5)若有返回值,按照表6-4所列规则存入寄存器。

习题7
7-1 什么是中断?CPU为什么要采用中断结构?
中断是指CPU正在执行某程序时,外部或者内部发生了随机的事件,请求CPU迅速去处理,CPU暂时停止现行的程序的执行,而自动转去执行预先安排好的处理该事件的服务子程序。

处理完成后返回到断点处继续执行。

中断结构使CPU具有随机应变的能力,提高了CPU效率,增强了实时性。

7-2 STC12C5A60S2单片机有哪几个中断源?单片机响应各中断后,应如何清除相应中断标志位?其中断服务程序的入口地址各是多少?
STC12C5A60S2单片机有10个中断源:外部中断0(INT0)、定时/计数器
T0、外部中断1(INT1)、定时计数器T1、串行口1(UART1)、A/D转换、串行口2(UART2)、低压检测(LVD)中断、PCA中断和SPI中断。

单片机响应各中断后,相应中断标志位的清除:
IE0、IE1:外部中断0、外部中断1设置为下降沿触发方式时,CPU响应该中断时由硬件自动将IE0、IE1位清0,如果设置为低电平触发方式,必须在程序中通过指令清0。

TF0、TF1中断响应后由内部硬件电路自动清0。

其余各中断标志位都要通过用户程序清0。

中断服务程序的入口地址:
INT0:0003H T0:000BH INT1:0013H T1:001BH
UART1:0023H ADC:002BH LVD:0033H PCA:003BH
UATR2:0043H SPI:004BH
7-3 STC12C5A60S2单片机的中断系统中有几个优先级?如何设定?当中断优先级相同时,其自然优先权顺序是怎样的?
STC12C5A60S2单片机的中断系统中有4个优先级。

STC系列单片机中,设置特殊功能寄存器IP、IP2、IPH、IP2H可以实现4个中断优先级选择。

当中断优先级相同时,如果其中的几个中断源同时产生中断请求,中断源响应中断的次序取决于内部的查询次序。

各中断源中断优先查询次序由高到低依次是:INT0、T0、INT1、T1、UART1、ADC、LVD、PCA、UATR2、SPI
7-4 简述STC12C5A60S2单片机的中断嵌套原则。

1. 在运行低优先级中断源的中断服务程序中,能被高优先级的中断源中断,反之不能。

2. 任何中断,一旦得到CPU 响应,就不会被同一中断优先级别的中断源中断。

7-5 中断响应过程中,为什么要保护现场?如何保护?
因为中断服务程序会用到一些寄存器和存储器,如果不保护现场,这些寄存器和存储器中的数据就会覆盖,当中断返回继续运行原来的程序时,就会得到错误的结果。

所以通常要保护现场。

保护现场的方法是把中断程序中用到的寄存器、存储器等要保护的内容压入到堆栈。

7-6 STC 系列单片机中如何选择和设置外部中断的边沿触发和电平触发方式 ?
TCON 寄存器中的IT0/TCON.0和IT1/TCON.2决定了外部中断0和1是下降沿触发还是低电平触发。

当ITx=1(x=0,1),系统在INTx (x=0,1)引脚检测到下降沿后产生外部中断。

当ITx=0(x=0,1),系统在INTx (x=0,1)引脚检测到低电平后产生外部中断。

7-7 在STC12C5A60S2单片机中,假设系统的时钟频率为
12MHz ,利用定时/计数器T0,分别用汇编语言和C51编程实现在P1.0引脚输出周期为2s 的方波。

用寄存器R2作为定时器T0中断次数计数器。

分析:要产生周期2s 的方波,需定时1s 。

选择12T 模式,T0x12=0,
f=12MHz ,机器周期T= us 112*M
121=,T0工作在方式1,最大定时时间为ms T 536.65*216=,所以一个定时器完成不了定时1s 的任务。

可以利用R2计数20次,每次定时50ms ,则
ms 50us 1*C -216=)(,计数初值C=15536=3CB0H ,
(1)汇编程序:
ORG 0000H
LJMP MAIN
ORG 000BH ;T0的中断向量入口地址
LJMP T0_INT
ORG 0100H
MAIN:MOV SP,#0BFH ;初始化堆栈指针
MOV TMOD,# 01H ;T0工作在方式1
MOV TL0,#0B0H ;给T0写入初值
MOV TH0,#03CH
MOV R2,#20 ;利用寄存器R2计数20次
SETB EA ;开放总中断
SETB ET0 ;T0溢出中断允许
SETB TR0 ;启动T0开始工作
SJMP $
T0_INT:MOV TL0,#0B0H ;重新赋初值
MOV TH0,#03CH
DJNZ R2,NEXT
CPL P1.0
MOV R2,#20 ;重新赋给R2值20
NEXT:RETI
END
(1)C51程序:
#include<STC12C5A.h>/
sbit P1_0=P1^0;
unsigned char i=0;
void main( )
{
TMOD=0x01;//T0工作在方式1
TL0=0xB0;//给T0装入初值
TH0=0x3C;
EA=1;//开放总中断
ET0=1;//T0溢出中断允许
TR0=1;//启动T0开始工作
while(1);
}
void T0_INT( ) interrupt 1 //T0中断服务程序
{
TH0=0x3C;
TL0=0xB0;//重新置入初值
i++;
if(i= =20)
{
P1_0=~P1_0;
i=0;
}
}
7-8由P1口驱动8个指示灯,利用定时/计数器T1的定时功能分别用汇编语言和C51编程实现8个指示灯依次循环点亮(输出高电平),点亮间隔为1s,反复循环。

分析:仿照上题,T1需定时50ms,R7计数20次,达到定时1s的目的,每隔1s,循环一次,实现轮流点亮。

(1)汇编程序
ORG 0000H
LJMP MAIN
ORG 001BH ;T1的中断向量入口地址
LJMP T1_INT
ORG 0100H
MAIN:MOV SP,#0BFH ;初始化堆栈指针
MOV TMOD,# 10H ;T1工作在方式1
MOV TL1,#0B0H ;给T1写入初值
MOV TH1,#03CH
MOV R7,#20 ;利用寄存器R7计数20次
MOV A,#01H
SETB EA ;开放总中断
SETB ET1 ;T1溢出中断允许
SETB TR1 ;启动T1开始工作
SJMP $
T1_INT:MOV TL1,#0B0H ;重新赋初值
MOV TH1,#03CH
DJNZ R7,NEXT ; R7减1不为0,说明中断次数未到20次,跳转到NEXT
;处返回
MOV P1,A;
RL A ;为下一次做准备
MOV R7,#20 ;重新赋给R7值50
NEXT:RETI
END
(2)C51程序:
#include<STC12C5A.h>
unsigned char i=0;
unsigned char j;
void main( )
{
TMOD=0x10;//T1工作在方式1
TL1=0xB0;//给T1装入初值
TH1=0x3C;
j=0x01;
EA=1;//开放总中断
ET1=1;//T1溢出中断允许
TR1=1;//启动T1开始工作
while(1);
}
void T1_INT( ) interrupt 3//T1中断服务程序
{
TH1=0x3C;
TL1=0xB0;//重新置入初值
i++;
if(i= =20)
{
P1=j;//已定时中断20次
i=0;
j=_crol_(j,1);
}
}
7-9 假设STC12C5A60S2单片机的系统时钟频率为12MHz,利用定时/计数器T1在方式1下的功能,分别用汇编语言和C51编程
INT)引脚上的正脉冲的宽度(单位μs)。

实现测量P3.3(1
汇编程序:;计时数据存放到60H(高位字节)、61H、62H单元。

ORG 0
LJMP START
ORG 001BH
LJMP T1_INT
START: MOV TMOD,#90H
MOV TL1,#00H
MOV TH1,#00H
MOV R0,#60H
MOV A,#0
SETB EA;
SETB ET1;
JB P3.3,$
SETB TR1
JNB P3.3,$
JB P3.3,$
CLR TR1
MOV @R0,A
INC R0
MOV @R0,TH1
INC R0
MOV @R0,TL1
SJMP $
T1_INT: INC A
RETI
END
C51语言:
#include<STC12C5A.h>
#include<intrins.h>//声明本征函数库
#define uchar unsigned char
sbit P3_3=P3^3;
uchar nvar0=0,nvar1,nvar2;// 存放计时数据
void main()
{
TMOD=0x90;
TH1=0x00;
TL1=0x00;
EA=1;
ET1=1;
while(P3_3==1); //等待P3.3变低
TR1=1;//P3_3为低电平时,启动T1工作
while(P3_3==0);//等待P3.3变高
while(P3_3==1); //等待P3.3再变低
TR1=0; //T1停止计数
nvar1=TH0;
nvar2=TL0;
while(1);
}
void T1_INT interrupt 3
{
nvar0++;
}
7-10 在STC89/90xx 系列单片机中利用定时/计数器T2的时钟输出功能,分别用汇编语言和C51编程实现在P1.0引脚上输出频率为50Hz 的方波。

分析:设系统时钟频率为12MHz ,工作在12T 模式,n=2,已知需要输出频
率为50Hz 的方波,由公式(RCAP2H ,RCAP2L )=65536-f
2n fosc ,计算出重装初值为RCAP2H=15H,RCAP2L=A0H.
汇编程序:
TH2 DATA 0CDH;特殊功能寄存器地址声明
TL2 DATA 0CCH
RCAP2L DATA 0CAH
RCAP2H DATA 0CBH
T2MOD DATA 0C9H
T2CON DATA 0C8H
TR2 BIT 0CAH
TF2 BIT 0CFH
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: MOV T2CON,#00H;T2工作在时钟输出方式
MOV T2MOD,#02H;T2输出时钟使能
MOV TL2,#0A0H;输出50Hz频率方波
MOV TH2,#15H
MOV RCAP2L,#0A0H
MOV RCAP2H,#15H
SETB TR2;T2开始工作
SJMP $
END
C51程序:
#include<reg52.h>
sfr T2MOD=0xC9;
void main()
{
T2CON=0x00;
T2MOD=0x02;
TL2=0xA0;//输出50Hz频率方波
TH2=0x15;
RCAP2L=0xA0;
RCAP2H=0x15;
TR2=1;
while(1);
}
7-11 简述STC12C5A60S2单片机的PCA模块的功能。

PCA每个模块都有自己的工作方式寄存器,通过对工作方式寄存器的设置,可以使各模块工作在定时方式(相当于定时、计数器)、捕获方式(相对应模块计数器所计数据进行捕获的方式,用于测量外部信号产生的时间间隔)、方波输出方式、输出信号脉宽调制(PWM)方式。

7-12假设系统时钟频率为12MHz,利用PCA模块的功能,分别用汇编语言和C51编程实现在P1.3引脚上间断重复输出频率为450Hz的
方波,持续和停止时间均为4s。

分析:将PCA模块的工作方式寄存器CCAPM0寄存器写为4DH,即PCA0设为时钟输出方式,从而可以在P1.3引脚自动翻转,输出方波,并允许PCA中断。

要求方波频率为450hz,即周期为1/450,定时时间应设定为1/900s,选择计数器时钟来源为系统时钟频率的12分频,即工作方式寄存器CMOD设为00H,需要计数(1/900)/(12/12000000)=10000/9≈1111=0457H个时钟脉冲,可将CL、CH初始值设为零,CCAP0H设为04H,CCAP0L设为57H,在每次PCA 中断里:将计数值加到比较匹配寄存器里CCAP0H、CCAP0L=CCAP0H、CCAP0L+0457H
启动PCA计数持续4秒(CR=1),停止(CR=0)持续4秒;
4秒钟定时:定时器T1,工作在方式1,计数时钟fosc/12,定时50毫秒,用R7计数T1中断80次产生4秒钟定时。

初值为N:由(65536-N)*1=50000得N=15536=3cb0H
(1) 汇编程序:
CCON EQU 0D8H;PCA控制寄存器
CMOD EQU 0D9H;PCA模式寄存器
CL EQU 0E9H;PCA定时器的低8位
CH EQU 0F9H;PCA定时器的高8位
CCAPM0 EQU 0DAH; PCA模块0的模式寄存器
CCAP0L EQU 0EAH;PCA模块0的捕获寄存器的低8位
CCAP0H EQU 0FAH;PCA模块0的捕获寄存器的高8位
AUXR EQU 8EH
CR BIT CCON.6;PCA定时控制位
CF BIT CCON.7;PCA溢出标志位
ORG 0000H
LJMP MAIN
ORG 001BH
LJMP T1_INT
ORG 003BH
LJMP PCA_INT
ORG 0100H
MAIN:
CLR A
MOV CCON,A;//(P197)
MOV CL,A;
MOV CH,A;
MOV SP,#0BFH;初始化堆栈指针
MOV TMOD,#10H;T1工作在方式1
MOV TL1,#0B0H;给T1写入初值
MOV TH1,#3CH;
ANL AUXR,#101111111H;//T1X12=0
MOV CCAPM0,#4DH;// 允许中断,输出方波。

相关文档
最新文档