单片机复位程序

发布者:茶叶侠最新更新时间:2016-07-26 来源: eefocus关键字:单片机  复位程序 手机看文章 扫描二维码
随时随地手机看文章

今天在网上看到这么一个单片机复位的程序,这个程序据说是一个大三的学生写出来的,不错,写的很有一定的道理,其C编程也达到了一定程度了【小盒子我还是很佩服这个人的】。下面我们来看看这个代码:

void main(void)
{
   unsigned char code rst[]={0xe4,0xc0,0xe0,0xc0,0xe0,0x32};  // 复位代码


   (*((void (*)())(rst)))();  // 执行上一行代码,将rst数组当函数调用
}

第一句定义一个数组rst[],数组内数据就是完成复位功能的汇编机器码,具体对应关系为:

clr a == 0xe4、push acc == 0xc0,0xe0、reti ==0x32
可以看出其程序起到复位的作用,完全就是汇编机器码的功劳。

而单片机复位的更好方法
clr a                      //清除ACC=0
push acc               //压0到堆栈——8位
push acc               //再压0到堆栈——再8位
reti                        //返回到0地址,从新执行。

这种复位方法比较麻烦,更加简单的复位写法是(摘自《C缺陷与陷阱》):
(     * (  void (*)( )  )0      ) ( );

看过上面更简单的复位方法,让我们多加考虑一下,为什么要写成0?别的不行吗?换成别的后会是什么样的效果呢?抱着这个想法,我亲自经过KEIL V2.4.0编译后的汇编程序:

可以看出若将(     * (  void (*)( )  )0     ) ( );  

改成(     * (  void (*)( )  )3      ) ( );

 

则程序会跳转到main()函数开始,避开startup文件的初始化……

 只所以我说的是会从main()开始,是因为我看过编译后的汇编文件,找到main的实际物理地址而已,否则我也不会写成3了。呵呵……下面就是编译后的汇编结果

C:0x0003    E4       CLR      A
C:0x0004    F508     MOV      0x08,A
C:0x0006    F509     MOV      0x09,A
    14:    while(1) { 
    15:         if(i == 10) { 
    16:            //(    *(   ( void (*)( ) )   (rst)    )    )();  // 执行上一行代码,将rst数组当函数调用 
C:0x0008    E509     MOV      A,0x09
C:0x000A    640A     XRL      A,#0x0A
C:0x000C    4508     ORL      A,0x08
C:0x000E    7005     JNZ      C:0015
    17:            (    *(   ( void (*)( ) )   (3)    )    )();  // 执行上一行代码,将rst数组当函数调用 
C:0x0010    120003   LCALL    main(C:0003)
    18:         } else { 
C:0x0013    80F3     SJMP     C:0008
    19:                 i++; 
C:0x0015    0509     INC      0x09
C:0x0017    E509     MOV      A,0x09
C:0x0019    70ED     JNZ      C:0008
C:0x001B    0508     INC      0x08
    20:         }

 

为了进行给大家一个很好的比较,从视觉上得到一定的感觉,我又再次将3改回成0,大家看看编译后的汇编结果是什么样子的;

下面的代码是函数(     * (  void (*)( )  )0     ) ( );   这个编译后的结果

C:0x0003    E4       CLR      A
C:0x0004    F508     MOV      0x08,A
C:0x0006    F509     MOV      0x09,A
    14:    while(1) { 
    15:         if(i == 10) { 
    16:            //(    *(   ( void (*)( ) )   (rst)    )    )();  // 执行上一行代码,将rst数组当函数调用 
C:0x0008    E509     MOV      A,0x09
C:0x000A    640A     XRL      A,#0x0A
C:0x000C    4508     ORL      A,0x08
C:0x000E    7005     JNZ      C:0015
    17:            (    *(   ( void (*)( ) )   (0)    )    )();  // 执行上一行代码,将rst数组当函数调用 
C:0x0010    120000   LCALL    C_STARTUP(C:0000)
    18:         } else { 
C:0x0013    80F3     SJMP     C:0008
    19:                 i++; 
C:0x0015    0509     INC      0x09
C:0x0017    E509     MOV      A,0x09
C:0x0019    70ED     JNZ      C:0008
C:0x001B    0508     INC      0x08
    20:         }

请大家注意红色的部分。

关键字:单片机  复位程序 引用地址:单片机复位程序

上一篇:MSP430学习—CPU及指令
下一篇:BCC异或校验法

推荐阅读最新更新时间:2024-03-16 15:01

51单片机的时钟及总线时序和总线扩展
说到51单片机的时钟首先想到51时怎么工作的呢?微型控制器要想工作必须要有一个“动力”,对于51单片机来说,这个“动力”就是时钟源。一般应用上会外接一个12MHz的晶振作为时钟源。 一般第一种接法用的比较多。选择内部震荡方式时晶振旁边有两个小电容。这两个电容叫晶振的负载电容,分别接在晶振的两个脚上和对地的电容,一般在几十皮发。它会影响到晶振的谐振频率和输出幅度。晶振的负载电容= +Cic+△C式中Cd,Cg为分别接在晶振的两个脚上和对地的电容,Cic(集成电路内部电容)+△C(PCB上电容)经验值为3至5pf。 各种逻辑芯片的晶振引脚可以等效为电容三点式振荡器。晶振引脚的内部通常是一个反相器, 或者是奇数个反相器串
[单片机]
51<font color='red'>单片机</font>的时钟及总线时序和总线扩展
51 单片机晶振电路原理
XTAL1和XTAL2指的是8051系单片机上常见的用于接“晶振”(晶体谐振器-Crystal Resonator”)的两个引脚。从原理上来说,这两个引脚和MCU内部一个反相器相连接。这个反相器与外部的“晶振”组成一个构成一个皮尔斯振荡器(Pierce oscillator)。因为这个振荡器集成在器件内部的组件实在是不能更简单啦,就一个反相器和一个电阻,非常合适于各种数字IC的设计制造流程。 深入地分析这个皮尔斯振荡器的工作原理时,不妨把它表述成以下理想的电路形式: 模电知识告诉我们,当期望得到一个输出信号频率为的振荡电路时,这个电路在必须满足两个条件:2kπ的环路相移 闭环增益为1 在上面的皮尔斯振荡器的电路原理图中
[单片机]
常用于机器人的单片机的使用经验
一 学习单片机的捷径是什么? 所谓捷径就是少走弯路。我刚开始学单片机时走了不少弯路,很多朋友和我都有相似的经历,刚开始接触 2 齿轮和凸轮组成的控制器 在模拟计算机诞生前,也就是蒸汽机时代,有些机械天才硬是用数百个齿轮和凸轮搭建出机械计算机,人们通过转动印有数字的各种齿轮,另一些齿轮就将运算结果显示出来。机械计算机在人类史上上曾经是高科技产品,第二次世界大战时,德国著名的密码机就是一种机电混合式计算机,它当时是最保密的通信工具。 3 发条和秒表和继电器组成的控制器 在电气时代开始时,人们用钟表内机械的旋转分时控制一些继电器的通断,从而控制一些机床和生产线的运行。这种装置类似于早期洗衣机内的定时器。 三 入门首选 AT
[单片机]
常用于机器人的<font color='red'>单片机</font>的使用经验
PIC单片机捕捉模块的设计思路
PIC16F877单片机配置了两个CCP(捕捉/比较/脉宽调制)模块,即CCP1和CCP2。它们各白都有独立的16位寄存器CCPR1和CCPR2。两个模块的结构、功能、操作方法基本一样,区别仅在于它们各自有独立的外部引脚和特殊事件触发器。CCP模块的功能包括外部信号捕捉、内部比较输出以及PWM输出,它往往与定时器/计数器配合使用。   CCP模块可工作在3种模式下:捕捉方式、比较方式和脉宽调制方式。   · 捕捉方式是指检测引脚上输入信号的状态,当信号的状态符合设定的条件时(信号上升沿或下降沿出现时)产生中断,并记录当时的定时器/计数器值,当CCP模块工作在捕捉方式时,TMR1控制寄存器必须工作在定时器或同步计数方式下。
[单片机]
PIC<font color='red'>单片机</font>捕捉模块的设计思路
从零开始51单片机教程 —— 定时器/计数器的方式控制字
从上一节我们已经得知,单片机中的定时/计数器都能有多种用途,那么我怎样才能让它们工作于我所需要的用途呢?这就要通过定时/计数器的方式控制字来设置。 定时/计数器共有四种工作方式 在单片机中有两个特殊功能寄存器与定时/计数有关,这就是TMOD和TCON。顺便说一下,TMOD和TCON是名称,我们在写程序时就能直接用这个名称来指定它们,当然也能直接用它们的地址89H和88H来指定它们(其实用名称也就是直接用地址,汇编软件帮你翻译一下而已)。 TMOD结构 从图1中我们能看出,TMOD被分成两部份,每部份4位。分别用于控制T1和T0,至于这里面是什么意思,我们下面介绍。 TCON结构 从图2中我们能看出,TCON也
[单片机]
从零开始51<font color='red'>单片机</font>教程 —— 定时器/计数器的方式控制字
51单片机时钟精度误差的解决
前几天用STC89C52单片机制作了一个电子时钟,经过一段时间的实验,发现时间精度存在误差,一分钟慢4秒左右。 这可了不得,十分钟就要慢40秒,一天下来不得慢半96分钟!!! 这个单片机晶振频率为11.0592mhz,和大部分时钟的晶振频率相同,应该没有问题。 后天考虑到源代码: 在定时器中断函数里: void t0(void) interrupt 1 using 0 { tcount++; if(tcount==4000) {tcount=0; second++; if(second==60) {second=0; minute++; if(minut
[单片机]
工程师在PIC单片机选型时需要了解的特性
  单片机的种类很多,PIC单片机(Peripheral Interface Controller)是一种用来开发和控制外围设备的集成电路(IC)。一种具有分散作用(多任务)功能的CPU。与人类相比,大脑就是CPU,PIC 共享的部分相当于人的神经系统。   PIC单片机有计算功能和记忆内存像CPU并由软件控制运行。然而,处理能力—般,存储器容量也很有限,这取决于PIC的类型。但是它们的最高操作频率大约都在20MHz左右,存储器容量用做写程序的大约1K—4K字节。时钟频率与扫描程序的时间和执行程序指令的时间有关系。但不能仅以时钟频率来判断程序处理能力,它还随处理装置的体系结构改变。如果是同样的体系结构,时钟频率较高的处理能力会
[单片机]
基于单片机和PWM控制方法调速实现无刷控制器检测设计
引言 伴随着城市化进程,人们生活的交通距离不断扩大,代替燃油汽车和自行车的电动车的普及大幅度的提高了电力资源的利用效率,促进了国民经济的健康发展。电动自行车以电力作动力,骑行中不产生污染,无损于空气质量。从改善人们的出行方式、保护环境和经济条件许可情况等因素综合来看,电动自行车目前乃至今后都有着广阔的发展空间。电动自行车所用直流电机分为有刷电机和无刷电机两种。其中有刷电机控制较简单。但其易磨损的电刷带来维修保养工作量相对较大、使用寿命相对较短等缺点。而直流无刷电机本身没有易磨损部件,电机寿命长,维修保养工作量小。但直流无刷电机采用电子换向原理工作,其控制过程比有刷电机复杂得多,因此对控制器质量的要求也高得多。 目前电动自行车采
[单片机]
基于<font color='red'>单片机</font>和PWM控制方法调速实现无刷控制器检测设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved