打印

LM3S811 使用心得二 之超声波测距(含液晶显示)

[复制链接]
4809|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nwx8899|  楼主 | 2011-11-20 13:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 nwx8899 于 2011-11-22 18:26 编辑

LM3S811 使用心得二  之超声波测距(含液晶显示)



LM3S811控制超声波传感器,
计算出到障碍物的距离,并通过5110lcd显示出来(这里关于5110的显示程序是效仿楼上 baixichi 兄的心得)。主要就把超声波测距的程序贴一下:

//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));

}



//lcd.c  lcd.h

//仿照baixichi

再贴张照片吧











超声波传感器原理.pdf (349.56 KB) 超声波测距.zip (1.2 KB)








2.jpg (1.44 MB )

2.jpg

1.jpg (121.21 KB )

1.jpg

相关帖子

沙发
nwx8899|  楼主 | 2011-11-20 13:01 | 只看该作者
1# nwx8899
超出范围了

使用特权

评论回复
板凳
nwx8899|  楼主 | 2011-11-20 13:02 | 只看该作者
1# nwx8899
//关于定时器的使用

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端口转变为高电平,表示一次测距结束

           }

}


}   


}


使用特权

评论回复
地板
fengzhongfeiwu| | 2011-11-20 19:19 | 只看该作者
2# nwx8899
图不错

使用特权

评论回复
5
nwx8899|  楼主 | 2011-11-20 21:07 | 只看该作者
4# fengzhongfeiwu  分全给你了

使用特权

评论回复
6
shuaijing| | 2011-11-21 21:48 | 只看该作者
好难哦,分享了

使用特权

评论回复
7
nwx8899|  楼主 | 2011-11-23 12:36 | 只看该作者
6# shuaijing :handshake

使用特权

评论回复
8
baixichi| | 2011-11-29 11:09 | 只看该作者
这个超声波的模块之前见朋友用过,如果用作蔽障的话,勉强可以,不过仍有很多盲区。如果想做测距,建议买一个精确点的模块。。。

使用特权

评论回复
9
tianm| | 2011-11-29 12:48 | 只看该作者
拍个整体就好了 包括被测距离的物体

使用特权

评论回复
10
nwx8899|  楼主 | 2011-11-29 13:01 | 只看该作者
9# jingshuai 参考书的

使用特权

评论回复
11
nwx8899|  楼主 | 2011-11-29 13:01 | 只看该作者
10# tianm 手在前面,传感器在边上

使用特权

评论回复
12
fengzhongfeiwu| | 2011-12-14 11:50 | 只看该作者
难啊

使用特权

评论回复
13
nwx8899|  楼主 | 2011-12-14 16:44 | 只看该作者
。。。

使用特权

评论回复
14
sqcumt123| | 2011-12-20 15:13 | 只看该作者
好复杂啊,基本没怎么看懂,得好好学习一下

使用特权

评论回复
15
勤勉务实| | 2012-5-13 22:11 | 只看该作者
新手学习了!谢谢!

使用特权

评论回复
16
拿起书本| | 2012-5-13 22:23 | 只看该作者
我前两年也搞过,不过这东西放到室外需要作的处理太多了,实验室的东西不能用。

使用特权

评论回复
17
jxmzzr| | 2012-5-13 22:58 | 只看该作者
超声波物位移还算不错,呵呵。楼主也的也不错。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名: 宁静致远

61

主题

805

帖子

2

粉丝