注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
panyixin的个人空间 https://home.eeworld.com.cn/space-uid-434783.html [收藏] [复制] [分享] [RSS]
日志

MSP430F149超声波定时器捕获测量距离

已有 2134 次阅读2012-8-18 23:15

1.程序能进入中断,执行中断的语句,但感觉不能循环,
2.上升沿和下降沿捕获的时间TACCR1可能有问题,但我找不出问题的所在,
3.特别是在捕获存放时间的TACCR1有很大的问题,,
上述问题希望大神们能帮我解决我在这里先谢谢大伙了,,以下是我的程序代码,,,,,,,


//捕获返回的电平
#include  
#include \"cry1602.h\"
unsigned int new_cap=0;
unsigned int old_cap=0;
unsigned int cap_diff=0;
unsigned char table[]={\"0123456789.M\"};
unsigned int diff_array[16];                // RAM array for differences
unsigned int capture_array[16];             // RAM array for captures
unsigned char index=0;
unsigned char count = 0;
unsigned char k=0,t1,t2=0,t3=0;
unsigned char i=0,t=0,s=0,m=0,cm=0,dm=0;
unsigned char  SR_Flag=0;         //SR的标志位,1为一次捕捉完成
/*******************************************
函数名称:Delay_1ms
功    能:延时约1ms的时间
参    数:无
返回值  :无
********************************************/
void Delay_1ms(void)
{
unsigned char j;
   
for(j = 150;j > 0;j--)  _NOP();
}
/*******************************************
函数名称:Delay_Nms
功    能:延时N个1ms的时间
参    数:n--延时长度
返回值  :无
********************************************/
void Delay_Nms(unsigned int n)
{
    unsigned int i;
   
    for(i = n;i > 0;i--)    Delay_1ms();
}
//**********************************
//*******主函数*****************
void main(void)
{
  volatile unsigned int i;
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
// for (i=0; i<20000; i++) { }                  // Delay for crystal stabilization
     
  P1DIR &=~ BIT2;   // P1.2为捕获输入 Echo
  P1SEL = 0x04;    // P1.2为CCI1A 输入口 Echo

/* P2DIR = 0x01;      // P2.0-
  P2OUT |= 0x01;    //输出高电平 Trig
  Delay_Nms(10);    //延时2S至少10us高电平
  P2OUT &=~ 0x01;*/
  
  while(1)
  {
   LcdReset();       //液晶初始化
     //系统时钟
      BCSCTL1&=~XT2OFF;//打开XT振荡器   
       do
      {
         IFG1 &= ~OFIFG;//清除振荡错误标志
         for(i = 0; i < 0xff; i++)
           _NOP();//延时等待
       }
       while ((IFG1 & OFIFG) != 0);//如果标志为1继续循环等待
       BCSCTL2|=SELM_2+SELS+DIVA_3;//MCLK 8M and SMCLK 8M;8分频 为1M
  
  P2DIR = 0x01;      // P2.0-
  P2OUT |= 0x01;    //输出高电平 Trig
  Delay_Nms(5);    //延时2S至少10us高电平
  P2OUT &=~ 0x01;
  CCTL1 |= CM_1 + SCS + CCIS_0 + CAP + CCIE; //上升沿捕获、同步、开捕获中断                                      // + Capture Mode + Interrupt
  TACTL |= TASSEL_2   ;  // SMCLK
  TACTL |= TACLR;   //定时器清零
  TACTL |= MC_2;//开始计数
  Disp1Char(8,1,table[4]);  //测试
  _EINT();//全局中断开
  //_BIS_SR(LPM3_bits + GIE);       // LPM3 + Enable global ints
// _BIS_SR( GIE );//能中断      
        };
      }
//*****************************************************************************************
  #pragma vector=TIMERA1_VECTOR
  __interrupt void TimerA1(void)
  {   
      Disp1Char(14,0,table[3]);//测试
      t1 = TACCR1;//保存TACCR1的值
      CCTL1 &=~ CM_1;   //清除上升沿捕捉
      CCTL1 |= CM_2;//改为下降沿捕获
      TACTL|=MC_2;   //开始TimerA计数,模式为连续计数
      if((CCTL1&CM_2)) //如果是下降沿捕获
      t2 = TACCR1;//保存TACCR1的值   
      TACTL&=~MC_2;        //停止计数直到改变模式后,重新计数
      //TACCR1=0;
      Disp1Char(15,0,table[3]);//测试
     
      t3= t2-t1;
      s=34000*t1;
       //s=3400*t1*(1/1000000);
                        m =s/100;
   dm =s%100/10;
   cm =s%100%10;
                        Disp1Char(9,0,table[11]);//显示m
                        Disp1Char(7,0,table[m]); //显示cm
                        Disp1Char(6,0,table[dm]);//显示dm
                        Disp1Char(5,0,table[10]);//显示小数点
                        Disp1Char(4,0,table[cm]); //显示m
   }
评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章