2019-03-24 20:25发布
ltwsq 发表于 2015-4-15 11:36 使用的是atmega16a芯片,晶振8M time0的初始化代码: void TC0_init(void) { TCCR0=0x00; //定时器停止 TCNT0=0x36; //计数初值计算为48(调试修改为54) 计数初值=最大计数值-[t(计时时间)*工作频率]/分频数 ,本例中=256-(208us*8MHz)/8=48 OCR0= 0xD0; //比较值 =最大计数值-计数初值=256-48 = 208 } time0的中断服务代码: interrupt [TIM0_OVF] void timer0_isr(void) { TCNT0=0x36;//重置计数初值--调试之后修改为54 i_count++; //每计时208us,计数器自加1 } 自己的delay函数,该函数定时是以208us为基数的定时(输入参数为定时208us的次数) void mydelay(int times) { TCCR0=0x02; //定时器开始,8分频 while(1) { if (times==i_count) { TCCR0=0x00;//到达计时时间,Time0停止工作 i_count = 0; //计时计数器归0,为下次计数做准备 break; //跳出循环 }; }; } 上面的三个结果是连续执行三次出现的,唉!
最多设置5个标签!
定时器如果要精度高,尽量用CTC模式,这样时间常数是自动转载的,不占用指令,没有装载参数引起的时间误差。
不知道你需要多大的时间精度,其实_delay_us函数的精度还可以的,你试试看。
一周热门 更多>