你这主程序这么写,并不只发一次。因为循环结束后并没有什么停止语句,而且重要的是主程序没有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单片机的发送、接收程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)