OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » LM3S811 使用心得 之超声波测距

共12条 1/2 1 2 跳转至

LM3S811 使用心得 之超声波测距

高工
2012-02-23 20:52:41    评分

LM3S811 使用心得二  之超声波测距

LM3S811控制超声波传感器, 超声波.png

 

计算出到障碍物的距离,并通过5110lcd显示出来 
//main.c


#include "LM3S811.h"


#include "uart1.h"


#include "uart0.h"


#include <stdio.h>




/*****************超声波数据结构声明**********************/


typedef struct suWaveData     


{



uint8 flag;



uint8 tempcmd[4];

   //温度



uint8 tempdata[2];



uint8 distcmd[4];

   //距离



uint8 distdata[2];


}suWave_t;




suWave_t suWave1={0x00,0x11,0x00,0x00,0x11,0x00,0x00,






  0x22,0x55,0x00,0x77,0x00,0x00}; //初始化超声波数据变量




/******************函数声明*********************************/


static void init_LM3S811(void);


static void delay(uint16 dly);


void   process_udata(suWave_t *pfile);




/*********************************************


functionmain 函数


input:    null


output:   null


author:  gyk


data
  2011_11_18


*********************************************/


int main(void)


{



init_LM3S811();



init_UART0(9600,2);



init_UART1(9600,3);



IntMasterEnable();



send_str_UART1("System initialization sucessful!!!\n");



send_str_UART1("Waiting for the data from URM37V3.2...\n");



for(;;)



{




send_UART0(suWave1.tempcmd,4);




delay(100);




send_UART0(suWave1.distcmd,4);




delay(100);




process_udata(&suWave1);




delay(5000);



}


}


/************************************************


function:初始化


input:    null


output:   null


author:  gyk


data
  2011_11_18


*********************************************/


static void init_LM3S811(void)


{



SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_USE_OSC|SYSCTL_OSC_MAIN|SYSCTL_XTAL_6MHZ);


}


/************************************************


function:延时


input:    dly


output:   null


author:  gyk


data
  2011_11_18


*********************************************/


static void delay(uint16 dly)


{



uint16 i;



for(;dly>0;dly--)



for(i=0;i<100;i++);


}


/************************************************


function: 超声波数据处理


input:    null


output:   null


author:  gyk


data
  2011_11_18


*********************************************/


void process_udata(suWave_t *pfile)


{



uint8 buffer[30];



uint16 tmp;



fp32   ftmp;



if(pfile->flag&&0x01)



{




if((pfile->tempdata[0]==0xFF)&&(pfile->tempdata[1]==0xFF))




{






send_str_UART1("Temperature: invalid data!\n");






return;




}






if((pfile->tempdata[0]&0xF0)==0xF0)




{




tmp=(uint16)(pfile->tempdata[0]&0xF0);




tmp<<=8;




tmp|=(uint16)pfile->tempdata[1];




ftmp=(fp32)tmp*0.1;




send_UART1(buffer,sprintf((char *)buffer,"temerature:  -%f\n",ftmp));




}




if((pfile->tempdata[0]&0xF0)==0x00)




{




tmp=(uint16)(pfile->tempdata[0]);




tmp<<=8;




tmp|=(uint16)pfile->tempdata[1];




ftmp=(fp32)tmp*0.1;




send_UART1(buffer,sprintf((char *)buffer,"temerature:  %f\n",ftmp));




}




pfile->flag&=0xFE;


}



if(pfile->flag&0x02)



{




tmp=(uint16)pfile->distdata[0];




tmp<<=8;




tmp|=pfile->distdata[1];




if(tmp==0xFFFF)




{





send_str_UART1("distance: invalid data!\n");





return;




}





send_UART1(buffer,sprintf((char *)buffer,"distance:  %f\n",tmp));





pfile->flag&=0xFD;



}




}


/************************************************


function: interrupt


input:    null


output:   null


author:  gyk


data
  2011_11_18


*********************************************/


void uart0_isr(void)


{



uint8 ch;



unsigned long ulStatus;





ulStatus=UARTIntStatus(UART0_BASE,true);



UARTIntClear(UART0_BASE,ulStatus);



if((ulStatus&UART_INT_RT)||(ulStatus&UART_INT_RX))



{




ch=UARTCharGet(UART0_BASE);




if(ch==0x11)




{





suWave1.tempdata[0]=UARTCharGet(UART0_BASE);





suWave1.tempdata[1]=UARTCharGet(UART0_BASE);





suWave1.flag|=0x01;




}




if(ch==0x022)




{





suWave1.distdata[0]=UARTCharGet(UART0_BASE);





suWave1.distdata[1]=UARTCharGet(UART0_BASE);





suWave1.flag|=0x02;




}



}


}


//uart0.h


#ifndef  _UART0_H_


#define  _UART0_H_




extern uint8 init_UART0(uint32 baudrate,uint8 prio);


extern void  send_UART0(uint8 *pbuffer,uint16 size);


extern void recv_UART0(void);


extern void  send_str_UART0(uint8 *pstr);




#endif




//uart1.h


#ifndef  _UART1_H_


#define  _UART1_H_




extern uint8 init_UART1(uint32 baudrate,uint8 prio);


extern void  send_UART1(uint8 *pbuffer,uint16 size);


extern void recv_UART1(void);


extern void  send_str_UART1(uint8 *pstr);




#endif










//uart0.c


#include"LM3S811.h"


/************************************************


function: 初始化串口0


input:    波特率,ISR优先级


output:   fasle失败,true成功


author:  gyk


data
  2011_11_18


*********************************************/


uint8 init_UART0(uint32 baudrate,uint8 prio)


{



if(baudrate>15200)



{




return FALSE;



}



SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);


    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);



GPIOPinTypeUART(GPIO_PORTA_BASE,GPIO_PIN_0|GPIO_PIN_1);



UARTConfigSetExpClk(UART0_BASE,SysCtlClockGet(),baudrate,(UART_CONFIG_WLEN_8|UART_CONFIG_STOP_ONE|UART_CONFIG_PAR_NONE));



UARTFIFOLevelSet(UART0_BASE,UART_FIFO_TX1_8,UART_FIFO_RX4_8);




    UARTIntEnable(UART0_BASE,UART_INT_RX|UART_INT_RT);



IntEnable(INT_UART0);



IntPrioritySet(INT_UART0,prio);



UARTEnable(UART0_BASE);



return TURE;


}


/************************************************


function: 串口0发送数据


input:    缓冲区大小,数据大小


output:   null


author:  gyk


data
  2011_11_18


*********************************************/


void send_UART0(uint8 *pbuffer,uint16 size)


{



uint16 i;



for(i=0;i<size;i++)



{




UARTCharPut(UART0_BASE,pbuffer);



}



while(UARTBusy(UART0_BASE));


}


/************************************************


function: 串口0发送字符串


input:    字符串指针


output:   null


author:  gyk


data
  2011_11_18


*********************************************/


void send_str_UART0(uint8 *pstr)


{



while(*pstr!='\0')




UARTCharPut(UART0_BASE,*pstr++);




while(UARTBusy(UART0_BASE));


}






//uart1.c


#include"LM3S811.h"


/************************************************


function: 初始化串口1


input:    波特率,ISR优先级


output:   fasle失败,true成功


author:  gyk


data
  2011_11_18


*********************************************/


uint8 init_UART1(uint32 baudrate,uint8 prio)


{



if(baudrate>15200)



{




return FALSE;



}



(void)prio;



SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);


    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);



GPIOPinTypeUART(GPIO_PORTD_BASE,GPIO_PIN_2|GPIO_PIN_3);



UARTConfigSetExpClk(UART1_BASE,SysCtlClockGet(),baudrate,(UART_CONFIG_WLEN_8|UART_CONFIG_STOP_ONE|UART_CONFIG_PAR_NONE));



UARTFIFOLevelSet(UART1_BASE,UART_FIFO_TX1_8,UART_FIFO_RX4_8);



UARTEnable(UART1_BASE);



return TURE;


}


/************************************************


function: 串口1发送数据


input:    缓冲区大小,数据大小


output:   null


author:  gyk


data
  2011_11_18


*********************************************/


void send_UART1(uint8 *pbuffer,uint16 size)


{



uint16 i;



for(i=0;i<size;i++)



{




UARTCharPut(UART1_BASE,pbuffer);



}



while(UARTBusy(UART1_BASE));


}


/************************************************


function: 串口1发送字符串


input:    字符串指针


output:   null


author:  gyk


data
  2011_11_18


*********************************************/


void send_str_UART1(uint8 *pstr)


{



while(*pstr!='\0')




UARTCharPut(UART1_BASE,*pstr++);




while(UARTBusy(UART1_BASE));


}

下载 (46.53 KB)
2011-11-22 18:25



关键词: LM3S811     使用     心得     超声波     测距     uint    

高工
2012-02-23 20:53:32    评分
2楼

 

1.jpg


高工
2012-02-23 20:54:09    评分
3楼

//关于定时器的使用


void  SysClockInit_40M(void)


{



SysCtlLDOSet( SYSCTL_LDO_2_75V);


    SysCtlDelay(SysCtlClockGet()/3000);
                                                     //延时1ms,稳定芯片用



SysCtlClockSet(SYSCTL_SYSDIV_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ);   //5分频,PLL设置时钟为40M



SysCtlDelay(SysCtlClockGet()/3000);













//延时1ms,稳定芯片用



SysCtlLDOSet( SYSCTL_LDO_2_50V);


}


 


void Timer0A_ISR(void)


{


     TimerIntClear(TIMER0_BASE,TIMER_TIMA_TIMEOUT );

//清除中断源


 


     counter++;   










//处理过程


 


     void TimerEnable(TIMER0_BASE, Timer_A);
             //使能定时器


}


 


int main(void)


{


 


    SysClockInit_40M();


 



SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);           //使能定时器0


 



SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);


// 使能PA端口


 


 


    GPIOPinTypeGPIOInput(GPIO_PORTA_BASE, GPIO_PIN_0);

// 设置PA0为超声波的echo管脚


 



GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_1 );
// 设置PA1为超声波的trig管脚


 


 


 


/*************************************关于定时器中断的设置**********************************/


    TimerConfigure(TIMER0_BASE, TIMER_CFG_16_BIT_PAIR|TIMER_CFG_A_PERIODIC);   //配置成16位周期定时器,使用定时器A


 


    void TimerLoadSet(TIMER0_BASE,  Timer_A, unsigned long ulValue);

   //设置定时器初始值


 



void TimerIntRegister(TIMER0_BASE,  Timer_A,void Timer0A_ISR(void));
   //声明定时器A的中断处理函数   


 


    void TimerEnable(TIMER0_BASE, Timer_A);
                                   //使能定时器


 



void TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
                   //使能中断,设置为定时器A的溢出中断


 


//
GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_1,GPIO_PIN_1);


 


//
GPIOPinRead(GPIO_PORTC_BASE, GPIO_PIN_0);


 



while(1)



{




GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_1,GPIO_PIN_1);
//trig口设置高电平信号,启动超声波传感器


        SysCtlDelay(SysCtlClockGet()/3000/50);




//高电平持续 20US




GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_1,~GPIO_PIN_1);
//trig口置低电平



    TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);




flag=0;












//设置标志位,方便对超声波传感器的控制




while(flag==0)


        {
if(GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_0)==0)




   { SysCtlIntDisable(TIMERA_BASE, TIMER_TIMA_TIMEOUT);     //关闭中断





  distance=counter;





  counter=0;





  flag=1;





  while(GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_0)==0);    //等待超声波的echo端口转变为高电平,表示一次测距结束


           }


}



}   


 


}


专家
2012-02-23 22:52:28    评分
4楼
支持一下!!

高工
2012-02-24 08:36:44    评分
5楼
这个设计的好,有没有完整的资料。

工程师
2012-02-24 09:24:04    评分
6楼
最好还是有个附件吧,在IAR下看要方便些

高工
2012-02-24 12:03:45    评分
7楼
3q

高工
2012-02-24 12:04:47    评分
8楼

硬件电路就那样嘛


高工
2012-02-24 12:05:24    评分
9楼

我用的是keil


高工
2012-02-24 19:04:16    评分
10楼
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);



GPIOPinTypeUART(GPIO_PORTD_BASE,GPIO_PIN_2|GPIO_PIN_3);



UARTConfigSetExpClk(UART1_BASE,SysCtlClockGet(),baudrate,(UART_CONFIG_WLEN_8|UART_CONFIG_STOP_ONE|UART_CONFIG_PAR_NONE));



UARTFIFOLevelSet(UART1_BASE,UART_FIFO_TX1_8,UART_FIFO_RX4_8);



UARTEnable(UART1_BASE);



return TURE;


}


/************************************************


function: 串口1发送数据


input:    缓冲区大小,数据大小


output:   null


author:  gyk


data
  2011_11_18


*********************************************/


void send_UART1(uint8 *pbuffer,uint16 size)


{



uint16 i;



for(i=0;i<size;i++)



{




UARTCharPut(UART1_BASE,pbuffer);



}



while(UARTBusy(UART1_BASE));


}


/************************************************


function: 串口1发送字符串


input:    字符串指针


output:   null


author:  gyk


data
  2011_11_18


*********************************************/


void send_str_UART1(uint8 *pstr)


{



while(*pstr!='\0')




UARTCharPut(UART1_BASE,*pstr++);




while(UARTBusy(UART1_BASE));


}


共12条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]