打印

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

[复制链接]
951|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
TXQDM|  楼主 | 2016-11-15 23:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
哇,第一篇博客竟然是在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。。。所以我就可以在屏上打印字符了。如下有点不清楚因为在清屏

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

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

110

主题

593

帖子

11

粉丝