51單片機與三菱PLC無協(xié)議通訊成功
我用了兩個晚上的時間查閱一些資料,利用三菱PLC的擴展RS485通訊板與其51單片機連接通訊,可寫PLC任意的地址。長度可達1000米,看見網(wǎng)上寫的都很煩且對三菱和單片機不是很熟的朋友來說有一定的閱讀難度,今天將它與大家分享。希望在此基礎(chǔ)上大家能擴展出自己想要的功能,過些時間有空我在寫個半雙工的程序。
硬件部分:
我用的是天祥單片機實驗板,由于沒有RS485接口,我利用ADM485芯片自制了一個485接口與三菱PLC的擴展RS485通訊如圖,但如果要進行半雙工通訊,須將P3.0口到下載程序的RS232芯片的線斷開可用一個跳線,用RS485的時候斷開RS232,用RS232的時候插上跳線帽。硬件連接如圖
PLC程序:
通訊我用單片機做主機(只發(fā)送指令),PLC做從機(只接收指令),單工單向,以便初學(xué)著掌握。
格式:1位啟始,8位數(shù)據(jù),一位停止。
所以PLC寄存器D8120:0C81.
plc程序很簡單不懂的可以看下三菱PLC的通訊手冊。如下圖:
三:單片機程序:
#include /*單片機的頭文件*/
unsigned char code tab[]={0x17,0xff};/*PLC輸出的Y點數(shù),PLC輸出Y燈0125678亮*/
sbit led=P1^1; /*將RS485置為發(fā)送數(shù)據(jù)模式*/
unsigned char i;
void init()
{
SCON=0x50; /*串口中斷開*/
TMOD=0x20; /*定時器設(shè)置*/
TH1=0xfd; /*定時時間的高位*/
TL1=0xfd; /*定時時間的低位,速度為9600BPS*/
TR1=1; /*定時器開*/
EA=1; /*開總中斷*/
TI=0; /*復(fù)位串口中斷*/
led=1; /*將RS485置為發(fā)送數(shù)據(jù)模式*/
}
void main()
{
init(); /*調(diào)用子程序*/
for(i=0;i<2;i++)
{
SBUF=tab[i]; /*將數(shù)據(jù)發(fā)送到串口*/
while(!TI); /*等待串口數(shù)據(jù)發(fā)送結(jié)束*/
TI=0; /*復(fù)位串口中斷*/
}
}
四:注意點。
1:RS485的線不能接反,否則數(shù)據(jù)將不正確。
2:單片機的晶振要選擇11.0592MHZ,否則PLC接收到數(shù)據(jù)也不正確。
3:RS485芯片的電源不能接反,否則要燒壞芯片。