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

2019-07-20 15:35发布

本帖最后由 不会发光的LED 于 2016-11-6 14:27 编辑

哇,第一篇博客竟然是在CSDN上写的,有点激动,本人大四狗,毕业设计做的是老师布置的倒车雷达系统的设计。关于倒车雷达,大家都知道我们首先要做的就是测距,准确测距是检测这个倒车雷达是否可行的唯一标准,不同于市面上的成型产品,他们可能是研究团队,或是创业团队,有雄厚的资源以及资金,咱们大学生怎么能和他们比,伤不起,东西自己掏钱买的,一块msp430g2553,一块12864的带按键的显示屏(这个是找实验室老大借的还要还回去我也是醉了),一个面包板(因为焊电路焊吐了。。。),一个HC-SR04这个大家知道吧!!!没这个做不成东西阿!然后进入正题先给一张丑照然后说说思路,这么简单就不用说了吧。。。首先给trig一个大于10微秒的激励脉冲,这个传感器就开始发出8个40kHz的超生波,如果有回波信号,echo返回一个持续时间与距离成正比的脉冲信号,所以整个过程中你只需用到定时器,时钟,这些基本的部件,最难的是这个屏,驱动很麻烦。首先给trig一个大于10微秒的激励脉冲,这个传感器就开始发出8个40kHz的超生波,如果有回波信号,echo返回一个持续时间与距离成正比的脉冲信号,所以整个过程中你只需用到定时器,时钟,这些基本的部件,最难的是这个屏,驱动很麻烦。字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。sprintf 是个变参函数,它是吧格式化的数据记录在一个缓冲区内,就像这char megstr[]字符数组,想要引用这个函数必须包含C的头文件stdio.h。。。所以我就可以在屏上打印字符了。如下有点不清楚因为在清屏
所以以上就是我要说的了,关于屏的驱动,不同的屏不一样,这里就不上传屏驱动的代码了,其实做多了,驱动都一个样,都是写指令,读数据什么的。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
不会发光的LED
1楼-- · 2019-07-20 19:57

现在上代码:

[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;  
  • }  
  • }  


一周热门 更多>