當前位置:編程學習大全網 - 編程語言 - 求壹個cc2530 超聲波模塊測距的程序

求壹個cc2530 超聲波模塊測距的程序

#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(uint n);

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>

#include "Ultrasound.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;

}

××××××××××××××××××××××××××××××××××××××

#include <ioCC2530.h>

#include "Ultrasound.h"

void main(void)

{

while(1)

{

UltrasoundRanging(LoadRegBuf);

Delay_1s(1);

data=256*H2+L2-L1-256*H1;

distance=(float)data*340/10000;

Delay_1s(2);

};

}

  • 上一篇:電動、液動、氣動執行器之間的區別
  • 下一篇:上海交大教授名單
  • copyright 2024編程學習大全網