哇,第一篇博客竟然是在CSDN上写的,有点激动,本人大四狗,毕业设计做的是老师布置的倒车雷达系统的设计。
关于倒车雷达,大家都知道我们首先要做的就是测距,准确测距是检测这个倒车雷达是否可行的唯一标准,不同于市面上的成型产品,他们可能是研究团队,或是创业团队,有雄厚的资源以及资金,咱们大学生怎么能和他们比,伤不起,东西自己掏钱买的,一块msp430g2553,一块12864的带按键的显示屏(这个是找实验室老大借的还要还回去我也是醉了),一个面包板(因为焊电路焊吐了。。。),一个HC-SR04这个大家知道吧!!!没这个做不成东西阿!
然后进入正题
先给一张丑照
然后说说思路,这么简单就不用说了吧。。。
首先给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。。。所以我就可以在屏上打印字符了。如下有点不清楚因为在清屏
所以以上就是我要说的了,关于屏的驱动,不同的屏不一样,这里就不上传屏驱动的代码了,其实做多了,驱动都一个样,都是写指令,读数据什么的。。。