2701|1

412

帖子

665

TA的资源

纯净的硅(中级)

楼主
 

LM3S811超声波测距(含液晶显示) [复制链接]

用LM3S811控制超声波传感器,   

下载 (46.53 KB)

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



//main.c



#include "LM3S811.h"



#include "uart1.h"



#include "uart0.h"



#include





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



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





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



function:main 函数



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



{





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



{





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 的



再贴张照片吧
 
点赞 关注

回复
举报

412

帖子

665

TA的资源

纯净的硅(中级)

沙发
 

//关于定时器的使用


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


           }


}



}   



}


 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表