您的位置 首页 被动

51单片机的软件复位

请先看最下面的程序这是一款针对Keil软件的,被称作纯软件复位的程序。所谓纯软件是指它没有直接操作硬件以及寄存器。事实上如果不…

请先看最下面的程序
这是一款针对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
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;
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/beidong/325910.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部