智能车制作
标题:
关于XS128超声波模块测不到准确距离,程序如下啊
[打印本页]
作者:
序文哥
时间:
2015-4-2 20:55
标题:
关于XS128超声波模块测不到准确距离,程序如下啊
本帖最后由 序文哥 于 2015-4-2 21:03 编辑
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#include <math.h>
#include "lcd5110.h"
//-----------------PIT定时中断参量--------------------------------------------------
#define PITTIME1 250;
#define PITTIME2 250;
//-------------------中断服务变量------------
//--------------pk
int test_start=0; //检验开始
int test_over=1; //检验结束
int start_flage=0; //开始标志
unsigned int time_m_o=0;
unsigned int time_start=0 ;
unsigned int time_over=0;
float time_rising=0;
float distance=0;
//----------------
/****************************准确延时*****************************/
//---------------------------1us准确延时__64M-----------------------------
void Delay1us(int c)
{
int cnt0;
for(cnt0=0;cnt0<2*c;cnt0++)
{
_asm NOP; _asm NOP;_asm NOP;
_asm NOP; _asm NOP;_asm NOP;_asm NOP;
_asm NOP; _asm NOP;_asm NOP;_asm NOP;
_asm NOP; _asm NOP;_asm NOP;_asm NOP;
_asm NOP; _asm NOP;_asm NOP;
}
}
//---------------------------1ms准确延时__64M-------------------------
void Delay1ms(int c)
{
int cnt;
int cnt1;
for(cnt=0;cnt<2*c;cnt++)
{
for(cnt1=0;cnt1<1000;cnt1++)
{
_asm NOP; _asm NOP;_asm NOP;_asm NOP;
_asm NOP; _asm NOP;_asm NOP;_asm NOP;
_asm NOP; _asm NOP;_asm NOP;_asm NOP;
_asm NOP; _asm NOP;_asm NOP;_asm NOP;
_asm NOP; _asm NOP;_asm NOP;_asm NOP;
}
}
}
/**************总线时钟设置函数***************************/
void SetBusCLK_64M(void)
{
CLKSEL = 0X00; //寄存器CLKSEL的第七位置0,选择时钟源为外部晶振OSCCLK,在PLL程序执行前,内部总线频率为OSCCLK/2;
PLLCTL_PLLON = 1; //打开PLL电路;
SYNR = 0xc0 | 0x07; //根据想要的时钟频率设置SYNR和REFDV两个寄存器,两个寄存器只有在PLLSEL=0时才能够写入;
REFDV = 0x80 | 0x01; //计算公式为
LLCLK=2*OSCCLK*(1+SYNR)/(1+REFDV)=128MHz,BUS CLOCK=PLLCLK/2=64M;
POSTDIV = 0x00; //VCOCLK=PLLCLK;
_asm(nop); //延时一个指令周期
_asm(nop);
while(!(CRGFLG_LOCK==1)); //当锁相环PLL电路输出的频率已经稳定时,LOCK位置才为1;
CLKSEL_PLLSEL = 1; //允许锁相环时钟源PLLCLK为系统提供时钟,与第一步相反;
}
/**************I/O初始化函数******************************/
void PORT_ini (void)
{
//设置A口0位的输出
DDRA_DDRA0=1; //数据方向寄存器1为输出,写数据
PORTA_PA0=0;
//设置H口0位的中断
DDRH_DDRH0=0; //H口0位:开关量输入 读数据!
PERH_PERH0=1; //H口0位:允许上拉或下拉器件
//H口初始化为高电平还是低电平???____应该为低电平!!!
PPSH_PPSH0=0; //H口0位:1上升沿触发中断 0下降沿 为1选择下拉电阻,0为上拉电阻
PIEH_PIEH0=1; //H口0位:中断允许 中断标志位 PIFH_PIFH0 ****************
}
/*******************************************************************
定时中断模块
********************************************************************/
void PIT_ini(void) //1ms定时中断
{
PITCFLMT_PITE=0; //PIT控制寄存器及强制载入微定时器寄存器
//禁止PIT
PITMUX_PMUX0=0; //PIT定时器复合寄存器:选择8位的基时钟base0
PITMUX_PMUX3=1; // 选择8位的基时钟base1
//------溢出周期计算:time-out period = (PITMTLD + 1) * (PITLD + 1) / fBUS.
// PITMTLD0=0xff;//PIT微定时器装载寄存器:8位, 0xc7——199;0x85——6399
//PITLD0=0x1f30; //PIT定时器装载寄存器:16位0xffff; 0x36f——879
//T0通道定时周期T0 period=200*880/64M=2ms;
PITMTLD0=0Xff;//0X85——133;C8——200+1
PITLD3=0X3a97; // FFFF——65535
//T0通道定时周期T3 period=134*65536/64M=100ms;
PITCE_PCE0=0; // PIT通道使能寄存器 : 通道0使能
PITCE_PCE3=1; //通道3使能
PITINTE_PINTE0=0; //PIT中断使能寄存器:
PITINTE_PINTE3=1; //通道3中断使能
PITCFLMT_PITE=1; //PIT使能
}
/**************ECT初始化函数***********************************/
static void ECT_ini(void)
{
TIOS_IOS7=0;//:通道选择寄存器0:相应通道为输入捕捉;1:相应通道为输出比较;
TIOS_IOS0=0; //T0输入捕捉
TIOS_IOS1=0; //T1输入捕捉
TSCR1_TEN=1;//定时器系统控制寄存器1:定时器使能
TSCR1_PRNT=1;//定时器系统控制寄存器1:精确定时器,PTPSR寄存器有效,对主定时器计数器频率进行设置 5.5M??????
PTPSR=0X07;//8分频
TCTL1_OM7=0;
TCTL1_OL7=0;//OC7 没有输出动作!
OC7M_OC7M7=0;//不把OC7D中的数据传送到定时器的数据端口;
TCTL4=0X04;//0000 0100 :脉冲累加器T1仅在上升沿捕捉******************
TIE=0X02;//0000a 0010禁止中断; 0允许中断
TSCR2_TOI=1; //定时器溢出中断允许
}
//------------给触发电平 *****************
void SET_PULSE (void)
{
if (start_flage==0) //30us的触发电平 高于10us
{
PORTA_PA0=0; //输出
Delay1us(30);
PORTA_PA0=1; //输出30us高电平
Delay1us(30);
PORTA_PA0=0;
start_flage=1; //
test_start=1; // ******************************
test_over=0; //
}
}
//------------给触发电平结束
void check_up (void)
{
while(!((start_flage==1)&&(PTH_PTH0==1))); // 检测到上升沿,记录当前时间
time_start=0;
time_m_o=0;
TCNT=0X0000;
start_flage=2; // cap riseing edge 开始计数标志
}
////////////中断服务函数
#pragma CODE_SEG __NEAR_SEG NON_BANKED
//----------------------------------------------
void interrupt 25 h_irupt (void) //H口下降沿触发中断
{
if (start_flage == 2)
{
time_over=TCNT;
time_rising=((time_over-time_start)+time_m_o*65535)/80; // ms
time_m_o=0;
start_flage=0;
distance=(time_rising*340)/2000; //公式 //cm
TCNT=0x0000;
test_start=0;
test_over=1;
}
PIFH_PIFH0=1; ///清除中断标志位
}
//--------------------------------------------------------
void interrupt 16 Irupt_t1 (void) //计时器中断溢出
{
TFLG2_TOF=1; //清除中断标志位
if ((start_flage==2)&&(test_start==1)) //开始计数了和检验开始 给触发电平结束
{
time_m_o++;
}
}
//***************************************************************/
void interrupt 69 Irupt_pit3(void) //通道3 100ms中断,检测周期
{
PITTF_PTF3=1; //清除中断标志位
SET_PULSE();
}
#pragma CODE_SEG DEFAULT
//中断结束
//------------------------------------------------------
/////////////中断服务程序结束///////////////
void main(void)
{
SetBusCLK_64M();
PORT_ini();
ECT_ini();
PIT_ini();
PORTK_Init(); //K口,5110口
LCD_Init();
LCD_Write_String(0,0,"超声波测距");
SET_PULSE(); //给触发电平
for(;;)
{
if ((test_start==1)&&(test_over==1) )
{
SET_PULSE();
}
if(test_start==1)
{
check_up();
}
DisableInterrupts;
LCD_Write_Num(25,5,distance,5);
EnableInterrupts;
}
}
欢迎光临 智能车制作 (http://dns.znczz.com/)
Powered by Discuz! X3.2