51 Problema del puerto serie analógico del microcontrolador No hay problema al enviar datos. Al recibir datos, solo se pueden recibir los dos primeros dígitos. Por ejemplo, si se envía 010203, solo se puede recibir 01.
El formato de datos consta de un bit de inicio, ocho bits de datos y uno o dos bits finales. Al enviar datos, no se puede omitir el bit final.
Pero al recibir datos, el programa no necesita esperar el bit final, porque en el proceso de esperar el bit final, también se esperará la interrupción de inicio de los siguientes datos.
Después de eliminar el último WaitTF0(); de la función uchar RByte(), el programa podrá recibir datos continuamente.
El siguiente es mi programa, lo entenderás después de leerlo.
/*
Simular el programa transceptor de puerto serie
Cambie el programa para usar cualquier puerto IO como puerto de envío y use el puerto de interrupción externa 0 para el puerto de recepción para lograr una comunicación en serie de 9600 bits/s
La generación y recepción de señales están controladas por el indicador de desbordamiento del temporizador
Notas:
1. garantiza que el estado sea correcto
2 La sincronización del temporizador debe ser precisa
*/
#include
sbit txd=P3^1 ;
sbit rxd=P3^2;
sbit en=P1^7;
sbit clk=P3^7;
#define uchar unsigned char
uchar number,flag;
uchar num[10]={0x00,0x00,0x01,0x02,0x03,0x04, 0x05,0x06,0x07,0x08 };
espera nula(uchar i);
envío nulo(uchar aa);
void main() p>
{
{
uchar i;
IE=0;EA=1;
TMOD= 0x12;
TR0=0;EX0=1;
IT0=1;en=0;
mientras(1)
{
if (num[0]==0x49&&num[1]==0x85&&num[2]== 0x54&&num[3]==0x31&&num[4]==0x59&&num[5]==0x87&&num[6]== 0x91&&num[7]==0x25&&num [8] ==0x34&&num[9]==0x62)
{
es=1;
número=0;
for(i=0;i<10;i++)
{enviar(num[i]);num[i]=0x00;}
es=0;
}
}
}
envío nulo(uchar aa)
{
uchar i;
txd=0;
esperar(0xb9);
for(i=0;i<8;i++ )
{txd=aa&0x01;aa>>=1;espera(0xb9);}
txd=1;
espera(0xb9); p>
bandera= 0;
}
void int0() interrupción 0
{
uchar i; p>
EX0= 0;clk=! clk;
esperar(0xad);
for(i=0;i<7;i++)
{
número> >=1; clk;
if(rxd)number=0x80|número;
else número=0x00|número;
esperar(0xb9);
}
número>>=1;clk=!clk
>
if(rxd)número=0x80|número;
else número=0x00|número;
esperar(0xd9);
num[bandera ]=número;
bandera++;clk=! clk;
IE0=0;EX0=1;
if(flag>=10)flag=0;
}
espera nula(uchar i)
{
TF0=0;
TH0=i;TL0=i;
TR0=1;
mientras(TF0==0);
TF0=0;TR0=0;
}