于RS485的多机通信程序主机端.docx
- 文档编号:27913884
- 上传时间:2023-07-06
- 格式:DOCX
- 页数:5
- 大小:15.66KB
于RS485的多机通信程序主机端.docx
《于RS485的多机通信程序主机端.docx》由会员分享,可在线阅读,更多相关《于RS485的多机通信程序主机端.docx(5页珍藏版)》请在冰豆网上搜索。
于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);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- RS485 通信 程序 主机