于RS485的多机通信程序主机端.docx

上传人:b****6 文档编号:15631077 上传时间:2023-07-06 格式:DOCX 页数:5 大小:15.66KB
下载 相关 举报
于RS485的多机通信程序主机端.docx_第1页
第1页 / 共5页
于RS485的多机通信程序主机端.docx_第2页
第2页 / 共5页
于RS485的多机通信程序主机端.docx_第3页
第3页 / 共5页
于RS485的多机通信程序主机端.docx_第4页
第4页 / 共5页
于RS485的多机通信程序主机端.docx_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

于RS485的多机通信程序主机端.docx

《于RS485的多机通信程序主机端.docx》由会员分享,可在线阅读,更多相关《于RS485的多机通信程序主机端.docx(5页珍藏版)》请在冰点文库上搜索。

于RS485的多机通信程序主机端.docx

于RS485的多机通信程序主机端

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

//-----------------------函数声明,变量定义---------------------

#include;

sbitRE_DE=P1^0;

#defineCOUNT10//定义接收缓冲区大小

#defineSlaver_NUM10

unsignedcharbdataflag;//在可位寻址去定义一个标志变量

sbittime_over_flag=flag^0;//接收超时标志

unsignedcharbuffer[COUNT];//定义缓冲区

unsignedcharpoint;//定义缓冲区位置指示

unsignedcharSlave_AD[Slaver_NUM];//定义有效地址存放区

unsignedcharADD_num;//有效地址个数

unsignedcharidatacount_10ms;//用于表示有多少次10ms中断

unsignedcharidatasend_data[7]={

0x31,0x32,0x33,0x34,0x35,0x36,0x37};//与定义发送数据,共7位

voidUART_init();//串口初始化函数

voidCOM_send(void);//串口接收函数

unsignedcharCLU_checkdata(void);//计算校验位函数

//---------------------------------------------------------------

//函数名称:

UART_init()串口初始化函数

//函数功能:

在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s

//串口接收中断允许,发送中断禁止,设定定时器中断允许

//---------------------------------------------------------------

voidUART_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工作模式

//---------------------------------------------------------------

voidtimer0_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()系统初始化

//函数功能:

调用串口、定时器初始化函数,完成系统初始化

//---------------------------------------------------------------

voidsystem_init(void)

{

//系统总设置

UART_init();

timer0_init();

EA=1;//单片机中断允许

}

//---------------------------------------------------------------

//函数名称:

com_interrup()串口接收中断处理函数

//函数功能:

接收包括起始位"S"在内的十位数据到数据缓冲区

//---------------------------------------------------------------

com_interrupt(void)interrupt4using3

{

unsignedcharRECEIVR_buffer;

if(RI)//处理接收中断

{RI=0;//清除中断标志位

RECEIVR_buffer=SBUF;//接收串口数据

if(point==0)//如果还没有接收到起始位

{

if(RECEIVR_buffer==0xFE)//判断是否起始标志位

{

buffer[point++]=RECEIVR_buffer;//把接收到的数据放入接收缓存区

}

else

point=0;//不是,继续等待起始位

}

elseif(point>;0&&point<10)//判断是否接收够十位数据

buffer[point++]=RECEIVR_buffer;//不够,把接收到的数据放入接收缓存区

elseif(point==10)

{

if(RECEIVR_buffer==0xEF)//判断结束标志位是否正确

{

buffer[point]=RECEIVR_buffer;//把接收到的数据放入接收缓存区

Slave_AD[ADD_num++]=buffer[2];//把接收到的地址放到地址存储器

//表示该地址有有效设备

}

else

point=0;//不是,继续等待起始位

}

elsepoint=0;//缓冲区已满,清除缓存区内数据重新接收

}

if(TI)//串口发送中断

{

TI=0;//清除发送中断

}

}

//---------------------------------------------------------------

//函数名称:

timer0_interrup()

//函数功能:

定时器T0中断服务程序

//函数说明:

T0枚10ms中断一次,连续中断50次置time_over_flag=1;

//---------------------------------------------------------------

timer0_interrupt(void)interrupt1using2

{

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()串口发送函数

//函数功能:

把数据缓冲区的十位数据发送出去

//---------------------------------------------------------------

voidCOM_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()

//函数功能:

写发送缓冲区十位数据

//---------------------------------------------------------------

voidwrite_buffer(unsignedcharslaver_add)

{

unsignedchari;

TB8=1;//打开多机通信方式

buffer[0]=0xFE;

buffer[1]=slaver_add;

for(i=2;i<9;i++)//连续发送十位数据

//把缓存区的数据都发送到串口

{

buffer[i]=send_data[i-2];

}

buffer[9]=0xEF;

}

//---------------------------------------------------------------

//函数名称:

主函数

//函数功能:

调度个子函数,完成通信过程

//---------------------------------------------------------------

voidmain(void)

{

unsignedchari=0;

system_init();//系统初始化

do{//查旬0到10好地址有没有对应设备

write_buffer(i++);//写查询第i号设备的发送信息

COM_send();//调用发送函数,完成发送

timer0_init();//完成一次查询,重新初始定时器0,准备下一次查询

}

while(time_over_flag&&i<10);

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2