#include "STC15F2K60S2.H"
#include "uart.h"
#include "sys_config.h"
#include "e2prom.h"
#include "volforce.h"
#include "time.h"
//定义串行通讯缓冲区
u8 xdata cv_SerialReceiverBuf[RECBUF_MAXLENGTH]; //必须和slave_communication.c中一起改长度
u8 xdata cv_SerialSendBuf[SENDBUF_MAXLENGTH];
//定义串行通信缓冲区的读写指针。
u8 ReceiverBufWritePoint;
u8 ReceiverBufReadPoint;
u8 SendBufWritePoint;
u8 SendBufReadPoint;
extern u8 send_ceshi;
bit SendFinish = 0;
u8 xdata SendCycleMs = 0;
u8 Send_Mask = 0;
//串口发送缓冲区空闲标志
bit Ti; //Ti=1,串口准备好,可以发送数据
bit Ri; //Ri=1,接收缓冲区有数据要接收
UNION_DWORD xdata GroupData;
UNION_PACK xdata PackBuf;
u8 xdata recPackTimeout_10ms=0;
u8 xdata RecPackState=0;
u8 xdata RecPackSerialNumber;
u8 xdata RecCheckSum;
u8 xdata RecPackStartPoint; //包起始指针
u8 xdata ReturnCounter;
u8 xdata ProDown_7f_Counter; //下载程序字符计数
sbit RS485_EN = P2^3;
u8 xdata RecPackLen;
bit RecPackOk;
extern bit SendStart; //串口自动发送实时数据允许标志
u8 xdata LineNow; //当前通道
extern u8 xdata E2prom_RW; // 1 - read 2-write
extern Un_Set_Param xdata Sys_Param;
extern u8 xdata Mcu_ID[8];
extern u8 xdata EEPROM_style_Fg;
//extern signed int xdata AD_Count_K[MOUDLE_CHANNEL_NUMBER],AD_Count_B[MOUDLE_CHANNEL_NUMBER]; //AD修正计算系数和常数
//extern s16 xdata AD_Count_Temp[MOUDLE_CHANNEL_NUMBER]; //AD修正时温度值
//葛同府所写模块初始化函数。
void SerialInit(void)
{
ReceiverBufWritePoint=0;
ReceiverBufReadPoint=0;
SendBufWritePoint=0;
SendBufReadPoint=0;
SendFinish = 1; //发送空闲
SendStart = 0;//数据更新完毕,串口允许发送SendCycleMs = 0;
LineNow = 0; //E方当前操作通道符号
Send_Mask = 0; //默认发送任务为实时数据发送0x43
Ti=0; //Ti=1,串口准备好,可以发送数据
Ri=0; //Ri=0,接收缓冲区无数据要接收
}
//串口中断函数
void SerialCom() interrupt 4
{
u8 temp;
//有接收中断,写入接收缓冲区
if(RI==1)
{
RI=0;
Ri=1; //Ri=1,接收缓冲区有数据要接收
temp=SBUF;
cv_SerialReceiverBuf[ReceiverBufWritePoint]=temp;
// Uart1_SendData(temp);
//接收缓冲区写指针+1
//接收缓冲区写指针大于接收数组最大值,置0
if(++ReceiverBufWritePoint>=RECBUF_MAXLENGTH) {ReceiverBufWritePoint=0;}//sizeof(cv_SerialReceiverBuf)
}
//有发送中断,置Ti标志为1
if(TI==1)
{
TI=0;
if (SendBufWritePoint != SendBufReadPoint)
{
//从接收缓冲区读数据
RS485_EN = 1;
SBUF=cv_SerialSendBuf[SendBufReadPoint];
//发送缓冲区读指针+1,发送缓冲区读指针大于接收数组最大值,置0
if (++SendBufReadPoint >= SENDBUF_MAXLENGTH)//sizeof(cv_SerialSendBuf)
{
SendBufReadPoint=0;
}
}
else
{
RS485_EN = 0;
Ti=0;
SendFinish = 1; //发送空闲
Send_Mask = 0; //清除发送任务
}
}
}
//将数据缓冲区组包后向串口n发送(需要检查发送缓冲区是否发送完成)
//入口参数:
// Buffer:发送数据缓冲区首址
// DataLength:有效数据长度,单位为字节
// PackType:包类型
static void UartSendPack (u8* Buffer,u8 DataLength, u8 PackType)
{
u8 i,CheckSum;
u16 crc_result;
CheckSum = 0; //初始化校验和
crc_result = CRC16(Buffer,DataLength);//获取crc16值
ES=0; //关闭总中断
PackBuf.stru.Start = 0x3a; //包头,0x3a
PackBuf.stru.Length = DataLength; //有效数据长度,单位为字节(*2);
PackBuf.stru.NetGroup = NET_GROUP_NO; //网络编号,固定0x01
PackBuf.stru.Type = PackType; //包类型
PackBuf.stru.SerialNumber = 0x01; //包序号
PackBuf.stru.SystemNo = WEIGHT_SCALE_MOUDLE; //系统编号,称重模块固定0xF0
PackBuf.stru.CrcH = (u8)(crc_result>>8); //crc高字节
PackBuf.stru.CrcL = (u8)(crc_result); //crc低字节
//打包数据
for(i = 0;i < (PackBuf.stru.Length + 8);i++)
{
if ((SendBufWritePoint+1) != SendBufReadPoint )
{//如果发送缓冲区不满,数据放发送缓冲区
cv_SerialSendBuf[SendBufWritePoint]=PackBuf.arry[i];
if(i)
{//除去包头其他均列入加和校验范围
CheckSum += PackBuf.arry[i];
}
//发送缓冲区写指针+1,如果发送缓冲区写指针大于接收数组最大值,置0
if (++SendBufWritePoint >= SENDBUF_MAXLENGTH) //sizeof(cv_SerialSendBuf)
{
SendBufWritePoint=0;
}
}
}
cv_SerialSendBuf[SendBufWritePoint] = CheckSum;//加入校验和字节
if (++SendBufWritePoint >= SENDBUF_MAXLENGTH) //sizeof(cv_SerialSendBuf)
{//发送缓冲区写指针+1,如果发送缓冲区写指针大于接收数组最大值,置0
SendBufWritePoint=0;
}
ES=1; //开总中断
//如果串口中断没有发送数据,置发送中断标志
if(Ti==0)
{
Ti=1; //表示正在发送数据
TI=1; //产生串口中断
}
}
//接收包处理
static void RecPackPro(void)
{
u8 i,n;
u16 caculate_crc;
//添加CRC校验
caculate_crc=(u8)CRC16(PackBuf.stru.avail_data,PackBuf.stru.Length);
if(caculate_crc != PackBuf.stru.CrcL)
{//crc16校验错误,退出函数
return ;
}
//如果是本系统和本板命令,处理接收包
//根据不同数据包类型散转
switch(PackBuf.stru.Type)
{
case MASTER_SET_CALIBRATION: //0x40 主机发送设置变送器当前点校准包
Send_Mask = 1;//添加应答0x40包
//记录当前校准点压力值
Set_Data[PackBuf.Pack40_stru.NowLine].Point[PackBuf.Pack40_stru.Force_Region].Force = PackBuf.Pack40_stru.Force;
//记录当前校准点电压值
Set_Data[PackBuf.Pack40_stru.NowLine].Point[PackBuf.Pack40_stru.Force_Region].Vol = Vol_Now[PackBuf.Pack40_stru.NowLine];
// Set_Data[PackBuf.Pack40_stru.NowLine].Temp[0].Point[10].Force = Temperature_0d5d;//每一路的低温度区第11点的电压记录值临时占用为校准点温度记录
//操作E方地址位置
LineNow = PackBuf.Pack40_stru.NowLine;
EEPROM_style_Fg = 1;
break;
case MASTER_SET_PARAMETER: //0x41,主机发送设置变送器参数包
Send_Mask = 1;//添加应答0x41包
//benny
Sys_Param.Param.Temp_Up[0] = PackBuf.Pack41_stru.Temp_Region[0]; //低温区上限温度值
Sys_Param.Param.Temp_Up[1] = PackBuf.Pack41_stru.Temp_Region[1]; //中温区上限温度值
Sys_Param.Param.Temp_Up[2] = PackBuf.Pack41_stru.Temp_Region[2]; //高温区上限温度值
Sys_Param.Param.CLBRT_Num = PackBuf.Pack41_stru.CLBRT_Num; //校准点数量
Sys_Param.Param.DAC_Mode = PackBuf.Pack41_stru.DAC_Mode; //DAC输出模式
Sys_Param.Param.Scale_Range = PackBuf.Pack41_stru.Scale_Range; //计量量程
//获取对应传感器编号
for(n=0;n<MOUDLE_CHANNEL_NUMBER;n++)
for(i = 0;i < 8;i++)
{
Sys_Param.Param.Sensor_Sn[n][i] = PackBuf.Pack41_stru.Sensor_Sn[n][i];
}
//操作E方地址位置,需要修改为系统参数操作
// LineNow = 0xff;//系统参数操作
EEPROM_style_Fg = 4;
break;
case MASTER_GET_PARAMETER: //0x42,主机发送获取变送器当前参数包
Send_Mask = 3; //添加应答0x42包
// LineNow = 0xff; //系统参数操作,操作E方地址位置
break;
case MASTER_SET_ALL_CLBRT: //0x43,主机发送设置变送器全部校准点数据包
//数据内容
LineNow = PackBuf.Pack43_stru.NowLine; //操作E方地址位置
EEPROM_style_Fg = 1;
Sys_Param.Param.CLBRT_Num = PackBuf.Pack43_stru.CLBRT_Num; //校准点数量
caculate_crc = ((u16)PackBuf.Pack43_stru.avail_data[4]<<8)+PackBuf.Pack43_stru.avail_data[4];
//// if((caculate_crc > 30000) || (caculate_crc < 8000))
//// {//该修正值部分赋值无效,保持本地存储值不变
//// len = 6;
//// }
//// else
//// {
//// len = 0;
//// }
// for(i = 2;i < 6;i++)
// {
// GroupData.byte[i-2] = PackBuf.Pack43_stru.avail_data[i];
// }
// if((GroupData.dword > 30000) || (GroupData.dword < 8000))
// {//该修正值部分赋值无效,保持本地存储值不变
// len = 6;
// }
// else
// {
// len = 0;
// }
//打包指定转换通道的所有参数,低温区不赋值(因为低温区部分数据被其他功能参数占用)
for(i = 0;i < ONE_CHANNEL_ALL_PARAMETER_NUM;i++)
{
Set_Data[PackBuf.Pack43_stru.NowLine].arr[i] = PackBuf.Pack43_stru.avail_data[i];
}
Send_Mask = 1;//添加应答0x43包
break;
case MASTER_GET_ALL_CLBRT: //0x44,主机发送获取变送器全部校准点数据包
//数据内容
LineNow = PackBuf.Pack42_stru.NowLine; //操作E方地址位置
Send_Mask = 2;//添加应答0x44包
break;
case MASTER_SET_AD_CLBRT: //0x45,主机发送AD输出校正方程的
没有合适的资源?快使用搜索试试~ 我知道了~
底板程序V1.1.zip_ADS1232_ADS1232 程序_removecqn_stc15f32s2_底板程序复制
共70个文件
lst:12个
obj:12个
__i:11个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 121 浏览量
2022-09-24
10:30:56
上传
评论
收藏 236KB ZIP 举报
温馨提示
驱动ads1232 24位adc 串口232串口485
资源详情
资源评论
资源推荐
收起资源包目录
底板程序V1.1.zip (70个子文件)
底板程序V1.1
kout.h 330B
main.OBJ 20KB
RS485_Ctrl_uvopt.bak 8KB
timer.OBJ 16KB
e2prom.__i 64B
disled.LST 9KB
ad1232.h 328B
rs485.c 12KB
volforce.h 1KB
ad1232.OBJ 19KB
e2prom.c 9KB
timer.LST 3KB
key.h 373B
volforce.OBJ 33KB
main.c 2KB
程序更改记录.OBJ 323B
程序更改记录.LST 2KB
RS485_Ctrl.plg 0B
key.OBJ 7KB
disled.c 5KB
e2prom.OBJ 35KB
ad1232.LST 17KB
rs485.h 176B
ad1232.c 9KB
uart.h 9KB
main.LST 4KB
程序更改记录.c 1KB
kout.c 660B
kout.__i 62B
e2prom.h 2KB
RS485_Ctrl.uvproj 15KB
RS485_Ctrl_uvproj.bak 16KB
main.__i 62B
RS485_Ctrl 179KB
key.c 1KB
ad1232.__i 64B
uart1.OBJ 41KB
RS485_Ctrl.uvgui.Administrator 74KB
kout.LST 2KB
rs485.LST 21KB
RS485_Ctrl.hex 28KB
RS485_Ctrl.uvgui_Administrator.bak 74KB
key.LST 3KB
timer.__i 63B
RS485_Ctrl.lnp 172B
volforce.LST 17KB
uart1.c 20KB
RS485_Ctrl.m51 92KB
volforce.__i 66B
e2prom.LST 17KB
STARTUP.lst 14KB
STARTUP.A51 6KB
rs485.OBJ 33KB
key.__i 61B
sys_config.h 869B
volforce.c 10KB
RS485_Ctrl.uvopt 8KB
timer.c 1KB
uart1.__i 63B
disled.h 255B
disled.OBJ 11KB
RS485_Ctrl.build_log.htm 1007B
STARTUP.OBJ 749B
程序更改记录.__i 70B
uart1.LST 32KB
kout.OBJ 6KB
rs485.__i 63B
disled.__i 64B
time.h 172B
STC15F2K60S2.h 13KB
共 70 条
- 1
alvarocfc
- 粉丝: 109
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0