1447|0

1140

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

msp430超声波测距思路 [复制链接]

本帖最后由 灞波儿奔 于 2019-10-10 09:46 编辑
LCD初始化,显示LOGO;
给超声波模块一个触发信号;
检测超声波模块的输出信号,如果监测为高,启动定时器计时;如果检测为低,关闭定时器;
根据定时器计时时间和公式算出距离;
将距离送给LCD显示;
                LCD128-64
RS(CS)片选信号=P3.0 = 1;
WR(SID) = P3.1;//数据
EN(SCLK) = P3.2;//时钟
CS1(PSB) = P6.2;//接地,串行模式

单片机源程序:
  1. #include  <msp430x14x.h>
  2. #include "12864.h"
  3. uchar Edge=1;//当前触发沿
  4. uint RiseCapVal;   //上升沿时刻捕获值存放变量
  5. uint TA_Overflow_Cnt; //TA溢出次数存放变量,可能距离远超过65535
  6. unsigned long int Period;   //脉宽存放结果变量,高电平时间
  7. unsigned long int S;       // 定义距离长度,单位厘米
  8.  
  9.  
  10. void Conut(void)
  11.     {
  12.  
  13.        disbuff[1]=S%1000/100;
  14.        disbuff[2]=S%1000%100/10;
  15.        disbuff[3]=S%1000%10 %10;
  16.        LCD_set_xy( 3, 4 );
  17.        LCD_Write_number(disbuff[1]);
  18.        LCD_Write_number(12);
  19.        LCD_set_xy( 3, 5 );
  20.        LCD_Write_number(disbuff[2]);
  21.        LCD_Write_number(disbuff[3]);
  22.  
  23.  
  24.  
  25.       }
  26.  
  27. #pragma vector=TIMERA1_VECTOR
  28. __interrupt void Timer_A(void)
  29. {
  30.  
  31.   switch(TAIV)
  32.   {
  33.     case 2 :if(Edge==RISE)
  34.               {
  35.                 RiseCapVal = TACCR1;
  36.                 TACCTL1 |= CAP+CM_2+CCIS_1+SCS+CCIE;//改为下降沿捕获
  37.                 Edge = FALL;//下降沿捕获标志
  38.               }
  39.             else
  40.               {
  41.  
  42.                 //_DINT();
  43.                 Period = TACCR1-RiseCapVal;  //这里要注意是否考虑溢出,跟测试距离有关,希望大家拓展
  44.                 S=(Period*17)/100;   // 距离计算 s=340m/s*Period/2*10^(-6)*1000(mm)
  45.                 TACCR1 = 0;
  46.                 TACCTL1|= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
  47.                 Edge = RISE;//上升沿捕获标志
  48.                 //_EINT();
  49.               }
  50.              break;
  51.     case 4 : break;
  52.     case 10: TA_Overflow_Cnt++;   //溢出标志
  53.              break;
  54.   }
  55. }
  56.  
  57.  
  58. void init_timerA(void)
  59. {
  60.   TACTL   |= TASSEL_2+MC_2+TAIE+TACLR+ ID_3;//SMCLK,8MHz,8分频,连续计数,中断允许,计数器清零
  61.   TACCTL1 |= CAP+CM_3+CCIS_0+SCS+CCIE;//捕获模式,上升沿下降沿都捕获(CM_3),CCI1A输入,同步捕获,中断允许
  62. }
  63.  
  64. void init_IO(void)
  65. {
  66.   P1DIR |= BIT1;   //P1.1输出,普通I/O
  67.   P1DIR &=~ BIT2;  //P1.2输入
  68.   P1SEL |=  BIT2; //P1.2第二功能,捕获输入
  69.  
  70.   P1OUT &=~BIT1;  // 开始低电平,控制驱动波形发生
  71. }
  72.  
  73. void init_clk(void)
  74. {
  75.     uchar i;
  76.     BCSCTL1&=~XT2OFF;   //打开XT振荡器
  77.     BCSCTL2|=SELM_2+SELS;//MCLK 8M and SMCLK 8M
  78.     do
  79.     {
  80.       IFG1 &= ~OFIFG;//清除振荡错误标志
  81.       for(i = 0; i < 0xff; i++)  _NOP();//延时等待
  82.     }
  83.     while ((IFG1 & OFIFG) != 0);//如果标志为1继续循环等待晶振起振
  84.     IFG1&=~OFIFG;
  85. }
  86.  
  87.  
  88. void main(void)
  89. {
  90.  
  91.     /*下面六行程序关闭所有的IO口*/
  92.     P1DIR = 0XFF;P1OUT = 0XFF;
  93.     P2DIR = 0XFF;P2OUT = 0XFF;
  94.     P3DIR = 0XFF;P3OUT = 0XFF;
  95.     P4DIR = 0XFF;P4OUT = 0XFF;
  96.     P5DIR = 0XFF;P5OUT = 0XFF;
  97.     P6DIR = 0XFF;P6OUT = 0XFF;
  98.  
  99.  
  100.     WDTCTL = WDTPW + WDTHOLD;            //关闭看门狗
  101.     P6DIR |= BIT2;P6OUT |= BIT2;         //关闭电平转换
  102.     P6DIR |= BIT3;P6OUT |= BIT3;         //关闭电平转换
  103.  
  104.  
  105.  
  106.     Ini_Lcd();
  107.     Disp_img(logo);   //显示欢迎使用本产品LOGO
  108.     delay_Nms(1000);
  109.     Ini_Lcd();
  110.     Lcd_Mark2();
  111.  
  112.     init_clk();
  113.     init_IO();           //初始端口设置
  114.     _EINT();               //开全局中断
  115.     while(1)
  116.     {
  117.        init_timerA();
  118.        P1OUT |= BIT1;    // P1.1 高电平,超过10us
  119.        delay_Nms(100);
  120.        P1OUT &=~BIT1;
  121.        delay_Nms(80);
  122.        Conut();
  123.        delay_Nms(80);       //80MS
  124.  
  125.  
  126.  
  127.     }
  128. }
 
点赞 关注(1)

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表