智能车制作

标题: 大神帮我看看HC-SR04超声波探测程序的问题 [打印本页]

作者: 孤旅人    时间: 2015-3-23 14:30
标题: 大神帮我看看HC-SR04超声波探测程序的问题
#include <hidef.h>           /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#include <MC9S12XS128.h>
// echo连接的是PA1
//trig连接的是PA0


unsigned char a=0,s;
void PIT(void)     //PIT初始化子程序
   {

  PITCFLMT = 0x00;  //禁止PIT模块

  PITMUX_PMUX0 = 1;    //定时器通道使用Base Timer0(微定时基准0)
  PITMTLD0 = 0x01;    //设置8位微定时装载寄存器0初值(8位计数器初值)
  PITLD0 = 0x0078;    //设置16位微定时装载寄存器0初值(16位计数器初值)
  PITCFLMT =0x80;     //使能PIT模块
  PITCE_PCE0 = 1;   //使能定时器通道0
  PITINTE = 0x01;     //使能PIT定时器通道0中断
   //5us计时

  }

#pragma CODE_SEG __NEAR_SEG NON_BANKED        //中断服务子程序
interrupt VectorNumber_Vpit0 void PIT_ISR(void)
{                                 

   if(PITTF_PTF0 == 1)
    PITTF_PTF0 = 1;    //清除标志位
    a++;

}
#pragma CODE_SEG DEFAULT

void IO_INIT()//初始化端口
{
   DDRA = 0x01;
   PORTA = 0x00;


}

void delay(unsigned int loop_times)                 //延时10us程序
{
unsigned int loop_i,loop_j;
for(loop_i=0;loop_i<loop_times;loop_i++)
{for(loop_j=0;loop_j<38;loop_j++)
  ;
}
}


void signal() //超声波触发信号
{

    PORTA_PA0 = 1;     
    PORTA_PA2 = 1;
    delay(1);
    PITINTE = 0x00;//关闭定时器
    PORTA_PA0 = 0;//拉低电位
    a = 0;  //计时清0
}  

void distance() //测试距离
{

    while(!(PORTA_PA1 == 1))//程序一直 卡死在这里
    {
        ;
    }      
    PITINTE = 0x01;
    while(!(PORTA_PA1 == 0))
    {
        ;
    }
    PITINTE = 0x00;   
    s =a * 17/20;   //a每5us增加一次
}
/***************************************************
** 函数名称: PLL_Init
** 功能描述: 时钟初始化函数
** 说明:     总线时钟选定24M
****************************************************/
void PLL_Init(void)
{
  CLKSEL=0x00;
  SYNR=0XC0 | 0X05;
  REFDV=0XC0 | 0X03;
  PLLCTL_PLLON=1;
  POSTDIV=0X00;
  asm(nop);
  asm(nop);
  while(0==CRGFLG_LOCK); //锁相环锁定
  CLKSEL_PLLSEL=1; //选定PLL时钟
}


void SCI0_Init()  //串口初始化
{
SCI0BDL = (byte)((24000000 /* OSC freq /2*/) / 9600 /* baud rate */ / 16 /*factor*/);
SCI0CR1 = 0X00;                                      /*normal,no parity*/
SCI0CR2 = 0X2C;                                      /*RIE=1,TE=1,RE=1, */
}

void SCI_Write(unsigned char sendchar)  串口发送数据
{
    while (!(SCI0SR1&0x80));
    SCI0DRH=0;
    SCI0DRL=sendchar;
}




void main(void) {



     DisableInterrupts;
     IO_INIT();
     PLL_Init();
     SCI0_Init();
     PIT();

           EnableInterrupts;
  //-------------------//




  for(;;) {


        signal();
        distance();

        SCI_Write(s);



  }

}

经过我单步调试发现问题就是echo接收不到高电平,HC-SR04模块我也有换过,应该不是模块问题,求大神 支支招!!!



作者: 空有一人    时间: 2015-3-23 14:37
:):)
作者: 村口张si傅    时间: 2015-3-23 16:22
128的话用输入捕捉吧
作者: 天涯博弈    时间: 2015-3-26 15:18
试试这个                              #include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#define TIMER  2         
#define TRING  PTP_PTP0   //控制端   
#define ECHO   PTP_PTP1   //接收端     
  int time;
//---------------------------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;
  PLLCTL_PLLON=1;   //turn on PLL
  SYNR =0xc0 | 0x07;  //80M                     
  REFDV=0x80 | 0x01;
  
  POSTDIV=0x00;       //pllclock=2*16*(1+SYNR)/(1+REFDV)=xxMHz;
  
  while(CRGFLG_LOCK!=1);//Wait Till VCO Run Stable
  CLKSEL_PLLSEL=0x01;//PLLCLK Enabled,Bus Clock=PLLCLK/2=24M
  
}
   
/*IO口初始化*/   
void IO_Init(void)   
{   
    DDRP = 0x01;     //A0输出,A1输入     
}   
        
   
/*PIT初始化,实现10US定时*/      
void PIT_Init(void)        
{      
   PITCFLMT_PITE = 0;  //定时中断通道0关        
   PITCE_PCE0 = 1; //定时器通道0使能  
   PITMUX_PMUX0=0;      
   PITMTLD0 = 16 - 1; //8位定时器初值设定,160分频        
    PITLD0 = TIMER - 1;   //16位定时器初值设定,TIMER*10us        
   PITINTE_PINTE0 = 1; //定时器中断通道0中断使能        
     //定时器通道0使能关        
}      
      
void main(void)        
{   
     int t;
   double dis;   
      
   IO_Init();        //IO初始化   
   PIT_Init();       //PIT初始化        
   EnableInterrupts; //开中断      
      
   /*等待200us使超声波模块初始化完毕*/   
   Delay1us(200);   
   
   while (1)   
   {   
       /*给控制端一个超过10US的高电平,然后置低*/   
       TRING = 1;   
       Delay1us(20);        
       TRING = 0;   
           time=900;
       /*等待接收端产生高电平并计时*/   
       while (!ECHO);
       PITCFLMT_PITE =1;
         
       while (ECHO);
      PITCFLMT_PITE =0;
        t=900-time;   
       dis = 0.17*t*0.5;
       Delay1ms(100);          }        
}     
      
/*PIT定时中断*/      
#pragma CODE_SEG __NEAR_SEG NON_BANKED        
void interrupt 66 PIT0(void)        
{      
   PITTF_PTF0 = 1; //清中断标志位     
   --time;      
}  
#pragma CODE_SEG DEFAULT




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2