cpubbs论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

LabVIEW+单片机学习套件全套教程资料下载[免费]LabVIEW论坛精华列表贴USB0816数据采集卡《LabVIEW宝典》
LabWindows/CVI论坛精华贴NET0816以太网数据采集卡RC0210远程设备授权系统 关闭关停锁定打开设备 户外分布式数据采集
NET1624低速高精度以太网数据采集卡WIFI0824SD无线WIFI网络数据采集卡脱机运行 SD存储 小尺寸微型 串口采集远程采集 安卓 手持移动采集 纪录仪
查看: 1596|回复: 0

源程序中实现软件复位[转载]

[复制链接]
发表于 2004-11-20 02:16:05 | 显示全部楼层 |阅读模式
可以使用下面的程序跳到0000H实现软复位,下面的程序实际上是一个函数指针,指针指向
了0000H地址。
((void (code *) (void)) 0x0000) ();



下面的例子将实现软件自复位void reset (void)
{
((void (code *) (void)) 0x0000) ();
}

void main (void)
{
reset ();
}


你可能注意到以上的软复位程序并不能清除8051的中断系统和某些8051的外围设备,当您在
中断程序中调用上面的软件复位程序后,中断将再不能触发。因此,以上的软复位程序不能
在中断子程序中调用。


下面的小段汇编函数可以在中断程序或主程序中调用,该函数将0x0000压栈,然后通过
“RETI”出栈,这将清除中断环境并让程序从0000H重新开始运行。

?PR?RESET  SEGMENT CODE
RSEG ?PR?RESET

; C prototype:  void reset (void);

PUBLIC reset
reset: POP  ACC  ; pop return address
       POP  ACC
       CLR  A    ; push 0 as new
       PUSH ACC  ; return address to stack
       PUSH ACC
       RETI      ; execute return of interrupt

       END


以上程序在选择bank 0寄存器组时工作良好,假如选择的不是bank0寄存器组,那么可能无
法获得预料的结果。你应该在以上的程序或启动代码中加上“MOV  PSW, #0”来选择bank 0
寄存器组。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cpubbs论坛. ( 粤ICP备09171248号 )

GMT+8, 2025-5-4 15:07 , Processed in 1.284183 second(s), 7 queries , Gzip On, File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表