硬件设计
链接:https://pan.baidu.com/s/1O6FYzpRDkedPM2ZW6Uivuw
提取码:5jpj
代码设计
#include<reg51.h>
#include<string.h>
#include "lcd.h"
#define _SUCC_ 0x0f//数据传送成功
#define _ERR_ 0xf0//数据传送失败
unsigned char aa=0xff;//主机与从机之间通信标志
unsigned char temp=0xff;
unsigned char Buff[20];//数据缓冲区
unsigned char recive[6]; //用于保存从机发送的数据
sbit KEY1=P1^3;
sbit KEY2=P1^2;
sbit KEY3=P1^1;
sbit KEY4=P1^0;
sbit KEY5=P3^2;
sbit KEY6=P3^3;
//sbit KEY5=P1^4;
//sbit KEY6=P1^5;
//延时1ms函数
void delay_1ms(unsigned int i)
{
unsigned int x,y;
for(x=i;x>0;x--)
for(y=110;y>0;y--);
}
//串口初始化函数
void init()
{
TMOD=0x20; //定时器1工作于方式2
TH1=0xfd;
TL1=0xfd; //波特率为9600
PCON=0;
SCON=0xd0; //串口工作于方式3
TR1=1; //开启定时器
TI=0;
RI=0;
}
//发送数据函数
void SEND_data(unsigned char *Buff)
{
unsigned char i,lenth,check;
lenth=strlen(Buff); //计算数据长度
check=lenth;
TI=0; //发送数据长度
TB8=0; //发送数据帧
SBUF=lenth;
while(!TI);
TI=0;
for(i=0;i<lenth;i++) //发送数据
{
check=check^Buff[i];
TB8=0;
SBUF=Buff[i];
while(!TI);
TI=0;
}
TB8=0; //发送校验字节
SBUF=check;
while(!TI);
TI=0;
}
//接收数据函数
unsigned char RECE_data(unsigned char *Buff)
{
unsigned char i;
unsigned char lenth;
unsigned char check;
RI=0; //接收数据长度
while(!RI);
if(RB8==1)
{
RI = 0;
return 0xfe; //若接收到地址帧,则返回0xfe
}
lenth=SBUF;
RI=0;
check=lenth;
for(i=0;i<lenth;i++) //接收数据
{
while(!RI);
if(RB8==1) //若接收到地址帧,则返回0xfe
return 0xfe;
Buff[i]=SBUF;
check=check^(Buff[i]);
RI=0;
}
while(!RI); //接收校验字节
if(RB8==1) //若接收到地址帧,则返回0xfe
return 0xfe;
temp=SBUF;
RI=0;
check=temp^check; //将从主机接收到的校验码与自己计算的校验码比对
if(check!=0) //校验码不一致,表明数据接收错误,向主机发送错误信号,函数返回0xff
{
TI=0;
TB8=0;
SBUF=_ERR_;
while(!TI);
TI=0;
return 0xff;
}
TI=0; //校验码一致,表明数据接收正确,向主机发送成功信号,函数返回0x00
TB8=0;
SBUF=_SUCC_;
while(!TI);
TI=0;
return 0;
}
//发送从机地址
void ADDR_data(unsigned addr)
{
while(temp!=addr) //主机等待从机返回其地址作为应答信号
{
TI=0; //发送从机地址
TB8=1; //发送地址帧
SBUF=addr;
while(!TI);
TI=0;
RI=0;
while(!RI);
temp=SBUF;
RI=0;
}
}
void keyscan()
{
if(KEY1==0)
{
LcdWriteCom(0x01); //清屏
delay_1ms(5);
if(KEY1==0)
{
while(!KEY1);
ADDR_data(0x01);//发送从机地址
temp=_ERR_; //主机等待从机数据接收成功信号
while(temp!=_SUCC_)
{
unsigned char Buff[]={0xfe};
SEND_data(Buff);//发送数据
RI=0;
while(!RI);
temp=SBUF;
RI=0;
}
SM2=0; //接收数据帧
aa=0xff; //从机接收数据,并将数据保存到数据缓冲区
while(aa==0xff)
{
aa=RECE_data(Buff);
P0 = 0xff;
}
P0 = 0xfe;
recive[0] = Buff[0];
recive[1] = Buff[1];
recive[2] = Buff[2];
}
}
if(KEY2==0)
{
LcdWriteCom(0x01); //清屏
delay_1ms(5);
if(KEY2==0)
{
while(!KEY2);
ADDR_data(0x01);
temp=_ERR_; //主机等待从机数据接收成功信号
while(temp!=_SUCC_)
{
unsigned char Buff[]={0xff};
SEND_data(Buff);
RI=0;
while(!RI);
RI=0;
temp=SBUF;
}
}
}
if(KEY3==0)
{
LcdWriteCom(0x01); //清屏
delay_1ms(5);
if(KEY3==0)
{
while(!KEY3);
ADDR_data(0x02);
temp=_ERR_; //主机等待从机数据接收成功信号
while(temp!=_SUCC_)
{
unsigned char Buff[]={0xfe};
SEND_data(Buff);
RI=0;
while(!RI);
temp=SBUF;
RI=0;
}
SM2=0; //接收数据帧
aa=0xff; //从机接收数据,并将数据保存到数据缓冲区
while(aa==0xff)
{
aa=RECE_data(Buff);
P0 = 0xff;
}
P0 = 0xfe;
/*
recive[3] = Buff[0];
recive[4] = Buff[1];
recive[5] = Buff[2];
*/
recive[0] = Buff[0];
recive[1] = Buff[1];
recive[2] = Buff[2];
}
}
if(KEY4==0)
{
LcdWriteCom(0x01); //清屏
delay_1ms(5);
if(KEY4==0)
{
while(!KEY4);
ADDR_data(0x02);
temp=_ERR_; //主机等待从机数据接收成功信号
while(temp!=_SUCC_)
{
unsigned char Buff[]={0xff};
SEND_data(Buff);
RI=0;
while(!RI);
temp=SBUF;
RI=0;
}
}
}