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