找回密码
 注册
关于网站域名变更的通知
查看: 302|回复: 3
打印 上一主题 下一主题

msp430超声波测距思路

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-12-2 11:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 nuiga 于 2021-12-2 11:21 编辑 - l+ D' D2 C# {' D3 r9 w- r9 q
- \$ V8 Y) i/ |; v
LCD初始化,显示LOGO;+ i$ h2 H% f9 W+ M! U0 F6 |/ |
给超声波模块一个触发信号;0 T, E1 m( p( [9 E) V
检测超声波模块的输出信号,如果监测为高,启动定时器计时;如果检测为低,关闭定时器;0 C# l0 C7 [) h9 X
根据定时器计时时间和公式算出距离;' r/ c' O: [, p
将距离送给LCD显示;' l% ^9 u' H' P3 f( Y
5 O& [& E+ I( D1 T, \
RS(CS)片选信号=P3.0 = 1;3 Q! e* B9 J( m4 S2 X0 L
WR(SID) = P3.1;//数据
/ Z4 f) P0 G  W# N: Z/ b9 MEN(SCLK) = P3.2;//时钟
2 o) o( k( f  ~+ sCS1(PSB) = P6.2;//接地,串行模式
( q- E" R+ ~& }( w  H: ~1 N/ x
1 \/ p$ a( |0 i/ Q* k' u单片机源程序:
+ g. G+ {: j. S1 i7 n
  • #include  <msp430x14x.h>
  • #include "12864.h"
  • uchar Edge=1;//当前触发沿
  • uint RiseCapVal;   //上升沿时刻捕获值存放变量
  • uint TA_OveRFlow_Cnt; //TA溢出次数存放变量,可能距离远超过65535
  • unsigned long int Period;   //脉宽存放结果变量,高电平时间
  • unsigned long int S;       // 定义距离长度,单位厘米
  • void Conut(void)
  •     {
  •        disbuff[1]=S%1000/100;
  •        disbuff[2]=S%1000%100/10;
  •        disbuff[3]=S%1000%10 %10;
  •        LCD_set_xy( 3, 4 );
  •        LCD_Write_number(disbuff[1]);
  •        LCD_Write_number(12);
  •        LCD_set_xy( 3, 5 );
  •        LCD_Write_number(disbuff[2]);
  •        LCD_Write_number(disbuff[3]);
  •       }
  • #pragma vector=TIMERA1_VECTOR
  • __interrupt void Timer_A(void)
  • {
  •   switch(TAIV)
  •   {
  •     case 2 :if(Edge==RISE)
  •               {
  •                 RiseCapVal = TACCR1;
  •                 TACCTL1 |= CAP+CM_2+CCIS_1+SCS+CCIE;//改为下降沿捕获
  •                 Edge = FALL;//下降沿捕获标志
  •               }
  •             else
  •               {
  •                 //_DINT();
  •                 Period = TACCR1-RiseCapVal;  //这里要注意是否考虑溢出,跟测试距离有关,希望大家拓展
  •                 S=(Period*17)/100;   // 距离计算 s=340m/s*Period/2*10^(-6)*1000(mm)
  •                 TACCR1 = 0;
  •                 TACCTL1|= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
  •                 Edge = RISE;//上升沿捕获标志
  •                 //_EINT();
  •               }
  •              break;
  •     case 4 : break;
  •     case 10: TA_Overflow_Cnt++;   //溢出标志
  •              break;
  •   }
  • }
  • void init_timerA(void)
  • {
  •   TACTL   |= TASSEL_2+MC_2+TAIE+TACLR+ ID_3;//SMCLK,8MHz,8分频,连续计数,中断允许,计数器清零
  •   TACCTL1 |= CAP+CM_3+CCIS_0+SCS+CCIE;//捕获模式,上升沿下降沿都捕获(CM_3),CCI1A输入,同步捕获,中断允许
  • }
  • void init_IO(void)
  • {
  •   P1DIR |= BIT1;   //P1.1输出,普通I/O
  •   P1DIR &=~ BIT2;  //P1.2输入
  •   P1SEL |=  BIT2; //P1.2第二功能,捕获输入
  •   P1OUT &=~BIT1;  // 开始低电平,控制驱动波形发生
  • }
  • void init_clk(void)
  • {
  •     uchar i;
  •     BCSCTL1&=~XT2OFF;   //打开XT振荡器
  •     BCSCTL2|=SELM_2+SELS;//MCLK 8M and SMCLK 8M
  •     do
  •     {
  •       IFG1 &= ~OFIFG;//清除振荡错误标志
  •       for(i = 0; i < 0xff; i++)  _NOP();//延时等待
  •     }
  •     while ((IFG1 & OFIFG) != 0);//如果标志为1继续循环等待晶振起振
  •     IFG1&=~OFIFG;
  • }
  • void main(void)
  • {
  •     /*下面六行程序关闭所有的IO口*/
  •     P1DIR = 0XFF; P1OUT = 0XFF;
  •     P2DIR = 0XFF; P2OUT = 0XFF;
  •     P3DIR = 0XFF; P3OUT = 0XFF;
  •     P4DIR = 0XFF; P4OUT = 0XFF;
  •     P5DIR = 0XFF; P5OUT = 0XFF;
  •     P6DIR = 0XFF; P6OUT = 0XFF;
  •     WDTCTL = WDTPW + WDTHOLD;            //关闭看门狗
  •     P6DIR |= BIT2; P6OUT |= BIT2;         //关闭电平转换
  •     P6DIR |= BIT3; P6OUT |= BIT3;         //关闭电平转换
  •     Ini_Lcd();
  •     Disp_img(logo);   //显示欢迎使用本产品LOGO
  •     delay_Nms(1000);
  •     Ini_Lcd();
  •     Lcd_Mark2();
  •     init_clk();
  •     init_IO();           //初始端口设置
  •     _EINT();               //开全局中断
  •     while(1)
  •     {
  •        init_timerA();
  •        P1OUT |= BIT1;    // P1.1 高电平,超过10us
  •        delay_Nms(100);
  •        P1OUT &=~BIT1;
  •        delay_Nms(80);
  •        Conut();
  •        delay_Nms(80);       //80MS
  •     }
  • }
    4 i8 q& \2 ^( X7 z6 B' O

0 s' `1 D# \  D7 ~6 G+ ^. W5 s3 l

7 C: v7 M# w5 L$ G" u4 V0 f6 @* `9 f- ~

该用户从未签到

2#
发表于 2021-12-2 13:08 | 只看该作者
如果检测为低,关闭定时器

该用户从未签到

3#
发表于 2021-12-2 13:08 | 只看该作者
定时中断做的, |: s! G: F4 U3 o

该用户从未签到

4#
发表于 2021-12-2 13:08 | 只看该作者
检测超声波模块的输出信号,如果监测为高,启动定时器计时
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-21 11:42 , Processed in 0.093750 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表