|
楼主 |
发表于 2013-6-17 16:03:34
|
显示全部楼层
下面附上的是主程序部分:
//********************************************************************
//128*64液晶显示
//开发板使用TIMERA进行连续计数模式的实验,
//测量P1.2口,输入的外部方波信号,检测“高电平”宽度,输入为70MS左右。
//捕捉到的高电平的宽度WIDE通过LCD显示出来。
//钟源为XT2CLK 8MHZ设置 1/8 分频后,时钟为 1M,这
//样70ms 的脉宽应该得到 70ms/(1000000)=70000!
//显示前数据除以10后送显示,应该为7000;
//********************************************************************
#include <msp430x14x.h>
#include "Config.h" //开发板配置头文件,主要配置IO端口信息
unsigned int start,end,wide=1000;
unsigned char overflow;
//*************************************************************************
// 主函数
//*************************************************************************
void main(void)
{
WDT_Init(); //看门狗关闭
Clock_Init(); //系统时钟设置MCLK时钟源为XT2CLK;SMCLK时钟源为XT2CLK 均为8MHZ;
Close_LED(); //关闭数码管显示
P1SEL |= BIT2; //;P1.2为功能口,TA1(CCI1A input)
TACTL=TASSEL_2+MC_2+TACLR+TAIE+ID_3;//时钟为SMCLK**,连续计数模式,清楚定时器,允许溢出中断;8分频
CCTL1=CM_1+SCS+CAP+CCIE+CCIS_0; //开机默认上升沿捕捉,同步,捕获,开中断。*CCI1A为信号源*,
LCD_Init(); //lcd初始化
_EINT();//开中断
while(1)
{
HEX_TO_BCD(wide,sjbcd00);
numxs(); //显示wide脉宽值 ,初始值为1000;
delay_ms(100);
}
}
//***********************************************************************
// TIMERA中断服务程序,需要判断中断类型
//***********************************************************************
#pragma vector = TIMERA1_VECTOR//TA捕获中断服务程序
__interrupt void Timer_A(void)
{
switch(TAIV) //需要判断中断的类型
{
case 2://TA1中断 //捕获中断
if (CCTL1&CM_1) //上升沿中断到来
{
start=TAR; //同CCR1;
CCTL1=(CCTL1&(~CM_1))|CM_2; //改为下降沿触发
overflow=0; //溢出计数复位
}
else if (CCTL1&CM_2) //下降沿捕捉
{
end=TAR;//TAR;
CCTL1=(CCTL1&(~CM_2))|CM_1; //改为上升沿触发
wide=overflow*(65535/10)+(end-start)/10;//计算wide脉宽值
HEX_TO_BCD(wide,sjbcd00);//BCD吗转换。
numxs();//显示wide脉宽值
delay_ms(100);//延时100MS
}
break;
case 10:
overflow++; //溢出计数加1;70MS的脉宽一定会溢出的
HEX_TO_BCD(wide,sjbcd00);
numxs();// 保持显示捕捉到的“高电平”宽度,显示wide脉宽值 ,
delay_ms(100);
break;
default:
break;
}
}
|
|