您的位置 首页 芯闻

根据51单片机的RS-485的多机通讯

———————–函数声明,变量定义———————includereg51h>sbitRE_DE=P1^0;defineCOUNT10定义

//———————–函数声明,变量界说———————

#include

sbit RE_DE=P1^0;

#define COUNT 10 // 界说接纳缓冲区巨细

#define Slaver_NUM 10

unsignedcharbdata flag;//在可位寻址去界说一个标志变量

sbit time_over_flag =flag^0;//接纳超时标志

unsignedcharbuffer[COUNT];//界说缓冲区

unsignedcharpoint;//界说缓冲区方位指示

unsignedcharSlave_AD[Slaver_NUM];//界说有用地址寄存区

unsignedcharADD_num;//有用地址个数

unsignedcharidata count_10ms;//用于表明有多少次10ms中止

unsignedcharidata send_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) interrupt 4using3

{

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) interrupt 1using2

{

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);

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/xinwen/257783.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部