📄 commu485.c
字号:
/*************************************************************************************
文件类型:485通讯模块
文件作用:
修改权限:
文件相关:
创 建 人:chenbo
创建日期:2007.06.21
当前版本:Ver0.1
版本信息:Ver0.1 GeminiKQ
**************************************************************************************/
#include "Tiger.h"
unsigned int code botelv_table[]={300,1200,2400,4800,9600};
//=================================================
//函数功能:初始化485通讯模块
//
//=================================================
void init_485comm(void)
{ uint8 i;
// uint16 temp_data;
// if(ram[RAM_botelv]>4) //数据出错,默认为1200
// ram[RAM_botelv]=0;
// temp_data=botelv_table[ram[RAM_botelv]];
CfgEU(5,1200,11,0); //设置通讯波特率; 11数据,偶校验
CfgPort(7,2); //P1_3座位RXD4
P1IE|=0x08; //输入使能
CfgPort(8,2); //P1_4座位TXD4
P1OE&=0xef; //输出使能
for(i=0;i<25;i++) //清缓冲 25B
buff_485data[i]=0;
len_485commdata=0;
point_sendaddr=0;
timedelay_comm=0;
sta_485comm=standby_comm;
jiaoyan_type=type_enven;
SetInterrupt(18); //打开接收中断
}
//=============================================================
//函数功能:485接收中断处理函数。
//
//==============================================================
void rec_485comm(void)
{uint8 i;
timedelay_comm=0; //清接收等待延时
switch (sta_485comm)
{case standby_comm: //等待状态
if((buff_485rec&0xff)==0x68) //全国规约开始
{ sta_485comm=recdata_comm; //进入接收状态
len_485commdata=1;
buff_485data[0]=(unsigned char)buff_485rec;
jiaoyan_type=type_enven; //偶校验
type_protocl485=type_quanguo; //全国规约
}
break;
case recdata_comm: //接收状态
i=buff_485rec>>8; //取校验位
// if(i==0) //接收数据正确
{ len_485commdata++;
buff_485data[len_485commdata-1]=(unsigned char)buff_485rec;
}
/*
else //接收数据出错
{ sta_485comm=standby_comm; //进入等待状态
len_485commdata=0; //清接收缓冲
}
*/
break;
default: //
break;
}
}
//==========================================================
//函数功能:发送第一个数据,开发送中断
//
//==========================================================
void start_send485(void)
{ //uint8 i;
timedelay_comm=0;
ClrInterrupt(18); //禁止接收
SetInterrupt(17); //开发送中断
sta_485comm=senddata_comm; //485处于发送状态
SendUData(buff_485data[0],5); //发送第一个数据
/*
i=check_bitnum(buff_485data[0]); //发送奇偶校验位
if(jiaoyan_type==type_enven) //如果是偶校验
{ if(i==0)
SCON4&=0xf7;
else
SCON4|=0x08;
}
SBUF4=buff_485data[0]; //发送第一数据
*/
len_485commdata=len_485commdata-1;
point_sendaddr=0;
}
//==========================================================
//函数功能:485发送中断相应函数
//
//==========================================================
void intrupt_send485(void)
{//uint8 i;
timedelay_comm=0;
if(sta_485comm==senddata_comm)
{ if(len_485commdata>0) //如果还未发送完毕
{ len_485commdata=len_485commdata-1;
point_sendaddr++;
SendUData(buff_485data[point_sendaddr],5);
/*
i=check_bitnum(buff_485data[point_sendaddr]); //发送奇偶校验位
if(jiaoyan_type==type_enven) //如果是偶校验
{ if(i==0)
SCON4&=0xf7;
else
SCON4|=0x08;
}
SBUF1=buff_485data[point_sendaddr]; //发送数据
*/
}
else //如果发送完毕
{ SetInterrupt(18); //允许接收
ClrInterrupt(17); //禁止发送
sta_485comm=standby_comm; //485重新进入等待状态
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -