📄 measure.c
字号:
/******************************************************************************************
* 此函数用于检测轴重与制动力
******************************************************************************************/
#include <pic.h> //包含系统头文件
#include "total.h" //包含项目头文件
const unsigned char command_table[3] = {0x03, 0x02, 0x01};
/******************************************************************************************
* 最后修改日期: 05-4-30
* 修改原因: 添加注释
* 修改人: 饶阳胜
/******************************************************************************************
* 函数名称: unsigned char Measure_Weign(void)
* 功能: 轮重检测
* 入口参数: 无
* 出口参数: 无
* 全局变量: f_motor_weigh 前轮重
* b_motor_weigh 后轮重
* weigh_side 轮标识
* display_weigh 轴重标识
* display_data[] 显示数组
* send_buffer[] 发送数据数组
*
* 调用模块: Init_Tmr1(); 初始化TMR1函数
* Count_Force(); 计算函数
* Display(); 显示函数
* Send_Computer(); 向上位机发送数据函数
* Hex_Bcd(); 16进制数转BCD码函数
* di(); 关中断函数
* ei(); 开中断函数
*
* 设计者: 饶阳胜
* 日期: 05-3-4
* 说明: 1 检测前轮时,在第0个窗口显示
* 检测后轮时,在第1个窗口显示
* 2 要显示小数点
*******************************************************************************************/
unsigned char Measure_Weigh(void)
{
unsigned char i;
unsigned short temp_weigh; //轮重的临时变量
if(!(weigh_side & 0x01)){
f_motor_weigh = 0; // 前轮重清0
b_motor_weigh = 0; // 后轮重清0
display_data[1] = 0; // 第1显示窗口清0
}
Init_Tmr1();
for(i = 0; i < 100; i++){ //要连续10S钟超过10Kg
while(!TMR1IF){
if((temp_weigh = Count_Force(dema_weigh,Adc_Adverage(WEIGH))) < 100)
{
display_data[weigh_side] = 0;
display_data[2] = display_data[0] + display_data[1];
Display(display_data,DISPLAY_SIZE); //显示
return;
}
if(!weigh_side ) //是前轮
f_motor_weigh = temp_weigh; //取前轮重
else //是后轮
b_motor_weigh = temp_weigh; //取后轮重
display_data[weigh_side] = Hex_Bcd(temp_weigh);
display_data[2] = Hex_Bcd(f_motor_weigh + b_motor_weigh); //第2个显示窗口显示总重
}
Init_Tmr1();
if(!(i % 2))
Display(display_data,DISPLAY_SIZE); //显示
}
Display(display_data,DISPLAY_SIZE); //显示最终结果
send_buffer[0] = 0xFE;
if(!weigh_side){
send_buffer[1] = 0xAA;
}else{
send_buffer[1] = 0xBB;
}
send_buffer[2] = display_data[weigh_side] >> 8;
send_buffer[3] = display_data[weigh_side];
send_buffer[4] = 0xED;
Send_Computer(send_buffer,5); //向上位机送果
LIGHT = 1; //制动灯亮,提示称重完成
SelectDisplay273();
while(Count_Force(dema_weigh,Adc_Adverage(WEIGH)) >= 50); //等待车辆离台(轮重小于5Kg)
LIGHT = 0; //制动灯灭
SelectDisplay273();
di(); //关中断,用于调整标志
weigh_side ^= 0x01; //处理前后轮
ei(); //开中断
Delay(1000,500);
}
/******************************************************************************************
* 函数名称: unsigned char Measure_Trig()
* 功能: 制动检测
* 入口参数:
* 出口参数:
* 全局变量:
* 调用模块: Init_Tmr1() TMR1初始化函数
* SelectDisplay273() 选通输出函数
* Delay() 延时函数
*
*
* 设计者: 饶阳胜
* 日期: 05-4-20
* 说明: 1 检测前轮制动力时,在第0个窗口显示
* 检测后轮制动力时,在第1个窗口显示
*******************************************************************************************/
unsigned char Measure_Trig(unsigned char side)
{
unsigned char i;
short temp_force; //力的临时变量
for(i = 0; i < 5; i++){ //到位信号要保持0.5秒钟
Init_Tmr1();
do{
if(side == FRONT){
if(ARRIVE) return;
}
else{
if(BACK_ARRIVE) return;
}
}while(!TMR1IF);
}
send_buffer[0] = 0xcc;
Send_Computer(send_buffer,1);
LOCK = 1; //松锁
SelectDisplay273();
Delay(1080,500); //延时5秒
LOCK = 0;
MOTOR = 1; //启动电机
SelectDisplay273();
Delay(720,500); //延时2S
if(side == FRONT){
f_trig_force = 0;
b_trig_force = 0;
display_data[1] = 0;
// 如果当前检的是前轮,则前轮和后轮的制动力清0
}
LIGHT = 1; //制动灯亮
SelectDisplay273();
Init_Tmr1();
for(i = 0; i < 200; i++){ //采制动力,15S
while(!TMR1IF){
temp_force = Count_Force(dema_force,Adc_Adverage(FORCE));
// 算当前制动力
if(side == FRONT){ //存储最大制动力
if(temp_force > f_trig_force)
f_trig_force = temp_force;
}else{
if(temp_force > b_trig_force)
b_trig_force = temp_force;
}
display_data[side] = Hex_Bcd(temp_force); // 当前轮的制动力
display_data[2] = Hex_Bcd(f_trig_force + b_trig_force); // 制动和(最大和)
}
Init_Tmr1();
if(!(i % 2))
Display(display_data,DISPLAY_SIZE); //显示实时制动力
}
display_data[0] = Hex_Bcd(f_trig_force); //取最大制动力显示
display_data[1] = Hex_Bcd(b_trig_force);
Display(display_data,DISPLAY_SIZE); //显示
send_buffer[0] = 0xff;
if(side == FRONT){
send_buffer[1] = 0xAA;
}else{
send_buffer[1] = 0xBB;
}
send_buffer[2] = display_data[side] >> 8;
send_buffer[3] = display_data[side];
send_buffer[4] = 0xee;
Send_Computer(send_buffer,5); //向上位机送结果
// 送检测结果,数据序列如下: FF -- XX XX EE
LIGHT = 0; //制动灯灭
MOTOR = 0; //电机关
BACK_CLOSE = 1; //后夹动作
SelectDisplay273();
Delay(540,500); //延时3秒
BACK_CLOSE = 0;
SelectDisplay273();
while(1){ //等待到位信号无效
while(1){
if(ARRIVE & BACK_ARRIVE)
break;
}
Delay(D_SHAKE_H,D_SHAKE_L);
if(ARRIVE & BACK_ARRIVE)
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -