首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

关于51模拟串口的有关问题

2012-09-21 
关于51模拟串口的问题为什么我的程序不能够接收到正常的数据#includereg52.hsbit BT_RECP1^3//接收引

关于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)变低的,要等待一个起始位
给一对模拟串口你参考下

C/C++ code
/**************************************************************************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;} 

热点排行