51單片機程序,使用定時器時,定時器計數、定時器中斷函數、while(1)循環三者之間如何協調好整個流程?
我拿一個最經典的單片機應用——‘流水燈’來分析吧。
【定時器0實現間隔1s的流水燈】簡單示例
#include typedef unsigned int u16; //對數據類型進行聲明定義 typedef unsigned char u8; #define LED P3 bit LED_flag=0; //定時到1s的標志位 u8 n; //循環變量,用作LED總線的位索引index void InitTimer0(void); //定時器0,初始化 void main() { LED=0XFF; //先初始化LED全滅(自上而下流動) InitTimer0(); while(1) { if(LED_flag==1) { LED_flag=0; LED=~(0x01< if(++n==8) n=0; } } } void InitTimer0(void) { TMOD |= 0x01; //用|=防止配置沖突 TH0 = (65536 - 50000)/256; ///定時器0,置初值(定時50ms) TL0 = (65536 - 50000)%256; EA = 1; ET0 = 1; TR0 = 1; } void Timer0() interrupt 1 //定時器0,中斷服務函數 { static u16 i; TH0 = (65536 - 50000)/256; ///定時器0,重裝初值(定時50ms) TL0 = (65536 - 50000)%256; i++; if(i==20) // 1s = 20 × 50ms { i=0; LED_flag=1; } } 第一、定時器什么時候開始工作呢? TR0=1;//啟動定時器0,這個斷點就標志著定時器0開始工作了,不管同不同意中斷,它都在計時。 第二、什么時候進入中斷函數,進入中斷函數后定時器又是怎么工作的,怎么循環累加出延時時間的? 該示例程序配置了定時器的中斷時間為 50ms(12MHz晶振),也就是每隔 50ms 就進入一次中斷函數。 進入中斷后,程序又重新給定時器定時50ms(定時器0不會自動重裝初值),同時對中斷次數進行計數(i++)。 主程序只要查詢計數值(i),就能知道 定時器中斷了多少次了。 第三、while(1)循環里面又是怎么工作的呢? 首先,主函數的 while(1)表示系統是一個 循環系統,一直在循環,不結束。 當定時器產生中斷時,就會暫停主函數,這就稱為定時器中斷。等中斷服務函數執行結束后,又會在主函數被打斷的地方,繼續執行主函數的內容。 進一步理解 定時器等中斷服務屬于前臺工作,主函數屬于后臺工作。 這樣的系統稱為前后臺系統,包括一個死循環和若干個中斷服務程序:應用程序是一個無限循環,循環中調用API函數完成所需的操作,這個大循環就叫做后臺系統;而中斷服務程序,接收到系統的各種異步事件,也就是前臺系統。 這就像一個酒店服務流程一樣:酒店前臺柜員(中斷服務程序)接收到客戶的突發問題(單片機系統的各種異步事件),前臺柜員再將接收到的問題反饋給大堂經理(while(1)后臺)進行事件的處理解決。 這說明了:主函數在執行的時候,定時器中斷在前臺是一直在工作的(只要你開啟了)。 程序中,主函數的while(1),對定時器的中斷次數是否到達1s定時的標志位LED_flag進行查詢,如果==1,那它就將該標志位清0 ,并且執行流水燈事件。
上一篇:51單片機(二十一)—— 定時器計數功能
下一篇:51單片機的中斷和定時器、計數器
推薦閱讀
史海拾趣
GISMA深知客戶需求的重要性,因此始終將客戶需求放在首位。公司擁有一支專業的研發團隊和客戶服務團隊,能夠根據客戶的具體需求量身定制產品,提供從設計到生產的全方位服務。這種定制化服務模式不僅贏得了客戶的廣泛贊譽,也進一步鞏固了GISMA在電子行業中的市場地位。通過深入了解客戶需求,GISMA不斷優化產品設計和生產流程,為客戶提供更加優質的產品和服務。
隨著云計算和大數據的興起,數據中心市場迎來了爆發式增長。Exar公司敏銳地抓住了這一市場機遇,推出了一系列針對數據中心市場的產品。通過不斷的技術創新和產品優化,Exar在數據中心市場上取得了顯著的突破,贏得了眾多客戶的認可和信賴。
隨著全球環保意識的日益增強,Bel Power Solutions積極響應號召,將環保理念融入產品設計和生產中。公司推出了多款環保型電源產品,如高效能、低能耗的DC-DC轉換器和電源供應器,幫助客戶降低能耗、減少碳排放。同時,公司還致力于研發和推廣可再生能源應用技術,為可持續發展做出貢獻。
DLP聯合科技公司,通過與國內外知名企業的技術合作,實現了技術的快速迭代和產品的升級換代。公司積極尋求與產業鏈上下游企業的合作機會,共同研發新技術、新產品。通過與合作伙伴的緊密合作,DLP聯合科技在DLP技術領域取得了顯著成果,為電子行業的發展做出了積極貢獻。
DLP創新設計公司,一家專注于DLP技術應用的企業,通過精準的市場定位和靈活的市場策略,成功在電子行業中脫穎而出。公司深入了解消費者需求,針對不同市場推出差異化產品。同時,DLP創新積極尋求合作伙伴,通過渠道拓展和品牌建設,逐漸提高了市場占有率。其獨特的商業模式和敏銳的市場洞察力,使DLP創新在激烈的市場競爭中保持了穩健的發展。
前一短時間覺得自己的電腦放音不夠大,于是起了制作音響的想法。對我我這樣的業余選手制作出什么曠世奇作基本不可能,所以我也知趣的選擇了集成音頻功放IC,在價格和易用性上選擇我買了2片TDA2030,于是搜集各大網站的關于TDA2030制作資料,后來發 ...… 查看全部問答∨ |
我的畢業設計是要在vxworks下的zinc來構造一個車載導航界面,現在是新手,有以下問題請各位大俠們幫忙解決下,萬分感謝! 1.目前我用的是Windriver Tornado Ver2.2 For ARM的版本。看網上都是在pentium下安裝的wind2.0.3和zinc6.0,不知道for ARM ...… 查看全部問答∨ |
WINCE5.0 ARMV4I的模擬器的寬高能夠超過600*800? BSP用的是MICROSOFT DEVICEEMULATOR:ARMV4I Platform-->SDK-->Config SD-->Emulation屬性頁中,大小不能修改,還有其他地方能修改模擬器的大小嗎?比如調整成 1024*768… 查看全部問答∨ |
|
硬件工程師 職責: 1. 負責與客戶、營銷團隊、研發團隊、供應商或聯盟伙伴共同設計和研制工程產品或產品模塊的全過程. 2. 制定和建立設計規范和技術要求。 3. &nbs ...… 查看全部問答∨ |
剛剛裝了EVC4++. 里面還帶有SDK. 編譯運行<<windows CE程序設計>>中的例子程序時候. 在進入模擬器前. 編譯連結彈出對話框: ERROR: An appliction targeting a Standard SDK for Windows CE.NET and built for the X86 CPU c ...… 查看全部問答∨ |