1. 程式人生 > >Arduino—定時器中斷的簡單實現

Arduino—定時器中斷的簡單實現

實驗中使用到的Arduino開發板型號為Mega 2560。Mega 2560的工作電壓為5V,其標明的推薦電壓為7~12V,在開發專案的時候,一般要用到變壓器。其供電型別有3.3V和5V兩種。這裡進行中斷實驗時,沒這麼麻煩,只需將這塊板子和電腦用USB線連線起來即可。

首先,中斷是指計算機執行過程中,出現某些意外情況需主機干預時,機器能自動停止正在執行的程式並轉入處理新情況的程式,處理完畢後又返回原被暫停的程式繼續執行。相當於你在讀書時聽到了敲門聲,即中斷源向你發出了中斷請求,你需要放下書本,先去開門,發現原來是外賣到了。你處理完之後,又回去繼續讀書,並從你剛才讀到的地方繼續往下讀。如果你是一個機器人的話,你從聽到敲門聲到回來繼續讀書的過程,構成了整個的中斷過程。寫入你大腦中的程式即為軟體處理程式,門就是中斷裝置。


你可以在你的電腦上依次開啟“裝置管理器-檢視-依連線順序排列資源”,再展開“中斷請求”,這時你會看到你的電腦上的各種中斷,中斷號為0的是“系統計時器”,中斷號越小,其優先順序越高。所謂優先順序,是指當兩個或多箇中斷同時發生時,CPU先響應優先順序最高的中斷。

中斷有很多型別,此處介紹的為定時器中斷,即利用板子裡的定時器來讓中斷定時發生,可以精確控制時間。

在寫程式之前,需要先在Arduino開發環境中匯入一個庫,即FlexiTimer2,這個庫可以在官網上下載。然後直接開啟”專案—載入庫—新增一個.ZIP庫“,這時,你只需要將之前下載的庫在彈出來的檔案查詢框中點開即可。這時再點開”專案—載入庫“,會在下面看到這個庫,點選它,在程式中會自動出現預處理命令:

#include <FlexiTimer2.h>

整個程式如下:

#include <FlexiTimer2.h>

int pin=13;
int buttonpin=2;
void event()
{
    static boolean output=HIGH;
    digitalWrite(buttonpin,output);
    output=!output;
}

void setup() {
    pinMode(pin,OUTPUT);
    pinMode(buttonpin,OUTPUT);
    FlexiTimer2::set(500,1.0/1000,event);
    FlexiTimer2::start();
}
void loop() {
    for(int i=0;i<255;i++){
      analogWrite(pin,i);
      delay(5);
    }
    for(int i=255;i>0;i--){
      analogWrite(pin,i);
      delay(5);
    }
}

   首先定義板子上自帶的13號燈為pin引腳,然後定義2號引腳。這裡需要說明的是,每一型別的Arduino開發板的中斷引腳不同,Mega 2560開發板有2,3,21,20,19,18共六個中斷引腳。在主程式裡寫入13號引腳要做的工作——呼吸燈。然後在setup裡,初始化這兩個引腳。然後便是兩個函式:
    FlexiTimer2::set(500,1.0/1000,event);
    FlexiTimer2::start();
第一個函式裡有三個引數,首先500指頻率,1.0/1000是指時間,即用1秒除以1000,為1ms,第三個是一個函式,在這裡即為2號引腳要做的工作。整條語句意思是每過500*1ms,就執行一次event函式。接下來一條語句是讓定時器開始工作。
整個event函式,是讓2號引腳的電平反轉,意思是每隔500ms即0.5s讓2號LED燈點亮一次:
void event()
{
    static boolean output=HIGH;
    digitalWrite(buttonpin,output);
    output=!output;
}
現在整個程式已經完成,效果就是在13號燈進行呼吸操作的同時,2號LED燈每隔0.5秒閃爍一次。

相關推薦

Arduino定時中斷簡單實現

實驗中使用到的Arduino開發板型號為Mega 2560。Mega 2560的工作電壓為5V,其標明的推薦電壓為7~12V,在開發專案的時候,一般要用到變壓器。其供電型別有3.3V和5V兩種。這裡進行中斷實驗時,沒這麼麻煩,只需將這塊板子和電腦用USB線連線起來即可。首先,

定時查詢法和定時中斷實現LED閃爍

1、定時器查詢法實現LED閃爍 ;2013/4/23 ;延時1s閃爍 org 0000h ajmp start org 30h

用連結串列+函式指標+定時中斷實現的一個軟體定時(試用於所有微控制器)

因為需要移植nrf51822的程式到普通微控制器上,於是分析了協議棧裡的軟體定時器,用連結串列+函式指標+定時器中斷的方法實現了軟體定時器的功能。 下面介紹程式碼和使用方法 1、函式指標和連結串列初始化 typedef void (*app_timer_timeout_

定時/中斷/PWM】利用一個定時實現一路PWM波的輸出---點亮LED

------------------------------------------湊熱鬧的分割線------------------------------------------------ /*點亮led0(P1^0)和led7(P1^7) 其中led0以5v電壓正

定時中斷實現LED閃爍

#include <reg52.h> typedef unsigned char u8; typedef unsigned int u16; sbit led=P2^0; void T

stm32-定時中斷

cmd open 兩個 typedef clock 數據手冊 濾波 重裝 fin 由於現在是在學用庫函數操作,我的目標是知道用到的每個函數的作用,需要的時候可以加以更改使用,所以關鍵是要怎麽知道stm32各函數的作用 雖然從名字上也能知道個大概,但是細節還是要查stm3

Java web文件服務簡單實現

是否 auth cor multi 同步 登錄驗證 stp while break 我們公司在做一個在線考試平臺,平臺在發布文章、編輯試題時需要將文章生成的html文檔以及題中的圖片上傳到一個專門文件服務器,然後再界面中使用http鏈接上傳的文件。 基於這個考慮,需要實現一

系統引導加載簡單實現

位操作 地址 計算 中斷向量表 count 硬件 1.3 編寫 src 在實現引導加載器之前,首先我們先了解下在開機之後系統是怎麽被引導的,這對於實現引導加載器來說是很重要的。只有知道原理,才能更好的實現嘛。 1 引導過程 1.1 當電源按鈕按下時   當我們按下電源按鈕是

java定時2-spring實現

tint style eight pptv span 簡單 oid 性能 simple spring定時器(基於xml) spring定時器(基於註解) quartz定時器 1、使用基於xml配置的spring定時器 首先編寫定時任務類Mytask

C# 定時 一個簡單 並且可以直接運行的Demo

threading pac als 簡單 time tar model ali 代碼 using System; using System.Collections.Generic; using System.ComponentModel; using System.Dat

TI CC2530 學習筆記-7-NewBit-CC2530-Interrupt-定時中斷

TI CC2530 學習筆記-目錄 TI CC2530 學習筆記-7-NewBit-CC2530-Interrupt-定時器中斷 設定CC2530定時器4每1ms中斷一次,在中斷裡對溢位進行計數,當計數達到1000次(1秒)時小燈狀態改變。 配置定時器和LED

51微控制器使用定時中斷模擬PWM控制埠電壓

  最近應實驗室需求寫一篇51微控制器產生PWM的文章供參考.   微控制器晶片STC89C52,晶振12MHz,編譯環境Keil5.   分析:若使微控制器埠為高電平, 則微控制器輸出電壓為恆值5V. 反之低電平輸出電壓為0V. 但是我們如果在週期為T的時間內

使用Spring的定時@Scheduled註解實現定時任務

在很多時候我們在專案中需要週期性地執行一些操作,並且這些操作不能通過簡單的for迴圈和while迴圈來實現,因此我們需要有一個可以實現定時操作的方法,在spring中就有這麼一個非常方便的方法,下面就簡單記錄下@Scheduled註解的使用方法。 1、首先我們需要一個spring專案,這個是前

[STM32F103]定時中斷

l 使能定時器時鐘。   RCC_APB1PeriphClockCmd(); l 初始化定時器,配置ARR,PSC。   TIM_TimeBaseInit(); l 開啟定時器中斷,配置NVIC。   void TIM_ITConfig();   NVIC_Init(

Linux 高精度定時hrtimers簡單介紹和應用場景

hrtimer:high-resolution kernel timers:   hrtimers的誕生是由於核心開發者在使用過程中發現,原始的定時器kernel/timers.c,已經可以滿足所有場景的,但是在實際的大量測試中發現還是無法滿足所有場景,所以hrtime

微控制器MSP430 - Timer_A 定時中斷程式

一、利用定時器定時功能,實現定時器單個溢位中斷,實現 P3.0 方波輸出 #include "cc430x613x.h" void main() { WDTCTL = WDTPW + WDTHOLD; // 停止看門狗定時器 P3DIR |=

stm32f103定時中斷

stm32為我們提供了8個定時器,分為:通用是定時器(TIM2~TIM5),高階定時器(TIM1和TIM8),基本定時器(TIM6和TIM7)。 至於三者之間的區別可以參考以下部落格:https://blog.csdn.net/dukai392/article/details/72058041

ZYNQ-7000私有定時中斷

  轉自:https://blog.csdn.net/RZJMPB/article/details/50812579 本片文章將在ZYNQ的純PS裡實現私有定時器中斷。每個一秒中斷一次,在中斷函式裡計數加1,通過串列埠列印輸出。 *本文所使用的開發板是Miz702(相容zedb

C6678定時中斷學習180614

第一次寫部落格,希望能夠在兩年內記錄一下自己的學習歷程。目前剛開始接觸DSP,所以在學習DSP上會對多寫點,如果有不對的地方 希望大家能夠不吝賜教! 話不多說,接觸的6678板子,所以先從6678的中斷部分開始寫起,之前寫了一個GPIO的,但是樓主發現腦子短路了,因為沒有外部中斷GPIO

C51--點亮LED燈(for迴圈、while迴圈、定時中斷迴圈)

第一步:開啟keil4,建立工程,at89c52。 1.點亮第一個LED燈 #include<reg52.h> sbit led=P2^0; void main() { led=0;//低電平亮 } 2.利用延時來使LED 1秒閃爍,500ms變