51单片机软件复位

发布时间:2024-06-08
我们知道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;
}
}
上一个:机械硬盘怎么看新旧,怎么看电脑有没有机械硬盘
下一个:动静压混合轴承用于连杆轴瓦镗床

SEO外包从何做起?详解网站SEO外包服务的10大流程步骤
优惠销售荷兰observator传感器
劳动合同法试用期的规定有哪些
代缴社保需不需要资质吗
正规的汽修技校,有没有正规点的汽修技术学校
公司单方面解除合同赔偿标准
什么是侵犯商标权
显卡性能价格排行,求HD4570 HD5730 GT240 GT325M G310M G330M这些显卡的价格以
遗弃罪既遂标准是什么
农村宅基地房屋转让合同