📄 007.cpp
字号:
*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 + -