1986|0

3836

帖子

19

TA的资源

纯净的硅(中级)

楼主
 

msp430g2553的倒车雷达超声波测距子系统 [复制链接]

     首先给trig一个大于10微秒的激励脉冲,这个传感器就开始发出8个40kHz的超生波,如果有回波信号,echo返回一个持续时间与距离成正比的脉冲信号,所以整个过程中你只需用到定时器,时钟,这些基本的部件,最难的是这个屏,驱动很麻烦。
   #include  
#include  
#include "stdio.h"  
#include "lcd.h"  
#include "key.h"  

/***************    电源接法    *****************  
* VCC --- 液晶复位 pin11  
* VCC --- 液晶电源 pin2  
* GND --- 液晶电源 pin4  
************************************************/  

#define uchar unsigned char   
#define uint  unsigned int  
#define ulong unsigned long  

void measure_width(void);  
void delayUs(uint z);  

//测量参数定义  
uint pwm_start,pwm_end,pwm_wide=0;  
uint flag_width=0,overflow;  
uint freq_flag,freq_cnt,timer0_overflow=0,timer1_cnt=0,end=0;  
char msgstr[32];  

//主函数  
void main(void)  
{  
  WDTCTL=WDTPW+WDTHOLD;  
  BCSCTL1=CALBC1_1MHZ;  
  DCOCTL=CALDCO_1MHZ;//SMCLK时钟源选择1MHZ  
  LCD_init();  
  KeyPort_Init();  
  uint num=0;  
  P1DIR |= BIT0;//P1.0作为输出口连接trig  
  P1OUT |= BIT0;  
  P1DIR |= BIT1;  
  P1OUT &= ~ BIT1;  
  LCD_drawStrAt("this is a test",16,0,0);  
  while(1)  
  {  
    num=KeyScan();  
    switch(num)  
    {  
    case 1:  
      while(1)  
      {  
      P1OUT |= BIT0;  
      delayUs(12);  
      P1OUT &= ~BIT0;  
      measure_width();  
      LCD_clear();  
      //LCD_drawStrAt("distance:",1,0,0);  
      sprintf(msgstr,"distance=%d cm",pwm_wide/58);  
      LCD_drawStrAt(msgstr,16,0,0);  
      delayUs(200);  
      }  
      break;  
    case 2:  
    LCD_clear();  
    LCD_drawStrAt("botton 1 useful",16,0,0);  
     
    //sprintf(msgstr,"number=%d",a);  
    //LCD_drawStr(msgstr,strlen(msgstr));  
   // LCD_drawStrAt(msgstr,16,0,0);  
    //LCD_drawCharAt(a,1,1);  
    break;  
    default: break;  
    }  
  }  

}  

void delayUs(uint z)   
{  
while(z--);  
}  

void measure_width(void)  
{     
flag_width=1;  
P1SEL|=BIT2;//P1.1 CCI1A  
P1DIR&=~BIT2;  
P1REN|=BIT2;  
CCTL1=CAP+CM_1+CCIS_0+SCS+CCIE;//捕获模式,上升沿捕获,选择CCI1A,同步,捕获中断开  
TA0CTL=TASSEL_2+MC_2+TACLR+TAIE;//SMCLK=1M,连续计数模式  
_EINT();  
while(flag_width);  
pwm_wide=pwm_end-pwm_start+65536*overflow;  
}  

#pragma vector=TIMER0_A1_VECTOR  
__interrupt void timer_A(void)  
{   
switch(TA0IV)//向量查询  
{  
case 2:  //捕获中断  
if(flag_width==1)  
{  
if(CCTL1&CM0)    //上升沿  
{  
CCTL1=(CCTL1&(~CM0))|CM1;//更变为下降沿触发  
pwm_start=TAR;//记录初始时间  
overflow=0;//溢出计数变量复位  
}  
else if(CCTL1&CM1)//下降沿  
{  
CCTL1=(CCTL1&(~CM1))|CM0;//更改设置为上升沿触发  
pwm_end=TAR;//用start,end,overflow计算脉冲宽度  
flag_width=0;  
}  
}  
break;//CCR1  
case 4:break;//CCR2  
case 10:  
{  
if(freq_flag==1)  
timer0_overflow++;  
else if(flag_width==1)  
overflow++;  
}  

break;  
}  
}  
以上是主函数部分,这里要注意一下这个sprintf()的用法
字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。sprintf 是个变参函数,它是吧格式化的数据记录在一个缓冲区内,就像这char megstr[]字符数组,想要引用这个函数必须包含C的头文件stdio.h。。。所以我就可以在屏上打印字符了。如下有点不清楚因为在清屏

所以以上就是我要说的了,关于屏的驱动,不同的屏不一样,这里就不上传屏驱动的代码了,其实做多了,驱动都一个样,都是写指令,读数据什么的。。。
 
点赞 关注

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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