#include "msp430x16x.h"
#include "LCD.h"
#define recieve_start TBCTL&=~(MC0+MC1);TBCTL|=TBCLR; TBCTL|=MC_2
#define recieve_stop TBCTL|=TBCLR;
/***********************send_port-P5.0-clock recieve_port-p4.0-recieve*****/
float max=0;
unsigned char send=1;
unsigned char recieve=0;
unsigned int buff=0;
unsigned char over=0;
unsigned int pi=0;
unsigned int pj=0;
/***********************时钟设置初始化***********************/
void Init_Clock(void)
{
int i=0;
BCSCTL1 &= ~XT2OFF; // XT2on
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG)); // OSCFault flag still set?
BCSCTL2 |= SELM_2 + SELS; // MCLK = SMCLK = XT2 (safe)
_EINT(); //打开全局中断控制,若不需要打开,可以屏蔽本句
}
void send_40kHZ_init(void)
{
P5DIR|=0x01;
P5OUT&=~0x01;
TACTL=TASSEL_2+TACLR; //smclk
TACTL|=MC1+MC0; //增减计数模式 CCR0减到0时TAIFG置位
TACCR0=50;
TACTL|=TAIE;
// _EINT();
}
/*******************捕获以及计时初始化*******************/
void recieve_40kHZ_init(void)
{
P4SEL |= 0x01; //P4.0捕获
TBCCTL0&=~(CCIS1+CCIS0); // 捕获源为P4.0,即CCI0A(也是CCI0B)
TBCCTL0|=CM_1+SCS+CAP; //上升沿捕获,同步捕获,工作在捕获模式
TBCCTL0|=CCIE; //允许捕获比较模块提出中断请求
TBCTL|=TBSSEL_1; //选择时钟MCLK
// TBCTL|=ID_3;
TBCTL|=TBCLR; //定时器清零,
//定时器开始计数(连续计数模式0~0xFFFF)
TBCTL|=MC_2;
}
/************************************************************/
void main(void)
{
WDTCTL=WDTPW +WDTHOLD;
Init_Clock();
init_lcd ();
CHN_disp(0,2,"超声波测距");
delay_nms(10);
CHN_disp(1,3,"V_1.0");
delay_nms(10);
CHN_disp(2,0,"最大值: cm");
delay_nms(10);
CHN_disp(3,0,"当前值: cm");
delay_nms(10);
send_40kHZ_init();
recieve_40kHZ_init();
recieve_start;
while(1)
{
// send=1;;
;
}
}
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A (void)
{
// static unsigned char pi=0;
// static unsigned int pj=0;
if(TAIV==10)
{
pj++;
if(send)
{
if(pi==0)
TBCTL|=TBCLR;
pi++;
if(pi==99)
{
//recieve_start;
pi=0;
pj=0;
send=0;
}
else
P5OUT ^= 0x01;
}
if(pj==2000) {pj=0;send=1;}
}
}
#pragma vector=TIMERB1_VECTOR
__interrupt void Timer_B (void)
{
if(TBIV==10)
over++;
}
#pragma vector=TIMERB0_VECTOR
__interrupt void TimerB0(void)
{
static unsigned char i=0;
unsigned int data_buff=0;
static float result=0;
if(TBCCTL0&CM_1) //捕获到下降沿
{
data_buff=TBR;
if(i==0)
{
// delay_nus(10);
i++;
pi=0;
pj=0;
send=1;
TBCTL|=TBCLR;
}
else
{
buff=data_buff;
result=buff*0.479;
if(result>max)
{
max=result;
dis_float(2,4,4,max);
}
//dis_int(1,0,buff);
dis_float(3,4,4,result);
delay_nms(50);
//dis_int(2,0,pi);
//dis_int(3,0,pj);
i=0;
TBCTL|=TBCLR;
}
}
}