永发信息网

ATmega16单片机定时器停止不了

答案:2  悬赏:60  手机版
解决时间 2021-03-21 02:03
  • 提问者网友:人生佛魔见
  • 2021-03-20 18:22
这个问题纠结我好长时间。前段时间想用ATmega16单片机的定时器1做个99秒倒计时的装置。发现时间到0后定时器关闭不了。用的8MHz晶振,数码管显示。编译器是iccavr v6.31a,程序中定义char time=99;来计时。定时器初始化函数如下:void T1_init(){ TCCR1B=0x04; TCNT1H=0x85; TCNT1L=0xED; TIMSK |= BIT(2); SREG |= BIT(7);}定时器的中断服务程序如下:#pragma interrupt_handler T1:9void T1(){ TCNT1H=0x85; TCNT1L=0xED; time--; if (time <= 0) TIMSK &= ~BIT(2);}这样发现时间到0后,定时器没能停止,不过继续显示的是乱码。如果把中断服务程序里判断时间是否为零的语句改成if (time ==0)定时器就可以正常停止。这是为啥啊?哪位大师指点一下小弟?
最佳答案
  • 五星知识达人网友:舊物识亽
  • 2021-03-20 19:07
atmega的单片机没有运行控制位,停止不了,不像51,可以给一个TR0=0就可以停止了!
全部回答
  • 1楼网友:空山清雨
  • 2021-03-20 20:22

if (time <= 0)你的time 是全局变量,char型(-128~127)??那么time可以为负了,应该是if (time == 0)表示倒计时结束,为了可循环,可以做以下调整

if (time <= 0){
    timsk &= ~bit(2);

    time=99;//重新赋值
}

上一个我写的代码

#include<iom16v.h> #include"macroandconst.h"//自定义函数 #include<macros.h> int8 count; int8 ge; int8 shi; uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void delay(uint ms)   //误差 -0.651041666667us {     int8 a,b,i;  for(i=0;i<ms;i++)     for(b=102;b>0;b--)     for(a=3;a>0;a--); } void timer1_init(void) {  tccr1b=0x04;//256分频  tcnt1h=0x85;//1s  tcnt1l=0xee;  timsk|=bit(2);//t/c1 interrupt  sreg|=bit(7);  }   void port_init(void) { ddra=0xff; porta=0xff; ddrb=0xff; portb=0xff; ddrc=0xff; portc=0xff; ddrd=0xff; portd=0xff; } void display(int8 wela,int8 dula) {  portb=table[dula];//send dula  portc&=~bit(wela);//开启显示的位  delay(10);  portc|=bit(wela);//开启显示的位 } void main() {  port_init();  timer1_init();  while(1)     {   display(1,shi);     display(2,ge);   } } #pragma interrupt_handler timer1_isr:9 void timer1_isr(void) {    count++;  if(count==60)count=0;  shi=count/10;  ge =count%10;    tcnt1h=0x85;  tcnt1l=0xee; }

直奔→嵌入式团员为你解答,希望能帮助到你

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯