51单片机串口通信求助!
用的是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,所以就像上面说的第二次开电的时候才能建立连接