Red de conocimiento informático - Material del sitio web - Ayúdenme a encontrar algunos ejemplos básicos de programas en lenguaje C para el microcontrolador 51. Lo mejor es dar explicaciones.

Ayúdenme a encontrar algunos ejemplos básicos de programas en lenguaje C para el microcontrolador 51. Lo mejor es dar explicaciones.

Programa de control de interrupciones:

#include

#define uchar unsigned char

#define uint unsigned int

#define port_count P2 //P2 está conectado a la interfaz 8LED

//Muestra el valor binario del contador con 8 LED

uchar count;// Contador (almacena el número de interrupciones)

void main(void)

{

count=0 //Borrar el contador

port_count=~ count;//Borrar puerto P2

IT0=1; //¿INT0 está configurado en modo de disparo por flanco? IT0=0 es el modo de disparo por nivel

EX0=1; // Activar la interrupción INT0

EA=1; //Activar la interrupción del sistema

while(1); //Esperar el procesamiento de la interrupción

}

//Función de procesamiento de interrupciones INT0

void int0_interrupt() interrupción 0 //Número de interrupción INT0 0

{

count++;

port_count=~count; //Cuando llega a 255, se desborda y comienza desde 0 nuevamente

}

Programa de control de E/S:

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define flowlight P2

void delay10ms()

{uchar a,b;

for(a=200;a>0;a --)

for(b=225;b>0;b--);

}

void main()

{

uchar flag=0;//Juzga la dirección del movimiento flag==0, mueve la bandera a la izquierda==1, muévete a la derecha

uchar port_state=0x01;

flowlight=~port_state;

while(1)

{

delay10ms();

if(port_state== 0X80&&flag==0)

{

flag=1; //La lámpara de agua corriente se mueve hacia la izquierda hasta la octava posición y luego regresa a ~1000 0000

}

else

if(port_state==0X01&&flag==1)

{

flag=0; La lámpara de agua corriente se mueve hacia la derecha hasta la posición 1 y luego retrocede~0000 0001

}

if(flag==0)

{

port_state=port_state<<1;

flowlight=~port_state;

}

else

{

estado_puerto=por

t_state>>1;

flowlight=~port_state;

}

}

Programa de comunicación serie:

Programa host:

#include

#define NODE_ADDR 3 //Dirección del nodo de destino

#define COUNT 10 //Enviar buffer buffer tamaño

typedef unsigned char uchar;

uchar buffer[COUNT]; //Definir buffer

int pt //Establecer puntero

< p; >principal()/////////////////////////////////////////////Enviar programa

{

//inicialización del buffer

pt=0;

while(pt

{

buffer[pt]='1'+pt; //[buffer]=0X31,[buffer+1]= 0X32,[buffer+2] 0X33.....

pt++;

}

////Inicializa el puerto serie y T1 (generador de velocidad en baudios)/////////PCON por defecto es 0

PCON=0X00;

SCON=0Xc0; //SCON=1100 0000B, configure el puerto serie en modo 3, SM2=0, REN=0, el host no recibe la dirección frames

TMOD=0X20; //20H=0010 0000B, configura T1 en modo 2, TR1 controla el cambio de T1, modo temporizador

TH1=253;TL1=253; /El modo 2 es reinstalación automática///f(bps)=9600bps (f(osc)=11.0592MHZ)

TR1=1; //Iniciar T1

ET1=0; //Desactivar interrupción T1 debido a recarga automática

ES=1; //Habilitar interrupción del puerto serie

EA=1 //Habilitar interrupción del sistema

pt=0 ;

///////////////Enviar marco de dirección

TB8=1 //Marco de dirección

<; p> SBUF =NODE_ADDR; //Enviar dirección del nodo de destino

while(pt

while(1);//Hacer no realizar ninguna operación

} //end main

/////Enviar la función de interrupción

void send()interrupt 4

{

TI=0; //Borrar el indicador de interrupción de transmisión

if(pt

{

/ /Enviar un marco de datos

p>

TB8=0;//Marca de marco de datos

SBUF=buffer[pt] //Comenzar a enviar

pt++; ;//El puntero apunta a la siguiente unidad

p>

}

else

{

ES=0; interrupción del puerto serie

EA=0; / /Desactivar la interrupción del sistema

return; //Si se completa el envío, detenga el envío y regrese

}

}

Programa receptor:

#inclu

de

#define uchar unsigned char

#define NODE_ADDR 3 //Dirección del nodo local

#define COUNT 10 //Definir búfer de recepción tamaño del búfer

uchar buffer[COUNT]; //Definir buffer

int pt; //Puntero de posición actual

void send_char_com(unsigned char ch); /Declaración de función para enviar un carácter al puerto serie

void delay(void);

main() //////////////// Programa receptor esclavo asíncrono serie

{

PCON=0X00; //Inicializa el puerto serie y T1 (generador de velocidad en baudios)/////////Falta el PCON la provincia es 0

SCON=0XF0; //SCON=1111 0000B, modo 3, SM2=1, REN=1, permitido recibir tramas de direcciones

TMOD=0X20; 20H =0010 0000B, configura T1 en modo 2, TR1 controla el interruptor de T1, modo de temporizador

TH1=253;TL1=253 //El modo 2 es recarga automática///f(bps)= 9600bps (f(osc)=11.0592MHZ)

TR1=1; //Iniciar T1

ET1=0; //Desactivar interrupción T1 debido a reinstalación automática

ES=1; //Habilitar interrupción del puerto serie

EA=1; //Habilitar interrupción del sistema

pt=0;

while(pt

delay() ;

//Devolver datos después de recibir

SCON=0XC0; // SCON=1100 0000B, configura el puerto serie en modo 3, SM2=0, REN=0, el host no recibe el marco de dirección

EA=0;

para (pt=0;pt< COUNT;pt++)

{

send_char_com(buffer[pt]);

}

mientras (1);

} //finalizar principal

////////////Función de interrupción de recepción del puerto serie

recepción nula ( )interrumpir 4 usando 3

{

RI=0; //Borrar el indicador de interrupción de recepción

if(RB8==1) //Marco de dirección

{//Si es la dirección local, configure SM2=0 para recibir datos

if (SBUF==NODE_ADDR)

{

SM2=0;

}

}

/////RB8=0, marco de datos

else if(RB8 ==0)

{buffer[pt]=SBUF; //El marco de datos se envía al búfer

pt++;

if(pt>=COUNT)

SM2=1 ; //Si se reciben todas las tramas de datos, la comunicación finaliza; establezca SM2=1 y prepárese para la siguiente comunicación

}

}

//Al puerto serie Enviar un carácter

void send_char_com(unsigned char ch)

{

>

SBUF=ch;

mientras(TI==0);

TI=0;

}

/ /////////////////////////////////////////////////// //// //////////////////////////////////

retraso nulo(nulo)

{uchar i=100;

mientras(i--);

}