STC单片机p31口如何串口通信IO复用

STC单片机p31口如何串口通信IO复用,如下面的程序中,为何在串口发送完后,改变P3口的内容,就会使串口收不到内容?
void init_RS232 (void) // 串口初始化
{
//[email protected]
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
// AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
// AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0x98; //设定定时初值
TH1 = 0x98; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA=1;
}
//---------------------------------------------------------------------
void Send_Byte(unsigned char one_byte) // 发送一个字节
{
TI = 0; // 清零串口发送中断标志
SBUF = one_byte;
while (!TI);
TI = 0;
}
void main()
{
init_RS232();
while(1)
{
Send_Byte(0x3F);
Send_Byte(0x47);
Send_Byte(0x3F);
P3=0; /////////////////////////////////////为何加上这行,串口助手就收不到内容?去掉就可以?
}

}
当然是端口不够用啦,才会复用,用串口传一些调试的数据,单片机是stc12c2052ad,只有20脚,不太够用,上面的程序只是大概的意思,难道真的不能复用,平时做IO口输出用,只是在必要时传一下调试的数据,在电脑上看下对不对。。。,没有别的口可用了。。。

首先要用串口,P3.0和P3.1就不能复用,否则在对I/O口操作时,就会影响到串口的通信,如你的程序中最后一行是:P3=0;就是因为P3.0和P3.1都为0了,即不能收,也不能发了,当然就不能通信了,那串口助手肯定是收不到内容了。但不知为什么要有这一行,是因为P3.0和P3.1还控制其它什么电路了吗?有的话,一定要改一下,改用其它I/O来控制。
其次,不知你用的是什么型号的STC单片机,STC单片机有些型号是带双串口的,这样,还可以用第2个串口了,就不会影响你用P3.0和P3.1了,但最好还是把串口放在P3.0和P3.1上。因STC单片机下载程序就是用P3.0和P3.1这两个引脚的,所以,最好不要复用。
按你补充的说法只能复用的话,就要考虑以下问题:
P3.0和P3.1复用做什么了?串口是不是需要收/发,还是只用来发送,如果只是发送的话,那就不用P3.0了,可以用做I/O口了。
另一个问题:那个发送的P3.1接什么控制端电路了,当串口发送数据时,P3.1是变化的,会不会影响到控制端所控制的电路的工作?如果会的,就不能复用了,如果不会,可以复用。但必须保证,在串口发送数据时,先将P3.1置成高电平,即P3.1=1,才能保证串口正常发送数据。而不要写P3=0,这肯定是不行的。追问

嗯,只是发送数据,p31另有做数码码的显示,试过P31=1,比原来有改变,原来是只能收到一次数据,后面就收不到,改P31=1后,可以连续收到数据,但后面的数据不稳定,很多是错误的数据。等于无效,不知道能不能改善。

追答

这就是P31复用造成的毛病,因为在做数码显示时,P31有数据输出,变化的,因此,就会同时从串口输出乱码,看起来就是不稳定,是错误数据,这是肯定的,这就是前面说的串口脚P30,P31 不准复用的原因,互相影响。能不能把P31与其它的I/O复用,不能作数码管显示。因此,P31是不准复用的。有个更好的办法解决I/O引脚不够用的问题,用一片74HC595作数码管显示的段码输出,只用单片机的3个I/O脚与595连接,而595就可以输出8位的段码,就是用串行的方式扩展一个8位并行口。用3个脚扩展成8个,这样,你的单片机引脚还会有剩余呢,这样,P30,P31只用串口,可以实现与电脑双向通信了,电脑即能收,也能发,单片机也是即能发,又能收,这多好。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-04-18
P3^0,P3^1在用作串口时就不能作其他用,可以用P3^2~P3^7。
P3=0xC0; //这样加上这行,串口助手就不影响。
第2个回答  2013-12-02
因为你端口被设置为常低电平了
第3个回答  2013-12-02
不知道为什么非要全部用到P3口,所以帮不到你,但是就事论事的说如果把P3=0;改成P3=P3&0x03;这样就将P3.0/P3.1端口释放了,不知道可以不,试试看。
相似回答