51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机源码 > 详细内容
51单片机的软件复位程序
发布时间:2009/6/2  阅读次数:687  字体大小: 【】 【】【

作者:佚名    来源:不详

这是一款针对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;

}

}

  

我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号