RS-485的多机通信程序(主机端)

发布者:RadiantRiver最新更新时间:2015-06-19 来源: 51hei关键字:RS-485  多机通信  主机端 手机看文章 扫描二维码
随时随地手机看文章
//-----------------------函数声明,变量定义---------------------
#include
sbit RE_DE=P1^0;
#define COUNT 10 // 定义接收缓冲区大小
#define Slaver_NUM 10
unsigned char bdata flag; //在可位寻址去定义一个标志变量
sbit time_over_flag =flag^0; //接收超时标志
unsigned char buffer[COUNT]; //定义缓冲区
unsigned char point; //定义缓冲区位置指示
unsigned char Slave_AD[Slaver_NUM]; //定义有效地址存放区
unsigned char ADD_num; //有效地址个数
unsigned char idata count_10ms; //用于表示有多少次10ms中断
unsigned char idata send_data[7]={
0x31,0x32,0x33,0x34,0x35,0x36,0x37}; //与定义发送数据,共7位
void UART_init(); //串口初始化函数
void COM_send(void); //串口接收函数
unsigned char CLU_checkdata(void); //计算校验位函数
//---------------------------------------------------------------
// 函数名称: UART_init()串口初始化函数
// 函数功能: 在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s
// 串口接收中断允许,发送中断禁止,设定定时器中断允许
//---------------------------------------------------------------
void UART_init()
{
//初始化串行设置
SCON =0x58; //选择串口工作方式为1,打开接收允许,TB8=1
TMOD =0x21; //定时器1工作在方式2,定时器0工作在方式1
TR1 =1; //启动定时器T1
ES=1; //允许串行口中断
PS=1; //设计串行口中断优先级
//初始化定时器1
TH1 =0xfd; //实现波特率9600(系统时钟11.0592MHZ)
ET1 =0; //定时器1中断禁止
}
//---------------------------------------------------------------
// 函数名称: timer0_init()初始化定时器0
// 函数功能: 设置timer0工作模式
//---------------------------------------------------------------
void timer0_init()
{
time_over_flag=0;
count_10ms=0;
ADD_num=0;
TL0=0x0F0; //T0用于产生10ms的中断
TH0=0x0D8; //50次T0中断产生1次超时溢出
ET0=1; //允许定时器0中断
}
//---------------------------------------------------------------
// 函数名称: system_init()系统初始化
// 函数功能: 调用串口、定时器初始化函数,完成系统初始化
//---------------------------------------------------------------
void system_init(void)
{
//系统总设置
UART_init();
timer0_init();
EA =1; //单片机中断允许
}
//---------------------------------------------------------------
// 函数名称: com_interrup()串口接收中断处理函数
// 函数功能: 接收包括起始位"S"在内的十位数据到数据缓冲区
//---------------------------------------------------------------
com_interrupt(void) interrupt 4 using 3
{
unsigned char RECEIVR_buffer;
if(RI) //处理接收中断
{RI=0; //清除中断标志位
RECEIVR_buffer=SBUF; //接收串口数据
if(point==0) //如果还没有接收到起始位
{
if(RECEIVR_buffer==0xFE) //判断是否起始标志位
{
buffer[point++]=RECEIVR_buffer;//把接收到的数据放入接收缓存区
}
else
point=0; //不是,继续等待起始位
}
else if(point>0&&point<10) //判断是否接收够十位数据
buffer[point++]=RECEIVR_buffer; //不够,把接收到的数据放入接收缓存区
else if(point==10)
{
if(RECEIVR_buffer==0xEF) //判断结束标志位是否正确
{
buffer[point]=RECEIVR_buffer; //把接收到的数据放入接收缓存区
Slave_AD[ADD_num++]=buffer[2]; //把接收到的地址放到地址存储器
//表示该地址有有效设备
}
else
point=0; //不是,继续等待起始位
}
else point=0; //缓冲区已满,清除缓存区内数据重新接收
}
if(TI) //串口发送中断
{
TI=0; //清除发送中断
}
}
//---------------------------------------------------------------
// 函数名称: timer0_interrup()
// 函数功能:定时器T0中断服务程序
// 函数说明:T0枚10ms中断一次,连续中断50次置time_over_flag=1;
//---------------------------------------------------------------
timer0_interrupt(void) interrupt 1 using 2
{
count_10ms++;
if(count_10ms==50)
{
ET0=0; //关闭定时器T0中断
TR0=0; //停止定时器T0
time_over_flag=1;//设置接收超时标志
count_10ms=0x00; //10ms计数器复位
}
else
{
TL0=0x0F0; //重装定时器初始值
TH0=0x0D8;
}
}
//---------------------------------------------------------------
// 函数名称: COM_send()串口发送函数
// 函数功能: 把数据缓冲区的十位数据发送出去
//---------------------------------------------------------------
void COM_send(void)
{
RE_DE=1; //设置MAX483进入发送状态
for(point=0;point<=10,TI=1;point++) //连续发送十位数据
//把缓存区的数据都发送到串口
{
SBUF=buffer[point];
TI=0;
}
RE_DE=0; //设置MAX483进入接收状态
}
//---------------------------------------------------------------
// 函数名称: write_buffer()
// 函数功能: 写发送缓冲区十位数据
//---------------------------------------------------------------
void write_buffer(unsigned char slaver_add)
{
unsigned char i;
TB8=1; //打开多机通信方式
buffer[0]=0xFE;
buffer[1]=slaver_add;
for(i=2;i<9;i++) //连续发送十位数据
//把缓存区的数据都发送到串口
{
buffer[i]=send_data[i-2];
}
buffer[9]=0xEF;
}
//---------------------------------------------------------------
// 函数名称: 主函数
// 函数功能: 调度个子函数,完成通信过程
//---------------------------------------------------------------
void main(void)
{
unsigned char i=0;
system_init(); //系统初始化
do{ //查旬0到10好地址有没有对应设备
write_buffer(i++); //写查询第i号设备的发送信息
COM_send(); //调用发送函数,完成发送
timer0_init(); //完成一次查询,重新初始定时器0,准备下一次查询
}
while(time_over_flag&&i<10);
}
关键字:RS-485  多机通信  主机端 引用地址:RS-485的多机通信程序(主机端)

上一篇:利用串口输入整数简单代码
下一篇:128*64代码进化版显示时,分,秒

推荐阅读最新更新时间:2024-03-16 14:04

信号链基础知识:如何设计一款适用RS-485的2-4线转换器
多点数据通信网络,例如:Profibus、Modbus 和 BACnet 等通常均要求具备 RS-485 双线、半双工总线系统与四线、全双工总线系统通用性。这些系统可以扩展至数百米长,并承受较大的接地电位差 (GPD)。这些电位差会超出收发器的共模电压范围,对器件造成损坏。为了消除 GPD,我们利用电隔离型收发器,将总线节点的控制电子组件隔离于连接总线的实际收发器级。 图 1 显示了使用 2-4 线转换器的混合网络的结构图。 图 1 2-4 线转换器可确保半双工系统和全双工系统之间的通用性 为了使转换器运行不依赖于数据速率,我们通过总线的逻辑状态来控制转换器驱动器和接收器的开启和关闭。总线驱动是以每比特间隔,从而让转
[模拟电子]
信号链基础知识:如何设计一款适用<font color='red'>RS-485</font>的2-4线转换器
新一代RS-485总线不限距离和节点
  传统的RS-485总线的传输距离限制为最远1200米,同一条总线所挂的节点数限制为最多128个。现在新一代RS-485技术的每一个节点都带中继功能,这样在加入一个RS-485节点的同时却增加了驱动,包括传输距离和负载能力。在新一代RS-485总线中接N个节点就可以达到N×1200米的最远距离以及N×128个的负载能力,N是不受限制的。   RS-485口可以理解成为是RS-232口的差分形式,主要目的是解决RS-232的2个缺点:1、远距离传输,RS-485最远1200米,而RS-232最远15米;2、多机 通信 ,RS-485可以到32个或以上,而RS-232只能够一对一。最早的RS-485 芯片 的是MOTOROLA 公司生
[嵌入式]
RS-485自收发电路的参考设计
  RS-485标准在 工业控制 、电力通讯、智能仪表等领域中使用广泛。但是,在工业控制等现场环境中,情况复杂,常会有电气噪声干扰传输线路;在多系统互联时,不同系统的地之间会存在电位差,形成接地环路,会干扰整个系统,严重时会造成系统的灾难性损毁;还可能存在损坏设备或危害人员的潜在电流浪涌等高电压或大电流。因此,对RS-485接口的隔离是非常有必要的。   ADM2483是一款集成了信号通道隔离和RS-485收发器的芯片。以单芯片实现了对RS-485接口的隔离,电路连接简单,设计方便,性能上远高于繁琐的光耦隔离485电路设计。在某些系统应用中,由于I/O口数量有限,因此我们希望半双工的RS-485收发器能够实现自收发功能,以
[嵌入式]
FPGA单片带你领略如何实现串行通信网络
随着电子技术和EDA技术的发展,FPGA技术以其独有的优势,在电子设计领域得到越来越广泛的应用。 FPGA 具有集成度高、体积小和功耗低等优点,而且还具有用户可编程能力。采用FPGA器件可以大大缩短开发周期,减少资金投入,实现片上可编程系统(SOPC)的设计。同时,测控系统中使用串行扩展通信的趋势越来越突出,但是传统总线拓扑结构较低的响应效率已经不能满足复杂系统的要求。本文的主要目的是基于FPGA设计一个集成16个简单UART(通用异步接收发送设备)的模块,该模块采用VHDL语言描述。主单片机通过并口与FPGA相连,FPGA通过16个UART分别与16个从单片机相连,实现 单片机 串行通信网络系统。 1 系统硬件总体设计 系统
[电源管理]
FPGA单片<font color='red'>机</font>带你领略如何实现<font color='red'>多</font><font color='red'>机</font>串行<font color='red'>通信</font>网络
基于以太网技术和RS-485协议的网络化数据采集系统介绍
  MSC1210采用增强型8051内核,时钟频率高达33MHz,它有3个独立的16位定时/计数器,1个片内看门狗、2个通用异步收发器,片内存储器包括闪速程序存储器、FLASH存储器(可以分区成程序存储器或数据存储器)、静态数据存储器等。另外,MSC1210还在片内固化了2KB的BOOT ROM,可以引导程序的写入,免去了程序写入时使用编程器的麻烦,MSC1210片内FLASH存储器的烧写寿命高达100万次,程序保存时间长达100年之久。该芯片已经在内部将数字和模拟电源分隔开来,两者都可以在2.7V~5.5V之间选取,这样用户可以将模拟部分和数字部分分开供电,可以有效地降低系统的噪声,提高A/D转换精度。   MSC1210是一个集
[嵌入式]
红外通信发送程序
多机红外通信发送端程序 #include reg932.h #define uchar unsigned char sbit KEY1=P0^0; //定义KEY1 sbit KEY2=P0^1; //定义KEY2 sbit Infr=P0^3; //定义红外输出端口 //-------------------------------------- void CC U_Init(); //CCU初始化 void KeyISR_Init(); //键盘中断初始化 void ReadKey();
[单片机]
通信的从程序
/* multi_s.c */ /* 多机通信的从机部分 */ #ifndef __MULTI_S_C__ #define __MULTI_S_C__ #include AT89X51.H #include STRING.H #define __MAX_LEN_ 64 // 数据最大长度 #define _MHz_ 11 // 设置 单片机 使用的晶振频率(11.0592MHz) /* 以下为程序协议中使用的握手信号 */ #define __SUCC_ 0x0f // 数据传送成功 #define __ERR_ 0xf0 // 数据传送错误 void init_serial(); // 串口初始化 unsi
[单片机]
Maxim推出高速(40Mbps)、半双工RS-485收发器
Maxim推出高速(40Mbps)、半双工RS-485收发器MAX14840E/MAX14841E,适用于通过长距离电缆传输的工业应用。MAX14840E具有对称的失效保护接收器输入和较高的(170mV)接收器滞回电压,可有效改善高速、长距离电缆传输应用中的噪声抑制及信号恢复性能。MAX14841E具有真正的失效保护接收器输入,当输入端发生短路或开路故障时确保接收器输出逻辑高电平。这些特性与收发器的高可靠性相结合,使MAX14840E/MAX14841E理想用于嘈杂的电机控制应用。 MAX14840E/MAX14841E采用低电源电压(3.3V)供电,具有业内可靠性最高的ESD保护架构(±35kV,人体模式),
[网络通信]
Maxim推出高速(40Mbps)、半双工<font color='red'>RS-485</font>收发器
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved