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

📄 system.c

📁 利用SPCE061A单片机、三个超声波测距模组实现超声波倒车雷达
💻 C
字号:
//========================================================
//	文件名称:	system.c
//	功能描述:	系统初始化、部分功能程序
//	维护记录:	2005-12-12	v1.0
//========================================================
#include "SPCE061A.h"
//下面的函数定义在Speech.c当中,播放A2000语音资源子程序
extern void PlaySnd_Auto(unsigned int uiSndIndex,unsigned int uiDAC_Channel);

unsigned int Show_Freq_Set[3] = {0,0,0};
unsigned int Show_Counter_1KHz[3] = {0,0,0};
//=======================================================================
//	语法格式:	void Initial_IO(void)
//	实现功能:	系统端口初始化程序
//	参数:		无
//	返回值:	无
//=======================================================================
void Initial_IO(void)
{
	*P_IOA_Dir = *P_IOA_Dir|0xff00;
	*P_IOA_Attrib = *P_IOA_Attrib|0xff00;
	*P_IOA_Data = *P_IOA_Buffer&0x00ff;
	
	*P_IOB_Dir = *P_IOB_Dir|0x0003;
	*P_IOB_Attrib = *P_IOB_Attrib|0x0003;
	*P_IOB_Data = *P_IOB_Buffer&0xFFFc;
}
//=======================================================================
//	语法格式:	void Channel_Sel(unsigned int ch)
//	实现功能:	传感器通道选择
//	参数:		ch   选择的通道号(0~2)
//	返回值:	无
//=======================================================================
void Channel_Sel(unsigned int ch)
{
	unsigned int uiTemp;
	ch = ch&0x0003;										//只取低二位,因为系统设计仅使用了IOB0和IOB1
	uiTemp = *P_IOB_Buffer;								//采用先读,再计数,再写的方式
	uiTemp = uiTemp&0xfffc;								//保证其它端口状态不变
	uiTemp = uiTemp|ch;
	*P_IOB_Data = uiTemp;
}
//=======================================================================
//	语法格式:	void Result_Check(unsigned int ch,unsigned int Result[3])
//	实现功能:	测量结果处理程序   更新状态显示频率设置值,更新状态显示
//				针对测量结果进行语音播报
//	参数:		unsigned int ch		通道号数
//				unsigned int Result	该通道的测量值
//	返回值:	无
//=======================================================================
void Result_Check(unsigned int ch,unsigned int Result[3])
{
	if(Result[ch]<150)									//判断测量结果是否大于150cm?
	{													//小于,则设置显示频率值
		if(Result[ch]>40)	Show_Freq_Set[ch] = Result[ch]*6;	//如果非零,则结果乘以6
		else Show_Freq_Set[ch] = 100;					//如果结果为零,则设置为100
	}													//数值越大,则频率越低
	else 
	{
		Show_Freq_Set[ch] = 0;							//测量值大于150cm
		switch(ch)
		{												//对应通道的状态显示进行熄灭操作
			case 0:*P_IOA_Data = *P_IOA_Buffer&(~0x0100); break;
			case 1:*P_IOA_Data = *P_IOA_Buffer&(~0x0200); break;
			case 2:*P_IOA_Data = *P_IOA_Buffer&(~0x0400); break;
			default: break;
		}
	}
	
	if(Result[1]<150||(Result[0]<150&&Result[2]<150))
	{
		PlaySnd_Auto(1,3);
	}
	else if(Result[0]<150)
	{
		PlaySnd_Auto(0,3);
	}
	else if(Result[2]<150)
	{
		PlaySnd_Auto(2,3);
	}
}
//=======================================================================
//	语法格式:	void Show_Flag(void)
//	实现功能:	状态显示程序,在IRQ4的1KHz中断当中调用
//	参数:		无
//	返回值:	无
//=======================================================================
void Show_Flag(void)
{	
	if(Show_Freq_Set[0]!=0)								//第一组传感器(左)
	{													//该显示频率设置的变量非零,表示要进行状态显示
		Show_Counter_1KHz[0] = Show_Counter_1KHz[0]+1;	//计数器加1
		if(Show_Counter_1KHz[0]>Show_Freq_Set[0])		//如果计数达到了显示频率设置的值,表示需要对端口
		{												//输出进行翻转
			Show_Counter_1KHz[0] = 0;					//计数器清零
			*P_IOA_Data = *P_IOA_Buffer^0x0100;			//与1进行异或, 相当于对该位进行取反
		}
	}
	if(Show_Freq_Set[1]!=0)								//第二组传感器(中)
	{
		Show_Counter_1KHz[1] = Show_Counter_1KHz[1]+1;
		if(Show_Counter_1KHz[1]>Show_Freq_Set[1])
		{
			Show_Counter_1KHz[1] = 0;
			*P_IOA_Data = *P_IOA_Buffer^0x0200;
		}
	}
	if(Show_Freq_Set[2]!=0)								//第三组传感器(右)
	{
		Show_Counter_1KHz[2] = Show_Counter_1KHz[2]+1;
		if(Show_Counter_1KHz[2]>Show_Freq_Set[2])
		{
			Show_Counter_1KHz[2] = 0;
			*P_IOA_Data = *P_IOA_Buffer^0x0400;
		}
	}
}

⌨️ 快捷键说明

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