Lenguaje de programación Wren
Los microcontroladores de las series 89S51 y 89S52 tienen funciones de vigilancia. El registro A6H en el área de datos del chip tiene funciones de vigilancia. Es muy sencillo de usar:
# incluye ltreg 51. h. gt;
...
sfr WDTRST = 0xA6
...
void main()
{
wd trst = 0x 1E;; //Inicializa el mecanismo de vigilancia
wd trst = 0xe 1; //Inicializa el mecanismo de vigilancia
for( ;;)
{
wd trst = 0x 1E;; // Comando de alimentación del perro
wd trst = 0xe 1; // Comando de alimentación del perro p>
}
}
Como puedes ver, todo lo que tienes que hacer es agregar una instrucción de alimentación para perros al bucle grande del programa. Sin embargo, este perro guardián tiene funciones limitadas y no es muy fiable. Funciona con oscilador de cristal. Una vez que el oscilador de cristal no puede vibrar, no tiene ningún efecto.
En la práctica, se suele utilizar el método de vigilancia externa y hay muchos chips para elegir: MAX708 y MAX813.
, X25045...La programación específica depende del material de referencia del chip.
Por ejemplo, X25045 es un chip de vigilancia para el bus SPI y el terminal de reinicio está conectado al terminal de reinicio de la MCU. Puede elegir la interfaz IO adecuada para la entrada de datos SPI.
WREN 0x06 establece el bit de habilitación de escritura
WRDI 0x04 restablece el bit de habilitación de escritura.
RDSR 0x05 Registro de estado de lectura
WRSR 0x01 Registro de estado de escritura
Leer 0x03/0x0b La dirección de la página EEPROM interna durante una operación de lectura.
Escribe 0x02/0 la dirección de la página interna EEPROM durante la operación de escritura.
# incluir ltreg 51 . h gt;
sbit cs = p2^7
sbit entonces = p2^6
sbit sck = p2^5;
sbit si = p2^4;
#Define WREN 0x06 //
#Define WRDI 0x04 //
#Define RDSR 0x05 //
#Define WRSR 0x01 //
#Define READ0 0x03 //
#define READ1 0x0b //
#define WRITE0 0x02 //
#define WRITE1 0 //
#Define uchar carácter sin firmar
uchar byte leído() / /Leer un byte del dispositivo
{
bit bData
uchar ucLoop
uchar ucData
para (bucle UC = 0; ucLoop lt8; ucLoop )
{
SCK = 1;
SCK = 0;
bData = SO
ucData lt lt=1;
if(bData)
}
Devolver ucData
}
void write byte(uchar UC data)//Escribe un byte en el dispositivo
{
uchar ucLoop
for(UC loop = 0; ucLoop lt8; ucLoop )
{
if((UC data amp; 0x 80)== 0)//MSB se envía primero
Otro
SCK = 0;
SCK = 1;
ucData lt lt=1; p>}
uchar ReadReg()//Leer registro
{
uchar ucData
CS = 0;
escribir byte(RDSR);
Datos UC = leer byte();
CS = 1;
Devolver ucData
}
uchar escribir registro(uchar datos UC)//escribir registro
{
uchar ucTemp
UC temp = leer registro ();
if((UC temp amp; 0x 01)== 1)//El dispositivo está ocupado
Devuelve 0;
CS = 0 ;
write byte(WREN); //Al escribir WREN, cs debe tener un nivel alto
CS = 1;
CS = 0 ; p>
escribir byte(WRSR);
escribir byte(datos UC);
CS = 1;
Devolver 1;
}
void WriteEpm(uchar cData, uchar cAddress, bit bRegión)
/*
Escriba un byte, cData es el número escrito, dirección CAD es la dirección escrita, bRegión es la página*/
{
while((ReadReg() amp; 0x 01) = = 1); //El dispositivo está ocupado
CS = 0;
write byte(WREN); //Al escribir wren, cs debe tener un nivel alto
CS = 1;
CS = 0;
if(bRegión==0)
//Escribir dirección de página
Otros
escribir byte(dirección CAD);
escribir byte(cData);
SCK = 0; //
CS = 1;
}
uchar ReadEpm(uchar cAddress, bit bRegión)
/*Leer un byte, donde dirección de lectura es la dirección de lectura, bRegión es la página */
{
uchar cData
while((ReadReg() amp; 0x 01)= = 1);
CS = 0;
if(bRegión==0)
Otros
escribir byte(dirección CAD);
cData = leer byte();
CS = 1;
Devolver cData
}
Principal()
{
write reg(0x 00); //Establece el tiempo de vigilancia en 1,4 s
CS = 1;
CS = 0; //Restablecer perro guardián
}
Respuesta: Xu Zhimin 9514
Todas las series 89S tienen perros y las series 80C no tienen perros.
Entonces, 89S51 y 89S52 traen perros, pero ni 80C51 ni 80C52 traen perros.