第十一章 看门狗
复位方法:
STC89系列微控制器有四种复位方法,分别是外部RST引脚复位、软件复位、掉电复位以及看门狗复位。
名称 | 描述 | 地址 | 位和符号 | |||||||
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |||
ISP_CONTR | ISP-IAP 控制寄存器 | 0xE7 | ISPEN | SWBS | SWRST | - | - | WT2 | WT1 | WT0 |
看门狗复位:
相关寄存器:
计算溢出时间;
喂狗操作:
功能:按下KEY1,模拟死机状态,一定时间后自动重启。
#include <STC89C5xRC.H>
sbit BEEP=P1^0;
void Delay1ms(unsigned int xms) //@11.0592MHz
{
while(xms--)
{
unsigned char i, j;
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
void InitInterrupt()//中断初始化
{
IT0=1;
EX0=1;
EA=1;
}
void main()
{
unsigned char i;
BEEP=0;
Delay1ms(50);
BEEP=1;
InitInterrupt();
WDT_CONTR=0x33;
while(1)
{
P2=0xEF;
for(i=0;i<4;i++)
{
Delay1ms(500);
P2=P2<<1;
WDT_CONTR|=0x10;
}
}
}
void External0_Handler() interrupt 0//制造死机现象
{
Delay1ms(2000);
}
第十二章 FLASH读取
编程方式:
寄存器:
功能:LED状态,写入FLASH,实现保存。
头函数:
EMPROM.h
void IAPSectorErase(unsigned int addr);
void IAPByteWrite(unsigned int addr,unsigned char dat);
unsigned char IAPByteRead(unsigned int addr);
#include <STC89C5xRC.H>
#include<EMPROM.h>
void IAPTrigger()
{
ISP_TRIG=0x46;
ISP_TRIG=0xB9;
}
void IAPDisable()
{
ISP_CONTR=0x00;//禁用读写
ISP_CMD=0x00;
ISP_TRIG=0x000;//关闭
}
unsigned char IAPByteRead(unsigned int addr)
{
unsigned char dat;
ISP_CONTR=0x81;//打开设置等待时间
ISP_CMD=0x01;//允许读取
ISP_ADDRL=addr;
ISP_ADDRH=addr>>8;
IAPTrigger();
dat=ISP_DATA;
IAPDisable();
return dat;
}
void IAPSectorErase(unsigned int addr)//单字节
{
ISP_CONTR=0x81;
ISP_CMD=0x03;//允许擦除
ISP_ADDRL=addr;
ISP_ADDRH=addr>>8;
IAPTrigger();
IAPDisable();
}
void IAPByteWrite(unsigned int addr,unsigned char dat)//单字节
{
ISP_CONTR=0x81;
ISP_CMD=0x02;//写入
ISP_ADDRL=addr;
ISP_ADDRH=addr>>8;
ISP_DATA=dat;
IAPTrigger();
IAPDisable();
}
FLASH读取:
#include <STC89C5xRC.H>
#include <EMPROM.h>
void Delay1ms(unsigned int xms) //@12.000MHz
{
while(xms--)
{
unsigned char i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
sbit KEY1=P3^2;
sbit LED=P2^4;
void main()
{
P2=IAPByteRead(0x2000);
while(1)
{
if(KEY1==0)
{
Delay1ms(20);
LED=~LED;
while(KEY1==0);
IAPSectorErase(0x2000);
IAPByteWrite(0x2000,P2);
}
}
}
至此,51单片机小知识内容已经学完。