51单片机串口通信问题

2019-03-24 18:02发布

大家好,最近我学51串口通信 PC给单片机发一串数据 长度不定 单片机收到后,将原数据再发给PC,但是一直接收不到数据,请大家帮我看看是什么原因,新手求指导。我用定时器1做波特率发生器,定时器0用作超时法判断数据接收完毕,串口中断接收数据,查询法发送数据。下面附程序:
#include<STC12C5A32S2.H>
#include<INTRINS.H>
unsigned char idata tab[];
unsigned char j,cnt=0,flag=0;
unsigned char i=0;
void UART_INIT()
{
  SCON=0X50;            //工作方式1,发送使能
  TMOD|=0X21;           //定时器1,工作方式2,定时器0,工作方式1
  AUXR&=0x3F;                    //定时器0,1时钟为Fosc/12,即12T
  AUXR&=0xFE;                    //串口1选择定时器1为波特率发生器
  PCON&=0x7F;                    //波特率不加倍
  TH1=0XFC;             //波特率9600,时钟频率14.7456MHz
  TL1=0XFC;
  TH0=0XFB;             //定时长度1ms
  TL0=0X33;
  TR0=0;                //定时器0不使能
  TR1=1;                //定时器1使能
  PS=1;                 //串口中断设为高优先级
  ES=1;                 //开串口中断
  ET1=0;                        //禁止定时器1中断
  ET0=1;                //开定时器0中断
  EA=1;                 //开总中断
}

void delay_1ms(unsigned int t)
{
  unsigned int a,b;
  for(a=0;a<t;a++)
  for(b=0;b<1167;b++);
}

void mian(void)
{
  delay_1ms(100);
  UART_INIT();
  while(1)
    {
          if(flag==1)
            {
          flag=0;
                  ES=0;
                  for(j=0;j<cnt;j++)
                        {
                      SBUF=tab[j];
                      while(!TI);
                      TI=0;
                        }
                  ES=1;
            }
    }
}

void UART_Rountine() interrupt 4
{
  if(RI)
    {
          TR0=0;
          i=0;
          RI=0;
          tab[cnt++]=SBUF;
        }
  TR0=1;
}


void Timer0_Rountine() interrupt 1
{
  TH0=0XFB;             //定时长度1ms
  TL0=0X33;
  TF0=0;
  i++;
  if(i==50)
    {
      i=0;
          TR0=0;
      flag=1;
    }
}

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
13条回答
xmb6954757
2019-03-25 05:48
程序里面,数据从单片机发向PC,发送完了,记得把cnt清0了,为下次接收数据做准备。你可以先试试你的串口可不可以工作先,就单单接收一个数据;看看串口可不可以正常的工作,波特率对了没有,一个数据工作正常了,在来看多数据的

一周热门 更多>