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

📄 main.c

📁 基于msp430f247的红外检测的程序——自编
💻 C
字号:
#include "msp430x24x.h"
unsigned char flag=0,personflag=0;//定义标志位
unsigned char i;
float time,temp,distance;
void int_port();
void counttime();
void delay10ms(unsigned int count);
float math_calc( float result0);  //计算距离


void main(void)
{
 WDTCTL=WDTPW+WDTHOLD;

 int_port();
 //P1IE|=BIT1;//00000010允许p1.1中断
 _EINT(); //开总中断
 while(1)
  {
 
   //if(personflag==1)   //personflag  
 //{   
    
     CCTL1&=0x0000;//清零,关定时器A的捕捉模块
     TACTL&=0x0000;//清零,定时器控制位清零
     P5SEL|=BIT6;
     //P5SEL&=~BIT6;
     TACTL|=TASSEL0+TACLR+MC0;//TACLK=ACLK;16位计数增加模式
     CCR1=12;//12个周期的40KHz
     CCTL1=CCIE;//比较模块中断使能
     //P5SEL&=~BIT6;
     P2OUT&=~BIT0;//p5.6关闭输出,要修改**************
     TACTL|=TACLR;//计数清零
     CCR1=36;//36个ACLK周期的延时
     
     counttime();//计算时间子程序
     
     
     //P4DIR=0XFF;
     //P4OUT=0XFF;
     //personflag=0;
  //}//if personflag
}//while
}//main

void int_port()
{
  ///delay10ms(50);
  unsigned char i;
  BCSCTL1&=~XT2OFF;//Set 430 clk  开启XT2,DOC的标称频率为最低 且不分频;XT1为低速晶体(32.768K)
 // BCSCTL1|=XTS;//高频模式
  BCSCTL2=SELM_2+SELS;//选择MCLK SMCLK的时钟源为高速时钟 不分频,均为8M
  //BCSCTL3|=XT2S1;
 // BCSCTL3&=~XT2S0;
 // BCSCTL3&=LFXT1S_0 ;
 // for(i=0;i<8;i++) 
  //{
   P4DIR=0XFF;
   P4OUT=0Xff;
   delay10ms(100);
   P4OUT=0X00;
   delay10ms(100);
  //}
   
 do
   {
    IFG1&=~OFIFG;
    for(i=0;i<100;i++);
   }
  while ((IFG1&OFIFG)!=0);
  //IFG1&=~OFIFG;
     
   //P4DIR=0XFF;
  //P4OUT=0XFF;
  P1DIR|=BIT1;//P1.1口作为红外检测输入信号;1表示输出  11111101
  P1SEL=0;//设为0,普通的I/O口功能
  //P1IES&=0x00;//上升沿触发
  P1IE=0;
  P1IFG=0;
  P1IES=0;//0,上升沿触发中断;1,下降沿触发
  P1IE|=BIT1;//00000010允许p1.1中断
  P2DIR|=BIT0;//P2.0 output ACLK 
  P2SEL|=BIT0;
}

void counttime( void )
{ 
    
  P1SEL=0x04;//p1.2作为捕捉的输入
  TACTL |=TASSEL0+MC1;//选择ACLK作为计数脉冲
  temp=TAR;//计数器的初始值
  TACCTL1=CM0+SCS+CAP+CCIE;//定时器A上升沿触发捕捉,输入CCIB,捕捉模式,中断使能
  _EINT();
  CCTL1=0x0000;//关定时器A
  while(1);
  //temp=TAR;//计数器的初始值
  //P4DIR=0Xff;
  //P4OUT=0X44;
  /* while(flag==1)
  {
    
    _DINT();
    flag=0;  
    //P4DIR=0Xff;
    //P4OUT=0X44;
    time=TACCR1-temp+48;
    //CCTL1=0x0000;
    //直接用读出来的time 值和固定时间比较
    if (time<236)//小于1m
     {
       P4DIR=0Xff;
       P4OUT=0X01;
       delay10ms(300);
      }
    else if(time<353)//小于1.5m
    {
       P4DIR=0Xff;
       P4OUT=0X02;
       delay10ms(300);
    }
    else if (time<471)//小于2m
    {
     P4DIR=0Xff;
     P4OUT=0X03;
     delay10ms(100);
    }
     
 }//while(flag==1)*/

}//void counttime

//中断时间响应
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
   switch(TAIV)
   {
   case 2: {
       time=TACCR1-temp+48;
    //CCTL1=0x0000;
    //直接用读出来的time 值和固定时间比较
     if (time<236)//小于1m
     {
       P4DIR=0Xff;
       P4OUT=0X05;
       delay10ms(300);
      }
     else if(time<353)//小于1.5m
    {
       P4DIR=0Xff;
       P4OUT=0X0A;
       delay10ms(300);
     }
     else if (time<471)//小于2m
    {
     P4DIR=0Xff;
     P4OUT=0X03;
     delay10ms(100);
    }
   }
   case 4: break;
   case 10:break;//TAIFG定时器溢出中断 
   }
}

//p1.1 personflag响应
#pragma vector=PORT1_VECTOR 
__interrupt void PORT1_ISR()
{
   if((P1IFG&BIT1) ==BIT1)
     {
           //处理P1IN.1中断
           P1IFG &= ~BIT1; //清除中断标志
           personflag=1;
      }  
   P1IFG&=0x00;
}

//延时
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++); 
}

/******
//计算子程序
float math_calc( float result0)
{
  float result1;

 result1 =340*result0/2;//计算部分,用distance做距离
  
 return (result1);

}
*******/

⌨️ 快捷键说明

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