MC9S12XS128实现超声波测距

先来说说超声波测距模块的引脚:

 

VCC,  ECHO(接收端),   TRING(控制端),  OUT(悬空),  GND

时序图:

 

参考代码:

开发环境:Freescale Codewarrior 5.0

/*  
*          Authour: flyreally  
*  
*自己写的一个超声波测距的模块,用查询方式做的,  
*当然也可以用中断了  
*  
*/  
  
#include <hidef.h>      /* common defines and macros */   
#include <MC9S12XS128.h>     /* derivative information */   
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"   
    
/*可以通过更改TIMER的值来实现不同时间的定时,     
定时长为TIMER * 10us*/      
#define TIMER  1        
#define TRING  PORTA_PA0    //控制端   
#define ECHO   PORTA_PA1    //接收端    
  
ulong time = 0;   
  
/* n * 10us延时*/  
void Delay_Us(ulong n)   
{   
    time = n;   
    while (time);   
}   
  
/*IO口初始化*/  
void IO_Init(void)   
{   
    DDRA = 0x02;     //A0输出,A1输入    
}   
        
  
/*PIT初始化,实现10US定时*/      
void PIT_Init(void)       
{       
    PITCFLMT_PITE = 0;  //定时中断通道0关       
    PITCE_PCE0 = 1; //定时器通道0使能       
    PITMTLD0 = 160 - 1; //8位定时器初值设定,160分频       
    PITLD0 = TIMER - 1;   //16位定时器初值设定,TIMER*10us       
    PITINTE_PINTE0 = 1; //定时器中断通道0中断使能       
    PITCFLMT_PITE = 1;  //定时器通道0使能       
}       
      
void main(void)       
{   
    ulong t;   
    double dis;   
  
    IO_Init();        //IO初始化   
    PIT_Init();       //PIT初始化       
    EnableInterrupts; //开中断     
      
    /*等待200us使超声波模块初始化完毕*/  
    Delay_Us(20);   
  
    while (1)   
    {   
        /*给控制端一个超过10US的高电平,然后置低*/  
        TRING = 1;   
        Delay_Us(2);       
        TRING = 0;   
  
        /*等待接收端产生高电平并计时*/  
        while (!ECHO);   
        time = 0xff;   
        while (ECHO);   
        t = 0xff - time;     //计时   
        dis = 1.7 * t;       //计算距离   
        //延时10MS,这个的原因大家看时序图,不同的硬件不同   
        Delay_Us(1000);          }       
}       
      
/*PIT定时中断*/      
#pragma CODE_SEG __NEAR_SEG NON_BANKED       
void interrupt 66 PIT0(void)       
{       
    PITTF_PTF0 = 1; //清中断标志位    
    --time;      
}     

你可能感兴趣的:(timer,IO,delay,macros)