⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 基于msp430f247的超声波模块的源码-c语言
💻 C
字号:

//#include "io430.h"
#include "msp430x24x.h"
#define hperson   P1IN.1
#define ultradon  P2OUT.1//
void Init_Device();    //超声波设备初始化
void Init_Port();//初始化端口
void delay10ms(unsigned int count);    //===延时
float math_calc( float result0);  //计算距离

float time,temp;
unsigned char flag=0,personflag=0;
unsigned int digits;


void main( void )
{
  // Stop watchdog timer to prevent time out reset
   float distance;
  WDTCTL = WDTPW + WDTHOLD;
  CCTL1=CCIE;//比较器中断使能
  Init_Device();    //超声波设备初始化
  Init_Port();
  _EINT();   //=== 打开全局中断控制 ===
 //  LPM3;//进入低功耗模式
 while(1)//等待中断
 {
       CACTL1&=~CAON;//关闭比较器
       CCTL1&=0x0000;//清零,关定时器A的捕捉模块
       TACTL&=0x0000;//清零,定时器控制位清零
       P2OUT|=BIT0;//p2.0输出
       TACTL|=TASSEL0+TACLR+MC0;//TACLK=ACLK;16位计数增加模式,TASSEL0  0x0100//0000 0001 0000 0000
      // P1SEL|=BIT5;///////////////////////////////////////////////////////////////
      
       CCR1=12;//12个周期的40KHz
       CCTL1=CCIE;//比较器中断使能
       P2OUT&=~BIT0;//p2.0关闭输出
      
       //  P1SEL&=~BIT5;
       TACTL|=TACLR;//计数清零
       CCR1=36;//36个ACLK周期的延时
      
       CACTL1|=CAON;//打开比较器
       CACTL1&=~CAIFG;//比较器中断标志位允许
       CCTL1=CM0+CCIS0+SCS+CAP+CCIE;//定时器A上升沿触发捕捉,输入CCIB,捕捉模式,中断使能
       temp=TAR;//计数器的初始值
      
       //LPM0;//_BIS_SR(LPM0_bits+GIE);   //活动模式
      
       
        while (flag==1)//如果比较器捕获到中断,计算距离 
      { 
        flag=0;
       
        //while(CACTL1==0x00) digits=0xbe;//没有收到接收传感器的信号,显示为出错信号   
        time=CCR1-temp+48;
        distance=math_calc(time);//计算距离
        if(distance>1.5)//如果大于1.5米
         {
        P4OUT=0xff; //语音提示
        }
        else 
        { 
         P4OUT=0x55; //语音警告
         // 闪光
        }
      }//while flag==1
  
  }//while(1)
}
 

//============================================================================= 
//函 数 名: Init_Port() 
//功 能:系统初始化 
//入口参数:无 
//出口参数:无 
//返 回 值:无 
//=============================================================================
void Init_Port()
{
 //  P1DIR&=0xfd;//0,P1.1口作为红外检测输入信号;1,输出  11111101
 //  P1SEL&=0x00; //设为0,普通的I/O口功能,
 //  P1IE|=0x02;//00000010允许p1.1中断 
 //  P1IES&=0x00;//0,上升沿触发中断;1,下降沿触发
  
   P2SEL|=0x19;//p2.0第二功能ACLK,p2.3第二功能ca0  1,p2.4第二功能ca1  1——0001 1001
   P2DIR|=0x01;//P2.0口作为超声波输出信号,——00000001
   P2DIR&= 0xe7;//11100111,p2.3是超声波输入信号,p2.4是超声波输入信号
   
   P4DIR=0xFF;//输出
   P4SEL&=0x00; //设为0,普通的I/O口功能,
}


//============================================================================= 
//函 数 名: Init_Device() 
//功 能:系统初始化 
//入口参数:无 
//出口参数:无 
//返 回 值:无 
//============================================================================= 
void Init_Device()
{ 
   
   delay10ms(50);
   //Init_Port(); 
   BCSCTL1=0x00;//Set 430 clk  开启XT2,DOC的标称频率为最低 且不分频;XT1为低速晶体(32.768K)
   BCSCTL2=SELM_2+SELS;//选择MCLK SCLK的时钟源为高速时钟 不分频,均为8M  
 
   CAPD&=CAPD3+CAPD4;//CAPD3,CAPD4输入缓冲禁止,********************************需要修改的地方
     
   CACTL2=P2CA0+P2CA1+CAF;//CA0作为比较器的输入,CA1作为比较器的输入,比较器输出经过滤波器
   CACTL1=CARSEL+CAREF_1+CAON;//内部参考电压为0.25Vcc,打开比较器,参考选择位,选择比较器的输入端和Vcaref连接情况
   
  // _EINT();   //=== 打开全局中断控制 === 
   
} 
float math_calc( float time0)
{
  float result;
 // digits=0x00;
  while(time0!=0)
   {
      
   result =340*30*time0/2000000;//计算部分,用distance做距离
   }
return result;
}

//============================================================================= 
//函 数 名: delay10ms(int count) 
//功 能:延时子函数 
//入口参数:int count 
//出口参数:无 
//返 回 值:无 
//============================================================================= 
void delay10ms(unsigned int count)   //===延迟=== 
{ 
unsigned int i,j,k; 
for (i=0; i<count; i++) 
  for(j=0; j<10; j++) 
    for(k=0; k<120; k++); 
}

//============================================================================= 
//P1.1中断函数 
//============================================================================= 

/*#pragma vector=PORT1_VECTOR 
__interrupt void PORT1_ISR()
{
  if((P1IFG&BIT1) == BIT1)
  {
   P1IFG=0x00;
   personflag=1;
   LPM3_EXIT;//退出低功耗模式
   }
 }*/

//==============================================================
//比较器A中断函数 ,还需要修改
//==============================================================
#pragma vector=COMPARATORA_VECTOR 
__interrupt void COMPARATORA(void)
{
 flag=1; 
 CCTL1=0x0000;//关定时器A
 //LPM3_EXIT;//退出低功耗模式
 
}

//============================================================================= 
//定时器A中断函数 
//多中断中断源:CC1~2 TA  还需要修改
//============================================================================= 

#pragma vector=TIMERA1_VECTOR 
__interrupt void TimerA1() 
{ 
  switch (__even_in_range(TAIV, 10)) 
  { 
   case 2: 
   //捕获/比较1中断 
   CCTL1&=~CCIFG; //清除中断标志位
    break; 
   case 4: 
   //捕获/比较2中断 
    break; 
   case 10: 
   //TAIFG定时器溢出中断 
    break; 
  } 
 // LPM3_EXIT; //退出中断后退出低功耗模式
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -