单片机复位程序_51 单片机复位程序 - CSDN
精华内容
参与话题
  • 51单片机软件(程序复位

    千次阅读 2013-05-03 08:19:41
    51单片机软件复位汇编代码  POP ACC ; pop return address  POP ACC  ;弹出PC  MOV SP,#30H ;复位后SP为07H ,这样就会复位椎栈  MOV PSW,#00H ;清寄存器  CLR

    51单片机软件复位汇编代码

           POP  ACC  ; pop return address

           POP  ACC
        ;弹出PC

            MOV SP,#30H                        ;复位后SP为07H ,这样就会复位椎栈
            MOV PSW,#00H   ;清寄存器


            CLR  A    ; push 0 as new


            PUSH ACC  ; return address to stack
            PUSH ACC
            ;重置PC=0并压到椎栈中

            RETI      ; execute return of interrupt

    ;程序又开始从0000H处开始运行,但寄存器内的值不确定!



    用C51实现软件复位



    方法1:   



    void(*SoftReset)();



    SoftReset=0;



    SoftReset();



    解释:利用函数型指针,使函数型指针指向的函数的入口地址为0。



    方法2: 嵌入汇编



    #pragma asm


    LJMP 0FFF0h;//ljmp 0000h



    #pragma endasm



    方法3: 在C51编程过程中,用一个不存在函数,引起复位。



    如下程序,编译正常,但执行到 reset()处即复位了。其时汇编代码为 

    LCALL C:0000。







    extern void rest(void);   //实际并不存在。



    void main()



    {



    rest();     //复位




    }

    方法4:如果有用看门狗,使用看门狗复位。

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

    今天在网上看到这么一个单片机复位的程序,这个程序据说是一个大三的学生写出来的,不错,写的很有一定的道理,其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:         }

    请大家注意红色的部分。

    若大家都能亲自动手实际操作一下,会让你理解的更多,体会的也会更多的。。。具体的还有什么好的方法和好的建议,希望多多留言大家共同进步。【小盒子 2007.08.17     PM17:14】

    展开全文
  • 单片机意外死机,意外复位程序跑飞。原因有以下几种。 一、数组越界。  特别是使用指针操作的,如果有越界的情况,后果将很严重。 二、电源不稳定。  可以用示波器监测检查 三、Stack 栈溢出 Stack是为了...

    单片机意外死机,意外复位,程序跑飞。原因有以下几种。

    一、数组越界。

           特别是使用指针操作的,如果有越界的情况,后果将很严重。

    二、电源不稳定。

           可以用示波器监测检查

    三、Stack 栈溢出

    Stack是为了程序运行过程中临时保存所需数据而在内存里分配的一小块空间。保存的数据类型一般情况下包括以下几种:

    1. 函数中声明的局部变量以及参数

    2. 函数返回值

    3. 中断时CPU 寄存器值

    4. 函数运行后返回的地址

    因此,编译器设置里,一定要预留足够大的栈空间。

    IAR里面的设置方法:

    参考:https://www.cnblogs.com/harleygwak1206/p/5856562.html

    展开全文
  • 单片机复位方式

    万次阅读 2018-09-23 14:30:53
    /*****************************************分析 一***********************************************/  一、高电平复位  复位电路的工作原理 在书本上有介绍,51...在单片机系统中,系统上电启动的时候复位...

     

    /*****************************************分析 一***********************************************/

         一、高电平复位

         复位电路的工作原理 在书本上有介绍,51单片机要复位只需要在第9引脚接个高电平持续2us就可以实现,那这个过程是如何实现的呢?在单片机系统中,系统上电启动的时候复位一次,当按键按下的时候系统再次复位,如果释放后再按下,系统还会复位。所以可以通过按键的断开和闭合在运行的系统中控制其复位。      

            (1)、上电复位

            在电路图中,电容的的大小是10uf,电阻的大小是10k。所以根据公式,可以算出电容充电到电源电压的0.7倍(单片机的电源是5V,所以充电到0.7倍即为3.5V),需要的时间是10K*10UF=0.1S。也就是说在电脑启动的0.1S内,电容两端的电压时在0~3.5V增加。这个时候10K电阻两端的电压为从5~1.5V减少(串联电路各处电压之和为总电压)。所以在0.1S内,RST引脚所接收到的电压是5V~1.5V。在5V正常工作的51单片机中小于1.5V的电压信号为低电平信号,而大于1.5V的电压信号为高电平信号。所以在开机0.1S内,单片机系统自动复位(RST引脚接收到的高电平信号时间为0.1S左右)。    

          (2) 按键复位

           在单片机启动0.1S后,电容C两端的电压持续充电为5V,这是时候10K电阻两端的电压接近于0V,RST处于低电平所以系统正常工作。当按键按下的时候,开关导通,这个时候电容两端形成了一个回路,电容被短路,所以在按键按下的这个过程中,电容开始释放之前充的电量。随着时间的推移,电容的电压在0.1S内,从5V释放到变为了1.5V,甚至更小。根据串联电路电压为各处之和,这个时候10K电阻两端的电压为3.5V,甚至更大,所以RST引脚又接收到高电平。单片机系统自动复位。  

           总结: 1、复位电路的原理是单片机RST引脚接收到2US以上的电平信号,只要保证电容的充放电时间大于2US,即可实现复位,所以电路中的电容值是可以改变的。 2、按键按下系统复位,是电容处于一个短路电路中,释放了所有的电能,电阻两端的电压增加引起的。

    二、低电平复位

          在使用STM32芯片时,常用的复位方式为按键复位,且为低电平复位。其原理与上述高电平复位相反,分析也挺简单,这里不在赘述,只给出按键复位原理图。

     

    /**************************************************分析二*********************************************/

        单片机的复位引脚RST(全称RESET)出现2个机器周期以上的复位电平时,单片机就执行复位操作。如果RST持续为复位电平,单片机就处于循环复位状态。当单片机处于正常电平时就正常转入执行程序。

     图1:当单片机上电瞬间由于电容电压不能突变会使电容两边的电位相同,此时RST为低电平,之后随着时间推移电源通过电阻对电容充电,充满电时RST为高电平。正常工作为高电平,低电平复位。即上电低电平,然后转向高电平。

      图2:当单片机上电瞬间由于电容电压不能突变会使电容两边的电位相同,此时RST为高电平,之后随着时间推移电源负极通过电阻对电容放电,放完电时RST为低电平。正常工作为低电平,高电平复位。

     

    展开全文
  • 51单片机软件复位函数

    千次阅读 2019-09-09 11:13:08
    51单片机无自带的看门狗,没有提供软件复位的函数和机制,要想实现软件复位,只能通过强制将PC指针指到0x0000位置, 通过以下函数将PC指针强制指到0x0000: void reset(void) { ((void (code *) (void)) 0x0000) ...
  • 复位期间,大部分控制和状态寄存器被迫使用初始值,单片机的外围模块被禁止,单片机用于复位复位源有加电复位、外部RESET管脚复位、看门狗复位等。 我们实验对应的硬件复位电路,如下图所示。 这个图中集成...
  • 51单片机复位(高电平复位)

    千次阅读 2015-12-14 14:16:35
    以当前使用较多的AT89系列单片机来说,在复位脚加高电平2个机器周期(即24个振荡周期)可使单片机复位。复位后,主要特征是各IO口呈现高电平,程序计数器从0开始执行程序。 复位方式有两种。 1. 手动复位:...
  • 单片机复位电路原理

    千次阅读 2017-05-14 17:59:25
    单片机复位引脚RST(全称RESET)出现2个机器周期以上的复位电平时,单片机就执行复位操作。如果RST持续为复位电平,单片机就处于循环复位状态。当单片机处于正常电平时就正常转入执行程序。   图1:当单片机上电...
  • 51单片机复位电路

    2020-01-08 21:12:44
    单片机复位的条件:使单片机的RST端(引脚9的RESET端)加上持续两个机器周期的高电平。例如,若时钟频率为12MHz,每机器周期为1ms,则只需在RST引脚出现2ms以上时间的高电平,就可以使单片机复位。 图3-14(a)所...
  • 提出解决单片机复位程序跑飞影响的措施
  • STM8单片机复位源判断

    千次阅读 2019-08-13 14:47:07
    最近在调试系统的时候,发现单片机老是复位,于是想着用程序来判断一个单片机复位信号是来自于哪里。查找资料发现STM8单片机复位源总共有9种 ●NRST引脚产生的外部复位 ● 上电复位(POR) ● 掉电复位(BOR) ● ...
  • 51单片机中的复位电路的原理

    千次阅读 2017-12-15 11:37:35
    51单片机复位电路的原理  复位电路:简单的说复位电路,就是利用它把电路恢复到起始状态。  复位电路的种类:(1)微分型复位电路;(2)积分型复位电路;(3)比较器型复位电路;(4)看门狗型复位电路。  复位电路的...
  • 无论用户使用哪种类型的单片机,总要涉及到单片机复位电路的设计。而单片机复位电路设计的好坏,直接影响到整个系统工作的可靠性。许多用户在设计完单片机系统,并在实验室调试成功后,在现场却出现了“死机”、“程序走...
  • 51单片机复位电路的设计

    千次阅读 2011-11-07 22:06:36
    单片机在可靠的复位之后,才会从0000H地址开始有序的执行应用程序。同时,复位电路也是容易受到外部噪 声干扰的敏感部分之一。因此,复位电路应该具有两个主要的功能:  1. 必须保证系统可靠的进行复位;  2. ...
  • 在STM32F103C8T6单片机上检测单片机复位源,通过不同的按键对单片机进行不同方式复位,然后通过读取寄存器判断单片机是哪种方式复位(上电复位、复位按键复位、独立看门狗复位、窗口看门狗复位、系统复位、内核复位...
  • stc单片机复位到isp引导区因学习需要, 本人从网上整理了一些 STC 单片机不断电程序下载的方法, 拿出来分享一下。
  • 单片机复位5问

    2019-06-30 18:49:32
    以下是自己关于单片机复位电路的一些认识: >1、单片机为什么要复位? 使单片机回复初始状态,从PC指针的0地址开始执行程序 >2、如何复位单片机?(怎样操作确保单片机复位) 要求:51单片机要复位只...
  • msp430单片机复位

    千次阅读 2017-11-01 16:51:13
    在学习MSP430单片机的时候,经常会遇到一个问题,那就是单片机上电复位以后它到底是什么样的状态?因为它功能复杂,且资源丰富,IO管脚很多,时钟和低功耗模式配置灵活,那么上电后它们处于什么样的状态? 对于电子...
  • 在刚上电或外部复位引脚为复位电平时,单片机系统进入一个预定的状态——复位状态。在复位状态下,控制寄存器的值是确定的,而数据寄存器的值是随机的,程序计数器也被赋予一个确定的值。但多数情况下控制寄存器的...
  • 本篇博客主要讲授华大半导(STM32、C51等单片机均可适用)复位(以看门狗复位为例)后变量数据保存的方法。 这里将用到__not_init属性,其用于变量声明,可禁止系统启动时变量的初始化,有了__not_init属性,编译器...
1 2 3 4 5 ... 20
收藏数 12,000
精华内容 4,800
关键字:

单片机复位程序