定时器采用自然益出产生中断的办法,如定时器每1US计一次,那么计1024次产生一次自然益出定时中断,即每1024US产生一次中断,那么1秒内产生1000000/1024=976.5625次中断,我们先假设是977次这样的定时中断进1秒,那么每一秒就会多出0.4375个这样的定时中断 ,这个称之为误差,采用软件校准这个误差就是把这个误差累加到以后的时间计算里去,......,就这样采用软件校准的办法,就OK了. 我尝试用过51单片机、义隆单片机还有ATMEGA单片机做过电子表,都可以做到误差每天小于1秒的,如果再调节下晶振的补偿电容,慢了就调小,快了就调大一点,误差还可以做到更小. 下面有我一段用ATMEGA做的电子表时间误差软件校准的代码DEMO: if(++time_var.mil_sec_var>=977) { PORTB=PORTB^0b00000001; time_var.mil_sec_var=0; time_cal_counter=time_cal_counter+4375; if(time_cal_counter>=10000) { time_var.mil_sec_var=1; time_cal_counter=time_cal_counter-10000; } //callibrate the error time if(++time_var.sec_var>=60) { time_var.sec_var=0; if(++time_var.min_var>=60) { time_var.min_var=0; if(++time_var.hour_var>=24) time_var.hour_var=0; } } } |