void timer_init()
{
TACCR0 = 520;
TACTL |= TASSEL_2+ID_3+MC_1;
TACCTL0 |= CCIE;
}
void main()
{
WDTCTL = WDTPW+WDTHOLD;
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
TCA6416A_Init();
HT1621_init();
timer_init();
while(1)
{
display();
}
}
#pragma vector = TIMER0_A0_VECTOR __interrupt void Timer_A(void)
{
static int i=0;
i++;
switch(i)
{
case 20:sec++,i=0;break;
default: break;
}
switch(sec)
{
case 60:min++,sec=0;break;
default: break;
}
switch(min)
{
case 60:min=0,hou++;break;
default: break;
}
switch(hou)
{
case 24:hou=0;break;
default: break;
}
}
以上是我自己写的程序,第一段是定时器的初始化,第二段是主程序。在第一段中设置了CCR0的初值,设置了时钟源,设置了分频,设置了技术模式。在第二段主程序中设置了系统时钟。 因为我是打算用430的配件那块显示屏来设置一个时钟,类似于23-59-58这种,但是现在碰到的问题是:定时器的静态变量计时和实际计时相差很大,就是程序中我觉得是已经算好了,但是实际中这个秒位是不正常加数的。 下面是我的计算时间的方法,各位大神帮我看下有没有错误,请帮小弟多多指正。
BCSCTL1 = CALBC1_1MHZ;DCOCTL = CALDCO_1MHZ;这两句就是数控振荡器选择了1MHZ的频率,那么主时钟就是1MHZ,TACTL |= TASSEL_2+ID_3+MC_1;这句话中ID_3为8分频,那么频率就是1/8=0.125MHZ,那么12*(1/(0.125 * 1000 000))=96us,那么50ms/96us=520,那么CCR0的初值就为520,但是实际显示秒位计数过快。
灰小子:
楼主,你好。
你的秒位大约比正常时间能快多少?
如果快的不是太多,一般是正常的。如果要求精度高的话,建议使用外部晶振。
bin zhou4:
回复 灰小子:
重要的不是快不快,重要的是我这样的计算方法对不对。
灰小子:
回复 bin zhou4:
不懂为什么要乘以12,请原谅我的无知。。
msp430和51单片机是不同的