新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)多機(jī)通信協(xié)議

51單片機(jī)多機(jī)通信協(xié)議

作者: 時(shí)間:2016-11-30 來源:網(wǎng)絡(luò) 收藏
//-----------------------------------------------------------------------
//----------------接收部分---------------------------------------------
case 4:
{
if(temp==Response)//呼叫從機(jī)得到回應(yīng)
{
state=5;//轉(zhuǎn)換狀態(tài)
SendByte(S_M);//發(fā)送從機(jī)到主機(jī)命令
break;
}
/*else//無回應(yīng),停止此次傳輸
{
state=0;
SendByte(STOP);
break;
} */
else
break;
}
case 5:
{
if(temp==OK)//發(fā)送S_M得到回應(yīng)
{
state=6;//轉(zhuǎn)換狀態(tài)
SendByte(S_MOK);//準(zhǔn)備完成
break;
}
/*else //無回應(yīng),停止通信
{
state=0;
SendByte(STOP); //發(fā)送停止命令
break;
}*/
else
break;
}
case 6:
{
if(Position-CMD<20) //數(shù)組溢出判斷
{
*Position=temp;//接收數(shù)據(jù)
Position++;
SendByte(CONTINUE); //要求從機(jī)繼續(xù)發(fā)送數(shù)據(jù)
break;
}
else//超出數(shù)組,停止通信
{
state=0;
SendByte(STOP);
break;
}
}
default:
break;
}
}
}


//-----------------------------------------------
//從機(jī)程序,從機(jī)接收信息,所以用中斷法會(huì)更便于反饋和執(zhí)行命令
//-------------------------------
#include "basic.h"

//---------------------------------------------------
//宏定義

#define EN_ADDSEND TB8=1;//發(fā)送尋址,搜尋從機(jī)
#define EN_DATASEND TB8=0;//發(fā)送數(shù)據(jù)

#define M_S 0Xf0//握手后的命令字,主機(jī)到從機(jī)
#define S_M 0Xf1//握手后的命令字,從機(jī)到主機(jī)
#define M_SOK 0Xf2//主到從準(zhǔn)備完成,從機(jī)發(fā)送的反饋信息
#define S_MOK 0xf3//從到主準(zhǔn)備完成,主機(jī)發(fā)送的反饋信息
#define STOP 0xf4//主機(jī)到從機(jī)發(fā)送結(jié)束

#define ERROR 0xf5//錯(cuò)誤
#define Response 0xf6//應(yīng)答信號(hào)
#define CONTINUE 0xf7//接受數(shù)據(jù)之后給對(duì)方發(fā)送的反饋,請(qǐng)求繼續(xù)
#define OK 0xf8

sbit key=P3^7;
//--------------------------------------------------
//數(shù)據(jù)定義
uchar DATA[20]={0x12,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0x00,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,};//從機(jī)返回的狀態(tài)值
uchar CMD[20]={0};//主機(jī)給從機(jī)發(fā)送的命令
uchar state=0;//狀態(tài)值,進(jìn)行中斷判斷
uchar ADDR;//呼叫從機(jī)地址
uchar temp=0;//SBUF緩存
uchar *Position=0;//數(shù)據(jù)指針,指定數(shù)據(jù)更新的位置

//------------------------------------------
//STC12具有7字節(jié)全球唯一ID,將7位的ID加和作為從機(jī)地址.(有可能從機(jī)地址會(huì)重復(fù))
uchar Set_Add()
{
uchar *p;
uchar i;
uchar addr=0;
p=0xf1;//上電后唯一ID起始地址
for(i=0;i<7;i++)
{
addr+=*p;
}
return (addr);
}

//---------------------------------------------
//串口1初始化,用于和從機(jī)通訊
void Uart1_Init(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0xD0; //9位數(shù)據(jù),可變波特率
AUXR |= 0x40; //定時(shí)器1時(shí)鐘為Fosc,即1T
AUXR &= 0xFE; //串口1選擇定時(shí)器1為波特率發(fā)生器
TMOD &= 0x0F; //清除定時(shí)器1模式位
TMOD |= 0x20; //設(shè)定定時(shí)器1為8位自動(dòng)重裝方式
TL1 = 0xDC; //設(shè)定定時(shí)初值
TH1 = 0xDC; //設(shè)定定時(shí)器重裝值
ET1 = 0; //禁止定時(shí)器1中斷
TR1 = 1; //啟動(dòng)定時(shí)器1
}
void All_Init()
{
Uart1_Init();
ADDR=Set_Add();
EA=1;//打開總中斷
ES=1;//打開串口中斷
}
//------------------------------------------
//查詢法發(fā)送一個(gè)字
void SendByte (uchar date)
{
ES=0;//關(guān)斷串口中斷
EN_DATASEND;
SBUF=date;
while(!TI);
TI=0;
ES=1; //打開串口中斷
}

//主函數(shù),可以用大循環(huán)只執(zhí)行全局?jǐn)?shù)組命令,而中斷接收并修改全局命令命令
void main()
{
All_Init();
Position=DATA;
//SendCmd(DATA);
while(1);
{
}
}

//串口1中斷服務(wù)程序,用state進(jìn)行狀態(tài)判斷處理
void UART1() interrupt 4
{
RI=0;
temp=SBUF;//讀取數(shù)據(jù)
if (state)
{
switch (state)
{
case 1:
if(temp==M_S)//主機(jī)發(fā)送到從機(jī),從機(jī)準(zhǔn)備好接收數(shù)據(jù)
{
SendByte(M_SOK);//發(fā)送應(yīng)答
state=2;//更換狀態(tài)
break;
}
else if(temp==S_M)//主機(jī)要求從機(jī)發(fā)數(shù)據(jù)
{
SendByte(OK);//回應(yīng)主機(jī)
state=3;//轉(zhuǎn)換狀態(tài)
Position=DATA;
break;
}
else if(temp==STOP)
{
SM2=1;
state=0;
break;
}
break;
case 2:
{
if(temp==STOP)//停止符判定,回到待機(jī)狀態(tài)
{
state=0;
SM2=1;
break;
}
DATA[1]=temp;//接收數(shù)據(jù)
SendByte(CONTINUE);//接收數(shù)據(jù)后回應(yīng)
//SendByte(DATA[1]);//串口測試用的
break;
}
case 3:
{
switch(temp)
{
case S_MOK://主機(jī)準(zhǔn)備完成
{
SendByte(*Position);//發(fā)送數(shù)據(jù)
break;
}
case CONTINUE:
{
Position++;
SendByte(*Position);//發(fā)送數(shù)據(jù)
break;
}
case STOP:// 停止命令,返回待機(jī)狀態(tài)
{
state=0;
SM2=1;
break;
}
}
}
}
}
if(RB8==1)//判斷尋址
{
if(temp==ADDR)//進(jìn)行地址判斷
{
SM2=0;//從機(jī)響應(yīng),清除SM2
SendByte(Response);//發(fā)送應(yīng)答
state=1;//更換狀態(tài)
}
else//用于主機(jī)呼叫從機(jī)之后,錯(cuò)誤的呼叫其他從機(jī),則使該機(jī)處于待機(jī)狀態(tài)
{
SM2=1;
state=0;
}
}
}

上一頁 1 2 下一頁

評(píng)論


技術(shù)專區(qū)

關(guān)閉