📄 cxz.c
字号:
/*****************************************************************
多机通信,以三机为例,从机地址0x01,0x02
可以正确的发送命令和地址以及地址的返回,
发送数据0xd1,0xd2,接收数据0xc1,0xc2.
******************************************************************/
#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
sbit P32=P3^2;
sbit P16=P1^6;
sbit P17=P1^7;
uchar anjian=0; //anjian值:0,1,2,3,4,分别对应:复位,send-->0x01,send-->0x02,receive<--0x01,receive<--0x02
uchar address[2]={0x01,0x02}; //从机地址0x01,0x02
uchar command[2]={0x11,0x12}; //命令:11--send,12--receive
uchar adr;
uchar flag_receive=0; //从机返回地址标志,
uchar adr_choice; //从机选择标志
uchar com_choice; //命令选择标志
uchar flag_dat=0; //接受从机发送数据标志
void delay() //短延时
{
uint i;
for(i=0;i<10000;i++)
;
}
void del() //长延时
{
uint i;
uchar m;
for(m=0;m<4;m++)
{
for(i=0;i<20000;i++)
;
}
}
void string() interrupt 4 //串行中断处理函数
{
if(RI==1)
{
RI=0;
adr=SBUF;
if(adr==address[adr_choice]) //若从机返回地址正确flag_receive=1
flag_receive=1;
else if(adr==0xc1||adr==0xc2) //若接收数据正确flag_dat=1
flag_dat=1;
}
else
TI = 0;
}
void fasong() //发送函数
{
if(TB8==1)
{
SBUF=address[adr_choice]; //发送地址
del();
}
if(flag_receive)
{
TB8=0;
delay();
SBUF=command[com_choice]; //发送命令
del();
while(anjian==1&&flag_receive==1) //循环发送数据
{
P1=0x00;
P16=1;
del();
SBUF=0Xd1;
P16=0;
del();
}
while(anjian==2&&flag_receive==1)
{
P1=0x00;
P17=1;
del();
SBUF=0Xd2;
P17=0;
del();
}
}
}
void jieshou() //接受函数
{
if(TB8==1)
{
SBUF=address[adr_choice]; //发送地址
del();
}
if(flag_receive)
{
TB8=0;
delay();
SBUF=command[com_choice]; //发送命令
del();
while(anjian==3&&flag_dat==1) //循环等待从机发送数据
{
P16=1;
del();
P16=0;
P17=1;
del();
P17=0;
del();
flag_dat=0;
}
while(anjian==4&&flag_dat==1)
{
P17=1;
del();
P17=0;
P16=1;
del();
P16=0;
del();
flag_dat=0;
}
}
}
void int0(void) interrupt 0
{
delay();
if(P32 == 0)
{
while (P32==0) // 若按键不释放,则等待
{;}
anjian++;
if(anjian==1)
{
adr_choice=0; //地址选择
com_choice=0; //命令选择
flag_receive=0; //anjian值改变,终止fasong()内的循环发送数据
}
else if(anjian==2)
{
adr_choice=1;
com_choice=0;
flag_receive=0;
}
else if(anjian==3)
{
adr_choice=0;
com_choice=1;
flag_receive=0; //jieshou()函数内的循环等待由 flag_dat=0 终止
}
else if(anjian==4)
{
adr_choice=1;
com_choice=1;
flag_receive=0;
}
if(anjian>=5)
anjian=0;
}
}
void main (void)
{
SCON=0xf0; //SCON:SM0,SM1,SM2,REN,TB8,RB8,TI,RI=1 1 1 1 0 0 0 0 串行方式3工作
PCON=0X00; //SMOD=0
TMOD=0x20; //T1 方式2工作
TH1=0xe8; //晶振11.0592MHz,1200 bit/s
TL1=0xe8;
TB8=1;
ES=1;
EA=1;
EX0=1;
SM2=0;
P1=0x00;
TR1=1;
while(1)
{
if(anjian==1) //anjian 值选择对应操作
{
TB8=1;
fasong();
}
else if(anjian==2)
{
TB8=1;
fasong();
}
else if(anjian==3)
{
TB8=1;
jieshou();
}
else if(anjian==4)
{
TB8=1;
jieshou();
}
else if(anjian==0) // 令从机01,02复位
{
TB8=1;
SBUF=0xff;
del();
P1=0xff;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -