《電子技術應用》
您所在的位置:首頁 > 其他 > 業界動態 > 單片機程序設計中運用事件驅動機制

單片機程序設計中運用事件驅動機制

2009-01-19
作者:蔣 翔

??? 摘? 要: 通過實例說明將事件驅動機制應用到單片機程序中,使中斷響應與處理程序分離,可較理想地用硬件定時代替處理程序中的軟件定時,從而大幅提高系統對多中斷的實時響應能力,降低多中斷系統調試的難度。?

??? 關鍵詞: 事件驅動?? 單片機?? 程序設計?? 實時響應

?

1 傳統單片機程序開發的不足?

??? 在傳統的單片機程序中,通常是以“過程”和“操作”為中心的結構,程序按規定的過程順序地執行,與外設的連接一般采用中斷方式,在中斷服務程序中完成外設的全部處理工作,主程序一般只是初始化系統并等待中斷的發生。這種結構成熟、易于理解,但有如下不足:?

??? (1)受單片機性能的限制,容易造成系統對其它中斷的響應變得遲緩,特別是對于中斷源較多、中斷處理耗時較多的系統 (如:LED顯示、鍵盤掃描等);?

??? (2)中斷服務程序過長,在中斷服務期間系統無法響應同級的中斷;?

??? (3)可能導致代碼重入,增大堆棧開銷,造成難以預料的結果;?

??? (4)程序調試時,花在各模塊定時協調方面的時間、精力隨系統的復雜程度大幅增加。?

??? 如果在編寫單片機程序時,引入Windows程序中的事件驅動機制,把中斷響應與事件處理程序分離,中斷服務程序的任務只是產生一個中斷發生的標志,而事件處理則由處理程序來完成,主程序則負責判斷標志和調度處理程序。這樣,可大幅縮短中斷服務程序的長度,減少中斷服務程序的耗時,提高系統對多中斷的響應能力,從而較好地解決上述矛盾。?

2 Windows的事件驅動機制?

??? 在Windows系統中,程序的設計圍繞事件驅動來進行。當對象有相關的事件發生時(如按下鼠標鍵),對象產生一條特定的標識事件發生的消息,消息被送入消息隊列,或不進入隊列而直接發送給處理對象,主程序負責組織消息隊列,將消息發送給相應的處理程序,使相應的處理程序執行相應的動作,做完相應的處理后將控制權交還給主程序。?

??? 在這種機制中,對象的請求僅僅是向隊列中添加相應的消息,耗時的處理則被分離給處理函數。這種結構的程序中各功能模塊界限分明,便于擴充,能充分利用CPU的處理能力,使系統對外界的響應準確而及時。?

3 事件驅動的單片機程序設計?

??? 與Windows系統相比,單片機的資源非常有限,因此,單片機程序中的事件驅動機制只能采取一種簡化的方式。當某個中斷發生時,中斷服務程序設置相應的標志,不同的標志代表不同的中斷發生的消息,而主程序不斷地判別這些標志,以決定啟動哪一個處理函數。相應的處理函數被啟動處理完相關的任務后,清除此標志,然后把控制權交還給主程序。采用這種機制,可合理地利用有限資源,使程序調試的工作量大幅下降。對于延時、定時處理(如LED顯示、鍵盤掃描等),更可方便地使用一定時器來完成延時、定時的任務,從而把CPU從這種耗時的任務中解放出來,確保系統對多中斷有足夠的響應能力。?

??? 本文以一IC卡讀寫機為例,說明事件驅動機制在單片機程序設計中的具體應用。?

3.1 硬件結構?

??? 本系統以ATMEL公司的89C51為核心(如圖1)。89C51價格低廉,性能較好,片內有4KB的可擦寫程序存儲器,可滿足本系統的要求。為簡化硬件結構及系統能耗,鍵盤采用軟件掃描的矩陣鍵盤。LED顯示采用段位動態掃描,在任一時刻LED中最多只有一段被點亮。具體是在位選信號送某位LED的公共極時,每隔一個時間片依次輸出該位LED的段碼(含小數點),輸出完成一位后,再逐次輸出下一位。從第一位至第N位LED依次分成8×N個時間片循環掃描顯示。串口UART作為系統與外部數據通訊的通道,IC卡的讀寫由MCU模擬I2C協議來實現。?

?

?

3.2 事件驅動機制的單片機程序設計?

??? 中斷申請標志?

??? 在系統中定義一個可位尋址的單元,在此把它命名為Message_Flag,用來記錄描述中斷事件發生的情況。各位的定義如下:?

?

?

??? LED顯示的實現?

??? 顯示模塊結構見圖2。以定時器T0作為LED的動態掃描的定時基準,T0的定時時間最大值Tseg=20ms/(8×N)(其中N為LED位數),改變Tseg的值可改變顯示的亮度。T0每隔Tseg時間向MCU申請中斷,在T0的中斷服務程序中置位相應的標志位(Message_Flag中的D0位)。主程序檢測到此標志位被置位后,啟動顯示模塊實現位段的顯示輸出。?

?

?

??? 鍵盤輸入的實現?

??? 鍵盤模塊結構見圖3。在LED動態掃描期間,只有被點亮的LED相應的位選線維持大約3ms的低電平,而在系統工作的絕大部分時間內LED的位選線(即鍵盤的列線)維持高電平。當有鍵被按下時,將把鍵盤的行線中某一根拉成高電平,經或非門后,向MCU申請INT1中斷,在INT1的中斷服務程序中啟動定時時間為20ms的定時器T1。T1的定時時間到后向MCU申請T1中斷,在T1的中斷服務程序中置位相應的中斷申請標志(Message_Flag中的D1位)。主程序檢測到此標志位被置位后,啟動鍵盤掃描模塊實現鍵盤輸入。鍵盤輸入完成(用戶按“確認”鍵),置位鍵盤輸入確認標志(Message_Flag中的D7位)。

?

?

??? IC卡的讀寫?

??? IC卡的SDA、SCL經卡座分別通過P1.0、P1.1與MCU相連。當IC卡插入卡座時,座上的微動開關使INT0變為低電平,向MCU申請INT0中斷。在INT0中斷服務程序中置位相應的中斷申請標志(Message_Flag中的D2位),主程序檢測到此標志位被置位后,啟動IC卡的讀模塊,以軟件模擬I2C協議來實現讀卡操作。在數據處理完成后,同樣通過軟件模擬I2C協議來完成寫卡的操作。?

??? 串口通訊?

??? 實際應用中可把UART轉換成RS232C與PC相連或轉換成RS485等其它協議組成單片機網。MCU與外部的通訊采用中斷方式,在串口的中斷服務程序中置位相應的中斷申請標志(Message_Flag中的D4位)。主程序檢測到此標志位被置位后,啟動串口通訊模塊,實現與外部的數據通訊。?

??? 主程序的設計?

??? 綜上所述,主程序首先完成系統的初始化,然后循環檢測各中斷的中斷申請標志,如有某標志被置位,則啟動相應的處理模塊完成相應的任務。程序結構如下(用C51編寫):?

??? unsigned bdata message_flag;?

??? sbit t0_int=message_flag^0;?

??? sbit t1_int=message_flag^1;?

??? sbit int0_int=message_flag^2;?

??? sbit uart_int=message_flag^4;?

??? sbit kb_enter=message_flag^7;?

??? unsigned char kb_buf[8];?

??? unsigned char led_buf[8];?

??? unsigned char ic_buf[8];?

??? unsigned char num_buf[8];?

??? void num_proc(void);????? ? /*數據處理模塊*/?

??? void ledbuf_write(unsigned ,unsigned int); /*數據處理*/?

??? void system_init(void);?? ? /*系統初始化*/?

??? void uart_commune(void);? ? /*串口通訊模塊*/?

??? void led_display(void);?? ? /*LED顯示*/?

??? void kb_scan(void);???? ??? /*鍵盤掃描*/?

??? void ic_reader(void);???? ? /*讀IC卡*/?

??? void ic_writer(void);???? ? /*寫IC卡*/?

??? void set_timer(unsigned int time_len,unsigned char type,unsigned char id);/*設置定時器*/?

??? void t0_int_sever(void);? ? /*定時器T0中斷服務*/?

??? void t1_int_sever(void);?? /*定時器T1中斷服務*/?

??? void int0_int_sever(void);? ??? /*INT0中斷服務*/?

??? void int1_int_sever(void);? ??? /*INT1中斷服務*/?

??? void uart_int_sever(void);? ??? /*串口中斷服務*/?

??? void main(void)?

??? {?

??????? system_init();?

? ? while(1) {?

??? ????? if? (t0_int)? ??? led_display();?

??? ????? if? (int0_int)? ? ic_reader();?

??? ????? if? (t1_int)??? ? kb_scan();?

??? ????? if? (uart_int)?? uart_commune();?

??? ????? if? (kb_enter){?

?????? ???? ?????? num_proc();?

??????? ?????????? ic_writer();?

??????? ?????????? ledbuf_write(num_buf,8);?

???? ????????? }?

???? ???? }?

??? }?

??? 事件驅動的單片機程序設計是通過在中斷服務程序中置位相應標志,把耗時的中斷服務中的處理部分分離出來,中斷返回后,再由主程序根據標志啟動相應的處理模塊。在任務處理完成后,清除相應的標志。由于中斷服務程序短小,所以一般能實時地響應各種中斷;而處理程序之間不會被相互調用,所以不會產生代碼重入;各模塊界限分明,給程序中各模塊的統調帶來很大的方便。?

??? 實踐證明,運用事件驅動機制來組織單片機程序,即使對于要求定時準、耗時多的多中斷、多模塊系統,也可輕松地完成。?

參考文獻?

1 何立民.MCS-51系列單片機應用系統配置與接口技術.北京:北京航空航天大學出版社,1990?

2 馬忠梅等.單片機的C語言應用程序設計.北京:北京航空航天大學出版社,1997.3?

3 黃維通.Visual C++面向對象與可視化程序設計.北京:清華大學出版社,2000.5

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          亚洲视频精品| 美日韩丰满少妇在线观看| 欧美视频在线播放| 国产精品美女| 亚洲精品欧洲| 欧美mv日韩mv国产网站| 久久九九全国免费精品观看| 精品999在线播放| 99国产精品99久久久久久| 国产精品护士白丝一区av| 欧美午夜视频一区二区| 狠狠色狠狠色综合日日五| 韩日欧美一区二区| 香港成人在线视频| 一本色道久久综合亚洲精品不卡| 亚洲国产精品123| 亚洲欧美精品中文字幕在线| 亚洲一区二区免费看| 国产日产高清欧美一区二区三区| 亚洲人成在线观看| 欧美日韩1区2区3区| 国产日韩精品一区二区三区在线| 黄色国产精品一区二区三区| 一区二区视频免费在线观看| 欧美黄色日本| 欧美精品在线观看一区二区| 欧美一区二区三区免费观看视频| 亚洲一区精品视频| 91久久极品少妇xxxxⅹ软件| 黄色精品免费| 亚洲国产成人精品久久久国产成人一区| 国内自拍一区| 精品1区2区| 久久久国产精品亚洲一区| 欧美综合激情网| av72成人在线| 久久久免费av| 欧美在线一二三| 激情一区二区三区| 日韩午夜黄色| 欧美色图天堂网| 国产精品日韩欧美一区二区三区| 国产日韩欧美a| 国产视频观看一区| 国产婷婷色一区二区三区| 欧美丰满少妇xxxbbb| 香蕉久久久久久久av网站| 午夜精品久久久久久久99樱桃| 国产精品国产三级国产aⅴ无密码| 久久久久青草大香线综合精品| 亚洲少妇一区| 激情久久五月| 国产日韩亚洲欧美| 老司机精品视频一区二区三区| 国产精品欧美风情| 最新国产拍偷乱拍精品| 一本大道久久精品懂色aⅴ| 久久国产福利| 欧美丰满高潮xxxx喷水动漫| 亚洲欧美日本日韩| 久久偷看各类wc女厕嘘嘘偷窃| 国产精品igao视频网网址不卡日韩| 亚洲午夜精品视频| 国产精品日韩欧美一区二区三区| 国产精品老女人精品视频| 欧美日韩国产经典色站一区二区三区| 国产精品福利影院| 国产精品二区影院| 韩国美女久久| 一区二区欧美在线观看| 欧美日韩亚洲综合在线| 国产精品自拍一区| 欧美视频国产精品| 欧美国产日韩a欧美在线观看| 日韩视频一区二区| 久久久久久久综合色一本| 欧美色精品天天在线观看视频| 在线观看久久av| 国产精品一区免费观看| 久久久av网站| 久久久久久久一区| 在线精品视频免费观看| 欧美伊人久久久久久午夜久久久久| 亚洲午夜精品在线| 国产精品99久久久久久久vr| 美女主播一区| 亚洲欧美精品在线| 国产精品自拍一区| 国产在线精品二区| 老司机一区二区| 亚洲国产欧美一区| 国产原创一区二区| 欧美香蕉大胸在线视频观看| 欧美日韩福利在线观看| 久久免费的精品国产v∧| 免播放器亚洲一区| 一本久道综合久久精品| 亚洲香蕉成视频在线观看| 亚洲国产欧美日韩| 国产精品日产欧美久久久久| 在线亚洲一区观看| 久热这里只精品99re8久| 欧美成ee人免费视频| 国产精品尤物| 一区二区三区欧美| 久久精品亚洲乱码伦伦中文| 国内自拍视频一区二区三区| 久久这里只有精品视频首页| 欧美午夜久久| 在线看片一区| 欧美在线播放| 欧美日本国产精品| 亚洲资源在线观看| 91久久在线观看| 国产精品v欧美精品v日本精品动漫| 另类人畜视频在线| 亚洲国产成人久久综合| 精品91久久久久| 久久精品人人做人人爽电影蜜月| 国产欧美日韩亚洲精品| 亚洲精品视频在线| 91久久精品日日躁夜夜躁欧美| 亚洲精品免费在线| 欧美激情一区二区| 亚洲裸体俱乐部裸体舞表演av| 亚洲乱码国产乱码精品精| 影音国产精品| 亚洲少妇最新在线视频| 欧美四级剧情无删版影片| 欧美日韩一区二区在线视频| 欧美激情一区三区| 中文日韩在线视频| 亚洲国产精品视频一区| 国产一区二区成人久久免费影院| 模特精品裸拍一区| 亚洲午夜久久久| 国产主播一区二区| 91久久精品一区二区三区| 国产精品美女久久久浪潮软件| 亚洲一区在线观看视频| 一本久道久久综合中文字幕| 尤物yw午夜国产精品视频| 国产乱码精品一区二区三区不卡| 国产午夜精品视频| 欧美日韩免费观看中文| 久久精品在这里| 久久综合狠狠综合久久综青草| 欧美一二三视频| 欧美/亚洲一区| 国产在线播精品第三| 欧美在线你懂的| 欧美搞黄网站| 嫩模写真一区二区三区三州| 国产精品久久久久三级| 国产精品久久精品日日| 在线视频欧美日韩| 最新中文字幕一区二区三区| 久久精品二区| 亚洲欧洲免费视频| 国外成人免费视频| 欧美午夜电影一区| 欧美日韩1区2区| 亚洲视频在线观看免费| 中国日韩欧美久久久久久久久| 国内一区二区在线视频观看| 国产精品午夜av在线| 久久婷婷丁香| 国产精品久久97| 亚洲第一区在线观看| 欧美另类变人与禽xxxxx| 99在线精品视频| 亚洲在线免费| 久热国产精品视频| 欧美日韩亚洲高清一区二区| 一区二区三区精品| 欧美一二三区精品| 亚洲男人的天堂在线观看| 久久成人精品电影| 欧美精品粉嫩高潮一区二区| 国产精品午夜久久| 欧美精品免费播放| 欧美日韩成人| 亚洲电影免费观看高清完整版| 久久一区精品| 欧美区视频在线观看| **网站欧美大片在线观看| 亚洲第一成人在线| 久久久五月天| 欧美日韩美女在线| 国产香蕉97碰碰久久人人| 欧美日韩高清一区| 精品99一区二区| 在线一区视频| 国产精品女主播在线观看| 国产精品夜夜嗨| 国产综合一区二区| 亚洲人成网站精品片在线观看| 欧美日韩精品免费观看视频| 亚洲自拍电影| 亚洲福利视频在线| 亚洲日本电影| 夜夜夜久久久| 国产精品久久久久久久一区探花| 一区二区视频免费完整版观看| 亚洲丰满在线| 亚洲视频你懂的| 午夜精品影院| 久久蜜桃香蕉精品一区二区三区| 美女精品国产| 韩国三级在线一区| 国产精品三上| 国产精品视频区| 在线日韩电影| 在线观看国产日韩| 久久这里有精品视频| 激情欧美一区二区三区| 99视频超级精品| 欧美精品免费在线| 国产精品久久综合| 欧美片在线播放| 亚洲一区二区高清视频| 国产精品成人一区二区网站软件| 日韩视频精品在线| 日韩一级大片在线| 一区二区三区精品视频| 麻豆成人在线| 在线观看日韩国产| 一区二区三区黄色| 免费不卡视频| 久久精品国产999大香线蕉| 99亚洲精品| 亚洲国产精品尤物yw在线观看| 影音先锋日韩精品| 一区二区三区高清视频在线观看| 亚洲欧洲三级电影| 国产精品高清一区二区三区| 99国产精品久久久久老师| 亚洲欧美日韩精品久久久| 国产精品国产三级国产专播精品人| 在线观看成人小视频| 欧美日韩性视频在线| 99国产一区二区三精品乱码| 国产性色一区二区| 一区二区在线视频| 99热在这里有精品免费| 欧美www视频| 欧美另类99xxxxx| 欧美高清影院| 欧美一级午夜免费电影| 国产欧美一区二区精品性色| 在线日韩电影| 国产一区999| 136国产福利精品导航| 欧美电影在线免费观看网站| 久久精品国产亚洲5555| 久久中文字幕导航| 久久国产日韩| 欧美精品电影| 欧美一级久久久| 亚洲一区二区三区高清| 亚洲国产欧美一区二区三区丁香婷| 国产片一区二区| 久久久久国产精品一区| 性久久久久久久| 国产精品美女在线| 亚洲第一免费播放区| 亚洲婷婷在线| 国产精品久久久久国产精品日日| 欧美三级免费| 激情久久久久久久久久久久久久久久| 久久综合一区| 亚洲精品一区二区三区婷婷月| 国产精品午夜国产小视频| 中文在线一区| 日韩午夜激情| 亚洲精品网址在线观看| 国产情侣一区| 91久久国产综合久久蜜月精品| 一区一区视频| 亚洲一区免费在线观看| 美腿丝袜亚洲色图| 欧美激情影院| 亚洲国产一成人久久精品| 亚洲欧洲精品一区二区三区| 国产亚洲午夜高清国产拍精品| 国产精品亚洲аv天堂网| 久久久在线视频| 国内视频精品| 正在播放亚洲一区| 亚洲国产成人在线播放| 一区二区三区四区五区视频| 亚洲私人黄色宅男| 亚洲精品乱码久久久久久| 欧美一区中文字幕| 国产日韩欧美一区二区三区在线观看| 亚洲天堂av图片| 欧美日韩在线观看一区二区三区| 男人的天堂亚洲| 国产综合欧美在线看| 性欧美video另类hd性玩具| 欧美美女操人视频| 国产一区二区高清视频| 欧美色另类天堂2015| 欧美国产一区视频在线观看| 久久一区精品| 亚洲自拍偷拍福利| 久久躁日日躁aaaaxxxx| 国产精品久久久久久影院8一贰佰| 国产日韩亚洲欧美综合| 国产精品美女午夜av| 欧美午夜精品久久久久久久| 狠狠色丁香久久综合频道| 欧美在线一区二区三区| 欧美 日韩 国产一区二区在线视频| 欧美日韩另类国产亚洲欧美一级| 欧美日韩精品一区二区三区| 国产欧美日韩在线播放| 欧美成人国产va精品日本一级| 欧美激情一区二区| 国产亚洲一区在线| 在线观看免费视频综合| 国产精品www色诱视频| 国产精品九色蝌蚪自拍| 中文在线资源观看网站视频免费不卡| 欧美午夜www高清视频| 一区二区三区福利| 精品动漫一区| 欧美日韩黄色一区二区|