CC2530+HCSR04超聲波測距

  • hcsr04.h
#include <ioCC2530.h> 
#include <stdio.h>
#ifndef ULTRASOUND_H 
#define ULTRASOUND_H 

#define uchar unsigned char 
#define uint unsigned int 

#define TRIG P1_3    //P1_2    
#define ECHO P0_7    //P0_1 
 
extern uchar RG; 
extern  uchar H1; 
extern  uchar L1; 
extern  uchar H2; 
extern  uchar L2; 
extern  uchar H3; 
extern  uchar L3; 
extern  uint data; 
extern  float distance; 
extern  uchar LoadRegBuf[4]; 

 void Delay_1us(uint microSecs); 
 void Delay_10us(uint n); 
 void Delay_1s(uint n); 
 void SysClkSet32M(); 
 void Init_UltrasoundRanging(); 
 void UltrasoundRanging(uchar *ulLoadBufPtr); 
  __interrupt void P0_ISR(void); 
#endif

//×××××××××××Ultrasound.c****************************
#include <ioCC2530.h> 
uchar RG; 
uchar H1; 
uchar L1; 
uchar H2; 
uchar L2; 
uchar H3; 
uchar L3; 
uint  data; 
float distance; 
 
uchar LoadRegBuf[4];//全局數據,用以存儲定時計數器的值。 

void Delay_1us(uint microSecs) 
{  while(microSecs--) 
  {    /* 32 NOPs == 1 usecs 因爲延時還有計算的緣故,用了31個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"); 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 Delay_10us(uint n) 
{ /* 320NOPs == 10usecs 因爲延時還有計算的緣故,用了310個nop*/ 
    uint tt,yy; 
    for(tt = 0;tt<n;tt++); 
    for(yy = 310;yy>0;yy--); 
    {asm("NOP");} 
} 
 
void Delay_1s(uint n) 
{       uint ulloop=1000; 
        uint tt; 
    for(tt =n ;tt>0;tt--); 
    for( ulloop=1000;ulloop>0;ulloop--) 
    { 
          Delay_10us(100); 
        } 
 
} 

void SysClkSet32M() 
 { 
    CLKCONCMD &= ~0x40;         //設置系統時鐘源爲32MHZ晶振 
    while(CLKCONSTA & 0x40);     //等待晶振穩定 
    CLKCONCMD &= ~0x47;        //設置系統主時鐘頻率爲32MHZ 
                               //此時的CLKCONSTA爲0x88。即普通時鐘和定時器時鐘都是32M。      
  } 
 
 void Init_UltrasoundRanging() 
 {  
    P1DIR = 0x08;     //0爲輸入1爲輸出  00001000  設置TRIG P1_3爲輸出模式 
    TRIG=0;           //將TRIG 設置爲低電平 
    
    P0INP &= ~0x80;   //有上拉、下拉 有初始化的左右 
    P0IEN |= 0x80;    //P0_7 中斷使能 
    PICTL |= 0x01;    //設置P0_7引腳,下降沿觸發中斷   
    IEN1 |= 0x20;      // P0IE = 1; 
    P0IFG = 0;  

} 
 
 void UltrasoundRanging(uchar *ulLoadBufPtr) 
 {   
     SysClkSet32M(); 
     Init_UltrasoundRanging(); 
     EA = 0; 
     TRIG =1; 
      
     Delay_1us(10);     //需要延時10us以上的高電平 
     TRIG =0; 
 
     T1CNTL=0; 
     T1CNTH=0; 
      
     while(!ECHO);  
     T1CTL = 0x09;      //通道0,中斷有效,32分頻;自動重裝模式(0x0000->0xffff); 
     L1=T1CNTL;  
     H1=T1CNTH;   
     *ulLoadBufPtr++=T1CNTL; 
     *ulLoadBufPtr++=T1CNTH; 
      EA = 1;  
      Delay_10us(60000);     
      Delay_10us(60000);  
  
 } 

#pragma vector = P0INT_VECTOR 
 __interrupt void P0_ISR(void) 
 { 
         EA=0;  
         T1CTL = 0x00;  
         LoadRegBuf[2]=T1CNTL;  
         LoadRegBuf[3]=T1CNTH;  
         L2=T1CNTL;  
         H2=T1CNTH;  
          
        if(P0IFG&0x080)          //外部ECHO反饋信號 
        {    
         P0IFG = 0;        
        } 
        T1CTL = 0x09;  
         T1CNTL=0; 
         T1CNTH=0; 
        P0IF = 0;             //清中斷標誌 
        EA=1; 
 } 

 

  • hcsr04.c
#include <ioCC2530.h> 
#include <stdio.h>
#include "hcsr_04.h"
#define ULTRASOUND_H 
#define uchar unsigned char 
#define uint unsigned int 
extern float getDistance(void); 
float getDistance(void) 
{ 
  UltrasoundRanging(LoadRegBuf); 
  Delay_1s(1); 
  data=256*H2+L2-L1-256*H1;  
  distance=(float)data*340/10000; 
  Delay_1s(5);
  return distance;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章