#include<msp430g2553.h>
#define uchar unsigned char //定义一下方便使用
#define uint unsigned int
unsigned char dis1[]="0123456789";
unsigned int result1_start,result1_end;
unsigned char index=0;
unsigned int temp;
unsigned juli;
double distance;
unsigned char dis2[]="the juli";
unsigned char dis3[]="000.0cm";
/*==================================TA的初始化设置=========================================
函数名称: void CAP_Init()
函数功能:定时器A捕获设置,用于捕获上升下降沿
函数参数:
=========================================================================================*/
void CloseWDTCTL()
{
WDTCTL=WDTPW+WDTHOLD;
}
void ClockInit()
{
BCSCTL1|=RSEL2;
DCOCTL|=DCO0+DCO1;
}
void PortInit()
{
P2DIR &=~BIT1; //P2.1,为输入引脚
P2SEL |= BIT1; // P2.1 = (InputDirection + TA0.1) = CCIxA.1 --> CCR1,P2.1作为输入,CCI1A,指定输入
P2DIR|=BIT0;
}
void Timer1Init()
{
TACCTL1 = CAP + CCIS_0 + CM_3 + CCIE+SCS; // Capture CCIxA, both edge, interrupt enable.CCI1A->p1.2
TACTL |=TASSEL_2 + ID_0 + MC_2+ TAIE+TACLR ;//选择1M-SMCLK时钟,continuous mode
TACCR1=0;
_EINT();
LPM0;
_NOP();
}
/*void delay(uint n)
{
uint i,j;
for(i=0;i<n;i++)
for(j=0;j<110;j++);
}*/
void send_25us()//超声波发送15us的高电平
{
P2OUT&=~BIT0;
_NOP();
P2OUT|=BIT0;
_NOP();
P2OUT&=~BIT0;
}
/*==================================TA的中断服务程序=========================================
函数名称: Timer_AISR
函数功能: 定时器A中断服务子函数,捕获待测信号上升沿,下降沿
函数参数:这里注释下吧,CCR0单独的占用了个中断,好像是TIMER0_A0_VECTOR,其他的合着用,所以进入中断
后要判断是CCR1,还是CCR2产生的中断,也就是TAOIV或者TA1IV对应case :2 和4,另外如果你不访问TAIV这个寄存器,
那你产生的一些标志位就要你手动的软件复位了,反之是硬件自己复位。由于捕获是硬件捕获的,测距比较准。
=========================================================================================*/
#pragma vector=TIMER0_A1_VECTOR
__interrupt void timer_a(void)
{
switch(TAIV)
{
case 2: //ccr1中断向量
if (TACCTL1&CM0) //上升沿触发
{
TACCTL1=(TACCTL1&(~CM0))|CM1;
result1_start=TAR;//记录初始值
index=0;
}
else
if (TACCTL1&CM1)
{
TACCTL1=(TACCTL1&(~CM1))|CM0;
result1_end=CCR1; //记录结束值
if(result1_end>result1_start)//结果比开始数值小,表示溢出了一次或者几次,但是一般从0开始计数的话是不溢出的,这超声波实际测不了那么远,最多有个4米,5米的样子已经很好了
temp=result1_end-result1_start;
else
temp=result1_end+index*65535-result1_start;
distance=temp*0.0172;
juli=(uint)(distance*10+0.5); //取一位小数,四舍五入
dis3[0]=dis1[juli/1000];
dis3[1]=dis1[juli%1000/100];
dis3[2]=dis1[juli%100/10];
dis3[4]=dis1[juli%10];
index=0; //溢出清零
break;
}
case 4:break;
case 10: index++;break; //溢出中断向量,其实就2,4,10号向量有用那些手册里也没说,用不到
default :break;
}
LPM0_EXIT;
}
void delay(uint n)
{
uint i,j;
for(i=0;i<n;i++)
for(j=0;j<110;j++);
}
void write_command(uchar command_data)//发送命令
{
uchar i;
uchar i_data;
i_data=0xf8; //写命令为11111000
P1OUT |=BIT0; //p1.0置1
P1OUT &= ~BIT2; //p1.2置0触发下降沿写命令
for(i=0;i<8;i++)
{
P1OUT &= ~BIT2;
if(i_data&0x80)
P1OUT |= BIT1; //p1.1置1
else
P1OUT &= ~BIT1; //p1.1置0
// P1OUT &= ~BIT2; //p1.2置0
P1OUT |= BIT2; //p1.2置1触发上升沿写命令
//_NOP();
//P1OUT &=~BIT2;
i_data=i_data<<1;
}
i_data=command_data;
i_data&=0xf0; //取高四位,先写高电平,再读低电平
for(i=0;i<8;i++)
{
P1OUT &= ~BIT2;
if(i_data&0x80)
P1OUT |= BIT1; //p1.1置1
else
P1OUT &= ~BIT1; //p1.1置0
// P1OUT &= ~BIT2; //p1.2置0
P1OUT |= BIT2; //p1.2置1触发上升沿写命令
// _NOP();
// P1OUT &=~BIT2;
i_data=i_data<<1;
}
i_data=command_data;
i_data<<=4; //取低四位
for(i=0;i<8;i++)
{
P1OUT &= ~BIT2;
if(i_data&0x80)
P1OUT |= BIT1;
else
P1OUT &= ~BIT1;
// P1OUT &= ~BIT2;
P1OUT |= BIT2; //p1.2置1触发上升沿写命令
//_NOP();
// P1OUT &=~BIT2;
i_data=i_data<<1;
}
P1OUT &= ~BIT0; //p1.0置0选择命令
delay(10); //稍作延迟,为了稳定信号
}
void write_data(uchar command_data)//发送数据
{
uchar i;
uchar i_data;
i_data=0xfa; //写数据为11111010
P1OUT |= BIT0; //p1.0置1,把CS拉高
for(i=0;i<8;i++)
{
P1OUT &= ~BIT2;
if(i_data&0x80)
P1OUT |= BIT1; //p1.1置1读
else
P1OUT &= ~BIT1; //p1.1置0写
//P1OUT &= ~BIT2; //p1.2置0
P1OUT |= BIT2; //p1.2置1触发上升沿写命令
//_NOP();
//P1OUT &=~BIT2;
i_data=i_data<<1;
}
i_data=command_data;
i_data&=0xf0; //取高四位
for(i=0;i<8;i++)
{
P1OUT &= ~BIT2;
if(i_data&0x80)
P1OUT |= BIT1; //p1.1置1读
else
P1OUT &= ~BIT1; //p1.1置0写
// P1OUT &= ~BIT2; //p1.2置0
P1OUT |= BIT2; //p1.2置1触发上升沿写命令
//_NOP();
// P1OUT &=~BIT2;
i_data=i_data<<1;
}
i_data=command_data;
i_data<<=4; //取低四位
for(i=0;i<8;i++)
{
P1OUT &= ~BIT2;
if(i_data&0x80)
P1OUT |= BIT1;
else
P1OUT &= ~BIT1;
// P1OUT &= ~BIT2;
P1OUT |= BIT2; //p1.2置1触发上升沿写命令
// _NOP();
// P1OUT &=~BIT2;
i_data=i_data<<1;
}
P1OUT &= ~BIT0; //p1.0置0,选择命令
delay(10); //稍作延时为了稳定
}
void LCD_INIT() //液晶初始化
{
delay(100);
write_command(0x30); //设置8为数据接口,基本指令模式
write_command(0x02); //清DDRAM
//write_command(0x06); //游标及显示右移一位
write_command(0x0c); //整体显示开,游标关,反白关
write_command(0x01); //写入空格清频
write_command(0x80); //设定首次显示位置
}
void display_dis1()
{
uchar a;
write_command(0x80); //定义起始地址
for(a=0;a<10;a++)
{
write_data(dis1[a]);
_NOP();
}
delay(10);
}
void display_dis2()
{
uchar a;
write_command(0x90); //设定起始地址
for(a=0;a<8;a++)
{
write_data(dis2[a]);
}
delay(10);
}
void display_dis3()
{
uchar a;
write_command(0x88);//设定起始地址
for(a=0;a<7;a++)
{
write_data(dis3[a]);
}
delay(10);
}
void main(void)
{
WDTCTL=WDTPW+WDTHOLD;
P1SEL=0X00; //把P1口设置为普通的IO口
P1DIR=0XFF; //把P1口设置为输出
P2SEL=0X00;
P2DIR=0XFF;
ClockInit();
LCD_INIT();
PortInit();
Timer1Init();
_EINT();
display_dis2();
display_dis3();
while(1)
{
send_25us();
delay(100);
}
}
就是进不了中断,各位大神、高手,求破解啊1
本文来自论坛,点击查看完整帖子内容。