单片机复位程序怎么写,如何使用单片机C语言实现复位

1,如何使用单片机C语言实现复位可以使用下面的程序跳到0000H实现软复位,下面的程序实际上是一个函数指针,指针指向了0000H地址 。((void(code*)(void))0x0000)();下面的例子将实现软件自复位voidreset(void)((void(code*)(void))0x0000)();}voidmain(void)reset();}你可能注意到以上的软复位程序并不能清除8051的中断系统和某些8051的外围设备,当您在中断程序中调用上面的软件复位程序后,中断将再不能触发 。因此,以上的软复位程序不能在中断子程序中调用 。下面的小段汇编函数可以在中断程序或主程序中调用 , 该函数将0x0000压栈 , 然后通过“RETI”出栈,这将清除中断环境并让程序从0000H重新开始运行 。?PR?RESETSEGMENTCODERSEG?PR?RESET;Cprototype:voidreset(void);PUBLICresetreset:POPACC;popreturnaddressPOPACCCLRA;push0asnewPUSHACC;returnaddresstostackPUSHACCRETI;executereturnofinterruptEND以上程序在选择bank0寄存器组时工作良好,假如选择的不是bank0寄存器组,那么可能无法获得预料的结果 。你应该在以上的程序或启动代码中加上“MOVPSW,#0”来选择bank0寄存器组 。以上文章由龙啸九天翻译自KEILFAQ,可能有疏漏,欢迎提出 。
2,单片机秒表复位程序如何写归零吗?直接把累计的变量置零就可以了希望帮到你 ,  增加S4和复位标志Reset 我没有测试,相信你会调试好的,加油!123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 #include<reg51.h> #define uchar unsigned char sbit dula=P2^6;sbit wela=P2^7;sbit beep=P2^3;sbit S2=P3^0;sbit S3=P3^1;sbit S4=Px^x; unsigned char halt,j,k,a1,a0,b1,b0,c1,c0,s,f,m,n=255,Reset=0;unsigned int pp;unsigned char code table[]= 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void delay(unsigned char i) for(j=i;j>0;j--) for(k=125;k>0;k--);} void display(uchar shi2,uchar shi1,uchar fen2,uchar fen1,uchar miao2,uchar miao1) dula=0; P0=table[shi2]; dula=1; dula=0; wela=0; P0=0xfe; wela=1; wela=0; delay(5); P0=table[shi1]|0x80; dula=1; dula=0; P0=0xfd; wela=1; wela=0; delay(5); P0=table[fen2]; dula=1; dula=0; P0=0xfb; wela=1; wela=0; delay(5); P0=table[fen1]|0x80; dula=1; dula=0; P0=0xf7; wela=1; wela=0; delay(5); P0=table[miao2]; dula=1; dula=0; P0=0xef; wela=1; wela=0; delay(5); P0=table[miao1]; dula=1; dula=0; P0=0xdf; wela=1; wela=0; delay(5);} void keyscan() if(S2==0) delay(10); if(S2==0) halt=1; } if(S3==0) halt=0; if(S4==0)//复位按键 Reset=1; } } void main() TMOD=0x01; TR0=1; TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080 , 计时器每隔50000微秒发起一次中断 。TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12 ET0=1; EA=1; while(1) if(halt==0) TR0=1; if(pp==20) m++; n--; P1=n;//闪烁灯 if(m==60) m=0; f++; if(f==60) f=0; s++; if(s==99) s=0; } } } } a0=s%10; a1=s/10; b0=f%10; b1=f/10; c0=m%10; c1=m/10; display(a1,a0,b1,b0,c1,c0); } else if(Reset==1) Reset=0; TR0=0; s=0; m=0; a0=s%10; a1=s/10; b0=f%10; b1=f/10; c0=m%10; c1=m/10; display(a1,a0,b1,b0,c1,c0); } else TR0=0; display(a1,a0,b1,b0,c1,c0); } }} void time0() interrupt 1 TL0=(65536-46080)%256; pp++;}【单片机复位程序怎么写,如何使用单片机C语言实现复位】