一:STC系统复位的几种方式:
Ai8051U 系列单片机的复位分为硬件复位和软件复位两种。
硬件复位时,所有的寄存器的值会复位到初始值,系统会重新读取所有的硬件选项。同时根据硬件选项所设置的上电等待时间进行上电等待。硬件复位主要包括:
上电复位
低压复位
复位脚复位(低电平复位)
看门狗复位
软件复位时,除与时钟相关的寄存器保持不变外,其余的所有寄存器的值会复位到初始值,软件复位不会重新读取所有的硬件选项。软件复位主要包括:
写 IAP CONTR 的 SWRST 所触发的复位
二:使用看门狗复位功能:

WDT FLAG:看门狗溢出标志
看门狗发生溢出时,硬件自动将此位置1,需要软件清零。EN WDT:看门狗使能位
0:对单片机无影响
1:启动看门狗定时器
CLR WDT:看门狗定时器清零
0:对单片机无影响
1:清零看门狗定时器,硬件自动将此位复位IDL WDT:IDLE 模式时的看门狗控制位
0:IDLE 模式时看门狗停止计数
1:IDLE 模式时看门狗继续计数
WDT PS[2:0]:看门狗定时器时钟分频系数

三:软件代码如下所示:
3.1 定义如下寄存器
#define D_WDT_FLAG (1<<7) #define D_EN_WDT (1<<5) #define D_CLR_WDT (1<<4) //auto clear #define D_IDLE_WDT (1<<3) //WDT counter when Idle #define D_WDT_SCALE_2 0 #define D_WDT_SCALE_4 1 #define D_WDT_SCALE_8 2 //T=393216*N/fo #define D_WDT_SCALE_16 3 #define D_WDT_SCALE_32 4 #define D_WDT_SCALE_64 5 #define D_WDT_SCALE_128 6 #define D_WDT_SCALE_256 7
3.2实际代码如下所示:
while(1)
{
delay_ms(1); //延时1ms
DisplayScan();
if(tes_cnt <= 5) //5秒后不喂狗, 将复位,
WDT_CONTR = (D_EN_WDT + D_CLR_WDT + D_WDT_SCALE_256); // 喂狗
if(++ms_cnt >= 1000)
{
ms_cnt = 0;
tes_cnt++;
LED8[7] = tes_cnt;
}
}四:试验现象图片如下所示:
数码管显示当前的秒计数,工作5s之后,不再喂狗,实现复位功能。
(二)外部按键唤醒功能:使用INT0,INT1唤醒
2.1 配置程序工作2S后,进入睡眠模式:
//2秒后MCU进入休眠状态
if(++msecond >= 20)
{
msecond = 0; //清计数
if(INT0 && INT1) //两个中断都是高电平时才进入睡眠,下降沿唤醒。
{
P0 = 0xff; //先关闭显示,省电
IE0 = 0; //外中断0标志位
IE1 = 0; //外中断1标志位
EX0 = 1; //INT0 Enable
EX1 = 1; //INT1 Enable
IT0 = 1; //INT0 下降沿中断
IT1 = 1; //INT1 下降沿中断
PD = 1; //Sleep
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}2.2 可以使用外部中断唤醒,如下所示:
/********************* INT0中断函数 *************************/
void INT0_int (void) interrupt 0 //进中断时已经清除标志
{
EX0 = 0; //INT0 Disable
}
/********************* INT1中断函数 *************************/
void INT1_int (void) interrupt 2 //进中断时已经清除标志
{
EX1 = 0; //INT1 Disable
}
我要赚赏金
