为什么51单片机用485发送字符1,串口助手收到的却是00 67,有时候还收到FF

为什么51单片机用485发送字符1,串口助手收到的却是00 67,有时候还收到FF,第1张

你这主程序这么写,并不只发一次。因为循环结束后并没有什么停止语句,而且重要的是主程序没有while(1)语句,主程序却被编译成了子程序,反复循环调用,结果是串口将无限循环的发送字符1了,为什么这么写主程序呢?

再说电脑接收错误,因为单片机是RS485发送,那肯定需要一个USB转RS485模块,电脑才能收到单片机发送的字符。估计你并不是用USB转485摸块。曾经有人提问过这样的问题,他是先用USB转RS232串口线,再用一个232转485模块接单片机,现象与你相似。如果你也是这么转的,那就告诉你,肯定是不行的,电脑接收肯定是错误的。必须用一个USB转485模块。

51单片机能直接接收RS485信号吗

不行,要用RS485转换的。RS485有8个引脚:一个电源;一个地,一个差分+;一个差分-(是通讯线),还有一个接单片机RXD,一个接TXD,另外两个是输出控制和输入控制的(这两个通常连在一起)。

所以单片机的输出是先送到TXD,再由RS485变成差分信号送出去的;

输入是把差分的输入信号由RS485送到单片机的RXD引脚的。

相信你的 RE 与 DE 是连接在一起的,如果不是,你的电路就成了另类

与 RE/DE 连接在一起的那条单片机I/O, 我命名为 CTRL_PIN ,至于是哪条,你才知道

其实发送与接收与普通的 232 有 999% 的相似, 只是多了两行,看下面

发送程序时:

CTRL_PIN = 1; // 输出高电平,允许MAX485输出差分信号

UART232_SENDCHAR(); // 普通232发送函数

CTRL_PIN = 0; // 输出低电平,禁止发送,允许接收

接收程序时: 只要保证 CTRL_PIN = 0 就可以了,无论你是采用中断,还是沦询的方式接收字符,与普通串口用法一样

这个问题很简单,用485通讯的话,思路如下

思路:

PC方面:可以用MSCOMM控件先发一个字符表示接收地址,后延迟1ms,(注意PC端在485通讯在字符发送过程中一定要加延迟,这是我多次测试的总结,如果是用调试助手的话,他内部代码已经加过延迟了,就不必考虑这个问题)再发控制指令,初学者建议直接用调试助手

单片机方面:首先对接收数据进行核对,如果不是本地地址,放弃,如果是本地地址,在检测命令是否正确,如果正确,做出处理后返回PC本地地址并发送命令

我举个例子教你怎么玩多站通讯,下面是我已经通过测试的一个程序

#include <reg51h> //选用晶振110592MHz

#include <absacch>

#define DATA51 DBYTE[0x80] //80H存数据

#define AddressID 0x31 //本机地址1

sbit RS485E=P3^7; //定义485的使能脚// RS5485E=0为接收状态 RS5485E=1为发送状态

sbit MAX485_DIR=P3^7;

main()

{

//通讯设置

SCON = 0xF0; //REN=1允许串行接受状态,串口工作模式3,SM2=1

TMOD|= 0x20; //定时器工作方式2

PCON|= 0x80; //波特率提高一倍

IP=0x10; //串口优先级高

// TH1 = 0xFD; //baud2 / reload value 19200、数据位8、停止位1。效验位无(110592)

TH1 = 0xf4; //fa // //baud2 / 波特率4800、数据位8、停止位1。效验位无 (110592M)

TL1 = 0xf4;

TR1 = 1; //开启定时器1

EA = 1; // 开总中断

ES = 1; //开串口中断

RS485E=0; // RS5485E=0为接收状态 RS5485E=1为发送状态

while(1);

}

void counter4(void) interrupt 4 using 2 //串口中断

{

while(RI==0);

RI=0;

if(SBUF==AddressID)

{

while(RI==0);

RI=0;

if(SBUF==0x01) //发送指令

{

MAX485_DIR=1; //开发送

SBUF=AddressID;

while(TI==0);

TI=0;

SBUF=0x6f; //发送o

while(TI==0);

TI=0;

SBUF=0x6b; //发送k

MAX485_DIR=0; //开接收

}

if(SBUF==0x00) //接收

{

//这里怎么处理就看你自己要怎么做了,你没要求,我也不好怎么写,就自己写吧

}

}

}

程序调试通过,可以直接套用

一般单片机的通讯接口是UART串口电平是TTL电平,与485的差分信号是无法直接连接的,中间需要需要用485芯片进行转换的, 给你推荐一颗芯片PB331,可以兼容485协议,接线不分极性总线可以供电。

以上就是关于为什么51单片机用485发送字符1,串口助手收到的却是00 67,有时候还收到FF全部的内容,包括:为什么51单片机用485发送字符1,串口助手收到的却是00 67,有时候还收到FF、51单片机能直接接收RS485信号吗、MAX485与51单片机的发送、接收程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9277067.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存