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

📄 userfunction.c

📁 1 系统简介 与本文档配套的超声波测距模组为 V2.0 版本。 1.1 基本特性与参数指标 超声波传感器谐振频率:40KHz; 模组传感器工作电压:4.5V~9V 模组接口电压:4
💻 C
字号:
//=============================================================
//  文件名称: UserFunction.c
//  实现功能: 用户功能子程序程序
//  完成日期:  2004,7,21
//==============================================================
#define P_TimerB_Data			(volatile unsigned int *)0x700C   
#define P_TimerB_Ctrl			(volatile unsigned int *)0x700D  
#define P_TimeBase_Setup		(volatile unsigned int *)0x700E 

#define P_IOB_Data				(volatile unsigned int *)0x7005  
#define P_IOB_Buffer			(volatile unsigned int *)0x7006   
#define P_IOB_Dir				(volatile unsigned int *)0x7007   
#define P_IOB_Attrib			(volatile unsigned int *)0x7008 

#define P_INT_Ctrl				(volatile unsigned int *)0x7010   
#define P_INT_Clear				(volatile unsigned int *)0x7011  
#define P_INT_Ctrl_New			(volatile unsigned int *)0x702d
#define P_Watchdog_Clear		(volatile unsigned int *)0x7012 
#define P_SystemClock			(volatile unsigned int *)0x7013  

#define M_TIMERA_EN       0x0001					//使能TimerA的配置,计数频率为96KHz
#define M_TIMERA_STOP	  0x0006					//停止TimerA的配置,计数器停止工作

unsigned int  M_TIMER_DELAY=30;				//为防止余波干扰而定义的延时
unsigned int  M_LOW_DISTEN=7;
unsigned int  M_TIMER_OFFSET=20;
unsigned int  M_TIMER_SEND=10;
unsigned int  M_MUT_DATA=32300;

unsigned int uiIOB_20Hz_flag;				//IOB01口(即20Hz方波输出口)的状态标识
unsigned int uiEXT_EN_flag;					//外部中断使能标识位

unsigned int uiMeasure_Index;				//当前测量的次数
unsigned int uiResult[4];					//保存测四次测量结果的缓存区

extern unsigned int F_Binary_BCD(unsigned int Binary);
//F_Binary_BCD为Data_OS_A.asm文件里提供
unsigned int ResultOS(void);
void ErrorOS(void);
void InitMeasureData(void);

unsigned int uiError_Counter;						//出错累加器
//============================================================= 
// 函数名称:    InitMeasure()
// 功能描述:	系统IO口、中断等进行初始化
// 语法格式:    void InitMeasure(void)
// 入口参数:    无
// 出口参数:    无
// 注意事项:    用户可参考设置进行必要修改,以适应不同情况
//=============================================================
void InitMeasure(void)
{
	unsigned int iTest;		//设置的中间量
	//设置IOB口   IOB04口为20Hz(也许用16Hz)的输出,以控制模组发射40KHz方波   
	//IOB2 口为外部中断的输入,设置为带上拉的输入口。
	*P_SystemClock = 0x000b;
	
	*P_IOB_Dir = 0x0010;
	*P_IOB_Attrib = 0x0010;
	*P_IOB_Data = 0x0004;
	//开时间基准中断,TMB1  16Hz
	*P_TimeBase_Setup=0x0001;
	//设置TimerB   选使其处于停止工作状态
	*P_TimerB_Data = 0x0000;
	*P_TimerB_Ctrl = M_TIMERA_STOP;
	
	*P_INT_Ctrl = 0x0008;				//开IRQ5的2Hz中断,用来清狗
	__asm("FIQ OFF");
	__asm("IRQ ON");
	
	InitMeasureData();
}
//============================================================= 
// 函数名称:    InitMeasureData()
// 功能描述:	部分全局数据的初始化
// 语法格式:    void InitMeasureData(void)
// 入口参数:    无
// 出口参数:    无
// 注意事项:    仅为用户模型
//=============================================================
void InitMeasureData(void)
{
	uiIOB_20Hz_flag = 0;				//初始化为零
	uiEXT_EN_flag = 0;
	
	uiMeasure_Index = 0;
}

//============================================================= 
// 函数名称:    BeginMeasure()
// 功能描述:	进行一次测距  包括数据处理
//              每次测距都要进行四次测量,而且都是通过后台
//				的16Hz中断启动这四次测量
// 语法格式:    unsigend int BeginMeasure(void)
// 入口参数:    无
// 出口参数:    无
// 注意事项:    仅为用户模型
//=============================================================
//延时程序
//
void User_Delay(unsigned int iTimers)
{
	unsigned int i;
	for(i=0;i<iTimers;i++)
	{
		__asm("nop");
	}
}
void US_Send200us(void)
{
	*P_TimerB_Data = 0x0000;		//TimerA计数器清零
	*P_IOB_Data=0x0014;
	*P_TimerB_Ctrl = M_TIMERA_EN;	//使能TimerA
	User_Delay(M_TIMER_SEND);					//延时,发送完十一个以上的完整的40KHz方波脉冲
	*P_IOB_Data=0x0004;				//停止发送
	uiIOB_20Hz_flag = 1;			//置位标识位
}
unsigned int BeginMeasure(void)
{
	unsigned int uiExit_RQ;			//退出循环标识
	unsigned int uiMeasure_Result;	//测量结果
	unsigned int i;
	
	*P_SystemClock = 0x000b;		//设置SystemCkock,以保证软件延时的准确...Edit by xinqiang 20050806
	uiExit_RQ = 1;
	
	uiMeasure_Index = 0;			//开始测量
	*P_INT_Ctrl = 0x0002;			//打开16Hz中断,在中断里面启动测量
	while(uiExit_RQ)
	{
		if(uiIOB_20Hz_flag)			//当该标识位非零时才进行下面的判断
		{
			if(*P_TimerB_Data>=M_TIMER_DELAY)			//计数器中数值表明已经过了余波干扰延时
			{											//可以打开外部中断,检测回波信号
				*P_INT_Clear = 0x0100;					//开中断前先清中断
				*P_INT_Ctrl = *P_INT_Ctrl_New|0x0100;
				uiEXT_EN_flag = 1;
				uiIOB_20Hz_flag = 0;					//清该标志位,由16Hz中断启动下一次测量
			}
		}
		//一次测距结束(即完成四次测量),进入结果处理
		if(uiMeasure_Index>4)							
		{
			uiMeasure_Index=0;
			uiMeasure_Result = ResultOS();				//处理测距结果
			if(uiMeasure_Result<=M_LOW_DISTEN)
			{//测量时出错,进入错误管理
				uiMeasure_Result = 0;				//出错时,结果为0
			}
		//	else
		//	{
		//		Speech_Result(uiMeasure_Result);
		//		uiError_Counter = 0;				//错误计数器清零
		//	}
			uiExit_RQ=0;
			break;
		}
		*P_Watchdog_Clear = 0x0001;
	}
	return uiMeasure_Result;						//返回数据,返回0时代表测量出错。
}

//============================================================= 
// 函数名称:    ResultOS()
// 功能描述:	对结果进行软件处理  包括结果解算、软件补偿等。 
// 语法格式:    unsigned int ResultOS(void)
// 入口参数:    无
// 出口参数:    十进制的距离,以cm为单位
// 注意事项:    仅为用户模型
//=============================================================

unsigned int ResultOS(void)
{
	unsigned long int uliResult2;	
	unsigned int uiResult1;
	unsigned int i;
	if(uiResult[0]<=(M_TIMER_DELAY+M_TIMER_OFFSET))
	{//此时的数据是错的
		return 0;
	}
	else
	{
		for(i=0;i<3;i++)
		{
			if((uiResult[i]-uiResult[i+1])>=30)
			{
				uiResult[i+1] = uiResult[i];
			}
		}	
	}
	
	uiResult1 = (uiResult[1]+uiResult[2])/2-3;		//取平均值
	uliResult2 = (unsigned long int)uiResult1*M_MUT_DATA;//数据处理
	uliResult2 = uliResult2/96;
	uliResult2 = uliResult2/2;
	//用户可在止加入适当的软件补偿,以期得到更准确的距离值
//	uliResult2 = uliResult2-3050;
	uliResult2 = uliResult2/1000;
	
	//..end
	uiResult1 = (unsigned int)uliResult2;
	for(i=0;i<4;i++)
	{
		uiResult[i]=0;
	}
	return uiResult1;
}

//============================================================= 
// 函数名称:    void ErrorOS(void)
// 功能描述:	测量出错管理(处理)
// 语法格式:    void ErrorOS(void)
// 入口参数:    无
// 出口参数:    无
// 注意事项:    仅为用户模型
//=============================================================
void ErrorOS(void)
{
	unsigned int i;
	Speech_Resource(12);
/*	for(i=0;i<3;i++)
	{
		LCD_Draw(1);
		User_Delay(20000);
		LCD_Draw(0);
		User_Delay(20000);
	}
	uiError_Counter++;
	if(uiError_Counter>3) uiError_Counter = 3;
	switch(uiError_Counter)
	{
		case 1: Speech_Resource(14);break;
		case 2: Speech_Resource(15);break;
		case 3: Speech_Resource(16);break;
		default: break;
	}*/
}

⌨️ 快捷键说明

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