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

发布者:飘然出尘最新更新时间:2015-01-20 来源: laogu关键字:源程序  软件复位 手机看文章 扫描二维码
随时随地手机看文章
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寄存器组。
关键字:源程序  软件复位 引用地址:怎样在我的源程序中实现软件复位?

上一篇:关于指针函数的范例
下一篇:一个高效的模拟SPI的读写函数

推荐阅读最新更新时间:2024-03-16 13:51

基于stm32做的遥控器源程序(按键和摇杆均有)
按键的话非常简单,定义一个函数,然后可以直接在主函数里实现,要确认好自己的蓝牙就可以,波特率也要一致才行。 int main(void) { delay_init(); LED_Init(); Key_Init(); uart_init(9600); while(1) { keys(); } } 摇杆的话,需要用到ADC算法,下面会分享一个ADC搜集数据的程序然后将搜集的数据加以利用就好了。 如下: void chuli(void ) { u16 x; u16 y; x = Get_Adc_Average(ADC_Channel_1 , 10);
[单片机]
单片机数控云台master 仿真及源程序
源程序: /********************************************* This program was produced by the CodeWizardAVR V1.23.8c Standard Automatic Program Generator ?Copyright 1998-2003 HP InfoTech s.r.l. http://www.hpinfotech.ro e-mail:office@hpinfotech.ro Project : SKYT Version : 0.01 Date : 2006-12-6 Author : hlchen
[单片机]
单片机数控云台master 仿真及<font color='red'>源程序</font>
基于51单片机的温控电机proteus仿真及源程序
温控电机项目特别提醒: 用Proteus软件进行电路仿真时,TLC549和AT89C51的电源引脚均隐藏了,在制作电路板时一定要给TLC549的Pin8接+5V,Pin4接地;AT89C51的的Pin40接+5V,Pin20接地。 单片机温控电机源程序如下: //产生频率为100Hz的PWM #include reg51.h #define uchar unsigned char #define uint unsigned int sbit TLC549_SCLK=P1^5; //定义P1.5引脚位名称为TLC549_SCLK sbit TLC549_SDO=P1^3; //定义P1.3引脚位名称为TLC549_S
[单片机]
基于51单片机的温控电机proteus仿真及<font color='red'>源程序</font>
单片机RGB彩灯渐变七彩灯无频闪 源程序
/*彩灯自动循环:1、渐变*/ #include reg52.h #define uchar unsigned char #define uint unsigned int #define dengji 1//LED变化等级调整 sfr P5=0xC8;//xxxx,1111 端口5 uint shudu=30;//LED渐变速度调整 sbit B1=P3^3; sbit R1=P5^4; sbit G1=P5^5; uchar cishu; uchar num;//定时器计数变量 uint ji;//亮度等级控制变量 uint Rout,Gout,Bout; void delay(uint z) { uint x,y;
[单片机]
PIC16C71单片机按键换醒CPU的源程序
; p=pic16c71,xt=40000hz LIST P=16c71 ; Z EQU 2 RBPU EQU 7 TEMP EQU 10H OPTIONREG EQU 1H F EQU 1 PORT_B EQU 06H ; INCLUDE P16c71.INC LIST ; ORG 0 ;复位地址 GOTO START ; ORG 4 ;中断向量 GOTO SERVICEINTERRUPT ; START CALL INITPORT_B
[单片机]
9种简单的数字滤波算法(C语言源程序)
假定从8位AD中读取数据(如果是更高位的AD可定义数据类型为int),子程序为get_ad(); 1、限副滤波 /* A值可根据实际情况调整 value为有效值,new_value为当前采样值 滤波程序返回有效的实际值 */ #define A 10 char value; char filter() { char new_value; new_value = get_ad(); if ( ( new_value - value A ) || ( value - new_value A ) return value; return new_value; } 2、中位值滤波法 /* N值可根据实
[单片机]
51单片机键盘接口电路(含源程序)
键盘是由若干按钮组成的开关矩阵,它是单片机系统中最常用的输入设备,用户能通过键盘向计算机输入指令、地址和数据。一般单片机系统中采和非编码键盘,非编码键盘是由软件来识别键盘上的闭合键,它具有结构简单,使用灵活等特点,因此被广泛应用于单片机系统。 按钮开关的抖动问题 组成键盘的按钮有触点式和非触点式两种,单片机中应用的一般是由机械触点组成的。在下图中,当开 键盘结构图 图1 图2 关S未被按下时,P1。0输入为高电平,S闭合后,P1。0输入为低电平。由于按钮是机械触点,当机械触点断开、闭合时,会有抖动动,P1。0输入端的波形如图2所示。这种抖动对于人来说是感觉不到的,但对计算机来说,则
[单片机]
51单片机键盘接口电路(含<font color='red'>源程序</font>)
单片机红外发射与接收源程序
发送端单片机源程序如下: #include ir_send.h /*------------初始化IO------------*/ void ir_init(void) { P2M0 = 0x80; //P2.7强推挽 P2M1 = 0x00; TMOD = 0x01; //T0 16位 定时 IR = 0; } /*-------发射数据 + 载波---------*/ void ir_t(bit BT , uint p) { TH0 = p 8; TL0 = p; TF0=0;
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved