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++; p>
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)
{ p>
port_state=port_state<<1;
flowlight=~port_state;
}
else
{ p>
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..... p > 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
while(pt while(1);//Hacer no realizar ninguna operación p> } //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 TB8=0;//Marca de marco de datos SBUF=buffer[pt] //Comenzar a enviar pt++; ;//El puntero apunta a la siguiente unidad } 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 } p> } 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--); }