关于51模拟串口的问题
为什么我的程序不能够接收到正常的数据
#include<reg52.h>
sbit BT_REC=P1^3;//接收引脚
sbit BT_SND=P1^4; //发送引脚
#define F_TM F0
void psendchar(unsigned char inch)//发送程序
{
unsigned char i;
i=0;
F_TM=0;
BT_SND=0;
TR1=1;//开始定时
while(!F_TM);
while(i<8)
{
if(inch&1)
{BT_SND=1;}
else
{BT_SND=0;}
F_TM=0;
while(!F_TM);
i++;
inch>>=1;
}
BT_SND=1;
F_TM=0;
while(!F_TM);
TR1=0;//关闭定时
}
unsigned char pgetchar() //接收程序
{
unsigned char rch,i;
F_TM=0;
rch=0;
i=0;
TR1=1;//开始定时
while(!F_TM);
while(i<8)
{
rch>>=1;
if(BT_REC)
{rch|=0x80;}
i++;
F_TM=0;
while(!F_TM);
}
F_TM=0;
while(!F_TM)
{
if(BT_REC)
{break;}
}
return rch;
TR1=0;//关闭定时
}
void main()
{
unsigned char gch;
TMOD=0x22;
TH1=(256-96);
TL1=TH1;
PCON=0x00;
EA=1;
ET1=1;
psendchar(0x56);//发送程序
}
void time1(void) interrupt 3
{
F_TM=1;
}
[解决办法]
1>.void time1(void) interrupt 3
time1的频率应该是波特率的16倍。(所以软件做串口,波特率低 300-1200)
2>.要按串口定时考虑接受,低=start位,定时器 6,7,8中检查电平(3取2)。。。
3>.如果学习可以,实际上很少用。很多年前我编过一个。
[解决办法]
51 没有串口吗
找 串口大全, 看看 baud rate 的基础
[解决办法]
接收程序有问题的
并不是你调用接收程序对面就"正好"开始发数据
接收程序前面是要等待RXD(BT_REC)变低的,要等待一个起始位
给一对模拟串口你参考下
/**************************************************************************Name: uart_2Return: noneParameter: uchar dDescription: 串口2,模拟非硬件串口,使用Timer2***************************************************************************/bit uart_2(uchar d){ uchar dat; uchar i; bit eabuf; dat=d; eabuf=EA; EA=0;// PRINTER_ENABLE; //定时器0里对总线操作可能会使打印机电源控制线(P2.1)短暂拉高// TH2=RCAP2H=0XFF; //0xff75 9600Band@16MHz// TL2=RCAP2L=0X75;// TH2=RCAP2H=0XFE; //0xfeea 9600Band@16MHz@x2// TL2=RCAP2L=0XEA; TF2=0; while(TF2==0); //这里多等了一位的时间才开始发 TF2=0; UART_2_TX_LOW; //起始位 while(TF2==0); TF2=0; for(i=0;i<8;i++) //8个数据位 { if((dat&0x01)==0x01)UART_2_TX_HIGH; else UART_2_TX_LOW; dat>>=1; while(TF2==0); TF2=0; } UART_2_TX_HIGH; while(TF2==0); EA=eabuf; return 1;}uchar uart_2_rx(void){ uchar i; uchar dat=0; xdata unsigned long cnt=0; bit eabuf; eabuf=EA; EA=0; while(uart2_rx==1) { cnt++; if(cnt>24096) {EA=eabuf;return 0xff;} } //666666NOP=0.5S,1loop=83us TF2=0;// TH2=RCAP2H=0XFF; //0xff75 9600Band@16MHz// TL2=RCAP2L=0X75;// TH2=RCAP2H=0XFE; //0xfeea 9600Band@16MHz@x2// TL2=RCAP2L=0XEA; while(TF2==0); for(i=0;i<8;i++) { dat>>=1; if(uart2_rx==1)dat|=0x80; TF2=0; while(TF2==0); } EA=eabuf; return dat;}