📄 main.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 + -