标题: 关于串行口问题 [打印本页]

作者: 55123    时间: 2015-6-1 23:57
标题: 关于串行口问题
我输入1后但是回来的却是乱码,原本应该是i get 1,对吧!



#include<reg52.h>
#define uchar unsigned char
uchar flag,a,i;
  uchar code table[]={'I',' ','g','e','t',' '};

void main()
{
  
  TMOD=0X20;  //开定时器2
  TH1=0XFD;          //自动八位重装
  TL1=0XFD;
  TR1=1;           //开启定时器
  REN=1;                //允许串行接收
  EA=1;                         //开总中断
  ES=1;                         //串行口中断允许位
  SM1=1;                 //选择模式1
  SM0=0;                 //选择模式1

  while(1)
  {
/*if(RI==1)         
     RI=0;
         P0=SBUF;
           */
   if(flag==1)          //标志位
   {
    ES=0;
        for(i=0;i<6;i++)
                {
                 SBUF=table[i];
                 while(!TI);
                 TI=0;
                }
    flag=0;
        SBUF=a;                  //再将a送给SBUF  ??????
        while(!TI);           //送数据。。。。。检测TI是否为1,串行发送停止位的中间时 由内部硬件使RI置1,开中断,后人工置0
       
         TI=0;
         ES=1;
   
   }
  }
}
   void ser() interrupt 4         //进入串行中断
{
  RI=0;                                        // 接收时。。。。。 串行发送停止位的中间时 由内部硬件使RI置1,开中断,后人工置0
  P1=SBUF;                           //P1接收SBUF中的数据
  a=SBUF;                           //将SBUF送给a
  flag=1;                           //开启标志位
}

作者: yesonjob    时间: 2015-6-2 08:19
这个是郭老师教材上面的程序,串口中断服务程序里面,把上位机发送给单片机的数据给a,然后置flag=1,返回主函数之后,
for(i=0;i<6;i++)
                {
                 SBUF=table[i];
                 while(!TI);
                 TI=0;
                }
就首先把“I get ”这六个字符发送给上位机。
SBUF=a;                  //再将a送给SBUF  ??????
这句的意思就是接着把刚才单片机接收到的a也发送给上位机咯。
这样上位机发送一个字符x后,单片机就会马上返回一个I get x
在这里有个小小的技巧,自己一直在用也觉得很好记忆。在串口通信中肯定存在SBUF这寄存器赋值的情况,我就这样理解,等号一边是寄存器另外一边是单片机,比如SBUF=a,那么a就是单片机,单片机赋值给SBUF,很明显就是单片机发送数据,反之a=SBUF就是寄存器赋值给单片机,就是单片机接收数据。
作者: yesonjob    时间: 2015-6-2 19:36
之前搞错了没看到你的提问。
波特率要用定时器0产生,TMOD=0x02;
串口助手波特率要与设置一致;
串口助手接收与发送的类型要相同,同是文本或16进制数据。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1