1.程序能进入中断,执行中断的语句,但感觉不能循环,
2.上升沿和下降沿捕获的时间TACCR1可能有问题,但我找不出问题的所在,
3.特别是在捕获存放时间的TACCR1有很大的问题,,
上述问题希望大神们能帮我解决我在这里先谢谢大伙了,,以下是我的程序代码,,,,,,,
//捕获返回的电平
#include
#include \"cry1602.h\"
unsigned int new_cap=0;
unsigned int old_cap=0;
unsigned int cap_diff=0;
unsigned char table[]={\"0123456789.M\"};
unsigned int diff_array[16]; // RAM array for differences
unsigned int capture_array[16]; // RAM array for captures
unsigned char index=0;
unsigned char count = 0;
unsigned char k=0,t1,t2=0,t3=0;
unsigned char i=0,t=0,s=0,m=0,cm=0,dm=0;
unsigned char SR_Flag=0; //SR的标志位,1为一次捕捉完成
/*******************************************
函数名称:Delay_1ms
功 能:延时约1ms的时间
参 数:无
返回值 :无
********************************************/
void Delay_1ms(void)
{
unsigned char j;
for(j = 150;j > 0;j--) _NOP();
}
/*******************************************
函数名称:Delay_Nms
功 能:延时N个1ms的时间
参 数:n--延时长度
返回值 :无
********************************************/
void Delay_Nms(unsigned int n)
{
unsigned int i;
for(i = n;i > 0;i--) Delay_1ms();
}
//**********************************
//*******主函数*****************
void main(void)
{
volatile unsigned int i;
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
// for (i=0; i<20000; i++) { } // Delay for crystal stabilization
P1DIR &=~ BIT2; // P1.2为捕获输入 Echo
P1SEL = 0x04; // P1.2为CCI1A 输入口 Echo
/* P2DIR = 0x01; // P2.0-
P2OUT |= 0x01; //输出高电平 Trig
Delay_Nms(10); //延时2S至少10us高电平
P2OUT &=~ 0x01;*/
while(1)
{
LcdReset(); //液晶初始化
//系统时钟
BCSCTL1&=~XT2OFF;//打开XT振荡器
do
{
IFG1 &= ~OFIFG;//清除振荡错误标志
for(i = 0; i < 0xff; i++)
_NOP();//延时等待
}
while ((IFG1 & OFIFG) != 0);//如果标志为1继续循环等待
BCSCTL2|=SELM_2+SELS+DIVA_3;//MCLK 8M and SMCLK 8M;8分频 为1M
P2DIR = 0x01; // P2.0-
P2OUT |= 0x01; //输出高电平 Trig
Delay_Nms(5); //延时2S至少10us高电平
P2OUT &=~ 0x01;
CCTL1 |= CM_1 + SCS + CCIS_0 + CAP + CCIE; //上升沿捕获、同步、开捕获中断 // + Capture Mode + Interrupt
TACTL |= TASSEL_2 ; // SMCLK
TACTL |= TACLR; //定时器清零
TACTL |= MC_2;//开始计数
Disp1Char(8,1,table[4]); //测试
_EINT();//全局中断开
//_BIS_SR(LPM3_bits + GIE); // LPM3 + Enable global ints
// _BIS_SR( GIE );//能中断
};
}
//*****************************************************************************************
#pragma vector=TIMERA1_VECTOR
__interrupt void TimerA1(void)
{
Disp1Char(14,0,table[3]);//测试
t1 = TACCR1;//保存TACCR1的值
CCTL1 &=~ CM_1; //清除上升沿捕捉
CCTL1 |= CM_2;//改为下降沿捕获
TACTL|=MC_2; //开始TimerA计数,模式为连续计数
if((CCTL1&CM_2)) //如果是下降沿捕获
t2 = TACCR1;//保存TACCR1的值
TACTL&=~MC_2; //停止计数直到改变模式后,重新计数
//TACCR1=0;
Disp1Char(15,0,table[3]);//测试
t3= t2-t1;
s=34000*t1;
//s=3400*t1*(1/1000000);
m =s/100;
dm =s%100/10;
cm =s%100%10;
Disp1Char(9,0,table[11]);//显示m
Disp1Char(7,0,table[m]); //显示cm
Disp1Char(6,0,table[dm]);//显示dm
Disp1Char(5,0,table[10]);//显示小数点
Disp1Char(4,0,table[cm]); //显示m
}