引用 单片机多机通讯
2010-07-19 16:40:57| 分类: 自动化专业知识 | 标签: |字号大中小 订阅
本文引用自热火《单片机多机通讯》
引用
单片机多机通讯
说明:该程序为多机通讯程序,最多可以挂 255 个从机。
该程序主机发送端与多个从机的接收端相接,主机的接收端与多个从机的
发送端相接。
该程序主要的目的为给从机发送作为命令的数据。
该程序调试成功,从机可正确接收。
//==========================================================
===========
// 多机通讯主机程序
//zhuji.c
//writer:谷雨 2008 年 3 月 22 日于 EDA 实验室
//注:主机先发送地址,接收到应答后,再发送数据
//==========================================================
===========
#include
#define unit unsigned int
#define uchar unsigned char
#define addr1 0x31 //从机 1 地址
#define addr2 0x32 //从机 2 地址
void Uart_Init(void)
{
TMOD=0x20; //定时器 T1 使用工作方式 2
TH1=250;
TH0=250;
TR1=1; //开始计时
PCON=0x80; //SMOD=1;
SCON=0xd0; //工作方式 3,9 位数据位,波特率 9600bit/s,允许接收
TI=1;
RI=1;
}
uchar Receive(void) //接收数据程序
{
uchar Data;
while(!RI); //等待接受完毕
Data=SBUF; //接收数据
RI=0;
return Data;
}
void send_addr(uchar addr) //发送地址
{
uchar tem;
while(addr!=tem) //如果发送的地址与从机应答的地址不一样,则一直发送
地址
{
while(!TI); //等待发送完毕
TI=0; //软件复位 TI
TB8=1; //发送地址帧
SBUF=addr; //发送地址
tem=Receive();
}
}
void send_data(uchar ddata) //发送数据,但此处由于与从机的协议,禁止发送
0xff
{
while(!TI); //等待发送完毕
TI=0; //软件复位 TI
TB8=0; //发送数据帧
SBUF=ddata; //发送数据
while(!TI);
}
void main()
{
Uart_Init();
send_addr(addr1); //向从机 1 发地址
send_data(0x33);
send_addr(addr2); //向从机 2 发地址
send_data(0x34);
while(1);
}
//==========================================================
===========
// 多机通讯从机 1 程序
//cong1.c
//writer:谷雨 2008 年 3 月 22 日于 EDA 实验室
//注:从机先接收地址,然后与自己的地址比较,正确了再接收数据,修改地址可
挂多个从机
//==========================================================
===========
#include
#define unit unsigned int
#define uchar unsigned char
#define addr 0x31 //从机 1 地址
void Uart_Init(void)
{
TMOD=0x20; //定时器 T1 使用工作方式 2
TH1=250;
TH0=250;
TR1=1; //开始计时
PCON=0x80; //SMOD=1;
SCON=0xd0; //工作方式 3,9 位数据位,波特率 9600bit/s,允许接收
TI=1;
RI=1;
}
void send(uchar Data) //发送数据程序
{
while(!TI); //等待发送完毕
SBUF=Data;
TI=0;
while(!TI);
}
uchar recv_data(void) //接收数据
{
uchar date;
while(!RI); //等待接受完毕
RI=0;
if(RB8==1) //若当前接收为地址帧则返回 0xff
return 0xff;
date=SBUF;
while(!RI);
return date;
}
void main()
{
uchar tem,Data;
Uart_Init();
while(1)
{
SM2=1; //只接收地址帧
//如果接收到的地址帧不是本机地址,则继续等待
while(tem!=addr)
{
while(!RI);
RI=0;
tem=SBUF;
}
//如果是本机地址,发送应答信号,并做好接受数据的准备
TB8=0; //主机不
检测
工程第三方检测合同工程防雷检测合同植筋拉拔检测方案传感器技术课后答案检测机构通用要求培训
该位
send(addr);
SM2=0; //允许接受数据信息
//接收数据
Data=recv_data();
if(Data==0xff)
continue;
switch(Data)
{
case 0x01: //在此可以写入要完成的动作,最多可完成 256 个动作
break;
case 0x33:
P1=0xaa; //为方便其间,赋值给 P1 口,测 P1 口电平来检测该程序
break;
case 0x02:
break;
case 0x03:
break;
default:
break;
}
}
}