微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机串口通信求助!

51单片机串口通信求助!

时间:10-02 整理:3721RD 点击:
最近在使用串口通信时遇到了点小问题解决不了,
用的是AT89S51和max232与PC的通信,串口连接好之后板子上电,测试程序在跑,但是串口不工作,此时测的单片机TX引脚低电平,然后掉电之后迅速上电串口就好了,大神给我分析一下子。在线等。

max232是不是有问题,还有你的代码能保证正确么?

是一个电机驱动的程序   我把串口的程序贴出来给你看一下啊

void cpu_init()
{
  //I/0初始化
  TMOD=0x20;//使定时器T1工作在方式2,即T1工作在常数自动装入的8位定时器/计数器状态
  TCON=0x00;//清定时器T0\T1溢出标志,关定时器T0\T1,
            //清外中断INT0和INT1溢出标志,选择INTO\INT1为电平触发方式
  TH1=0xfd; //11.0592MHz下,设置串行口波特率为9600
  TL1=0xfd;  
  PCON=0x00;//波特率不加倍
  TR1=1;//启动定时器T1
  SCON=0x50;//串口工作在方式1,且允许串行口接收,set byte rate as 9600bps
  //IP=0x01;//设置外中断INT0为高优先级,此处加优先级           
   
  IE=0x90;   // EA=1,ES=1,开总中断,开串行中断
ZM_Key1=1;  
ZM_Key2=1;
FM_Key1=1;  
FM_Key2=1;
eye_LR=0;
eye_LR_temp=0xFF;
}
下面是串口通信
//增加串口中断模块
void cpu_com() interrupt 4
{
   uchar rev;
   EA=0;
   if(RI)
   {
     RI=0;
     rev=SBUF;//CPU收到的PC机数据
  if( (rev&0x60)==0x40)//判断是否为镜头变倍指令
  {  
      switch(rev&0x03)
       {
       case 0x00:zoom_motor(0,0);break;//控制变倍镜头停止(锁定)      
     case 0x01:zoom_motor(1,1);break;//控制变倍镜头倍率变大     
     case 0x02:zoom_motor(1,0);break;//控制变倍镜头倍率变小            
     default:break;
     }
   }
  if( (rev&0x60)==0x20 )//判断是否为镜头聚焦指令
    {
     switch(rev&0x03)
     {        
      case 0x00:send_LR_info() ;break;
    default: break;
     }
    }        
  }
   if(TI)
   {
   TI=0;
   }
   EA=1;
}

好好学习天天向上谢谢lz

问题没解决呢     烦的

问题已解决,是因为开机的时候没清SBUF寄存器引起的   MCU通信   要先有“握手”信号才能建立连接    此时若SBUF中有数据  这个时候会发生电平冲突    连接建立不起来         MCU后迅速上电就等于将单片机“复位”复位后的MCU就相当于将SBUF清0,所以就像上面说的第二次开电的时候才能建立连接   

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top