哇,第一篇博客竟然是在CSDN上写的,有点激动,本人大四狗,毕业设计做的是老师布置的倒车雷达系统的设计。 关于倒车雷达,大家都知道我们首先要做的就是测距,准确测距是检测这个倒车雷达是否可行的唯一标准,不同于市面上的成型产品,他们可能是研究团队,或是创业团队,有雄厚的资源以及资金,咱们大学生怎么能和他们比,伤不起,东西自己掏钱买的,一块msp430g2553,一块12864的带按键的显示屏(这个是找实验室老大借的还要还回去我也是醉了),一个面包板(因为焊电路焊吐了。。。),一个HC-SR04这个大家知道吧!!!没这个做不成东西阿! 然后进入正题 先给一张丑照 然后说说思路,这么简单就不用说了吧。。。 首先给trig一个大于10微秒的激励脉冲,这个传感器就开始发出8个40kHz的超生波,如果有回波信号,echo返回一个持续时间与距离成正比的脉冲信号,所以整个过程中你只需用到定时器,时钟,这些基本的部件,最难的是这个屏,驱动很麻烦。 现在上代码: [plain] view plain copy
- #include<msp430g2553.h>
- #include<string.h>
- #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。。。所以我就可以在屏上打印字符了。如下有点不清楚因为在清屏 所以以上就是我要说的了,关于屏的驱动,不同的屏不一样,这里就不上传屏驱动的代码了,其实做多了,驱动都一个样,都是写指令,读数据什么的。。。 |