51单片机的软件复位
2012-07-26
红尘客
标签: 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,此表达式就是函数指针了,再来看看求函数指针的一般格式(*p)(),把p代换成(void (*)())rst就成了(*(void (*)())rst)(),这说将这个复位的全部面纱揭开了。

以下为测试,验证程序:

#include <AT89X51.h>
main()
{
    //定义一个code类型的数组,一定要为code类型
    unsigned char code rst[6] = {0xe4, 0xc0, 0xe0, 0xc0, 0xe0, 0x22};
    while (1) { //循环测试
        TMOD = 5; //测试用可以是任何语句
        TI = 1;
        P1 = 0;
        P1 = 1;
        P2 = 2;
        P3 = 3;
        (*(void (*)())rst)();//复位
        SCON = 0x50;
    }
}


可能会用到的工具/仪表
相关文章
推荐文章
热门文章
章节目录
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号