在51rel单片机机SJMP rel 那PC地址等于PC+2+rel那地址不是越加越大吗?如何跳转到前面

通过前面4位计算机的结构、指令和程序,我们对计算机这一事物有了比较深入的理解,但这个4位机结构简单、指令集不丰富、运算速度慢、不支持高级语言编程,基本没有多少实际应用价值,仅能用来理解计算机工作原理。

这一章我们将对Intel公司出品的8051架构单片微型计算机进行讲解,并在后续章节中陆续设计出基于8051单片机的个人计算机,并且为其开发一款简单的操作系统,最终此8051计算机可以运行SD上的应用程序,可以在8051计算机上完成BASIC程序的编辑和运行。这台个人计算机将具备硬件、操作系统和应用软件的层次架构。

下面我们从结构、指令和程序三个方面来理解8051单片机。

8051单片机仍然符合冯诺依曼计算机设计方案。

l 二进制表示指令和数据;

l 存储程序,自动运行;

l 运算器、控制器、存储器、输入设备和输出设备。

l 布尔量处理能力;

l 1个全双工串行通信口;

8051单片机的功能方框图如图5-1所示,8051单片机也包括CPU(运算器和控制器)、数据存储器、程序存储器和输入/输输出5大部分。

前面我们自己设计的4位计算机,每一部分都能精确到用三极管怎样实现,8051单片机具体的硬件细节无从得知,除非Intel公司完全披露,好在我们不是设计或实现8051单片机,只是大体弄明白它的硬件结构和工作原理。


8051单片机常见的产品外观就是DIP40双列直插封装形式,示意图如图5-2所所示。把整个单片微型计算机封装在一个芯片内,所以简称单片机。P00~P07、P10~P17、P20~P27、P30~P37为四个8位并行的输入/输出口,其中P0、P2、P3为双功能口。P0、P2口也可用于扩展外部程序和数据存储器使用,当用于外部扩展存储器使用时,ALE、PSEN、EA、WR、RD为系统扩展的控制线。XTAL2和XTAL1为时钟输入线。RESET为复位线。Vcc为电源、Vss为地。

中央处理器包括运算器和控制器。运算器主要功能:

l 加、减、乘、除算数运算;

l 与、或、非等逻辑运算;

控制器主要作用是协调单片机各功能部件的动作,包括取指令、指令译码、发出微操作信号、控制存储器地址/数据传送等功能。

8051单片机的程序计数器是16位的,所以可访问的程序存储器最大为64KB,地址范围为0000H到FFFFH。实际的8051芯片片内不一定有64KB ROM,可能只有4KB、8KB等,如果需要更大的程序存储器,可以扩展片外程序存储器。如图5-3所示,8051内部有4KB ROM,外扩了60KB外部ROM。当引脚EA=1时,8051先访问片内的4KB ROM,超出4KB地址范围则访问外部ROM芯片;当EA=0时,直接忽略内部ROM,完全访问外部ROM。

外部程序存储器的扩展方法如图5-4所示,当访问外部程序存储器时,P0自动输出低8位的地址信息到锁存器,ALE引脚输出锁存信号,低8位地址被锁存,P2口再输出高8位地址,和锁存器的低8位地址共同构成外部ROM的地址,PSEN引脚输出读信号,ROM数据通过P0口输入8051单片机,完成外部程序存储器的读。

5-4 8051扩展外部程序存储器

指令要对数据进行操作,指令给出参与运算数据的方式称为寻址方式,8051单片机支持的寻址方式有:寄存器寻址、直接寻址、寄存器间接寻址、立即寻址和基址寄存器加变址寄存器间接寻址。

l MOV A,@R0  把R0寄存器里存的地址指向内存单元里的数据送入累加器A,寄存器间接寻址;

l MOVC A,@A+DPTR  把DPTR寄存器里的值加上累加器A里的值作为新的地址,此地址指向的存储单元里的数据送入累加器,基址寄存器加变址寄存器间接寻址。

8051数据存储器空间可分成4部分:外部64KB地址空间、内部低128字节数据存储区、内部高128字节特殊功能寄存器区、内部高128字节数据存储区,数据存储区结构如图5-5所示。

5-5 8051单片机数据存储区结构

其中内部低128字节数据存储区可以直接地址访问,内存高128字节数据存储区只能寄存器间接访问,内部高128字节特殊功能寄存器区可以直接地址访问,外部64KB存储区使用寄存器间接访问。

8051内部有一个低128字节的直接地址访问的数据存储区和一个高128字节直接地址访问的特殊功能寄存器区,更详细的划分如图5-6所示。

5-6 8051内部直接地址访问存储区结构

内部数据存储区的00H~0FH区域为四组工作寄存器区,每组有8个寄存器,用R0~R7表示,R0~R7具体位于哪一组工作寄存器区,通过PSW程序状态寄存器的第4位(RS1)和第3位(RS0)的组合指定,如果RS1RS0=“01”,则R0~R7位于第一组工作寄存器区,即R0的地址是08H,R7的地址是0FH。一旦设定好R0~R7位于的工作寄存器区的哪一组,那么剩下的其它地址单元就可以当普通RAM使用。

内部数据存储区的20H~2FH共16字节的存储区,除了有字节地址外,还有位地址,位地址的范围是00H~7FH。8051单片机可以用字节地址访问这段内存,也可以使用位地址访问这段内存。

比如说学生宿舍楼,每个房间都有一个房间编号,假设一个房间有8个床位,我们给床位再编一个床位号,100房间床位号是00H~07H,101房间床位号就是07H~0FH,其它房间以此类推。这样编完号后,每个床位可以用两种方式表示,一种是房间号加上第几个床位,另一种是直接的床位号,房间号好比字节地址,床位号好比位地址,表示方式不同,但访问的是同一个地方。

8051单片机在中断、子程序调用、传递参数等实际应用中,通常会用到一种称之为“栈”的数据存储结构。“栈”其实就是数据存储器中的一段内存,这段内存通过一个称为“栈指针”的特殊寄存器SP记录地址,当往“栈”里写入数据时,先把SP加1,然后把数据写入SP指向的内存单元,当从“栈”里读出数据时,把SP指向的内存单元数据读出,然后SP减1。8051单片机复位时,SP指向07H地址单元,用户可根据实际情况设置SP的指向。

片内数据存储区的低128字节除了工作寄存器区和堆栈区外,其它区域都可以作为普通的内存使用。

8051可以扩展64KB外部数据存储器或者I/O口,其中00H~FFH范围可以用R0、R1寄存器间接寻址,0000H~FFFFH范围可以使用16 位DPTR寄存器访问。8051单片机只管访问片外地址空间,至于访问是数据存储器还是外扩的I/O设备,由用户自己设计的硬件电路决定。

8051内部的CPU寄存器、I/O端口锁存器、串口寄存器、定时器寄存器、中断控制寄存器等特殊功能寄存器字节地址编号范围是80H~FFH,地址分配如表5-1所示。

5-1 8051特殊功能寄存器表

累加器ACC用于存放算数逻辑运算操作中的输入数和保存运算结果。

寄存器B在乘法和除法运算中作为辅助的寄存器使用,因为两个8位数相乘结果可能是16位数,只有累加器A存不下,所以使用B寄存器配合。

PSW程序状态寄存器,主要用于存储加法/减法的进位/借位信息,指定R0~R7位于哪一组工作寄存器区,存储溢出标志位和奇偶校验位等。

SBUF和SCON是串口通信相关寄存器,串口也在后面讲解。

TH1、TH0、TL1、TL0、TMOD和TCON是计数器寄存器,计数器后面讲解。

DPH和DPL组合到一起就是16位的DPTR寄存器,访问片外程序存储器和片外数据存储器时,DPTR用于存储地址信息。

SP是堆栈指针,用于指示栈顶的地址。

P0、P1、P2、P3是通用I/O的寄存器,可以输出数据和读入数据。

带星花的特殊功能寄存器除了可以字节寻址外,还可以位寻址,也就是说它们还有一个位地址,位地址编号为80H~FFH,与前面可位寻址的RAM共同构成00H~FFH的256个位寻址空间。

6. 外部数据存储器的扩展

当需要外部扩展数据存储器时,接口可参考图5-7所示。P0输出低8位地址,ALE输出锁存信号,锁存器锁存低8位地址,然后P2口输出的高地址和锁存器里的低8位地址组成外部RAM的地址,如果是写入RAM数据,那么P0口输出待写入数据,WR引脚输出写信号,数据写入RAM相应地址单元,如果是读出数据,那么RD引脚输出读信号,RAM读出的数据通过P0口输入8051单片机。

5-7 外部数据存储器的扩展结构

CPU正在按顺序一条条执行指令的时候,有紧急事件发生了,CPU被迫中断当前正在执行的程序,转而去处理紧急事件,处理完紧急事件后再返回中断处继续执行,这种机制就叫中断,能够请求CPU中断的来源称为中断源,8051单片机中断源及入口地址如表5-2所示。

5-2 8051单片机中断源和中断入口

以定时器0溢出产生中断为例,当定时器0记数达到最大值溢出后,会产生一个中断标志,CPU硬件会在每一个机器周期(标准8051的机器周期是12个时钟周期)末尾检查是否有中断需要处理,如果有中断到来,就把当前执行到的程序地址压入堆栈保存,然后把定时器0对应的中断入口000BH输入到程序计数器PC,也就是CPU跳转到000BH处执行,000BH处往往安排一条跳转指令,直接跳转到定时器0的中断处理子程序并执行,在子程序末尾会安排一条中断返回指令,中断返回指令会把压入栈的地址弹出到程序计数器PC中,也就是返回到中断前程序处继续执行。

8051单片机一般都有并行输入/输出口、定时器和串行通信口等几种常见的外围设备,一般外围设备都是由寄存器和功能部件构成,寄存器都有地址,往寄存器里写入/读出数据,寄存器再和功能部件产生电路上联系,最终通过控制寄存器就行控制这种外围设备。

8051单片机有P0、P1、P2和P3共32个通用输入/输出口,输入输出口的功能,可以理解为:往P1特殊功能寄存器里写入数据,数据会通过芯片P1口的8个引脚输出,读取P1特殊功能寄存器里的数据(MOV A,P1),就相当于把P1口的8个引脚上的高低电平读入计算机。P1、P2和P3都具有第二功能,比如外扩程序和数据存储器时用到的地址和数据功能,只有P1口是纯粹的输入输出口,P1口的结构如图5-8所示。

由图5-8可见,当把数据写入特殊功能寄存器时,实际上就是写入到了图中的D触发器中,如果写入1,Q—输出0,再经过一个反相器后,引脚上正好输出一个1。如果用MOV A,P1指令,则只是读取数据,会读引脚数据;如用OR P1,#0FFH等指令,则是读出-运算-写回,会读取寄存器里数据。

另外需要注意,P0口是开漏输出,做I/O口输出1时,实际输出的是高阻态,必须接上拉电阻后才能有效输出1的功能;P1、P2、P3内部都有一个比较大的上拉电阻,也就意味着当输出1时,实际是串联了一个大电阻再输出的,所以驱动电流比较小。如果要驱动较大功率的器件,可以使用“灌电流”的方式,也就是引脚输出0,外部器件接高电平,让电流流进引脚,形成灌电流;也可以在引脚外再用一个小电阻与片内的上拉电阻并联,并联后再接外部器件,因为并联后总电阻小于外接的小电阻,所以电流驱动能力也比较大。

    定时器配合定时器中断,可以实现类似闹钟提醒的功能。定时器包括一个记数时钟和一个计数器,可以给计数器设置一个初始值,记数时钟频率也可选择,这样在记数时钟驱动下,计数器从初始值开始累加,当记数到最大值后发生溢出,并会产生一个定时器中断,定时器中断的间隔可以通过记数时钟频率和计数器初始值计算得出,有了定时器就可以实现定时处理事情了,比如定时扫描键盘、输出设定占空比的脉冲信号等功能。

不同计算机之间往往需要传递信息或传输数据,那么就需要通信,串口可以实现串行通信,并口(前面提到的P口)可以实现并行通信。一般串行通信速率较慢,但连线少,并行通信则相反。

8051单片机最简单的串口通信只需一根地线,一根数据接收线,一根数据发送线。通信双方设置好发送和接收数据的波特率,发送方把待发送的字节数据写入发送寄存器SBUF,串口设备把SBUF里数据转换成8个脉冲信号,并且添加上起始位和停止位发送出去,接收方再把收到的脉冲信号还原成字节,并存入接收方的SBUF接收寄存器,接收单片机通过读取SBUF寄存器接收数据。异步串行通信的一种帧格式如图5-8所示。

5-8 异步串行通信帧格式

从异步串行通信的帧格式可以看出,一个数据帧通常包括1位起始位、8位二进制数据位、1位停止位。一秒钟能传输的二进制位的个数称为波特率,波特率确定了两个二进制位之间的时间间隔,接收双方只有相同的波特率才能通信成功。两个数据帧之间的时间间隔没有要求,一个数据帧除了数据位还包括起始位等无效数据,所以最终的有效数据传输速率肯定小于波特率。

常用的波特率有9600、19200、38400、57600、115200等,波特率可以通过设置8051单片机的相关寄存器进行设定。

二进制的指令编码方便记忆,所以设计了助记符与二进制编码对应,助记符也就是汇编语言,8051单片机总共有111条汇编指令。按指令编码字节数分类,有49条单字节指令、45条双字节指令和17条3字节指令;按指令执行周期分类,有64条单周期指令、45条双周期指令和2条4周期指令;按照指令完成的功能分类,有数据传送类、算术运算类、逻辑运算类、位操作类和控制转移类指令。

8051指令的16进制编码、助记符和功能解释如表5-3所示,其中:

addr)表示addr地址指向的内存单元里的数据;

l ((R0))表示R0里存储的地址指向的内存单元里的数据;

(A)乘以(B),积的高字节送入A,低字节送入B

左环移1位,第7位移入第0位

左环移1位,第7位移入CY,(CY)移入第0位

右环移1位,第0位移入第7位

右环移1位,第0位移入CY,(CY)移入第7位

如果(Rn)不等于0,

调用指令(LCALL)和转移(LJMP)指令都会带来程序的跳转,但调用指令会把当前地址压入堆栈保存,所以调用指令通过RET指令可以返回,但转移指令则不行。

调用和中断都把当前地址压入堆栈保存,都可以返回。调用是软件行为,而中断是硬件行为,并且中断还要清除中断标志、设置中断优先级状态寄存器等操作。调用用RET返回,中断用RETI返回,RETI指令除了把保存的地址弹出到PC外,还要清除中断响应时所置位的中断优先级状态寄存器。

4. 时钟周期、机器周期、指令周期

时钟周期就是最基本的晶振周期;8051单片机的1个机器周期包括12个时钟周期,完成指令的取指、译码、读操作数、执行、写结果等流程;指令周期就是一条指令的执行需要几个机器周期,比如乘除法需要4个机器周期,其它指令都是1到2个机器周期完成。

在讲解简单的4位计算机时,汇编代码是通过手工翻译成机器码的,耗时费力且容易出错,8051这里将用汇编器完成汇编语言的翻译工作。8051汇编器除了能翻译汇编指令为机器码外,还定义了很多伪指令,伪指令是用户想要传给汇编器的信息,通常不对应专门的机器码,伪指令主要有:

l ORG addr:指出后面的代码从程序存储器的addr地址处开始放置;

l LABEL:一段汇编程序的标号,汇编器会计算出来LABEL后第一条指令的地址,代码中就可以使用LABEL,如LJMP LABEL;

l END:汇编代码结束,后面即使还有程序也不会再处理;

注释:一行汇编指令后面用“;”注释,汇编器不处理分号后内容。

通过串口终端发送命令控制两个LED的亮灭,Proteus仿真原理图如图5-9所示。

5-9 命令控制LED灯仿真原理图

无论是写汇编程序,还是高级语言程序,基本思路都是化繁为简。在主函数中把复杂问题化为较简单的若干模块,在子函数中实现每个模块,如果模块仍然复杂,那么就进一步简化,总之就是简化、简化,一直简化到能实现为止。

    比如我们这个汇编小程序,可以在主函数中分成串口初始化和接收命令,在子函数中实现命令处理,直接处理命令不好解决,那么再写一个字符串比较子函数,一步步细化到好实现为止。

主程序流程图,命令处理子程序流程图、字符串比较子程序流程图如图所示。。。。。。

;接收命令并回显,保存命令至RAM 70~7F

CJNE A,#0DH,WAIT1 ;如果没有接收到回车符,那么继续接收下一个字符

LCALL PCMD ;如果接收到回车符,认为收到了一条完整的命令,处理命令

RET ;返回,继续接收新命令

RET ;返回重新接收新命令

;70H和60H开始挨个做差,差存入R3,遇到回车返回,

;差不为0也返回,R3=0为相等,否则不等

JZ LOOP ;字符相等,则比较下一个字符

RET ;只要遇到不相等,则比较完成

新建proteus工程,并绘制如图所示原理图;

在新建工程目录下创建code目录,code目录里创建led.asm文件文件,把汇编源代码录入led.asm;

仿真原理图中双击80c51单片机,并选择程序led.hex,执行仿真;

通过终端输入led开关的命令,查看程序执行的情况;

l 可以任意时刻暂停仿真,单片机上右键,选择查看特殊功能寄存器、内存单元里的内容,也可以调试汇编代码。

}

 单片机的最小系统?内部的主要结构?

答:最小系统:电源、晶振(为系统提供基本的时钟信号)、复位电路;内部结构:ROM/RAM、计时器、中断、I/O串并行口、总线扩展控制。

答:ROM(只读存储器):它的信息一次写入后只能被读出,而不能被操作者修改或者删除。一般用于存放固定的程序或数据表格。但是,“只读”这个概念有时候可以被一些新特性的器件颠覆。

RAM(随机存储器):它就是我们平时说的内存,主要用来存放各种现场的输入/输出数据、中间计算结果,以及与外部存储器交换信息,或者作堆栈(特点:先进后出,后进先出)用。它的存储单元根据具体需要可以读出或者改写。

两者区别:RAM只能用于暂时存放程序与数据。一旦电源关闭或发生断电,RAM中的数据就会丢失。而ROM中的数据在电源关闭或者断电后仍然会保留下来。

简而言之:相同点它们都是用来存储数据的

不同点存储数据的方式与数据能不能在二次加工不同

单片机I/O口有什么作用?I/0口的驱动能力?上拉电阻与下拉电阻的作用?

答:I/O口最主要的功能用来与外部器件实现数据信息的交互、速度匹配、数据传送方式和增强单片机的负载能力。它在两者之间扮演桥梁的作用,单片机拥有着串行与并行接口。每个种类的单片机的不同并行口也有着各自不同的功能。

单片机输出低电平时,将允许外部器件,向单片机引脚内灌入电流,这个电流,称为“灌电流”,外部电路称为“灌电流负载”。

单片机输出高电平时,则允许外部器件,从单片机的引脚拉出电流,这个电流,称为“拉电流”,外部电路称为“拉电流负载”。

单片机输出驱动能力的问题:每个单个的引脚,输出低电平的时候,允许外部电路,向引脚灌入的最大电流为 10 mA;每个 8 位的接口(P1、P2 以及 P3),允许向引脚灌入的总电流最大为 15 mA,而 P0 的能力强一些,允许向引脚灌入的最大总电流为26 mA;全部的四个接口所允许的灌电流之和,最大为 71 mA。而当这些引脚“输出高电平”的时候,单片机的“拉电流”能力呢?可以说是太差了,竟然不到 1 mA。

结论就是:单片机输出低电平的时候,驱动能力尚可,而输出高电平的时候,就没有输出电流的能力。

综上所述:灌电流负载,是合理的;而“拉电流负载”和“上拉电阻”会产生很大的无效电流,并且功耗大。

设计单片机的负载电路,应该采用“灌电流负载”的电路形式,以避免无谓的电流消耗。

在数字电路中,只有二种状态,要么是高电平,要么是低电平,在通电初期,这些输出状态是不确定的,为了使电路确定状态,必需使用上拉电阻或下拉电阻,使一个原来不确定电平变高的叫上拉电阻,否则就是下拉电阻,上拉电阻就是从电源上接一只电阻到这个状态口上就可以了,(就是把高的电压加到这个点上去,这个点的电位就高了)下拉电阻的接法,从这个状态口接一只电阻到负极(或数字接地),因电路形式与类别不同,当输入端有信号,这种变化会反应到输出口,从输出口得到了一个状态,本来应该完成任务了,但这会儿输入口已没信号了,可输出端还是这个状态(这个人习惯不好,开门后总是不关门,加一只弹簧,(电阻)让它自己关门,)这时候也要用到上下拉电阻,这里有复位的作用。

常见的时钟电路有哪些?为什么要使用PLL?

答:先了解一下什么是时钟电路?

时钟电路就是产生像时钟一样准确运动的振荡电路,任何工作都按时间顺序。用于产生这个时间的电路就是时钟电路。

组成:晶体振荡器、晶震控制芯片和电容组成。

它们的特点:接口简单、价格低廉、使用方便。

DS1302:具有涓细电流充电能力的电路,主要特点:采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768KHz晶振。

PLL(PhaseLocked Loop):锁相环电路。用来统一整合时脉讯号,使高频器件正常工作。如:内存的存取资料等。PLL用于振荡器中的反馈技术。许多电子设备要正常工作,通常需要外部的输入信号与内部的振荡信号同步。一般的晶振由于工艺与成本原因,做不到很高的频率,而在需要高频应用时,有相应的器件VCO,实现转成高频,但不稳定,故利用锁相环路就可以实现稳定且高频的时脉冲讯号。

什么是时脉:指同步电路中时钟的基础频率,它以(若千次周期每秒)来度量,单位是(Hz)

总之:PLL可以同步频率,相位正交。倍频、变频。

单片机的寻址方式有哪些?

答:80C51有七种寻址方式:

1、立即寻址,寻址空间为ROM;

2、直接寻址,寻址空间为片内RAM的低128B和特殊功能寄存器;

3、寄存器寻址,寻址空间为A、B、DPTR、CY、通用工作寄存器等;

4、寄存器间接寻址,片内RAM低128B、片外RAM;

5、相对寻址,寻址空间为ROM;

6、变址寻址,寻址空间为ROM;

7、位寻址,寻址空间为片内RAM低128B的位寻址区的128个位,其字节地址为20H~2FH;以及部分可以位寻址的特殊功能寄存器。

参考:AT89C51单片机能直接认识和执行的机器指令有255条,有7种寻址方式,即立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址、相对寻址和位寻址。

指令中直接给出参与操作的数据的地址,该地址一般用direct表示。

该指令的功能是将片内RAM地址direct单元中的内容(参与操作的数据)传送到累加器A中,双字节指令。

指令中直接给出参与操作的数据,称立即数,用data表示。在汇编语言中,为标明立即数,为data加前缀”#”。立即数可以是8位和16位二进制数,分别用#data和#data16表示。

该指令将立即数data传送到累加器A中,双字节指令。

参与操作的数据存放在寄存器中,汇编指令中直接以寄存器名来表示参与操作的数据地址,寄存器包括工作寄存器R0~R7、累加器A、AB、数据指针DPTR和位运算寄存器C。

该指令将Rn中的内容传送到累加器A中,单字节指令。

4. 寄存器间接寻址:

寄存器间接寻址为二次寻址,第一次寻址得到寄存器的内容为(Ri)或(DPTR),第二次寻址是将第一次寻址得到的寄存器内容作为地址,并在其中存、取参与操作的数据。汇编语言中,寄存器前缀@是寄存器间接寻址的标志,有@Ri、@DPTR等。

该指令是将Ri中的内容作为地址,再将该地址中的内容传送到累加器A中,单字节指令。

间接寻址由两个寄存器提供。若由A、PC提供,在汇编语言指令中寻址地址表示为@A+PC;若由A和DPTR提供,在汇编语言指令中寻址地址为@A+DPTR。其中,PC或DPTR被称为基址寄存器,A被称为变址寄存器,基址与变址相加为16位无符号加法。若变址寄存器A中内容加基址寄存器DPTR(或PC)中内容时,低8位有进位,则该进位直接加到高位,不影响进位标志。因变址寻址指令多用于查表,故常称为查表指令。

该指令将DPTR中的内容加上A中的内容作为地址,再将该地址中的内容传送到累加器A中,单字节指令。

相对寻址是以相对寻址指令的下一条指令的程序计数器PC的内容为基值,加上指令机器代码中的“相对地址”,形成新的PC值(要转移的指令地址)的寻址方式。指令机器代码中“相对地址”指的是用一个带符号的8位二进制补码表示的偏移字节数,其取值范围为-128~+127,负数表示向后转移,正数表示向前转移。

若(PC)表示该指令在ROM中的首地址,该指令字节数为2,执行时分两步操作:(PC)←(PC)+2,(PC)←(PC)+相对地址。第一步完成后,PC中的值为该指令的下一条指令的首地址;第二步完成后,PC中的内容(PC)为转移的目标地址。所以,转移的目标地址范围是该相对寻址指令的下一条指令首址加上-128~—+127字节的地址。

汇编语言相对寻址指令中的”rel”往往是一个标号地址,表示ROM中某转移目标地址。汇编软件对该汇编语言指令进行汇编时,自动算出“相对地址”并填入机器代码中,应将”rel”理解为“带有相对意义的转移目标地址”。

Rel=(PC)+相对寻址指令字节数+相对地址

其中,(PC)为该指令所在ROM中的首地址。

参与操作的数据为“位”,而不是字节,是对片内数据存储器RAM和SFR中可位寻址单元的位进行操作的寻址方式。

该指令将bit(位地址)中的内容(0或1)与C中的内容进行与操作,再将结果传送到PSW中的进位标志C中。

什么是时钟周期?机器周期?指令周期?它们之间的关系?

答:1、时钟周期又叫做振荡周期;单片机内部时钟电路产生(或外部时钟电路送入)的信号周期,单片机的时序信号是以时钟周期信号为基础而形成的,在它的基础上形成了机器周期、指令周期和各种时序信号。定义为时钟脉冲的倒数(可以这样理解:时钟周期就是单片机外接晶振的倒数,例如:12M的晶振,它的时钟周期就是1/12us),是计算机中最基本的、最小的时间单位。在一个时钟周期内,CPU仅完成一个最基本的动作。

2、计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一个阶段完成一项工作。例如:取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一项基本操作所需要的时间成为机器周期。一般情况,一个机器周期由若干个S周期(状态周期)组成。机器周期是单片机的基本操作周期,每个机器周期包含S1、S2、……S6这6个状态,每个状态包含两拍P1和P2,每个拍为一个时钟周期(振荡周期)。因此,一个机器周期包含12个时钟周期。依次可表示为S1P1、S1P2、S2P1、S2P2……、S6P1、S6P2。

3、指令周期:计算机从取一条指令开始,到执行完该指令所需要的时间称为指令周期。不同的指令,指令长度不同,指令周期也不一样。但指令周期以机器周期为单位,指令不同,所需的机器指令也不同。

51单片机指令根据指令长度与执行周期分为:

1) 单字节单周期指令

2) 单字节双周期指令

3) 双字节单周期指令

4) 双字节双周期指令

5) 三字节双周期指令

6) 一字节四周期指令

总结:时钟周期是最小单位,机器周期需要1个或者多个时钟周期,指令周期需要1个或者多个机器周期;机器周期是指完成一个基本操作的时间。指令周期是CPU的关键指标,指取出并执行一条指令的时间。一般以机器周期为单位,分单指令执行周期、双指令执行周期等。机器周期是完成一个基本操作的时间单元。时钟周期是CPU的晶振的工作频率的倒数。

单片机有哪些接口,各模块有哪些特性及应用环境?

答:接口电路——用于衔接外设与总线,实现存储空间扩展、I/O口线扩展、类型转换(电平转换、串并转换、A/D转换)、功能模块、通信扩展、总线扩展等。

外围设备——工作设备,连接在接口电路上,主要有输出设备和输入设备。

答:工作原理:在系统运行以后就启动看门狗计数器,此时看门狗就开始自动计时,如果达到一定的时间还不去给它进行清零,看门狗计数器就会溢出从而引起看门狗中断,造成系统的复位。

因为看门狗是一个计数器,而计数器位数有限。能够装的数值也就有限(比如8位的最多装256个数,16位的最多装65536个数),从开启看门狗那刻起,它就开始不停的数机器周期,数一个机器周期就计数器加1,加到计数器盛不下了(这就是溢出)就产生一个复位信号,重启系统。

看门狗分为软件看门狗和硬件看门狗,在什么情况下软件看门狗失效?

答:硬件看门狗是利用一个定时器电路,其定时输出连接到电路的复位端,程序在一定时间范围内对定时器清零,因此程序正常工作时,定时器总不能溢出,也就不能产生复位信号。如果程序出现故障,不在定时周期内复位看门狗,就使得看门狗定时器溢出产生复位信号并重启系统。

软件看门狗原理上一样,只是将硬件电路上的定时器用处理器的内部定时器代替,这样可以简化硬件电路设计,但是在可靠性方面不如硬件定时器。

1、系统内部定时器自身发生故障看门狗就会失效(当然可以通过双定时器相互监视,成本高);

2、中断系统故障导致定时器中断失效。

3、整个程序死机。主程序出现异常。

什么时候喂狗?怎么喂狗?喂狗的注意事项?

答:在实际的单片机应用系统中,到底选用哪种型号的看门狗,采用何种喂狗方式和看门狗连接方式以及在编程中喂狗命令应该放在程序中什么位置,这要根据现场干扰源的特点、已采用的干扰措施、单片机硬件资源和软件结构特点以及对单片机系统的可靠性等具体情况而定。

看门狗一般应用到程序的那些位置?

答: 一些重要的程序,必须让它一直跑着;而且还要时时关心它的状态——不能让它出现死锁现象。(当然,如果一个主程序会出现死锁,肯定是设计或者编程上的失误。首要做的事是Debug。)但如果时间紧迫可以用软件看门狗,暂时应急。

定时中断服务子程序中;

复位时单片机有什么动作?

答:主要做的就是初始化每个寄存器,包括最重要的PC指针,不包括RAM,然后单片机从复位地址开始执行程序。

必须使RST引脚(9)加上持续两个机器周期(即24个振荡周期)的高电平。单片机就执行复位操作。如果RST持续为高电平,单片机就处于循环复位状态。

单片机有哪些复位源,什么情况下会导致各个复位源

(2)外部复位输入引脚有效(RST);

(3)掉电检测可以用于由以下任一事件引起:① 低于BOR0,触发值是BOR0的 最高电压值;② 低于BOR1,触发值是BOR1的最高 电压值。

(4)软件启动复位(利用软件复位寄存器);

(5)违反看门狗复位条件;

STM8S共有9个复位源:

NRST引脚产生的外部复位

EMS复位:当一些关键的寄存器被破坏或错误加载时产生的复位

所有的复位源最终都作用于NRST管脚,并在复位过程中保持低电平。复位入口向量在内存映射中位于固定的地址6000h。

答:1、上电复位:要求接通电源后,自动实现复位操作。

2、按钮复位:要求接通电源后,单片机自动复位,并且在单片机运行期间,使用开关也可以实现复位。

答:采用上电复位:复位信号上电过程中有掉电现象,可能会造成逻辑方面的错误导致相关芯片复位时间不够、二次复位等、从而不能够正常工作起来。原因:产生的复位信号给了几个芯片用,导致这个复位信号的负载压力比较大,驱动能力不够从而往下调电,此现象常常出现在RC复位上。

复位信号上电前有毛刺与复位信号上电时有毛刺,可能会造成逻辑方面的错误导致相关芯片复位时间不够。方案:加大上拉电阻的阻值。

复位电路有哪些?那种比较好?

答:单片机复位电路主要有四种类型:

(1)微分型复位电路:

(2)积分型复位电路:

(3)比较器型复位电路:

比较器型复位电路的基本原理。上电复位时,由于组成了一个RC低通网络,所以比较器的正相输入端的电压比负相端输入电压延迟一定时间.而比较器的负相端网络的时间常数远远小于正相端RC网络的时间常数,因此在正端电压还没有超过负端电压时,比较器输出低电平,经反相器后产生高电平.复位脉冲的宽度主要取决于正常电压上升的速度.由于负端电压放电回路时间常数较大,因此对电源电压的波动不敏感.但是容易产生以下二种不利现象:

1)电源二次开关间隔太短时,复位不可靠:

2)当电源电压中有浪涌现象时,可能在浪涌消失后不能产生复位脉冲。

为此,将改进比较器重定电路,可以利用数字逻辑的方法和比较器配合,设计的比较器重定电路。此电路稍加改进即可作为上电复位和看门狗复位电路共同复位的电路,大大提高了复位的可靠性。

(4)看门狗型复位电路.

看门狗型复位电路主要利用CPU正常工作时,定时复位计数器,使得计数器的值不超过某一设定的值;当CPU不能正常工作时,由于计数器不能被复位,因此其计数会超过某一值,从而产生复位脉冲,使得CPU恢复正常工作状态。此复位电路的可靠性主要取决于软件设计,即将定时向复位电路发出脉冲的程序放在何处是最优的设计。一般设计,将此段程序放在定时器中断服务子程序中。然而,有时这种设计仍然会引起程序走飞或工作不正常。原因主要是:当程序"走飞"发生时,定时器初始化以及开中断之后的话,这种"走飞"情况就有可能不能由Watchdog复位电路校正回来.因为定时器中断一真在产生,即使程序不正常,Watchdog也能被正常复位.为此提出定时器加预设的设计方法.即在初始化时压入堆栈一个地址,在此地址内执行的是一条关中断和一条死循环语句.在所有不被程序代码占用的地址尽可能地用子程序返回指令RET代替.这样,当程序走飞后,其进入陷阱的可能性将大大增加.而一旦进入陷阱,定时器停止工作并且关闭中断,从而使Watchdog复位电路会产生一个复位脉冲将CPU复位.当然这种技术用于实时性较强的控制或处理软件中有一定的困难。

由此可见,四种复位电路中,看门狗型复位电路较其他三中复位电路更加适合。

堆栈的原理?过程怎么操作?

答:单片机RAM中,常常会指定一个专门的区域来存放某些特别的数据,它遵循先进后出、后进先出的原则。这个RAM区就是堆栈。堆栈是一种数据结构(数据项按序排列:堆,顺序随意。栈,后进先出)。使用一个称作堆栈指针的专用寄存器指示前的操作位置,堆栈指针总是指向栈顶。

1) 堆栈的建立(初始化)

堆栈应用在什么地方?存在什么问题?怎么解决?

答:在80C51单片机中,堆栈在子程序调用和中断时会把断点地址自动进栈和出栈。进栈和出栈的指令(PUSH、POP)操作可用于保护现场和恢复现场。由于子程序调用和中断都允许嵌套,并可以多级嵌套,而现场的保护也往往使用堆栈,所以一定要注意给堆栈以一定的深度,以免造成堆栈内容的破坏而引起程序执行的“跑飞”。

堆栈指针SP在80C51中存放当前的堆栈栈顶所指存储单元地址的一个8位寄存器。80C51单片机的堆栈是向上生成的,即进栈时SP的内容是增加的;出栈时SP的内容是减少的。

系统复位后。80C51的SP内容为07H。若不重新定义,则以07H为栈底,压栈的内容从08H单元开始存放。但工作寄存器R0~R7有4组,占有内部RAM地址为00H~1FH,位寻址区占有内部RAM地址为20H~2FH。若程序中使用了工作寄存器1~3组或位寻址区,则必须通过软件对SP的内容重新定义,使堆栈区设定在片内数据RAM区中的某一区域内(如30H),堆栈深度不能超过片内RAM空间。

答:在片内RAM中,常常要指定一个专门的区域来存放某些特别的数据,它遵循顺序存取和后进先出(LIFO/FILO)的原则,这个RAM区叫堆栈。

1.子程序调用和中断服务时CPU自动将当前PC值压栈保存,返回时自动将PC值弹栈。

2.保护现场/恢复现场

也就是说,堆栈是进入中断的时候用到的,单片机一旦遇到中断请求,就会去处理中断,处理完后再回来处理主程序,这样就涉及到了一个问题,单片机要保存中断之前的信息,以便处理完后能够回到主程序中,单片机会在响应中断前,把单片机现在的指针地址(也就是处理完要返回的地址),以及一些必要的数据压入堆栈(没有这些数据,单片机处理完中断后就无法确定主程序的状态)。

中断的响应过程?优先级?

1)根据响应的中断源的中断优先级,使相应的优先级状态触发器置1;

2) 执行硬件中断服务子程序调用,并把当前程序计数器PC的内容压入堆栈,保护断点,寻找中断源。

3) 清除相应的中断请求标志位(串行口中断请求标志RI和TI除外);

4) 把被响应的中断源所对应的中断服务程序的入口地址(中断矢量)送入PC,从而转入相应的中断服务程序。

5) 中断返回,程序返回断点处进行执行。

2、优先级:中断的优先级有两个:查询优先级与执行优先级

查询优先级:查询优先级是不可以更改和设置的

1)系统默认的优先级(逻辑上):

2)由IP寄存器来决定优先级。当IP对应位置为1时,该中断级别提高。同为1是按默认级别

中断嵌套的好处与坏处?

答:中断嵌套:CPU在处理级别较低的中断过程中,出现了级别较高的中断请求。CPU停止执行低级别中断,执行高级别的中断处理程序后,再接着执行低级别的未被处理完的中断程序。

使用中断嵌套可以使高优先级别的中断得到及时的响应和处理。

1) CPU与外部设备并行工作

2) 能够处理例外事件

5) 实现用户程序与操作系统的联系

6) 实现多道程序并行执行

7) 在多处理机系统中,实现处理机之间的联系

坏处:高级别的中断一直持续的话会影响低级别中断的处理。

答:中断源的识别标志,可用来形成相应的中断服务程序的入口地址或存放中断服务程序的首地址称为中断向量。把所有的中断向量集中起来,按中断类型号从小到大的顺序存放到存储器的某一区域内,这个存放中断向量的存储区叫做中断向量表,即中断服务程序入口地址表。

中断在单片机中起到什么作用?

答:中断能实现快速的CPU与慢速的外设同步工作,实现数据传送、故障检测与处理、人机联系、多机系统、多道程序分时操作、实时信息处理等。

什么是临界段,哪些情况下会存在临界段的问题,如何进行临界段保护。

答:1.临界段代码,也叫临界区,是指那些必须完整连续运行,不可被打断的代码段。

2. ①读取或者修改变量(特别是用于任务间通信的全局变量)的代码,一般来说这是最常见的临界代码。

②调用公共函数的代码,特别是不可重入的函数,如果多个任务都访问这个函数,结果是可想而知的。总之,对于临界段要做到执行时间越短越好,否则会影响系统的实时性。

3.中断处理程序和任务都会访问的临界段代码,需要使用关中断的方法加以保护;仅由任务访问的临界段代码,可以通过给调度器上锁的方法来保护。

什么是可重入型函数,使用时需要注意哪些问题

不为连续的调用持有静态数据。

不返回指向静态数据的指针;所有数据都由函数的调用者提供。

使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。

如果必须访问全局变量,记住利用互斥信号量来保护全局变量。

绝不调用任何不可重入函数。

1 :编写可重入函数时,应注意局部变量的使用(如编写C/C++ 语言的可重入函数时,应使用auto 即缺省态局部变量或寄存器变量)

说明:编写C/C++语言的可重入函数时,不应使用static局部变量,否则必须经过特殊处理,才能使函数具有可重入性。

2 :编写可重入函数时,若使用全局变量,则应通过关中断、信号量(即P 、V 操作)等手段对其加以保护

说明:若对所使用的全局变量不加以保护,则此函数就不具有可重入性,即当多个进程调用此函数时,很有可能使有关全局变量变为不可知状态。

VDD:D=device 表示器件的意思, 即器件 内部的工作电压;

对于数字电路来说,VCC是电路的供电电压,VDD是芯片的工作电压(通常Vcc>Vdd),VSS是接地点;有些IC既有VDD引脚又有VCC引脚,说明这种器件自身带有电压转换功能。

VSS:S=series 表示公共连接的意思,通常是指电路公共接地端电压。

VPP:不同芯片对Vpp的定义稍有不同,比如电压峰峰值,单片机中Vpp多数定义为编程电压

在场效应管(或COMS器件)中,VDD为漏极,VSS为源极,VDD和VSS指的是元件引脚,而不表示供电电压。一般来说VCC=模拟电源,VDD=数字电源,VSS=数字地,VEE=负电源

}

《单片机与接口技术》习题库及答案 一、判断题(判断每小题的对错,对的在小题前的括号中打“√”,错的在小题前的括号中打“×”。) MCS-51单片机原理与结构 (×)1.MCS51单片机是高档16位单片机。)2.MCS51的产品8051与8031的区别是:8031片内无ROM。 )3.单片机的CPU从功能上可分为运算器和存器。).8051的累加器ACC是一个8位的寄存器,简称为A,用来存一个操作数或中间结果。 ).8051的程序状态字寄存器PSW是一个8位的专用寄存器,用于存程序运行中的各种状态信息。 ).MCS51的程序存器用于存放运算中间结果。 ).MCS51的数据存储器在物理上和逻辑上都分为两个地址空间:一个是片内的256字节的RAM,另一个是片外最大可扩充64K字节的RAM。 (√).单片机的复位有上电自动复位和按钮手动复位两种,当单片机运行出错或进入死循环时,可按复位键重新启动。 ).CPU的时钟周期为振荡器频率的倒数。 )1.单片机的一个机器周期是指完成某一个规定操作所需的时间,一般情况下,一个机器周期等于一个时钟周期。)1.单片机的指令周期是执行一条指令所需要的时间。一般由若干个机器周期组成。 )1.单片机系统扩展时使用的锁存器,是用于锁存高8位地址。 )1.MCS51单片机上电复位后,片内数据存储器的内容均为00H。 )1.当8051单片机的晶振频率为12MHZ时,ALE地址锁存信号端的输出频率为2MHZ的脉冲。 )1.8051单片机片内RAM从00H~1FH的32个单元,不仅可以作工作寄存器使用,而且可作为RAM来读写。 )1.MCS51单片机的片内存器称为程序存器。 )1.MCS51单片机的数据存器是指外部存器。 ).MCS51单片机的特殊功能寄存器集中布置在片内数据存器的一个区域中。 MCS-51单片机指令系统及)1.MCS51单片机的指令格式中操作码与操作数之间必须用“,”分隔。 )2.MCS51指令:MOV A,#40H ;表示将立即数40H传送至A中。 )MCS-51指令:MOV A,@R0 ;表示将R0指示的地址单元中的内容传送至A中。 ).MCS51指令:MOVX A,@DPTR ;表示将DPTR指示的地址单元中的内容传送至A中。 ).MCS51的数据传送指令是把源操作数传送到目的操作数,指令执行后,源操作数改变,目的操作数修改为源操作数。 ).MCS1指令中,MOVX为片外RAM传送指令。 ).MCS51指令中,MOVC为ROM传送指令。 ).将37H单元的内容传送至A的指令是:MOV A,#37H。 ).MCS51指令中,16位立即数传送指令是:MOV DPTR,#data16。 ).MCS51单片机,CPU对片外RAM的访问只能用寄存器间接寻址的方式,且仅有4 条指令。 ).如JC rel发生跳转时,目标地址为当前指令地址加上偏移量。 ).对于8051单片机,当CPU对内部程序存储器寻址超过4K时,系统会自动在外部程序存储器中寻址。 ).指令MUL AB执行前(A)=F0H,(B)=05H,执行后(A)=FH5,(B)=00H。 ).已知:DPTR=11FFH (×).801单片机的PC与DPR都在CPU片内,因此指令MOVC A,@A+PC与指令MOVC A,@A+DPTR执行时只在单片机内部操作,不涉及片外存储器。).MCS51单片机中PUSH和POP指令只能保护现场,不能保护断点。 ).指令LCALL addr16能在64K字节范围内调用子程序。 ).设PC的内容为35H,若要把程序存贮器08FEH单元的数据传送至累加器A,则必须使用指令MOVC A,@A+PC。).指令MOV A,0H执行后A的内容一定为00H。 定时、中断、串行口系统及应用 (×).在MCS51单片机内部结构中,TMOD为模式控制寄存器,主要用来控制定时器的启动与停止。 )

}

我要回帖

更多关于 rel单片机 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信