Arduino--输出随机数,外部中断,定时器

随机数

函数介绍

random()

描述:生成伪随机数。
函数原型:

  • random(max)

  • random(min,max)

    参数:

  • min: 随机数区间下限值,且包括在内。此参数可选,省略则从0开始。

  • max: 随机数区间上限值,且不包括在内。

    返回值:min和max-1之间的随机数。

randomSeed()

描述:初始化随机数生成器。
函数原型:randomSeed(seed)
参数:用于初始化伪随机序列的数字,随机数种子。
返回值:没有。

int num;

void setup() {
  
  Serial.begin(115200);
  randomSeed(analogRead(0)); // 从引脚0读一个数作为随机数的种子

}

void loop() {
  num = random(100); //产生随机数范围为:0~100
  Serial.println(num);
  delay(1000);
}

外部中断

attachInterrupt()

  • 描述:外部中断配置函数。
  • 函数原型:attachInterrupt(interrupt, ISR, mode)
  • 参数:
    • interrupt: 中断号。不同Arduino开发板中断号不同。Uno R3有两个外部中断,分别为数字管脚2(中断0)和数字管脚3(中断1)。
    • ISR: 中断处理函数。此函数不带参数,没有返回值。
    • mode: 中断触发方式。
      • LOW: 低电平触发。
      • CHANGE:管脚状态改变触发。
      • RISING:上升沿触发。
      • FALLING:下降沿触发。

返回值:无。

定时器

https://blog.csdn.net/acktomas/article/details/88528577

介绍两个库:

  • MsTimer2 Latest MsTimer2 on [Github](https: //github.com/PaulStoffregen/MsTimer2)
  • FlexiTimer2 Latest FlexiTimer2 on [Github](https: //github.com/PaulStoffregen/FlexiTimer2)

MsTimer2 库函数介绍

  • 设定时间与要执行的 function
    MsTimer2: : set( some_ms, your_function);

  • 启动中断
    MsTimer2: : start();

  • 必要时可停止中断(当然随时可以再重新启动)
    MsTimer2: : stop();

  • 请注意, 如果你使用了 MsTimer2 库, 则 pin11 和 pin3 就不能再用做 PWM 输出了! 因为该 pin3 和 pin11 的 PWM 是靠 timer2 帮忙的! (tone( ) 也是)
    注意 Servo.h 库与 TimerOne 都是使用内部定时器 timer1 会影响pin 9, pin 10 的 PWM
    **tone() function ** 使用 timer2 定时器; 若使用 Tone 库的 Tone 对象(Tone 变量)也是优先使用 timer2 定时器,若用两个 Tone 变量则 timer1 也会被用掉, 用三个 Tone 则连控制 millis( )的 timer0 也会被用掉 ! ! !
    别忘了, timer0 负责帮忙控制 pin 5 和 pin 6 的 PWM 输出 ! ! !
    只要不去改变 timer 的 Prescaler就不会影响其控制的 PWM pin, 但MsTimer2 库与 tone( )都会改变 Prescaler ! !

#include                //定时器库的 头文件

int cnt;

void flash()                        //中断处理函数,改变灯的状态
{
  cnt++;                        
  Serial.println(cnt);
}

void setup()
{
  Serial.begin(115200);

  MsTimer2::set(500, flash);        // 中断设置函数,每 500ms 进入一次中断
  MsTimer2::start();                //开始计时
}

void loop()
{

}

综合

#include                //定时器库的 头文件

int cnt;
int num;

void timer_irq_handler() {          // 定时器中断处理函数

  cnt++;
  if(cnt == 10) cnt = 0;                        
  Serial.println(cnt);
}

void external_irq_handler() {       // 外部中断处理函数
  Serial.println(9999);      // 如果有下降沿就打印9999
}

void setup() {
  Serial.begin(115200);
  randomSeed(analogRead(0));     // 从引脚0读一个数作为随机数的种子
  
  MsTimer2::set(500, timer_irq_handler);        // 定时器中断设置函数,每 500ms 进入一次中断
  MsTimer2::start();                       //开始计时

  //下降沿触发,触发中断0,调用external_irq_handler函数
  attachInterrupt(0, external_irq_handler, FALLING); // 数字管脚2--interrupt0
}

void loop() {

  num = random(10, 100); //产生随机数范围为:0~100
  
  Serial.println(num);
  
  delay(1000);
}

你可能感兴趣的:(arduino)