ISP_CONTR:ISP/IAP控制寄存器
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
复位值 |
ISPEN |
SWBS |
SWRST |
- |
- |
WT2 |
WT1 |
WT0 |
000x,0000 |
SWBS:当设置为0时,软件复位后从用户应用程序区启动;当设置为1时,软件复位从ISP程序区启动,。要与SWRST直接配合才可以实现。
SWRST:当设置为0时,不执行软件复位;当设置为1时,产生软件系统复位,硬件自动清零。
该复位是整个系统复位,所有的特殊功能寄存器都会复位到初始值,I/O口也会初始化。
【例子】通过按键中断来使MCU软件复位,复位后闪烁LED灯一段时间,然后MCU保持当前状态,空转。若要继续使LED重新闪烁,要求MCU复位来进行。
软件复位代码:
1 #include "stc.h"
2
3 #define LED_PORT P2 //定义LED控制端口为P2口
4
5 /********************************************
6 *函数名称:Delay
7 *输 入:无
8 *输 出:无
9 *说 明:延时一段时间
10 ********************************************/
11 void Delay(void)
12 {
13 unsigned char i,j;
14
15 for(i=0;i<130;i++)
16 for(j=0;j<255;j++);
17 }
18 /********************************************
19 *函数名称:SoftReset
20 *输 入:无
21 *输 出:无
22 *说 明:软件复位MCU
23 ********************************************/
24 void SoftReset(void)
25 {
26 ISP_CONTR=0x20;
27 }
28 /********************************************
29 *函数名称:EXTInit
30 *输 入:无
31 *输 出:无
32 *说 明:外部中断初始化
33 ********************************************/
34 void EXTInit(void)
35 {
36 EX1=1; //允许外部中断1中断
37 IT1=0; //低电平触发
38 EA=1; //允许所有中断
39 }
40 /********************************************
41 *函数名称:main
42 *输 入:无
43 *输 出:无
44 *说 明:函数
45 ********************************************/
46 void main(void)
47 {
48 unsigned char i;
49
50 EXTInit(); //外部中断初始化
51
52 for(i=0;i<20;i++) //循环闪烁LED灯
53 {
54 LED_PORT=~LED_PORT;
55 Delay();
56 }
57
58 while(1)
59 {
60 ;//空操作
61 }
62 }
63 /********************************************
64 *函数名称:EXT1IRQ
65 *输 入:无
66 *输 出:无
67 *说 明:外部中断1中断服务函数 复位操作
68 ********************************************/
69 void EXT1IRQ(void)interrupt 2
70 {
71 SoftReset();
72 }
73
代码分析:
SoftReset是复位操作函数,对ISP/IAP控制寄存器ISP_CONTR赋值位0x20,即将ISP_CONTR中“SWRST”置1来进行软件复位。要说明的是这里的软件复位是真正意义上的复位,同硬件复位的效果一模一样。
在main函数中,初始化外部中断后进行LED灯闪烁一阵时间,然后进入while(1)死循环进行空操作。
软件复位操作放在外部中断1中断服务函数函数当中,只要外部中断1被触发,单片机就进行复位。