51双机通讯直接直接用的RXD TXD相接,可以吗
RT。我用的是一块开发板和自己焊的一块最小系统(没用RS232等电平转换电路)。直接连接可以通讯吗?是不是都有说232的话就能直接连了? 可以呀,距离不能太远! shanyan 发表于 2013-8-1 11:45 static/image/common/back.gif可以呀,距离不能太远!
可是我用了论坛里的一个别人调通的程序,却通讯不了{:cry:} 这是程序,是论坛里找的
//甲机通过串口控制乙机LED
//名称:甲机发送控制命令字符
//说明:甲单片机负责向外发送控制命令字符“A”“B”“C”,或者停止发送,乙机根据所接收到的字符完成LED1闪烁、LED2闪烁、双闪烁、或停止闪烁。
//发送:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbitk=P3^3;
sbitLED1=P0^0;
sbitLED2=P0^1;
sbitA1=P1^0;
sbitA2=P1^1;
sbitA3=P1^2;
sbitA4=P1^3;
sbitA5=P1^4;
void delay(unsigned char z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}
void send(unsigned char c)
{
SBUF=c; //发送c
while(TI==0); //等待发送完毕
TI=0; //TI清零以便下次发送
}
void main()
{
uchar X=0;
TMOD=0X20; //T1工作模式2
SCON=0X40;// 0100 0000(SM0 SM1 SM2 RENTB8 RB8 TI RI)串口模式1
//REN=0;SM0=0;SM1=1;// 0 1 0 0 0 0 00
TH1=0xfd;//12M 9600bps
TL1=0xfd;
TI=0;
TR1=1;
while(1)
{
if(k==0) //按下K时选择操作代码0,1,2,3
{
while(k==0);
X=(X+1)%4;
}
switch(X) //根据操作代码发送A/B/C或停止发送
{
case 0:
LED1=LED2=0;
break;
case 1:
send('A');
LED1=~LED1;
LED2=0;
break;
case 2:
send('B');
LED2=~LED2;
LED1=0;
break;
case 3:
send('C');
LED1=~LED1;
LED2=~LED2;
break;
}
delay(100);
}
}
///////////////////////////////////////////////////////////////////////////////
//接收 乙机根据所接收到的字符完成LED1闪烁、LED2闪烁、双闪烁、或停止闪烁。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbitk=P3^3;
sbitLED1=P0^0;
sbitLED2=P0^1;
sbitA1=P1^0;
sbitA2=P1^1;
sbitA3=P1^2;
sbitA4=P1^3;
sbitA5=P1^4;
void delay(unsigned char z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}
void main()
{
TMOD=0X20; //T1工作模式2
SCON=0X50;// 0100 0000(SM0 SM1 SM2 RENTB8 RB8 TI RI)串口模式1 允许接收REN=1
// 0 1 0 1 0 0 00
TH1=0xfd;//12M 9600bps
TL1=0xfd;
RI=0;
TR1=1;
A1=A2=A3=A4=A5=0;
LED1=LED2=0;
A5=1;
while(1)
{
if(RI)//如收到则LED闪烁
{
RI=0;
switch(SBUF)//根据所收到的不同命令字符完成不同动作
{
case 'A': LED1=~LED1;LED2=0;break;//LED1闪烁
case 'B': LED2=~LED2;LED1=0;break; //LED2闪烁
case 'C': LED1=~LED1;LED2=~LED2;//双闪烁
}
}
else LED1=LED2=0; //关闭LED
delay(100);
}
} shanyan 发表于 2013-8-1 11:45 static/image/common/back.gif
可以呀,距离不能太远!
我看了一下,TTL通讯确实用不到232.可能是别的原因吧。 几米范围都可以的交叉相连 还有GND接GND啊 lgg88 发表于 2013-8-1 12:48 static/image/common/back.gif
几米范围都可以的交叉相连
距离就是杜邦线的长度,应该不是距离的问题 tbkmcjl 发表于 2013-8-1 13:08 static/image/common/back.gif
还有GND接GND啊
恩,这个有注意,共地了 晶振应该是11.0592MHz shanyan 发表于 2013-8-1 11:45 static/image/common/back.gif
可以呀,距离不能太远!
问题解决了。原来是两个晶振频率不一样。都换了11.0592就好了{:lol:} tbkmcjl 发表于 2013-8-1 13:21 static/image/common/back.gif
晶振应该是11.0592MHz
我刚刚把两个晶振都用11.0592就成功了。{:handshake:}
不过都是12M不行吗?是不是因为波特率的误差 洗澡哥 发表于 2013-8-1 13:51 static/image/common/back.gif
我刚刚把两个晶振都用11.0592就成功了。
不过都是12M不行吗?是不是因为波特率的误差 ...
拿本书去认真读,不教你了{:titter:} tbkmcjl 发表于 2013-8-1 14:00 static/image/common/back.gif
拿本书去认真读,不教你了
{:lol:} 好的。那我去看书了 两个晶振频率不一样无所谓,只要设置波特率一致就OK了 定时器1在12M晶振下无法实现标准的9600BPS。 本帖最后由 洗澡哥 于 2013-8-1 14:45 编辑
大米饭 发表于 2013-8-1 14:31 static/image/common/back.gif
两个晶振频率不一样无所谓,只要设置波特率一致就OK了
{:funk:} 那我主机11.0592M,从机12M就不能正常通讯。把从机也换了11.0592M就能正常通讯了。
我是按照这个设置的波特率9600,没问题吧?
是不是因为12M设置波特率有误差呢?
12M晶振12T波特率设置成9600误差8.51% STC1T型设置成9600波特率误差是0.16%
明显8.51%的误差太大了,就不能用 洗澡哥 发表于 2013-8-1 14:41 static/image/common/back.gif
那我主机11.0592M,从机12M就不能正常通讯。把从机也换了11.0592M就能正常通讯了。
我是按照这 ...
你没看到后面8.51%的误差啊,对于串口通信是致命的误差啊 大哥不要共地么? 共地,RX <---> TX TX <---> RX GND <---> GND
其实连接方法跟接串口的模块式一样的,波特率统一就行,一般30cm以内不会有问题 大米饭 发表于 2013-8-1 14:56 static/image/common/back.gif
你没看到后面8.51%的误差啊,对于串口通信是致命的误差啊
理解了。果然是误差太大!
把波特率调成2400,误差0.16就能用了 zhaoqiwen 发表于 2013-8-1 15:03 static/image/common/back.gif
大哥不要共地么?
我共地了。
问题出在波特率设置上。12M和11.0592M在波特率9600上误差太大,换2400就好了 如果你兩臺機都是12MHz的晶振,誤差一樣,理論上亦可通訊。 黑暗深处 发表于 2013-8-1 15:26 static/image/common/back.gif
共地,RXTX TXRX GNDGND
其实连接方法跟接串口的模块式一样的,波特率统一就行,一般30cm以内 ...
你说的没错。
我是波特率没设置号,误差太大,影响通讯了 qlb1234 发表于 2013-8-1 15:34 static/image/common/back.gif
如果你兩臺機都是12MHz的晶振,誤差一樣,理論上亦可通訊。
我也这么觉得,不过还没试。因为晶振11.0592M焊住了,不好弄下来
下次试一下 洗澡哥 发表于 2013-8-1 15:43 static/image/common/back.gif
你说的没错。
我是波特率没设置号,误差太大,影响通讯了
12M的晶振,2400的波特率可以 qlb1234 发表于 2013-8-1 15:34 static/image/common/back.gif
如果你兩臺機都是12MHz的晶振,誤差一樣,理論上亦可通訊。
这样可以吗?没试过同等的误差下通信是什么情况,有很多不确定因素啊,有待探索 qlb1234 发表于 2013-8-1 15:34 static/image/common/back.gif
如果你兩臺機都是12MHz的晶振,誤差一樣,理論上亦可通訊。
我也同意这个观点,一致就行了,你发我收,步调一致,错不了。 晶振不一样也是可以的 洗澡哥 发表于 2013-8-1 15:30 static/image/common/back.gif
我共地了。
问题出在波特率设置上。12M和11.0592M在波特率9600上误差太大,换2400就好了 ...
bingo!{:lol:} {:lol:}
页:
[1]