大家帮忙看下这个程序有些什么问题啊?
我想用这个程序测量占空比为百分之五十的方波
问什么液晶总是显示65535,而且frequency=1000000/period;这一句不管我把1000000换成多少他都显示的65535
不知道什么原因,请高手指点 先谢了。
#include "msp430x14x.h" #include "cry1602.h" uint start,end; uint width; //==用于存放脉宽== uint period; //==用于存放周期== uint frequency; //==用于存放频率== uint fy[]; //==用于存放频率显示数据==
uchar pinlv[]={"Frequency:"}; uchar hz[]={"HZ "}; void process(void); //==函数声明==
void Initclk(); //==初始化时钟== /****************************************************************** 主函数 ******************************************************************/ void main( void ) { WDTCTL = WDTPW + WDTHOLD; //==关狗==
Initclk(); //==初始化时钟,SMCLK,MCLK均为8M==
P1DIR&=~BIT2; P1SEL = BIT2; //==设置P1.2端口为功能模块使用,即:做捕获源== TACTL = TASSEL_2+ID_3+TACLR+TAIE+MC1;//==定时器A时钟信号选择SMCLK,8分频,同时设置定时器A计数模式为连续计数模式==
CCTL1 = CM_1+SCS+CAP+CCIE; //==输入上升沿捕获,CCI0A为捕获信号源== _EINT(); //==开全局中断允许== process(); LcdReset(); //初始化LCD DispStr(3,0,pinlv); DispStr(13,1,hz);
for(int i=0;i<6;i++) { Disp1Char(3+i,1,fy+48); } for(;;); }
/******************************************************* 初始化时钟 *******************************************************/ void Initclk() { unsigned int i; //--- 使用XT2振荡器 --- BCSCTL1&=~XT2OFF; //==打开XT2振荡器== do { IFG1 &= ~OFIFG; //==清除振荡器失效标志== for (i = 0xFF; i > 0; i--); //==延时,等待XT2起振== } while ((IFG1 & OFIFG) != 0); //==判断XT2是否起振== BCSCTL2 =SELM_2+SELS; //==选择MCLK、SMCLK为XT2,8M== }
/******************************************************************** 数据处理 ********************************************************************/
void process(void)
{ while(endstart
width = end-start; //==实际脉冲宽度的计算== period = 2* width; frequency=1000000/period;
fy[0]=frequency%1000000/100000;//显示十万位 fy[1]=frequency%100000/10000; //显示万位 fy[2]=frequency%10000/1000; //显示千位 fy[3]=frequency%1000/100; //显示百位 fy[4]=frequency%100/10; //显示十位 fy[5]=frequency%10; //显示个位
} /******************************************************************* 中断处理函数 *******************************************************************/ #pragma vector=TIMERA1_VECTOR //==定时器A中断处理== __interrupt void timer_a(void) { switch(TAIV) //==向量查询== { case 2: //==捕获中断== if(CCTL1&CM0) //==捕获到上升沿== { CCTL1=(CCTL1&(~CM0))|CM1; //==更变设置为下降沿触发==
start=TAR; //==记录初始时间== }
else if (CCTL1&CM1) //==捕获到下降沿== { CCTL1=(CCTL1&(~CM1))|CM0; //==更变设置为上升沿触发== end=TAR; //==用start,end,overflow计算脉冲宽度==
} break;
default: break; } }
|