51单片机

会使用51单片机的前提下,如何自学STM32?

cathy的头像

STM32单片机远比51单片机复杂,寄存器数量是它的好几倍,各种外设模块,DA、CRC、SPI、CAN、SD、CAN、TIM等等,而每一个模块可能都有单独的时钟,在使用这些模块时都要提前将时钟配置好,否则根本不能工作。

我们先普及一个概念,单片机(即Microcontroller Unit;MCU) 里面有什么。一个人最重要的是大脑,身体的各个部分都在大脑的指挥下工作。MCU跟人体很像,简单来说是由一个最重要的内核加其他外设组成,内核就相当于人的大脑,外设就如人体的各个功能器官。下面我们来简单介绍下51单片机和STM32单片机的结构。

1. 51系统结构

“51系统结构框图"
51系统结构框图

我们说的51一般是指51系列的单片机,型号有很多,常见的有STC89C51、AT89S51,其中国内用的最多的是STC89C51/2,下面我们就以STC89C51来讲解,并以51简称。

1)内核
  
51单片机由一个IP核和片上外设组成,IP核就是上图中的CPU,片上外设就是上图中的:时钟电路、SFR和RAM、ROM、定时/计数器、并行I/O口、串行I/O口、中断系统。IP核跟外设之间由系统总线连接,且是8bit的,速度有限。
  
51内核是上个世纪70年代Intel公司设计的,速度只有12M,外设是IC厂商(STC)在内核的基础上添加的,不同的IC厂商会在内核上添加不同的外设,从而设计出各具特色的单片机。这里Intel属于IP核厂商,STC属于IC厂商。我们后面要讲的STM32也一样,ARM属于IP核厂商,ARM给ST授权,ST公司在Cortex-M3内核的基础上设计出STM32单片机。

2)外设
  
我们在学习51的时候,关于内核部分接触的比较少,使用的最多的是片上外设,我们在编程的时候操作的也就是这些外设。

编程的时候操作的寄存器位于SFR和RAM这个部分,其中SFR(特殊功能寄存器)占有 128字节(实际上只用了 26 个字节,只有 26 个寄存器,其他都属于保留区),RAM占有 128 字节,我们在程序中定义的变量就是放在RAM中。其中SFR和RAM在地址上是重合的,都是在80~FF地址区间,但在物理区间上是分开的,所以51的RAM是有256个字节。
  
编写好的程序是烧写到ROM区。剩下的外设都是我们非常熟悉的IO口,串口、定时器、中断这几个外设。

2. STM32系统结构

“STM32系统结构框图"
STM32系统结构框图

1)内核

在系统结构上,STM32和51都属于单片机,都是由内核和片上外设组成。只是STM32使用的Cortex-M3内核比51复杂得多,优秀得多,支持的外设也比51多得多,同时总线宽度也上升到32bit,无论速度、功耗、外设都强于51。

从结构框图上看,对比51内核只有一种总线,取指和取数共用。Cortex-M3内部有若干个总线接口,以使CM3能同时取址和访内(访问内存),它们是:

指令存储区总线(两条)、系统总线、私有外设总线。有两条代码存储区总线负责对代码存储区(即FLASH外设)的访问,分别是I-Code总线和D-Code总线。

I-Code用于取指,D-Code用于查表等操作,它们按最佳执行速度进行优化。

系统总线(System)用于访问内存和外设,覆盖的区域包括SRAM,片上外设,片外RAM,片外扩展设备,以及系统级存储区的部分空间。

私有外设总线负责一部分私有外设的访问,主要就是访问调试组件。它们也在系统级存储区。

还有一个DMA总线,从字面上看,DMA是data memory access的意思,是一种连接内核和外设的桥梁,它可以访问外设、内存,传输不受CPU的控制,并且是双向通信。简而言之,这个家伙就是一个速度很快的且不受老大控制的数据搬运工,这个在51里面是没有的。

2)外设

从结构框图上看, STM32比51的外设多得多,51有的串口、定时器、IO口等外设 STM32 都有。STM32还多了很多特色外设:如FSMC、SDIO、SPI、I2C等,这些外设按照速度的不同,分别挂载到AHB、APB2、APB1这三条总线上。

本文转载自:程序源Lee
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 197

单片机简单来说就是集CPU(运算、控制)、RAM(数据存储-内存)、ROM(程序存储)、输入输出设备(串口、并口等)和中断系统处于同一芯片的器件。

在个人电脑中,CPU、RAM、ROM、I/O这些都是单独的芯片,然后这些芯片被安装在一个主板上,这样就构成了我们的PC主板,进而组装成电脑,而单片机将这些都集中在了一个芯片上。

一、51单片机

应用最广泛的8位单片机,当然也是初学者们最容易上手学习的单片机。

最早由Intel推出,由于其典型的结构和完善的总线专用寄存器的集中管理,众多的逻辑位操作功能及面向控制的丰富的指令系统,堪称为一代“经典”,为以后的其它单片机的发展奠定了基础。

1、51单片机特性

51单片机之所以成为经典,成为易上手的单片机主要有以下特点:

从内部的硬件到软件有一套完整的按位操作系统,称作位处理器,处理对象不是字或字节而是位。

不但能对片内某些特殊功能寄存器的某位进行处理,如传送、置位、清零、测试等,还能进行位的逻辑运算,其功能十分完备,使用起来得心应手。

同时在片内RAM区间还特别开辟了一个双重功能的地址区间,使用极为灵活,这一功能无疑给使用者提供了极大的方便。

乘法和除法指令,这给编程也带来了便利,很多的八位单片机都不具备乘法功能,做乘法时还得编上一段子程序调用,十分不便。

2、51单片机缺点

  • AD、EEPROM等功能需要靠扩展,增加了硬件和软件负担。

  • 虽然I/O脚使用简单,但高电平时无输出能力,这也是51系列单片机的最大软肋。

  • 运行速度慢,特别是双数据指针,如能改进能给编程带来很大的便利。

  • 51保护能力很差,很容易烧坏芯片。

3、51单片机应用范围

目前在教学场合和对性能要求不高的场合大量被采用。

使用最多的器件:8051、80C51。

二、STM32单片机

由ST厂商推出的STM32系列单片机,行业的朋友都知道,这是一款性价比超高的系列单片机,应该没有之一,功能及其强大。

其基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M内核;同时具有一流的外设,1μs的双12位ADC,4兆位/秒的UART,18兆位/秒的SPI等。

在功耗和集成度方面也有不俗的表现,当然和MSP430的功耗比起来是稍微逊色的一些,但这并不影响工程师们对它的热捧程度。

由于其简单的结构和易用的工具,再配合其强大的功能,在行业中赫赫有名。

01、STM32单片机特性

内核:ARM 32位Cortex-M3 CPU,最高工作频率72MHz,1.25DMIPS/MHz,单周期乘法和硬件除法。
存储器:片上集成32-512KB的Flash存储器,6-64KB的SRAM存储器。

时钟、复位和电源管理:2.0-3.6V的电源供电和I/O接口的驱动电压,POR、PDR和可编程的电压探测器(PVD),4-16MHz的晶振,内嵌出厂前调校的8MHz RC振荡电路,内部40 kHz的RC振荡电路,用于CPU时钟的PLL,带校准用于RTC的32kHz的晶振。

调试模式:串行调试(SWD)和JTAG接口,最多高达112个的快速I/O端口、最多多达11个定时器、最多多达13个通信接口。

02、STM32常用的器件

使用最多的器件:STM32F103系列、STM32 L1系列、STM32W系列。

三、51和STM32的区别

51单片机是对所有兼容Intel8031指令系统的单片机的统称,这一系列的单片机的始祖是Intel的8031单片机。

后来随着flash ROM技术的发展,8031单片机取得了长足的进展成为了应用最广泛的8bit单片机之一,它的代表型号就是ATMEL公司的AT89系列。

STM32单片机则是ST(意法半导体)公司使用ARM公司的cortex-M3为核心生产的32bit系列的单片机。

它的内部资源(寄存器和外设功能)较8051、AVR和PIC都要多的多,基本上接近于计算机的CPU了,适用于手机、路由器等。

本文转载自:网络
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:
cathy@eetrend.com)。

围观 921

51单片机——应用最广泛的8位单片机。

当然,也是初学者们最容易上手学习的单片机,最早由Intel推出,由于其典型的结构和完善的总线专用寄存器的集中管理,众多的逻辑位操作功能及面向控制的丰富的指令系统,堪称为一代“经典”,为以后的其它单片机的发展奠定了基础。目前在教学场合和对性能要求不高的场合大量被采用。

特点:

51单片机之所以成为经典,成为易上手的单片机主要有以下特点:

从内部的硬件到软件有一套完整的按位操作系统,称作位处理器,处理对象不是字或字节而是位。不但能对片内某些特殊功能寄存器的某位进行处理,如传送、置位、清零、测试等,还能进行位的逻辑运算,其功能十分完备,使用起来得心应手。

同时在片内RAM区间还特别开辟了一个双重功能的地址区间,使用极为灵活,这一功能无疑给使用者提供了极大的方便。

乘法和除法指令,这给编程也带来了便利。很多的八位单片机都不具备乘法功能,做乘法时还得编上一段子程序调用,十分不便。

缺点:

51单片机虽然是经典但是缺点还是很明显的

AD、EEPROM等功能需要靠扩展,增加了硬件和软件负担。

虽然I/O脚使用简单,但高电平时无输出能力,这也是51系列单片机的最大软肋。

运行速度过慢,特别是双数据指针,如能改进能给编程带来很大的便利。

51保护能力很差,很容易烧坏芯片。

STM32单片机——一款性价比超高的系列单片机

由ST厂商推出的STM32系列单片机,行业的朋友都知道,这是一款性价比超高的系列单片机,应该没有之一,功能及其强大。其基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M内核,同时具有一流的外设:1μs的双12位ADC,4兆位/秒的UART,18兆位/秒的SPI等等,在功耗和集成度方面也有不俗的表现,当然和MSP430的功耗比起来是稍微逊色的一些,但这并不影响工程师们对它的热捧程度,由于其简单的结构和易用的工具再配合其强大的功能在行业中赫赫有名。

特点:

STM32单片机其强大的功能主要表现在:

内核:ARM32位Cortex-M3CPU,最高工作频率72MHz,1.25DMIPS/MHz,单周期乘法和硬件除法。

存储器:片上集成32-512KB的Flash存储器;6-64KB的SRAM存储器。

时钟、复位和电源管理:2.0-3.6V的电源供电和I/O接口的驱动电压;POR、PDR和可编程的电压探测器(PVD);4-16MHz的晶振;内嵌出厂前调校的8MHz RC振荡电路,内部40 kHz的RC振荡电路;用于CPU时钟的PLL;带校准用于RTC的32kHz的晶振。

调试模式:串行调试(SWD)和JTAG接口;最多高达112个的快速I/O端口、最多多达11个定时器、最多多达13个通信接口。

来源:张飞实战电子,转载此文目的在于传递更多信息,版权归原作者所有。

围观 2571

助记符

指令说明

字节数

周期数

(数据传递类指令)

MOV

A,Rn

寄存器传送到累加器

1

1

MOV

A,direct

直接地址传送到累加器

2

1

MOV

A,@Ri

累加器传送到外部RAM(8 地址)

1

1

MOV

A,#data

立即数传送到累加器

2

1

MOV

Rn,A

累加器传送到寄存器

1

1

MOV

Rn,direct

直接地址传送到寄存器

2

2

MOV

Rn,#data

累加器传送到直接地址

2

1

MOV

direct,Rn

寄存器传送到直接地址

2

1

MOV

direct,direct

直接地址传送到直接地址

3

2

MOV

direct,A

累加器传送到直接地址

2

1

MOV

direct,@Ri

间接RAM 传送到直接地址

2

2

MOV

direct,#data

立即数传送到直接地址

3

2

MOV

@Ri,A

直接地址传送到直接地址

1

2

MOV

@Ri,direct

直接地址传送到间接RAM

2

1

MOV

@Ri,#data

立即数传送到间接RAM

2

2

MOV

DPTR,#data16

16 位常数加载到数据指针

3

1

MOVC

A,@A+DPTR

代码字节传送到累加器

1

2

MOVC

A,@A+PC

代码字节传送到累加器

1

2

MOVX

A,@Ri

外部RAM(8 地址)传送到累加器

1

2

MOVX

A,@DPTR

外部RAM(16 地址)传送到累加器

1

2

MOVX

@Ri,A

累加器传送到外部RAM(8 地址)

1

2

MOVX

@DPTR,A

累加器传送到外部RAM(16 地址)

1

2

PUSH

direct

直接地址压入堆栈

2

2

POP

direct

直接地址弹出堆栈

2

2

XCH

A,Rn

寄存器和累加器交换

1

1

XCH

A, direct

直接地址和累加器交换

2

1

XCH

A, @Ri

间接RAM 和累加器交换

1

1

XCHD

A, @Ri

间接RAM 和累加器交换低4 位字节

1

1

(算术运算类指令)

INC

A

累加器加1

1

1

INC

Rn

寄存器加1

1

1

INC

direct

直接地址加1

2

1

INC

@Ri

间接RAM 加1

1

1

INC

DPTR

数据指针加1

1

2

DEC

A

累加器减1

1

1

DEC

Rn

寄存器减1

1

1

DEC

direct

直接地址减1

2

2

DEC

@Ri

间接RAM 减1

1

1

MUL

AB

累加器和B 寄存器相乘

1

4

DIV

AB

累加器除以B 寄存器

1

4

DA

A

累加器十进制调整

1

1

ADD

A,Rn

寄存器与累加器求和

1

1

ADD

A,direct

直接地址与累加器求和

2

1

ADD

A,@Ri

间接RAM 与累加器求和

1

1

ADD

A,#data

立即数与累加器求和

2

1

ADDC

A,Rn

寄存器与累加器求和(带进位)

1

1

ADDC

A,direct

直接地址与累加器求和(带进位)

2

1

ADDC

A,@Ri

间接RAM 与累加器求和(带进位)

1

1

ADDC

A,#data

立即数与累加器求和(带进位)

2

1

SUBB

A,Rn

累加器减去寄存器(带借位)

1

1

SUBB

A,direct

累加器减去直接地址(带借位)

2

1

SUBB

A,@Ri

累加器减去间接RAM(带借位)

1

1

SUBB

A,#data

累加器减去立即数(带借位)

2

1

(逻辑运算类指令)

ANL

A,Rn

寄存器“与”到累加器

1

1

ANL

A,direct

直接地址“与”到累加器

2

1

ANL

A,@Ri

间接RAM“与”到累加器

1

1

ANL

A,#data

立即数“与”到累加器

2

1

ANL

direct,A

累加器“与”到直接地址

2

1

ANL

direct, #data

立即数“与”到直接地址

3

2

ORL

A,Rn

寄存器“或”到累加器

1

2

ORL

A,direct

直接地址“或”到累加器

2

1

ORL

A,@Ri

间接RAM“或”到累加器

1

1

ORL

A,#data

立即数“或”到累加器

2

1

ORL

direct,A

累加器“或”到直接地址

2

1

ORL

direct, #data

立即数“或”到直接地址

3

1

XRL

A,Rn

寄存器“异或”到累加器

1

2

XRL

A,direct

直接地址“异或”到累加器

2

1

XRL

A,@Ri

间接RAM“异或”到累加器

1

1

XRL

A,#data

立即数“异或”到累加器

2

1

XRL

direct,A

累加器“异或”到直接地址

2

1

XRL

direct, #data

立即数“异或”到直接地址

3

1

CLR

A

累加器清零

1

2

CPL

A

累加器求反

1

1

RL

A

累加器循环左移

1

1

RLC

A

带进位累加器循环左移

1

1

RR

A

累加器循环右移

1

1

RRC

A

带进位累加器循环右移

1

1

SWAP

A

累加器高、低4 位交换

1

1

(控制转移类指令)

JMP

@A+DPTR

相对DPTR 的无条件间接转移

1

2

JZ

rel

累加器为0 则转移

2

2

JNZ

rel

累加器为1 则转移

2

2

CJNE

A,direct,rel

比较直接地址和累加器,不相等转移

3

2

CJNE

A,#data,rel

比较立即数和累加器,不相等转移

3

2

CJNE

Rn,#data,rel

比较寄存器和立即数,不相等转移

2

2

CJNE

@Ri,#data,rel

比较立即数和间接RAM,不相等转移

3

2

DJNZ

Rn,rel

寄存器减1,不为0 则转移

3

2

DJNZ

direct,rel

直接地址减1,不为0 则转移

3

2

NOP

 

空操作,用于短暂延时

1

1

ACALL

add11

绝对调用子程序

2

2

LCALL

add16

长调用子程序

3

2

RET

 

从子程序返回

1

2

RETI

 

从中断服务子程序返回

1

2

AJMP

add11

无条件绝对转移

2

2

LJMP

add16

无条件长转移

3

2

SJMP

rel

无条件相对转移

2

2

(布尔指令)

CLR

C

清进位位

1

1

CLR

bit

清直接寻址位

2

1

SETB

C

置位进位位

1

1

SETB

bit

置位直接寻址位

2

1

CPL

C

取反进位位

1

1

CPL

bit

取反直接寻址位

2

1

ANL

C,bit

直接寻址位“与”到进位位

2

2

ANL

C,/bit

直接寻址位的反码“与”到进位位

2

2

ORL

C,bit

直接寻址位“或”到进位位

2

2

ORL

C,/bit

直接寻址位的反码“或”到进位位

2

2

MOV

C,bit

直接寻址位传送到进位位

2

1

MOV

bit, C

进位位位传送到直接寻址

2

2

JC

rel

如果进位位为1 则转移

2

2

JNC

rel

如果进位位为0 则转移

2

2

JB

bit,rel

如果直接寻址位为1 则转移

3

2

JNB

bit,rel

如果直接寻址位为0 则转移

3

2

JBC

bit,rel

直接寻址位为1 则转移并清除该位

2

2

本文转载自:
声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有,如涉及侵权,请联系小编邮箱 demi@eetrend.com 进行处理。

围观 208

51单片机的几种精确延时实现延时通常有两种方法:

一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;

另一种是软件延时,这种方法主要采用循环体进行。

1、使用定时器/计数器实现精确延时

单片机系统一般常选用 11.059 2 MHz、12 MHz 或 6 MHz 晶振。

第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为 1 μs 和 2 μs,便于精确延时。本程序中假设使用频率为 12 MHz 的晶振。最长的延时时间可达 216=65 536 μs 。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。

在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意,C51编写的中断服务程序编译后会自动加上 PUSH ACC、PUSH PSW、POP PSW 和 POP ACC语句,执行时占用了4个机器周期;如程序中还有计数值加1语句,则又会占用1个机器周期。这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。

2、软件延时与时间计算

在很多情况下,定时器/计数器经常被用作其他用途,这时候就只能用软件方法延时。

下面介绍几种软件延时的方法。

2.1 短暂延时

可以在C文件中通过使用带_NOP_( )语句的函数实现,定义一系列不同的延时函数,如Delay10us( )、Delay25us( )、Delay40us( )等存放在一个自定义的C文件中,需要时在主程序中直接调用。如延时10 μs的延时函数可编写如下:

void Delay10us( ) {
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
}

Delay10us( )函数中共用了6个_NOP_( )语句,每个语句执行时间为1 μs。主函数调用Delay10us( )时,先执行一个LCALL指令(2 μs),然后执行6个_NOP_( )语句(6 μs),最后执行了一个RET指令(2 μs),所以执行上述函数时共需要10 μs。可以把这一函数当作基本延时函数,在其他函数中调用,即嵌套调用\[4\],以实现较长时间的延时;但需要注意,如在Delay40us( )中直接调用4次Delay10us( )函数,得到的延时时间将是42 μs,而不是40 μs。这是因为执行Delay40us( )时,先执行了一次LCALL指令(2 μs),然后开始执行第一个Delay10us( ),执行完最后一个Delay10us( )时,直接返回到主程序。

依此类推,如果是两层嵌套调用,如在Delay80us( )中两次调用Delay40us( ),则也要先执行一次LCALL指令(2 μs),然后执行两次Delay40us( )函数(84 μs),所以,实际延时时间为86 μs。简言之,只有最内层的函数执行RET指令。该指令直接返回到上级函数或主函数。如在Delay80μs( )中直接调用8次Delay10us( ),此时的延时时间为82 μs。通过修改基本延时函数和适当的组合调用,上述方法可以实现不同时间的延时。

2.2 在C51中嵌套汇编程序段实现延时

在C51中通过预处理指令#pragma asm和#pragma endasm可以嵌套汇编语言语句。用户编写的汇编语言紧跟在#pragma asm之后,在#pragma endasm之前结束。

如:#pragma asm

汇编语言程序段

#pragma endasm

延时函数可设置入口参数,可将参数定义为unsigned char、int或long型。根据参数与返回值的传递规则,这时参数和函数返回值位于R7、R7R6、R7R6R5中。

在应用时应注意以下几点:

◆ #pragma asm、#pragma endasm不允许嵌套使用;

◆ 在程序的开头应加上预处理指令#pragma asm,在该指令之前只能有注释或其他预处理指令;

◆ 当使用asm语句时,编译系统并不输出目标模块,而只输出汇编源文件;

◆ asm只能用小写字母,如果把asm写成大写,编译系统就把它作为普通变量;

◆ #pragma asm、#pragma endasm和 asm只能在函数内使用。

将汇编语言与C51结合起来,充分发挥各自的优势,无疑是单片机开发人员的最佳选择。

2.3 使用示波器确定延时时间

利用示波器来测定延时程序执行时间。方法如下:编写一个实现延时的函数,在该函数的开始置某个I/O口线如P1.0为高电平,在函数的最后清P1.0为低电平。在主程序中循环调用该延时函数,通过示波器测量P1.0引脚上的高电平时间即可确定延时函数的执行时间。
方法如下:

sbit T_point = P1^0;
void Dly1ms(void) {
unsigned int i,j;
while (1) {
T_point = 1;
for(i=0;i<<2;i++){
for(j=0;j<<124;j++){;}
}
T_point = 0;
for(i=0;i<<1;i++){
for(j=0;j<<124;j++){;}
}
}
}
void main (void) {
Dly1ms();
}

把P1.0接入示波器,运行上面的程序,可以看到P1.0输出的波形为周期是3 ms的方波。其中,高电平为2 ms,低电平为1 ms,即for循环结构“for(j=0;j<<124;j++) {;}”的执行时间为1 ms。通过改变循环次数,可得到不同时间的延时。当然,也可以不用for循环而用别的语句实现延时。这里讨论的只是确定延时的方法。

2.4 使用反汇编工具计算延时时间

用Keil C51中的反汇编工具计算延时时间,在反汇编窗口中可用源程序和汇编程序的混合代码或汇编代码显示目标应用程序。为了说明这种方法,还使用“for ( i = 0;i< DlyT; i++ ) {;}”。

在程序中加入这一循环结构,首先选择build taget,然后单击start/stop debug session按钮进入程序调试窗口,最后打开Disassembly window,找出与这部分循环结构相对应的汇编代码,具体如下:

C:0x000FE4CLRA//1T
C:0x0010FEMOVR6,A//1T
C:0x0011EEMOVA,R6//1T
C:0x0012C3CLRC//1T
C:0x00139FSUBBA,DlyT //1T
C:0x00145003JNCC:0019//2T
C:0x00160E INCR6//1T
C:0x001780F8SJMPC:0011//2T

可以看出,0x000F~0x0017一共8条语句,分析语句可以发现并不是每条语句都执行DlyT次。核心循环只有0x0011~0x0017共6条语句,总共8个机器周期,第1次循环先执行“CLR A”和“MOV R6,A”两条语句,需要2个机器周期,每循环1次需要8个机器周期,但最后1次循环需要5个机器周期。DlyT次核心循环语句消耗(2+DlyT&TImes;8+5)个机器周期,当系统采用12 MHz时,精度为7 μs。

当采用while (DlyT--)循环体时,DlyT的值存放在R7中。

相对应的汇编代码如下:

C:0x000FAE07MOVR6, R7//1T
C:0x00111F DECR7//1T
C:0x0012EE MOVA,R6//1T
C:0x001370FAJNZC:000F//2T

循环语句执行的时间为(DlyT+1)&TImes;5个机器周期,即这种循环结构的延时精度为5 μs。

通过实验发现,如将while (DlyT--)改为while (--DlyT),经过反汇编后得到如下代码:

C:0x0014DFFE DJNZR7,C:0014//2T

可以看出,这时代码只有1句,共占用2个机器周期,精度达到2 μs,循环体耗时DlyT&TImes;2个机器周期;但这时应该注意,DlyT初始值不能为0。

注意:计算时间时还应加上函数调用和函数返回各2个机器周期时间。

来源:畅学电子

围观 329

1.怎样正确获取程序的目标代码

  要正确获取程序的目标代码,首先要明确程序代码的存放地点。51单片机的程序存储器最大空间为64KB,在一个实际的应用系统中,程序存储器的分布情况可能有以下几种:

  (1)只使用了片内程序空间。而没有使用片外的程序空间。

  其硬件特征为:/EA引脚接VCC;/PSEN引脚为空脚。

  这种情况比较简单,全部应用程序都在单片机内部的程序存储器中,我们只要使用编程器将程序代码读出来,保存为一个目标代码文件就可以了。要注意的是,有一些新型的单片机具有加密功能,如果进行了加密,其中的程序代码就是不能读出。

  (2)没有使用片内程序空间,片外程序空间由单个存储芯片构成。

  其硬件特征为:/EA引脚接GND;/PSEN引脚接到一个存储芯片上。

  这种情况下,全部应用程序都在单片机外部的程序存储器中,原则上我们只要使用编程器将程序代码读出来,保存为一个目标代码文件就可以了。但要注意的是,这样得到的并不一定是真正的目标代码,因为,为了防止程序代码被读取、反汇编,很多设计人员都采取跳接线的方法,将某些地址线跳接或将某些数据线跳接或将地址线、数据线都进行跳接,从而保护自己的程序不被反汇编(参见下面四图)。这样一来,我们从存储器中读取的就不是真正的程序目标代码,必须进行某种变换,将其转换为真正的程序目标代码,才能进行反汇编。

  要进行目标代码的变换,首先必须根据硬件画出实际的地址和数据的接线图,然后借助于工具软件进行变换。在“51汇编集成开发环境”关的介绍,其中,提供了一个变换工具,从软件界面的[辅助工具]-[目标代码转换]-[bin代码还原]就可以启动这个工具。

  单击[浏览]可以选择要转换的代码文件,注意:这里的代码文件只能是二进制代码文件,即bin文件,如果你通过编程器读取后保存的文件不是bin文件,就需要先将其转换为bin文件,在“51汇编集成开发环境”的[辅助工具]-[目标代码转换]菜单下,有相应的转换工具。

  单击[另存为]可以选择转换结果的存放地点和文件名,转换结果也一定是bin文件。

  再根据实际的地址、数据的接线图,来选择地址线跳接、数据线跳接,设置其接线表,然后单击[还原]即完成了代码的变换。

  (3)没有使用片内程序空间,片外程序空间由多个存储芯片构成其硬件特征为:/EA引脚接GND;/PSEN引脚接到了几个存储芯片上。

  这种情况下,全部应用程序在单片机外部的多个存储芯片中,我们首先需要使用编程器将每一个存储芯片上的程序代码读出来,分别保存为一个目标代码文件,然后将它们合并为一个文件。

  在读取存储芯片上的程序代码时,要注意查看硬件接线有无跳接线,如果有跳接线,必须进行代码的变换。

  在合并程序代码时,要注意每一个存储芯片的地址范围,必须按地址连接,才能得到真正的目标代码文件。

  在“51汇编集成开发环境”中,从[辅助工具][目标代码转换]-[bin代码合并]可以启动合并工具。

  单击[浏览]可以选择要合并的两个代码文件,注意:第一个代码文件必须是从0地址开始的文件,单击[另存为]可以选择合并后的文件存放地点和文件名,然后单击[开始]即完成了代码的合并。

  若选择直接连接,则第二个代码文件将紧接着第一个文件后连接;若选择按地址连接,则第二个代码文件将从指定的地址开始连接。如果两个代码文件之间有空字节,则将填充为“00H”或“FFH”;如果两个代码文件在空间上有重叠,则将得到提示:“地址空间存在重合现象,不能正常合并!”。

  (4)既使用了片内程序空间,也使用片外的程序空间其硬件特征为:/EA引脚接VCC;/PSEN引脚接到一个存储芯片或几个存储芯片上。

  在这种情况下,全部应用程序分布在单片机内部的程序存储器和外部的多个存储芯片中,获取程序代码的基本方法同(3)。

  这里要注意的是,片外程序存储器的地址范围应该在1000H~FFFFH之间,如果某一片程序存储器的地址是从0000H开始的,那么其 0000H~0FFFH之间的代码是无效的,必须将其去除。借助于“51汇编集成开发环境”的[辅助工具]-[目标代码转换]菜单下的[bin代码拆分],可以完成这一工作。

  单击[浏览]可以选择要转换的代码文件,再选择片内ROM空间为4KB,然后单击[开始]即可。

  2.怎样进行反汇编要想成功进行反汇编,还必须有一个好的反汇编工具。

在“51汇编集成开发环境”中集成有一个反汇编工具。该工具目前不支持对非0地址开始的部分代码进行反汇编,因为非O地址开始的部分代码无法区分程序和数据,但是对于从O地址开始的全部或部分代码的反汇编效果较好,能够智能分段、自动地分离出程序和数据,使获得的源程序具有较好的可读性。

  从软件界面的[编译]-[反汇编]-[MCS-51反汇编]可以启动这个工具。

  3.实例

  设有一个单片机的应用系统 单片机的/EA引脚接VCC;/PSEN引脚接到一个存储芯片28C64上,全部应用程序分布在单片机内部的程序存储器(4KB)和片外的28C64中,其中28C64还进行了跳线处理。要进行反汇编必须按以下步骤进行:

  (1)借助于编程器分别从单片机和28C64中读取代码,保存为两个文件。

  其中,从单片机中读取的文件名为CODE0.bin;从28C64中读取的文件名为CODE1.bin。

  (2)用“51汇编集成开发环境”中的[bin代码还原],将从28C64中读取

  的文件CODE1.bin转换为真正的程序代码,保存为文件CODE2.bin。

  (3)用“51汇编集成开发环境”中的[bin代码合并],将CODE0.bin和ODE2.bin合并为一个文件CODE3.bin.

  (4)用“51汇编集成开发环境”中的[MCS51反汇编],对CODE3.bin

  进行反汇编,得到的源程序文件保存为CODE.ASM。

  至此,反汇编成功。

来源:网络

围观 121

页面

订阅 RSS - 51单片机