⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 measure.c

📁 这个是汽车制动台控制程序的C语言版本. 用于实际产品中.单片机用的是PIC16F877A.
💻 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 + -