在工业控制、电力通讯、智能仪表等领域,往常情况下是采用串口通信的方式进行数据互换。最初采用的方式是RS232接口,由于工业现场比较复杂,各样电气设施会在环境中产生比较多的电磁干
扰,会致使信号传输错误。除此之外,RS232接口只能实现块上的能够进行通信了。
验。大家能够看到蓝绿色的单片机座周围有32个插针,、J5、J6、J7这4个器件,如图18-2所示.
图18—2单片机扩展接口
这32个IO口不是所有的IO口都能够用来对外扩展,其中既作为数据输出,又能够作为数据输入的引脚是不能够用的,比方P3。2、、P3。6引脚,,如果我们用来扩展,发送的信号如果和DS18B20的时序符合,会致使DS18B20拉低引脚,,都能够使用杜邦线接上插针,扩展出来使用。自然了,如果把目前的IO口应用于扩展功能了,板子上的相应的功能就实现不了了,也就是说需要扩展功能和板载功能二选一。
在进行RS485实验中,我们通信用的引脚必须是P3。0和P3。1,其他还有一个方向控制引脚,。
RS485的此外一端,大家能够使用一个 USB转485模块,用双绞线把
A和B分别对应连起来,USB那头插入电脑,然后就
学习了第13章的实用串口通信的方法和程序后,做这种串口通信的方法就很简单了,基本是一致的。我们使用实用串口通信的思路,做了一个简单的程序,经过串口调试助手下发随意个字符,单片机接收到后在末尾增添“回车+换行”符后再送回,在调试助手上从头显示出来,先把程序贴出来。
程序中需要注意的一点是:因为平常都是将485设置为接收状态,只有在发送数据的时候才将485改为发送状态,所以在UartWrite( )函数开头将485方向引脚拉高,函数退出前再拉低。但是这里有一个细节,就是单片机的发送和接收中止产生的时刻都是在停止位的一半上,也就是说每当停止位传送了一半的时候,RI或TI就已经置位并且马上进入中止(如果中止使能的话)函数了,接收的时候自然不会存在问题,但发送的时候就不同样了:当紧接这向SBUF写入一个字节数据时,UART硬件会在达成上一个停止位的发送后,再开始新字节的发送,但如果此时不是持续发送下一个字节,而是已经发送完成了,要停止发送并将485方向引脚拉低以使485从头处于接收状态时就有问题了,因为这时候最后的这个停止位实际只发送了一半,还没有完全达成,所以就有了UartWrite( )函数内DelayX10us(5)这个操作,这是人为的增加了延时50us,这50us的时间正好让剩下的一半停止位达成,那么这个时间自然就是由通信波特率决定的了,为波特率周期的一半。
/***********************RS485。c文件程序源代码** ***********
**********/
#include<>
include<〉
sbitRS485_DIR=P1^7 ; //RS485 方向选择引脚
bitflagOnceTxd=0;// 单次发送达成标志,即发送完一个字节
bitcmdArrived=0; //命令抵达标志,即接收到上位机下发的命令
unsignedcharcntRxd=0 ;
unsignedcharpdatabufRxd [40];//串口接收缓冲区
voidConfigUART(unsignedintbaud )//串口配置函数, baud为波特率
{
RS485_DIR=0 ;//RS485设置为接收方向
SCON=0x50 ; //配置串口为模式 1
TMOD&=0x0F ;//清零T1的控制位
TMOD|=0x20 ;//配置T1为模式2
TH1=256 —(11059200/12/32)/baud;// 计算T1重载值
TL1=TH1; //初值等于重载值
ET1=0; //禁止T1中止
ES=1; //使能串口中止
TR1=1; //启动T1
}
unsignedcharUartRead (unsignedchar*buf ,unsignedcharlen )//串口数据读取函数,
RS485通信和Modbus协议 来自淘豆网m.daumloan.com转载请标明出处.