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

📄 intdocument.c

📁 超声波控制倒车源代码。这是基于凌阳16单片机开发的
💻 C
字号:
//=============================================================
//  文件名称: IntDocument.c
//  实现功能: 各中断服务程序
//  完成日期:  2004,7,20
//==============================================================

#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 P_TimerB_Data			(volatile unsigned int *)0x700C   
#define P_TimerB_Ctrl			(volatile unsigned int *)0x700D  

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

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

extern unsigned int uiMeasure_Index;	//当前测量的次数
extern unsigned int uiResult[4];		//保存测四次测量结果的缓存区
extern void US_Send200us(void);			//启动模组发送40KHz信号
//============================================================= 
// 函数名称:    IRQ6()
// 功能描述:	TMB1/2中断服务程序    程序中设TMB1为16Hz 
//				每62.5ms进行一次测量   每次查询共进行四次测量
// 语法格式:    void IRQ6(void)
// 入口参数:    无
// 出口参数:    无
// 注意事项:    为超声波测距程序使用
//=============================================================
void IRQ6(void)__attribute__((ISR));
void IRQ6(void)
{
	int iTemp;				//中量变量
	iTemp = *P_INT_Ctrl;
	if(iTemp&0x0002)
	{
		*P_INT_Clear=0x0002;
		if(uiEXT_EN_flag)
		{//假如上次测量还没有接收到回波信号    出错管理
			*P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0100);	//关掉外部中断
			uiEXT_EN_flag = 0;							//标识位清零
			*P_TimerB_Ctrl = M_TIMERA_STOP;				//同时计数器停止工作
		}
		uiMeasure_Index++;								//自加一
		if(uiMeasure_Index>4)
		{//单次查询已测够四次,可以进行数据处理了
			*P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0100);	//关掉外部中断
			*P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0002);	//关掉TMB1的时基中断
			uiEXT_EN_flag = 0;							//标识位清零
			uiIOB_20Hz_flag = 0;
			*P_TimerB_Ctrl = M_TIMERA_STOP;				//同时计数器停止工作
		}
		else
		{
			US_Send200us();								//符合条件,可以进行查询
		}	
	}
}
//============================================================= 
// 函数名称:    IRQ3()
// 功能描述:	外部中断服务程序 
//				得到结果(时间差)并进行初步处理
// 语法格式:    void IRQ3(void)
// 入口参数:    无
// 出口参数:    无
// 注意事项:    为超声波测距程序使用
//=============================================================
void IRQ3(void)__attribute__((ISR));
void IRQ3(void)
{
	unsigned int uiTemp;
	unsigned int uiResult1;								//结果的暂存
	unsigned int i;
	
	uiTemp=*P_INT_Ctrl;
	if(uiTemp&0x0100)
	{
		if(uiEXT_EN_flag)
		{
			*P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0100);	//关掉外部中断
			uiEXT_EN_flag = 0;
			uiResult1 = *P_TimerB_Data;					//读取结果
			*P_TimerB_Ctrl = M_TIMERA_STOP;				//同时计数器停止工作
			//对测得的时间差进行初步处理.......
			if(uiMeasure_Index == 1)
			{
				uiResult[0] = uiResult1;	
			}
			else
			{
				i = uiMeasure_Index-1;
				while(i)
				{
					if(uiResult1>uiResult[i-1])
					{
						uiResult[i] = uiResult[i-1];
						uiResult[i-1] = uiResult1;	
					}
					else
					{
						uiResult[i] = uiResult1;
					}
					i--;
				}
			}//end.......
		}
		*P_INT_Clear = 0x0100;
	}
}

//============================================================= 
// 函数名称:    void IRQ4(void)
// 功能描述:	IRQ4的中断服务程序,利用1KHZ作为后台延时程序的
//				计数
// 语法格式:    void IRQ4(void)
// 入口参数:    无
// 出口参数:    无
// 注意事项:    仅为用户模型
//=============================================================
extern void Show_Flag(void);
extern unsigned int Counter_1KHz;
void IRQ4(void)__attribute__((ISR));
void IRQ4(void)
{
	Counter_1KHz++;
	Show_Flag();										//调用显示刷新程序
	*P_INT_Clear=0x0020;
}
//============================================================= 
// 函数名称:    void IRQ5(void)
// 功能描述:	IRQ5的中断服务程序,利用2Hz中断,作为语音播放的
//				控制程序的一部分,以避免语音播报过于频繁
// 语法格式:    void IRQ5(void)
// 入口参数:    无
// 出口参数:    无
// 注意事项:    仅为用户模型
//=============================================================
extern unsigned int Counter_2Hz;						//在Speech.c中定义
void IRQ5(void)__attribute__((ISR));
void IRQ5(void)
{
	Counter_2Hz++;
	if(Counter_2Hz>6)
		*P_INT_Ctrl = *P_INT_Ctrl_New&0xfff7;			//如果超过3秒了,则关闭IRQ5的2HZ中断
	*P_INT_Clear=0x0008;								//清中断标志位
}

⌨️ 快捷键说明

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