说一下功能:客户机发送0x01到服务机
2服务单片机应答0xf2到客户机
3客户机接收到0xf2,发送信息153432这6个数字到服务机
4client发送完信息后发送0xaa结束通信
5server接收到0xaa后回复0xaa结束通信,从此老死不相往来
看代码:
//发送端代码#include "reg51.h"
#include "myheader.h"
#define uchar unsigned char
long int sleep_i=0;
long int main_i=0;
int bufferc[6]={0};
uchar tag=0;
void test()
{P17=0;
}
void main()
{uchar sendx[6]={1,5,3,4,3,2};sleep(1000);TMOD=0x20;//采用初值自动重载的方式TH1=0XF4;//根据波特率计算公式这里需要设置为这么多才能够在串行数据传输模式1的状况下实现波特率2400B/STL1=0XF4;TR1=1;//启动定时器开始计时SCON=0X40;REN=1;EA=1;ES=1;SBUF=0x01; //发送01while(TI==0);
// test();for(;;){if(tag==1)break;}if(tag==1){EA=0;for(main_i=0;main_i<6;main_i++){SBUF=sendx[main_i];while(TI==0);TI=0;}EA=1;tag=0;}SBUF=0XAA;while(1);
}void int_4() interrupt 4
{EA=0;if(SBUF==0X01) {;//while(RI==0);}else if(SBUF==0XF2) {tag=1;}else if(SBUF==0Xaa){if(TI==1){;}else if(RI==1) {REN=0;}}else{;}RI=0;TI=0;EA=1;
}void sleep(long int a)
{for(sleep_i=0;sleep_i<a;sleep_i++){;}
}
服务端代码:
#include "reg51.h"
#include "myheader.h"
#define uchar unsigned char
int szc[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int bufferc[6]={0};
int sza[6]={0x01,0x02,0x04,0x08,0x10,0x20};
int t=0;
int i=0;
void display() //显示设备没有问题,因为可以忠实的显示出012345 如果是显示异常比如是数据出问题:bufferc[6]数据出了问题
{ //设备全部显示0,说明bufferc[6]没有被赋值 ,找到赋值bufferc语句uchar i=0;uchar num=0;for(i=0;i<6;i++) //显示异常,只能显示一个数字P1角有问题{num=bufferc[i]; //bufferc【】数据异常,0位置:3 1位:4 2位:5 3位置:6 4位置:后面都是0 也就是说1,2都被另外那个东西给截住了P2=szc[num];P1=sza[i];sleep(1);P2=0xff;}
}void test()
{P17=0;
}void main()
{TMOD=0x20;TH1=0XF4;//根据波特率计算公式这里需要设置为这么多才能够在串行数据传输模式1的状况下实现波特率2400B/STL1=0XF4;TR1=1;SCON=0x40;//串口工作与方式1,定义了传送数据的格式EA=1;ES=1; //串口中断开关打开REN=1;while(1){display();}
}void int_4() interrupt 4
{static uchar first=0;EA=0;t=SBUF;if(t==0x01&&first==0){first++;SBUF=0xF2;while(TI==0);TI=0;}else if(SBUF==0XF2){first++;}else if(SBUF==0Xaa){//需要判断是接收的0XAA,还是发送的0xaaif(RI==1)//接收的0xaa{SBUF=0XAA;while(TI==0);}else if(TI==1){REN=0; }}else if(RI==1){bufferc[i]=SBUF;i++;}if(RI==1&&TI==0)RI=0;if(TI==1&&RI==0)TI=0;EA=1;
}void sleep(long int a)
{uchar i=0;for(i=0;i<a;i++){;}
}