智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1387|回复: 0
打印 上一主题 下一主题

关于XS128超声波模块测不到准确距离,程序如下啊

[复制链接]

7

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2517
威望
1253
贡献
724
兑换币
594
注册时间
2014-10-14
在线时间
270 小时
跳转到指定楼层
1#
发表于 2015-4-2 20:55:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 序文哥 于 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;
      
        
  
     }        
  
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-10-6 10:27 , Processed in 0.048627 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表