您的位置 首页 厂商

51单片机多机通信协议

做自己以前没做过的东西,总会有各种踌躇,害怕做不出来,其实要是真的开始去做了,问题就解决大半了。在家没网,就开始写了,熬了两夜

做自己曾经没做过的东西,总会有各种踌躇,惧怕做不出来,其实要是真的开端去做了,问题就处理多半了。 在家没网,就开端写了, 熬了两夜,加一个半响,总算是完结了通讯协议,经调试,能够正常作业。 如果有孩子也要做这个,能够参阅一下哈! 其他不多说,贴代码。

//————————————————-
//主机程序,主机座操控,用中止法
//———————————————–
#include “basic.h”
//—————————————————
//宏界说
#define EN_ADDSEND TB8=1;//发送寻址,搜索从机
#define EN_DATASEND TB8=0;//发送数据
#define M_S 0Xf0//握手后的指令字,主机到从机
#define S_M 0Xf1//握手后的指令字,从机到主机
#define M_SOK 0Xf2//主到从预备完结,从机发送的反应信息
#define S_MOK 0xf3//从到主预备完结,主机发送的反应信息
#define STOP 0xf4//主机到从机发送完毕
#define ERROR 0xf5//过错
#define Response 0xf6//应对信号
#define CONTINUE 0xf7//承受数据之后给对方发送的反应,恳求持续
#define OK 0xf8
//————————————————–
//数据界说
uchar DATA[20]={0};//从机回来的状况值
uchar CMD[20]= {0x44,0x44,0x44,0x55,0x55,0x55,0x47,0x45,0x65,0x35,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,};// 主机给从机发送的指令
uchar state=0;//状况值,进行中止判别
uchar Address;//呼叫从机地址
uchar temp=0;//SBUF缓存
uchar *Position=0;//数据指针,指定数据更新的方位
//———————————————
//串口1初始化,用于和从机通讯
void Uart1_Init(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0xD0; //9位数据,可变波特率
AUXR |= 0x40; //守时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1挑选守时器1为波特率发生器
TMOD &= 0x0F; //铲除守时器1形式位
TMOD |= 0x20; //设定守时器1为8位主动重装方法
TL1 = 0xDC; //设定守时初值
TH1 = 0xDC; //设定守时器重装值
ET1 = 0; //制止守时器1中止
TR1 = 1; //发动守时器1
EA=1; //总中止发动
SM2=0;
ES=1;
}
//——————————————
//查询法发送一个数据,TB8=0;
void SendByte (uchar date)
{
//EN_DATASEND;//TB8=0;
TB8=1;
SBUF=date;
while(!TI);
TI=0;
}
//———————————–
//寻址从机
void Search(uchar ADD)
{
//EN_ADDSEND;
TB8=1;
SBUF=ADD;
while(!TI);
TI=0;
}
//主机向从机发送指令 //由于主机为操控端,为便于操控从机,所以挑选用查询法而不选用中止
void M_S_Protocol(uchar add,uchar *m)//三个参量分别为从机地址,指令的字节数,指令的方位
{
state=1;
ES=1;
Position=m;
Search(add);
}
//主机接纳从机状况,相同也为查询法不必中止
void S_M_Protocol(uchar add,uchar *m)//三个参量分别为从机地址,指令的字节数,指令的方位
{
state=4;
ES=1;
Position=m;
Search(add);
}
void M_S_Send(uchar add,uchar *m)//主机到从机整个进程
{
M_S_Protocol(add,m);
while(state);
ES=0;
}
void S_M_Send(uchar add,uchar *m)//从机到主机的整个进程
{
S_M_Protocol(add,m);
while(state);
ES=0;
}
//—————————–
//主函数,主机主函数首要用于与GPRS和从机之间做桥接
void main()
{
Uart1_Init();
while(1)
{
S_M_Send(0x01,CMD);
}
}
void UART1() interrupt 4
{
RI=0;//铲除中止标志
temp=SBUF;
if(state)//处于传输状况
{
switch(state)
{
//—————————————————————–
//———————M_S部分——————————–
case 1:
{
if(temp==Response)//寻址成功
{
SendByte(M_S); //发送M_S指令
state=2; //转化状况
break;
}
/*else//寻址不成功,通讯完毕,转化为非通讯状况
{
state=0;
SendByte(STOP);//发送通讯中止指令
break;
}*/
break;
}
case 2:
{
if(temp==M_SOK)//M_S得到回应
{
state=3;
SendByte(*Position);//发送榜首字节
break;
}
break;
}
case 3:
{
if(temp==CONTINUE) //从机持续要求数据
{
if(Position-CMD<19)//数组长度判别
{
Position++;
SendByte(*Position);//发送数据
break;
}
else//数组溢出,中止通讯
{
state=0;
SendByte(STOP);
break;
}
}
break;
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/318672.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部