标题:
单片机双机Rs485通信问题,求前辈指点!
[打印本页]
作者:
eyven0519
时间:
2020-2-8 20:08
标题:
单片机双机Rs485通信问题,求前辈指点!
一主机,用STC8A8K64S4,一从机,用STC89C52,用开发板上的MAX485模块(两个),进行通信,一直无法实现,以下是主机和从机的程序,求指点。
主机程序:
#include "stc8.h"
#include "intrins.h"
typedef unsigned char uchar;
typedef unsigned int uint;
#define FOSC 11059200L
#define BAUD 4800
#define BN 8
bit busy;
sbit RS485_DIR = P0^4;
uchar rebuf[8];
uchar trbuf[8]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x66,0xf8};
void delay(unsigned int ms)
{
unsigned char i;
while(ms--)
{
for(i=0;i<110;i++);
}
}
void master(uchar command)
{
uchar aa,i;
RS485_DIR=1;
S3BUF=command;
while(S3TI==0);
delay(5);
S3CON &= ~S3TI;
RS485_DIR=0;
while(!S3RI);
S3CON &= ~S3RI;
aa=S3BUF;
if(aa==0x02)
{
for(i=0;i<BN;i++)
{
while(!S3RI);
S3CON &= ~S3RI;
rebuf[i]=S3BUF;
}
}
if(aa==0x01)
{
RS485_DIR=1;
for(i=0;i<BN;i++)
{
S3BUF=trbuf[i];
while(!S3TI);
S3CON &= ~S3TI;
}
}
}
void ConfigUART(uint Baud)
{
RS485_DIR=1;
S3CON = 0x10;
AUXR = 0x10;
T2L = (65536 - (FOSC/4/Baud/12));
T2H = (65536 - (FOSC/4/Baud/12))>>8;
}
void main()
{
uchar j;
P_SW2 =0x00; //(P0.0/RxD3, P0.1/TxD3)
ConfigUART(BAUD);
// EA = 1;
while(1)
{
master(0x01);
master(0x02);
for(j=0;j<BN;j++)
{
P2=rebuf[j];
delay(10000);
}
}
}
复制代码
从机程序:
#include "reg52.h"
typedef unsigned int uint;
typedef unsigned char uchar;
sbit RS485DIR=P1^0;
uchar trbuf[8]={0x00,0xa4,0xf9,0x90,0xb0,0x92,0x66,0xff};
uchar rebuf[8];
void delay(uint i)
{
int j;
while(i--)
{
for(j=110;j>0;j--);
}
}
void UsartInit()
{ RS485DIR=0;
SCON=0X50;
TMOD=0X20;
PCON|=0X00;
TH1=0Xfa;
TL1=0Xfa;
TR1=1;
EA=1;
}
void main()
{
uchar j;
UsartInit();
while(1)
{
ES=1;
for(j=0;j<8;j++)
{
P0=rebuf[j];
delay(1000);
}
}
}
void Usart() interrupt 4
{
uchar a,j,i;
RI = 0;
ES=0;
a=SBUF;
delay(100);
if(a==0x02)
{
RS485DIR=1;
SBUF=0x02;
while(!TI);
TI=0;
for(j=0;j<8;j++)
{
SBUF=trbuf[j];
while(!TI);
TI=0;
}
}
if(a==0x01)
{
RS485DIR=1;
SBUF=0x01;
while(!TI);
TI=0;
for(i=0;i<8;i++)
{
RS485DIR=0;
while(!RI);
RI=0;
rebuf[i]=SBUF;
}
}
RS485DIR=0;
ES=1;
}
复制代码
作者:
csmyldl
时间:
2020-2-9 00:32
对于程序来说,只要波特率一致就可以了,重点检查两者配置的波特率是否一致
作者:
51hei**1140
时间:
2020-2-9 09:16
你好!
1、晶振和波特率要一致
2、485收发控制要做好
3、从简到繁逐步去调试
作者:
eyven0519
时间:
2020-2-9 11:41
波特率都是4800,STC8单片机P2收到的数据全是00,STC89C52,P0数据也是00
作者:
gd2051
时间:
2020-2-10 12:37
第一步,晶振和波特率要匹配。 第二步,两块单片机板各自独立用 ttl to usb 与串口助手进行通信,先调通单片机与串口助手能通畅通信。第三步,在单片机与串口助手能通信的基础上,把串口助手换成单片机,调试两个单片机进行串口通信。 第四步,把232通信改成485通信。
作者:
weras
时间:
2020-3-13 11:44
楼主先仿真试一下
作者:
robinsonlin
时间:
2020-3-13 13:01
1.先从TTL端截取信号,通过TTL转USB到电脑调试一下,看信号发出来没有。
2.做485传输的时候,建议把公共地也对接起来。不然很容易出莫名其妙的问题。也就是A+,B-,还有GND三个信号。
3.注意A+,B-的对应,别搞反了。
作者:
shuodongfeng
时间:
2020-3-13 14:19
485通讯测试方法如下:
1:先测试通讯双方的TTL信号是否正常从TX引脚发出,若没有,首先检查代码关于串口配置是否正确(代码尽量简单),而检查芯片是否正常工作,比如芯片供电,晶振配置等等!若一致则走下一步
2:示波器抓取通讯双方的TTL的波特率是否一致,有时候即使波特率不一致能可以收到数据,不过是一些乱码,波特率若不一致,检查程序的波特率配置、
3:检查485收发是否正常工作,比如供电,控制收发引脚状态是否符合控制逻辑
4:测试线路导通性
作者:
lem
时间:
2020-3-15 12:33
如果程序没问题的话检查一下485芯片是否与单片机共地
作者:
ThomasLuan
时间:
2020-3-15 14:11
楼主你可用先用TTL电平直连测试。以便区分是否是程序问题
作者:
热爱单片机1425
时间:
2020-4-8 11:07
我也用的这两个单片机,也是不能通讯
作者:
pcbboy
时间:
2020-4-8 17:41
IO口初始化一下,STC单片机IO口不初始化有些端口是不能用的:
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P6M0 = 0x00;
P6M1 = 0x00;
P7M0 = 0x00;
P7M1 = 0x00;
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1