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

📄 007.cpp

📁 本系统利用凌阳SPCE061A单片机原理
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	*P_TimerA_Data = 0x0000;
	
	while(*P_TimerA_Data<WAIT_DELAY2)	//等待一定时间,以避开余波的干扰
	{
		*P_Watchdog_Clear = 0x0001;
	}

	*P_INT_Ctrl = *P_INT_Ctrl_New|0x0100;//打开外部中断
	*P_INT_Clear = 0xffff;				//清除中断发生标志
	__asm("IRQ ON");					//打开总中断使能
	
	EXT1_IRQ_flag = 0;					//TimerA的溢出中断的标志变量置0
	while(Exit_flag)
	{
		if(EXT1_IRQ_flag==1)			//当该变量在timerA的FIQ中断中被置1时表示接收到了回波
		{
			Exit_flag = 0;				//exit-
			Counter_buf = Counter_buf;
			uiResoult = Resoult_ult(Counter_buf);//对计数值进行处理,得出距离值
		}
		if(*P_TimerA_Data>10000)		//如计数值大于10000,表示超时
		{
			Exit_flag = 0;				//exit
			uiResoult = 0;				//error return data 0
			*P_TimerA_Ctrl = 0x0006;	//stop timerA
		}
	}
	return uiResoult;
}
//========================================================================
//	语法格式:	unsigned int measure_Times(void)
//	实现功能:	组合进行共6次的测距程序,包括对6次测量结果的取平均值处理
//	返回值:	所测得的距离,以厘米为单位
//========================================================================
void measure_Times(unsigned int result[3])
{
	unsigned int uiMeasure_Index=0,i,j;
	unsigned int uiTemp_buf[30],uiTemp_Front,uiTemp,uiTemp_Behind;
	unsigned int uiSystem_Clock;

	uiTemp = *P_IOB_Buffer;
	*P_IOB_Data = uiTemp&0xfbff;				//选通前方的超声换能器

	Temper = Read_Temp();							//测量当前室温
	for(uiMeasure_Index=0;uiMeasure_Index<30;uiMeasure_Index++)
	{											//循环进行10次测量
		uiTemp_Front = measure_ult();		//进行一次测量
		if(uiMeasure_Index==0)					//如果为本次测量的第一次测距,则直接保存在缓冲区第一个单元
			uiTemp_buf[0] = uiTemp_Front;		
		else
		{										//否,则对结果进行比较,进行排序,从大到小排
			i = uiMeasure_Index;
			while(i)							//以下为排序的代码
			{
				if(uiTemp_Front>uiTemp_buf[i-1])
				{
					uiTemp_buf[i] = uiTemp_buf[i-1];
					uiTemp_buf[i-1] = uiTemp_Front;
				}
				else
				{
					uiTemp_buf[i] = uiTemp_Front;
					break;						//退出排序
				}
				i--;
			}
		}
		//两次测量之间的延时等待,利用以下代码软仿真时的cycles数结合设置的CPUCLK进行计算,大概72ms
		uiSystem_Clock = *P_SystemClock;		//将之前的系统时钟的设置用变量保存
		*P_SystemClock = 0x000b;				//设置为FSYS=24.576MHz  分频比为8
		for(i=0;i<2;i++)
		{
			Delay_ult(1000);						//调用延时程序
			*P_Watchdog_Clear = 0x0001;
		}
		*P_SystemClock = uiSystem_Clock;		//恢复系统时钟设置
		//此处延时结束
	uiTemp_Front = 0;
	}
	//对10次测距的结果进行处理
	
	for(i=13,j=0;i<19;i++)
	{
		if(uiTemp_buf[i]!=0)
		{
			uiTemp_Front += uiTemp_buf[i];
			j++;
		}
	}
	if(j!=0)
		uiTemp_Front = uiTemp_Front/j;	
	
	for(i=0,j=0;i<30;i++)	
	{
		if((uiTemp_buf[i]-uiTemp_Front<5)&&(uiTemp_buf[i]-uiTemp_Front>-5))
		{
			result[1] +=uiTemp_buf[i];
			j++;
		}
	}
	if(j!=0)
		result[1] = result[1]/j + FRONT_RES_ADD;
	else result[1] = uiTemp_Front + FRONT_RES_ADD;
	
	//测量后方至墙体的距离
	uiTemp = *P_IOB_Buffer;
	*P_IOB_Data = uiTemp|0x0400;				//选通后方的超声换能器
	
	for(uiMeasure_Index=0;uiMeasure_Index<30;uiMeasure_Index++)
	{											//循环进行六次测量
		uiTemp_Behind = measure_ult();				//进行一次测量
		if(uiMeasure_Index==0)					//如果为本次测量的第一次测距,则直接保存在缓冲区第一个单元
			uiTemp_buf[0] = uiTemp_Behind;		
		else
		{										//否,则对结果进行比较,进行排序,从大到小排
			i = uiMeasure_Index;
			while(i)							//以下为排序的代码
			{
				if(uiTemp_Behind>uiTemp_buf[i-1])
				{
					uiTemp_buf[i] = uiTemp_buf[i-1];
					uiTemp_buf[i-1] = uiTemp_Behind;
				}
				else
				{
					uiTemp_buf[i] = uiTemp_Behind;
					break;						//退出排序
				}
				i--;
			}
		}
		//两次测量之间的延时等待,利用以下代码软仿真时的cycles数结合设置的CPUCLK进行计算,大概72ms
		uiSystem_Clock = *P_SystemClock;		//将之前的系统时钟的设置用变量保存
		*P_SystemClock = 0x000b;				//设置为FSYS=24.576MHz  分频比为8
		for(i=0;i<2;i++)
		{
			Delay_ult(1000);						//调用延时程序
			*P_Watchdog_Clear = 0x0001;
		}
		*P_SystemClock = uiSystem_Clock;		//恢复系统时钟设置
		//此处延时结束	
	uiTemp_Behind = 0;
	}
//	//对10次测距的结果进行处理

	for(i=13,j=0;i<19;i++)
	{
		if(uiTemp_buf[i]!=0)
		{
			uiTemp_Behind += uiTemp_buf[i];
			j++;
		}
	}
	if(j!=0)
		uiTemp_Behind = uiTemp_Behind/j;
		
	for(i=0,j=0;i<30;i++)	
	{
		if((uiTemp_buf[i]-uiTemp_Behind)<5&&(uiTemp_buf[i]-uiTemp_Behind>-5))
		{
			result[2] +=uiTemp_buf[i];
			j++;
		}
	}
	if(j!=0)
		result[2] = result[2]/j + BEHIND_RES_ADD;	
	else	result[2] = uiTemp_Behind;
	result[0] = result[1] + result[2] + TOTAL_RES_ADD;
}


//=============================================================
//  文件名称: Speech.c
//  实现功能: 语音功能子程序
//  完成日期:  2008-05-01
//==============================================================
#include "SPCE061A.h"
#include "s480.h"

#define		SPEECH_1		0
#define		DAC1			1
#define		DAC2			2
#define		Ramp_UpDn_Off	0
#define		Ramp_UpDn_On	3
#define		Manual			0
#define		Auto			1
#define		Full			1
#define		Empty			2

//============================================================= 
// 函数名称:    Speech_Resource()
// 功能描述:	播放一段语音
//              同时还要存贮测量值(存放在Flash)中 
// 语法格式:    void Speech_Resource(unsigned int iSpeechIndex)
// 入口参数:    iSpeechIndex---语音资源索引号
// 出口参数:    无
// 注意事项:    仅为用户模型
//=============================================================
void Speech_Resource(unsigned int iSpeechIndex)
{	    	                          
	SACM_S480_Initial(Auto);	                         //自动方式播放初始化
	SACM_S480_Play(iSpeechIndex,DAC1+DAC2,Ramp_UpDn_On); //定义语音索引号、播放通道、允许音量增/减调节			
    while(SACM_S480_Status()&0x01)
    {      
		SACM_S480_ServiceLoop();                      	//获取语音数据并将其填入解码队列
		*P_Watchdog_Clear = 0x0001;
    } 
	SACM_S480_Stop();
//	*P_INT_Ctrl = 0x0008;
	__asm("FIQ OFF");
//	__asm("IRQ ON");
}
//============================================================= 
// 函数名称:    Speech_Result()
// 功能描述:	对测量得到的数据进行语报:X点XX米
//              同时还要存贮测量值(存放在Flash)中 
// 语法格式:    void Speech_Result(unsigned int uiResult)
// 入口参数:    uiResult---要用语音报的结果
// 出口参数:    无
// 注意事项:    仅为用户模型
//=============================================================
void Speech_Result(unsigned int uiResult)
{
	unsigned int uiTemp;
	uiTemp = uiResult/100;
	Speech_Resource(uiTemp);
	Speech_Resource(11);					//语音"点"
	uiTemp = (uiResult/10)%10;
	Speech_Resource(uiTemp);
	uiTemp = uiResult%10;
	Speech_Resource(uiTemp);
	Speech_Resource(12);					//语音"米"
}
//============================================================= 
// 函数名称:    Speech_Total()
// 功能描述:	对测量得到的总数据进行语报:XX点XX米
//              同时还要存贮测量值(存放在Flash)中 
// 语法格式:    void Speech_Total(unsigned int total)
// 入口参数:    total---要用语音报的结果
// 出口参数:    无
// 注意事项:    仅为用户模型
//=============================================================
void Speech_Total(unsigned int total)
{
	unsigned int uitemp;
	uitemp = total/1000;
	if (uitemp!=0)
	{
		Speech_Resource(uitemp);
		Speech_Resource(10); 					//语音"十"
	}
	uitemp = (total/100)%10;
	if (uitemp!=0)
		Speech_Resource(uitemp);
	Speech_Resource(11);						//语音"点"
	uitemp = (total%100)/10;
	Speech_Resource(uitemp);
	uitemp = total%10;
	Speech_Resource(uitemp);
	Speech_Resource(12);						//语音"米"
}
//============================================================= 
// 函数名称:    Speech_Temper()
// 功能描述:	对测量得到的温度进行语报:XX点X摄氏度
//              同时还要存贮测量值(存放在Flash)中 
// 语法格式:    Speech_Temper(float Temper_data)
// 入口参数:    Temper_data---要用语音报的结果
// 出口参数:    无
// 注意事项:    仅为用户模型
//=============================================================
void Speech_Temper(unsigned int Temper_data)
{
	unsigned int uitemp;
	uitemp = Temper_data/100;
	Speech_Resource(uitemp);
	Speech_Resource(10); 			    		//语音"十"
	uitemp = (Temper_data/10)%10; 
	if (uitemp!=0)
		Speech_Resource(uitemp);
	Speech_Resource(11);						//语音"点"
	uitemp = Temper_data%10;
	Speech_Resource(uitemp);
	Speech_Resource(13);						//语音"摄氏度"
}


//=============================================================
//  文件名称: Test_Temper.c
//  实现功能: DS18b20  测温模块程序
//  完成日期:  2008.4.29

//  修改时间:  	2008-05-01
//  硬件连接方案:	IOB3---------温度传感器的DQ数据端口引脚
//	修改内容: 		IOB3的输入输出属性定义方式
//					24.576MHz/1,强振模式
//==============================================================
#include "SPCE061V004.h"
#include "ultrasonic_App.h"

//============================================================= 
// 函数名称:    delay()
// 功能描述:	延时子程序 
// 语法格式:    void delay(unsigned int i)
// 入口参数:    i--延时设定值
// 出口参数:    无
// 注意事项:    仅为用户模型
//=============================================================

void Delay_T(unsigned int timers)
{
    unsigned int i;
	for(i=0;i<timers;i++)
	{
		__asm("nop");
	}
    // *P_Watchdog_Clear=0x0001;
}

//========================================================
//	语法格式:	void Set_DQ(int Dir)
//	实现功能:	改变IOB15口的状态
//	参数:		Dir,1:IOB15输出1;0:IOB15悬浮输入
//	返回值:	无
//========================================================

void Set_DQ(int Dir)
{
	if(Dir > 0)
		*P_IOB_Dir |= 0x0008;
	else
		*P_IOB_Dir &= 0xfff7;
	*P_IOB_Attrib |= 0x0008;				
	*P_IOB_Buffer |= 0x0008;
}

//========================================================
//	语法格式:	void Clr_DQ(int Dir)
//	实现功能:	改变IOA15口的状态
//	参数:		Dir,1:IOB3输出0;0:IOB3悬浮输入
//	返回值:	无
//========================================================

void Clr_DQ(int Dir)
{
	if(Dir > 0)
		*P_IOB_Dir |= 0x0008;
	else
		*P_IOB_Dir &= 0xfff7;
	*P_IOB_Attrib |= 0x0008;	
	*P_IOB_Buffer &= 0xfff7;
}

//========================================================
//	语法格式:	unsigned int Read_DQ(void)
//	实现功能:	读取DQ的值
//	参数:		无
//	返回值:	DQ的值
//========================================================

unsigned int Read_DQ(void)
{
	unsigned int uiTemp;
	uiTemp = 0;
	if((*P_IOB_Data & 0x0008) > 0)
		uiTemp = 1;
	return(uiTemp);
}

//========================================================
//	语法格式:	unsigned int Read_18B20_Byte(void)
//	实现功能:	读取18B20的值
//	参数:		无
//	返回值:	18B20的值
//========================================================

unsigned int Read_18B20_Byte(void)

⌨️ 快捷键说明

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