想法:
PC:可以用MSCOMM控件先發送壹個字符表示接收地址,然後延遲1ms(註意PC在485通信發送字符的過程中壹定要延遲,這是我多次測試的總結。如果用的是調試助手,就不需要考慮這個問題),然後發送控制指令。新手建議直接用調試助手。
單片機:首先檢查接收到的數據。如果不是本地地址,放棄。如果是本地地址,檢查命令是否正確。如果正確,返回PC本地地址,處理後發送命令。
我舉個例子教妳怎麽玩多站通訊。這是壹個程序,我已經通過了測試。
# include & ltreg 51 . h & gt;//選擇晶振11.0592MHz。
# include & ltabsacc.h & gt
# defined ATA 51 dbyte[0x 80]//80h來存儲數據。
#define AddressID 0x31 //本地地址1
sbit rs485e=p3^7;//定義485 // RS5485E=0的使能引腳為接收狀態,RS5485E=1為發送狀態。
sbit max485_dir=p3^7;
主()
{
//* * * * * * * * * *通信設置
SCON = 0xf 0;//REN=1允許串口接受狀態,串口工作模式3,=1。
TMOD | = 0x 20;//定時器工作模式2
PCON | = 0x 80;//波特率加倍
IP = 0x 10;//串口優先級高。
//th 1 = 0x FD;//波特* 2/*重載值19200,數據位8,停止位1。無效(11.0592)
th 1 = 0x F4;//FA///Baud * 2/*波特率4800,數據位8,停止位1。無效(11.0592M)
TL 1 = 0x F4;
tr 1 = 1;//啟動計時器1
EA = 1;//打開主機中斷
ES = 1;//打開串行端口中斷
RS 485 e = 0;// RS5485E=0為接收狀態,RS5485E=1為發送狀態。
while(1);
}
無效計數器4(無效)中斷4使用2//串行端口中斷
{
while(RI = = 0);
RI = 0;
if(SBUF==AddressID)
{
while(RI = = 0);
RI = 0;
if(sbuf = = 0x 001)//發送指令
{
max 485 _ DIR = 1;//開發和交付
SBUF = AddressID
while(TI = = 0);
TI = 0;
SBUF = 0x6f//發送o
while(TI = = 0);
TI = 0;
SBUF = 0x6b//發送k
max 485 _ DIR = 0;//開放接待
}
If(SBUF==0x00) //接收
{
//這裏怎麽處理,看妳自己想怎麽做了。妳沒有要求,我也不擅長怎麽寫。自己寫就好了。
}
}
}
該程序已通過調試,可以直接應用。