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

}

5-10 试用C51语言编写程序实现将片内RAM 30H、31H单元存放的2字节十六进制数转换为十进制数存于21H为首的单元中。(设低地址存放高位字节)

#include #include

#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; buf=buf/10; } }

5-11试用C51语言编写程序实现将0-9,A-F十六进制数转换成相应的ASCII码。

#include

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

13

#incldue 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的汇编语言文件,然后把这些文件导入到同一个工程下进行编译连接。

14

在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

15

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,

1*12?1us,T0工作在方式1,最大定时时间为f=12MHz,机器周期T=

12M216*T?65.536ms,所以一个定时器完成不了定时1s的任务。

(216-C)*1us?50ms,计数初可以利用R2计数20次,每次定时50ms,则

值C=15536=3CB0H,

(1)汇编程序:

ORG 0000H LJMP MAIN

ORG 000BH ;T0的中断向量入口地址 LJMP T0_INT

16