找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 970|回复: 0
打印 上一主题 下一主题
收起左侧

超声波测距

[复制链接]
跳转到指定楼层
楼主
ID:372554 发表于 2018-7-16 15:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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



    }
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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