¿Cómo utilizar el puerto IO para simular I2C para realizar la comunicación entre dos microcontroladores STC? ¿Cómo escribirlo en lenguaje C?
Este es un programa de simulación que escribí. Solo hay una función de envío y una función de recepción es el bit de bandera de recepción. No hay un bit de bandera para enviar. No hay respuesta o falta de respuesta No hay señal de finalización y los datos reales se pueden enviar y recibir normalmente
#ifndef _IOPORTSEND_H__
#define _IOPORTSEND_H__
<. p>#includeunsigned char DAT,EP=0;//DAT se puede considerar como SBUF en el puerto serie Una vez que el host completa el envío, el receptor extrae datos de DAT<. /p>
sbit flag = P3^3;//Puerto de interrupción externa
sbit ok = P2^7;//Iniciar puerto de envío de señal
sbit PCL = P2^ 6;//Línea de reloj
sbit PDA = P2^ 5;//Línea de datos
void delay() //La función de retardo controla la velocidad en baudios
{
carácter sin firmar a,b;
for(b=3;b>0;b--)
for(a=13;a> 0;a--);
} p>
void PortInit()//Configuración de interrupción
{
EA=1;
EX1=1;
IT1=1;
}
void SendPort(unsigned char dat)//Función de envío
{
unsigned char i;
PCL=0;
ok=1;//Utilice ok para iniciar la interrupción del receptor
ok=0;
for (i=0;i<8;i++)//Comenzar a enviar datos
{
PCL=0 ;
retraso();
if(dat&0x80)
PDA=1;
si no
PDA =0;
PCL=1; p>
retraso();
dat<<=1;
}
PCL=0;
delay( );
ok=1;//Establezca ok en 1 para iniciar la interrupción durante la siguiente transmisión
PCL=1;//Libera la línea de reloj y la línea de datos una vez completada la transmisión
PDA=1;
}
void ReadPort()interrupt 2 // Recibir función, recibir datos en la función de interrupción
{
unsigned char i;
static unsigned int b;
PCL =1;
PDA=1;//Evita que el puerto PCL del receptor y el puerto PDA afecten la recepción de datos
for(i=0;i<8;i++)// Empezar a recibir datos
{
DAT<<= 1;
mientras(PCL==0);
b=0;
mientras(PCL==1)
{
b++;
if(b==1)
if(PDA)
DAT|=0x01;
}
}
EP=1;//EP está configurado a 1 después de recibirlo y debe borrarse en otras funciones
} p>
#endif