老古开发网首页
导航:老古开发网首页文章索引索引第2117页文章分类单片机第44页→[怎样在我的源程序中实现软件复位?]
| -文章搜索 - 最新文章 - |

第2719篇:怎样在我的源程序中实现软件复位?

发布时间:2006年8月2日 点击次数:1417
来源:   作者:
 
C51: 用C51实现软件复位
问:
怎样在我的源程序中实现软件复位? 

答:
您可以使用下面的程序跳到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寄存器组。

欢迎进入老古论坛进行讨论
[单片机] 相关文章:
c51控制双色点阵左移显示与右移显示.
简介:
;;c51控制双色点阵左移显示与右移显示.;; ;;;程序显示的为6;; ORG 0 AJMP MAIN MAIN: MOV 30H,#00H MOV 31H,#00H MOV 32H,#0FEH MOV 33H,#92H MOV 34H,#92H MOV 35H,#0F2H MOV 36H,#00H MOV 37H,#00H mov 2fh,#7fh......

用PIC写高效的位移操作
一个高效的模拟SPI的读写函数
PIC8位在PICC中的数据类型
转:CRC算法原理及C语言实现
 
下一个:[单片机]AT89C2051单片机驱动步进电机的电路和源码
简介:
程序 stepper.c stepper.hex /* * STEPPER.C * sweeping stepper''s rotor cw and cww 400 steps * Copyright (c) 1999 by W.Sirichote */ #include c:\mc51\8051io.h /* include i/o header file */ #include c:\mc51\8051reg.h register unsi......

上一个:[单片机]关于指针函数的范例

老古开发网版权所有 2006年9月 asp.Net V2.0 设计:老古
页面缓存:30分钟 执行时间:31毫秒