51单片机与三菱PLC无协议通讯成功

我用了两个晚上的时间查阅一些资料 , 利用三菱PLC的扩展RS485通讯板与其51单片机连接通讯 , 可写PLC任意的地址 。长度可达1000米 , 看见网上写的都很烦且对三菱和单片机不是很熟的朋友来说有一定的阅读难度 , 今天将它与大家分享 。希望在此基础上大家能扩展出自己想要的功能 , 过些时间有空我在写个半双工的程序 。
硬件部分:
【51单片机与三菱PLC无协议通讯成功】我用的是天祥单片机实验板 , 由于没有RS485接口 , 我利用ADM485芯片自制了一个485接口与三菱PLC的扩展RS485通讯如图 , 但如果要进行半双工通讯 , 须将P3.0口到下载程序的RS232芯片的线断开可用一个跳线 , 用RS485的时候断开RS232 , 用RS232的时候插上跳线帽 。硬件连接如图
 
PLC程序:
通讯我用单片机做主机(只发送指令) , PLC做从机(只接收指令) , 单工单向 , 以便初学着掌握 。
格式:1位启始 , 8位数据 , 一位停止 。
所以PLC寄存器D8120:0C81.
plc程序很简单不懂的可以看下三菱PLC的通讯手册 。如下图:
 
三:单片机程序:
#include /*单片机的头文件*/
unsigned char code tab[]={0x17,0xff};/*PLC输出的Y点数 , PLC输出Y灯0125678亮*/
sbit LED=P1^1; /*将RS485置为发送数据模式*/
unsigned char i;
void init()
{
SCON=0x50; /*串口中断开*/
TMOD=0x20; /*定时器设置*/
TH1=0xfd; /*定时时间的高位*/
TL1=0xfd; /*定时时间的低位 , 速度为9600BPS*/
TR1=1; /*定时器开*/
EA=1; /*开总中断*/
TI=0; /*复位串口中断*/
led=1; /*将RS485置为发送数据模式*/
}
void main()
{
init(); /*调用子程序*/
for(i=0;i<2;i++)
{
SBUF=tab[i]; /*将数据发送到串口*/
while(!TI); /*等待串口数据发送结束*/
TI=0; /*复位串口中断*/
}
}
四:注意点 。
1:RS485的线不能接反 , 否则数据将不正确 。
2:单片机的晶振要选择11.0592MHZ , 否则PLC接收到数据也不正确 。
3:RS485芯片的电源不能接反 , 否则要烧坏芯片 。

    推荐阅读