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

📄 motortrig.c

📁 这个是汽车制动台控制程序的C语言版本. 用于实际产品中.单片机用的是PIC16F877A.
💻 C
字号:
/**********************************************************************************************
* File: motor_trig.c
* 功能: 摩托制动/称重仪表主程
* 设计者: 饶阳胜
* 日期: 05/2/27
**********************************************************************************************/
#include <pic.h>				//包含系统头文件
#include "total.h"				//包含项目头文件

/**********************************************************************************************
* 最后修改日期: 05-4-29
* 修改原因: 	  简化代码,添加注释
* 修改人: 	  饶阳胜
/**********************************************************************************************
* 函数名称:	void Check(void)
* 功能:   	检测轴重标定,力标定按键有没有按下
* 入口参数:	无
* 出口参数: 
* 全局变量:  display_weigh			轮重显示	
*			dema_weigh				轮重标定数据
*			dema_force				制动力标定数据
*
* 调用模块:  Init_Tmr1()				TMR1初始化函数
*			Dema()					标定函数
*
* 设计者:  	饶阳胜
* 日期: 		05-4-4
* 说明: 		1 按键是低电平有效,如:WEIGH_DEMA,FORCE_DEMA
*			2 按键要被按住不放5秒钟,有效
**********************************************************************************************/
void Check_Key()
{
	unsigned char i;

//检测轴重标定按键	
	if(!WEIGH_DEMA){
		Init_Tmr1();								//初始化TMR1,用它来设定5秒钟定时
		for(i = 0; i < 50; i++){	
			while(!TMR1IF)							//检测TMR1溢出标志
				if(WEIGH_DEMA) return;				//如果"WEIGH_DMEA"键被松开,退出
			Init_Tmr1();
		}
		Dema(dema_weigh,WEIGH,WEIGH_ADDRESS);		//调用标定函数
		display_weigh = 0;							//关闭显示轴重标识
	}else if(!FORCE_DEMA){
//检测制动力标定按键
		Init_Tmr1();								//初始化TMR1,用它来设定5秒钟定时
		for(i = 0; i < 50; i++){	
			while(!TMR1IF)							//检测TMR1溢出标志
				if(FORCE_DEMA) return;				//如果"WEIGH_DMEA"键被松开,退出
			Init_Tmr1();
		}		
		Dema(dema_force,FORCE,FORCE_ADDRESS);		//调用标定函数
	}
}

/***************************************************************************************************
* File: 	interrupt.c
* 功能: 		中断函数
* 入口参数: 	接收到上位机的命令
* 出口参数: 	无
* 全局变量: 	command 	接收到的命令
* 调用模块:	无
* 设计者: 	饶阳胜
* 日期:	 	05-4-29
* 说明: 		只使用了接收中断
***************************************************************************************************/
void interrupt rc_int(void)
{
	if(RCIF){						//如果有接收数据
		command = RCREG;			//将数据送到command中
	}
	RCIF = FALSE;					//清接收中断标志
	switch (command){
/*
		case 0x03:					//接收到的是检测前轮轮重命令
			weigh_side = 0;
			break;
		case 0x04:					//接收到的是检测后轮轮重命令
			weigh_side = 1;
			break;
*/
		default:
			break;
	}		
}

/**********************************************************************************************
* 最后修改时间:	05-4-29
* 修改原因:		添加注释
* 修改人: 		饶阳胜
/**********************************************************************************************
* 函数名称: 	void main(void)
* 功能: 		系统主函数
* 入口参数: 	系统上电
* 出口参数: 	无
* 全局变量:	display_data		显示数组
*			dema_force			制动力标定数据
*			dema_weigh			轮重标定数据
*			command				上位机命令
*			display_weigh		显示轮重
*
* 调用模块:	System_Init()		系统初始化函数
*			Delay()				软件延时函数
*			Display()			显示函数
*			My_Read()			读取EEPROM函数
*			Normal_Display()	正常显示函数
*			Init_Tmr1()			TMR1初始化函数
*			Check_Key()			查按键函数
*			Count_Force()		计算函数
*			Measure_Weigh()		检测轮重函数
*			Measure_Trig()		检测制动力函数
*			Clear_Zer0			清0函数
*
* 设计者: 	饶阳胜
* 日期: 		05-2-28
* 说明:		有关系统流程,请参看流程图
***********************************************************************************************/
void main(void)
{
	unsigned short current_AD;					//当前AD值
	unsigned short current_weigh;				//当前轮重
	unsigned char i; 
	unsigned char times;				//时间计数

	System_Init();						//系统初始化
	display_data[0] = 0x8888;
	display_data[1] = 0x8888;
	display_data[2] = 0x8888;
	Display(display_data,THREE);		//检测笔段显示
	Delay(1800,500);					//延时5秒
	My_Read(dema_force,DEMA_POINT_SIZE,FORCE_ADDRESS);				//读入制动力标定数据
	My_Read(dema_weigh,DEMA_POINT_SIZE,WEIGH_ADDRESS);				//读入轴重标定数据
	Normal_Display();												//显示正常态
	Init_Tmr1();
	Clear_Zero(dema_weigh, Adc_Adverage(WEIGH));				//调用清0函数
	while(1){
		Check_Key();												//标定处理
		if(Count_Force(dema_weigh, Adc_Adverage(WEIGH)) > 100){		//判断轴重是否大于10Kg
			di();													//取上位机命令,取之前关中断,取后开中断
			i = command;
			ei();
			if(i != NO_WEIGH){										//是否有无需检测命令
				display_weigh = 1;									//显示轴重全局变量为1
				Measure_Weigh();									//检测轴重
				display_weigh = 0;
			}
		}
		if(!ARRIVE){
			// 前轮检测踏板有效
			di();													//取上位机命令,取之前关中断,取后开中断
			i = command;
			ei();
			if(i != NO_TRIG)										//是否有无需检测命令
				Measure_Trig(FRONT);								//检测前轮制动
		}
		if(!BACK_ARRIVE){
			// 后轮检测踏板有效
			di();
			i = command;
			ei();
			if(i != NO_TRIG)
				Measure_Trig(BACK);									//检测后轮制动
		}
		if(TMR1IF){
			Init_Tmr1();
			++times;
			if(times > 5){
				times = 0;											//刷新时间			
				current_AD = Adc_Adverage(WEIGH);
                if(current_AD < dema_weigh[1])
                 {
                   current_AD = dema_weigh[1] + (dema_weigh[1] - current_AD);
                 }
				current_weigh = Count_Force(dema_weigh, current_AD);
				if((current_weigh > 0) && (current_weigh <= 2))			//当前轮重小于0.1Kg,调整0点
					Clear_Zero(dema_weigh, current_AD);				//调用清0函数
			}		
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -