msp430g2553的倒车雷达超声波测距子系统

哇,第一篇博客竟然是在CSDN上写的,有点激动,本人大四狗,毕业设计做的是老师布置的倒车雷达系统的设计。

关于倒车雷达,大家都知道我们首先要做的就是测距,准确测距是检测这个倒车雷达是否可行的唯一标准,不同于市面上的成型产品,他们可能是研究团队,或是创业团队,有雄厚的资源以及资金,咱们大学生怎么能和他们比,伤不起,东西自己掏钱买的,一块msp430g2553,一块12864的带按键的显示屏(这个是找实验室老大借的还要还回去我也是醉了),一个面包板(因为焊电路焊吐了。。。),一个HC-SR04这个大家知道吧!!!没这个做不成东西阿!

然后进入正题

先给一张丑照

msp430g2553的倒车雷达超声波测距子系统_第1张图片

然后说说思路,这么简单就不用说了吧。。。

首先给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。。。所以我就可以在屏上打印字符了。如下有点不清楚因为在清屏

msp430g2553的倒车雷达超声波测距子系统_第2张图片msp430g2553的倒车雷达超声波测距子系统_第3张图片

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


你可能感兴趣的:(msp430g2553的倒车雷达超声波测距子系统)