毕业论文

当前位置: 毕业论文 > 范文 >

定时器中断是干嘛的?(6)

时间:2022-03-06 14:05来源:优尔论文
//设置计数器为1kHZ,即1ms OCR1A = 1999;// = (16*10^6)/(1000*8) - 1 (must be 65536) TCCR1B |= (1 WGM12);//打开CTC模式 TCCR1B |= (1 CS11);//设置CS11位为1(8倍预分频) TIMSK1 |= (1 OCIE

  //设置计数器为1kHZ,即1ms

  OCR1A = 1999;// = (16*10^6)/(1000*8) - 1 (must be <65536)

  TCCR1B |= (1 << WGM12);//打开CTC模式

  TCCR1B |= (1 << CS11);//设置CS11位为1(8倍预分频)

  TIMSK1 |= (1 << OCIE1A);

  //设置定时器2为8kHz

  TCCR2A = 0;// set entire TCCR2A register to 0

  TCCR2B = 0;// same for TCCR2B

  TCNT2  = 0;//initialize counter value to 0

  // set compare match register for 8khz increments

  OCR2A = 249;// = (16*10^6) / (8000*8) - 1 (must be <256)

  // turn on CTC mode

  TCCR2A |= (1 << WGM21);//打开CTC模式

  // Set CS21 bit for 8 prescaler

  TCCR2B |= (1 << CS21);   

  // enable timer compare interrupt

  TIMSK2 |= (1 << OCIE2A);

  sei();//打开全局中断

}

//中断0服务函数

ISR(TIMER0_COMPA_vect){// timer0中断2Hz切换引脚13(LED)

//产生频率为10kHz / 2 = 5kHz的脉冲波

  if(toggle0){

    digitalWrite(8,HIGH);

    toggle0 = 0;

  }

  else{

    digitalWrite(8,LOW);

    toggle0 = 1;

  }

}

ISR(TIMER1_COMPA_vect){// timer1中断2Hz切换引脚13(LED)

//产生频率为2Hz / 2 = 1Hz的脉冲波

  if(toggle1>=500)

    digitalWrite(13,HIGH);

  if(toggle1<=500)

    digitalWrite(13,LOW);

  toggle1 += 1;

  if(toggle1 >= 1000)

    toggle1 = 0;

}

ISR(TIMER2_COMPA_vect){// timer2中断8kHz切换引脚9

//产生频率为8kHz / 2 = 4kHz的脉冲波

  if(toggle2){

    digitalWrite(9,HIGH);

    toggle2 = 0;

  }

  else{

    digitalWrite(9,LOW);

    toggle2 = 1;

  }

}

//loop function

void loop(){

}

3。4 定时器中断的使用

        使用定时器中断前,必须先安装对应的 Timer 库,然后导入到 Arduino 的库文件里,并在程序中引用头文件 Timer。h 。

        实例:

// 秒切换一次引脚13的电平

// 包含定时器库的头文件

#include <FlexiTimer2。h>

// 中断服务程序

void flash() {

  static boolean output = HIGH;

  digitalWrite(13, output);

  output = !output;

}

void setup() {

  pinMode(13, OUTPUT);

  FlexiTimer2::set(500, flash); // 中断设置函数,每 500ms 进入一次中断

  FlexiTimer2::start();                    // 开始计时

}

void loop() {

}

其他 Timer 的使用基本一样,只要找到合适的库函数就能够使用,注意使用的定时器不要和你已使用的封装函数冲突,比如对于 UNO 来说,你在使用 Servo。h 的时候,就不能再使用 timer1 了,此时IDE会给你编译报错。

定时器中断是干嘛的?(6):http://www.youerw.com/fanwen/lunwen_90686.html
------分隔线----------------------------
推荐内容