51单片机的软件复位

    请先看最下面的程序
      这是一款针对Keil软件的,被称作“纯软件”复位的程序。所谓“纯软件”是指它没有直接操作硬件以及寄存器。
      事实上如果不懂硬件和汇编也不可能有这段C程序,不管怎么样,我们还是来看一看它的真面目:
      我们知道51 单片机
      可以把数据放在程序存储器里面,也就是程序和数据没有本质区别,都是一些特定的数据。如果我们将一段程序,以数组数据的形式存储在程序存储器里面,那么是不是也可以执行呢?答案是肯定的。
       -
      言归正传,先来看看这个数组数据 0xe4,0xc0,0xe0,0xc0,0xe0,0x22,中Keil的汇编窗口看出,它其实是四条汇编语句:
        CLR A              ;编译后为 0XE4
        PUSH ACC           ;编译后为 0XC0 0XE0
        PUSH ACC           ;编译后为 0XC0 0XE0
        RET                ;函数返回 编译后为 0X22可以看出,其实这就是51 单片机 的汇编复位指令。
      其实这里只是C复位代码的写法难看而已,rst是一个指向程序存储器的字节指针,我们把它转换为指向返回为空的函数的指针,返回为空的函数指针的格式为:void
      (*)(),这个表达式比较复杂因运算符优先级关系,用括号括号括起来,就成了(void
      (*)())rst,这样rst就成函数指针了,再来看看求函数指针的一般格式(*p)(),把p代换成(void
      (*)())rst括起来就成了(*((void (*)())rst))(),这说将这个复位的全部面纱揭开了。
      以下为测试,验证程序:
#include <AT89X51.h>
main()
{
        unsigned char code rst[6]={0xe4,0xc0,0xe0,0xc0,0xe0,0x22};//定义一个code类型的数组,一定要为code类型
        while(1)//循环测试
        {
                TMOD=5;//测试用可以是任何语名
                TI=1;
                P1=0;
                P1=1;
                P2=2;
                P3=3;
                (*((void (*)())rst))();//复位
                SCON=0x50;
        }
}
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值