国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

單片機(jī)程序設(shè)計(jì)中運(yùn)用事件驅(qū)動(dòng)機(jī)制

發(fā)布時(shí)間:2010-8-1 23:51    發(fā)布者:conniede
1 傳統(tǒng)單片機(jī)程序開發(fā)的不足

在傳統(tǒng)的單片機(jī)程序中,通常是以“過程”和“操作”為中心的結(jié)構(gòu),程序按規(guī)定的過程順序地執(zhí)行,與外設(shè)的連接一般采用中斷方式,在中斷服務(wù)程序中完成外設(shè)的全部處理工作,主程序一般是初始化系統(tǒng)并等待中斷的發(fā)生。這種結(jié)構(gòu)成熟、易于理解,但有如下不足:

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

(2)中斷服務(wù)程序過長,在中斷服務(wù)期間系統(tǒng)無法響應(yīng)同級(jí)的中斷;

(3)可能導(dǎo)致代碼重入,增大堆棧開銷,造成難以預(yù)料的結(jié)果;

(4)程序調(diào)試時(shí),花在各模塊定時(shí)協(xié)調(diào)方面的時(shí)間、精力隨系統(tǒng)的復(fù)雜程序大幅增加。

如果在編寫單片機(jī)程序時(shí),引入Windows程序中的事件驅(qū)動(dòng)機(jī)制,把中斷響應(yīng)與事件處理程序分離,中斷服務(wù)程序的任務(wù)只是產(chǎn)生一個(gè)中斷發(fā)生的標(biāo)志,而事件處理則由處理程序來完成,主程序則負(fù)責(zé)判斷標(biāo)志和調(diào)度處理程序。這樣,可大幅縮短中斷服務(wù)程序的長度,減少斷服務(wù)程序的耗時(shí),提高系統(tǒng)對(duì)多中斷的響應(yīng)能力,從而較好地解決上述矛盾。


2 Windows的事件驅(qū)動(dòng)機(jī)制

在Windosw系統(tǒng)中,程序的設(shè)計(jì)圍繞事件驅(qū)動(dòng)來進(jìn)行。當(dāng)對(duì)象有相關(guān)的事件發(fā)生時(shí)(如按下鼠標(biāo)鍵),對(duì)象產(chǎn)生一條特定的標(biāo)識(shí)事件發(fā)生的消息,消息被送入消息隊(duì)列,或不進(jìn)入隊(duì)列而直接發(fā)送給處理對(duì)象,主程序負(fù)責(zé)組織消息隊(duì)列,將消息發(fā)送給相應(yīng)的處理程序,使相應(yīng)的處理程序執(zhí)行相應(yīng)的動(dòng)作,做完相應(yīng)的處理后將控制權(quán)交還給主程序。

在這種機(jī)制中,對(duì)象的請(qǐng)求僅僅是向隊(duì)列中添加相應(yīng)的消息,耗時(shí)的處理則被分離給處理函數(shù)。這種結(jié)構(gòu)的程序中各功能模塊界限分明,便于擴(kuò)充,能充分利用CPU的處理能力,使系統(tǒng)對(duì)外界響應(yīng)準(zhǔn)確而及時(shí)。

3 事件驅(qū)動(dòng)的單片機(jī)程序設(shè)計(jì)

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

本文以一IC卡讀寫機(jī)為例,說明事件驅(qū)動(dòng)機(jī)制在單片機(jī)程序設(shè)計(jì)中的具體應(yīng)用。

3.1 硬件結(jié)構(gòu)

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

3.2

事件驅(qū)動(dòng)機(jī)制的單片機(jī)程序設(shè)計(jì)

中斷申請(qǐng)標(biāo)志

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



*Message_Flag中某位為1表示當(dāng)前有相應(yīng)的事件發(fā)生,為0則當(dāng)有沒有相應(yīng)的事件發(fā)生。

LED顯示的實(shí)現(xiàn)

顯示模塊結(jié)構(gòu)見圖2。以定時(shí)器T0作為LED的動(dòng)態(tài)掃描的定時(shí)基準(zhǔn),T0的定時(shí)時(shí)間最大值Tseg=20ms/(8×N)(其中N為LED位數(shù)),改變Tseg的值可改變顯示的亮度。T0每隔Tseg時(shí)間向MCU申請(qǐng)中斷,在T0的中斷服務(wù)程序中置位相應(yīng)的標(biāo)志位(Message_Flag中的D0位)。主程序檢測到此標(biāo)志位被置位后,啟動(dòng)顯示模塊實(shí)現(xiàn)位段的顯示輸出。

鍵盤輸入的實(shí)現(xiàn)

鍵盤模塊結(jié)構(gòu)見圖3。在LED動(dòng)態(tài)掃描期間,只有被點(diǎn)亮的LED相應(yīng)的位選線維持大約3ms的低電平,而在系統(tǒng)工作的絕大部分時(shí)間內(nèi)LED的位選線(即鍵盤的列線)維持高電平。當(dāng)有鍵被按下時(shí),將把鍵盤的行線中某一根拉成高電平,經(jīng)或非門后,向MCU申請(qǐng)INT1中斷,在INT1的中斷服務(wù)程序中啟動(dòng)定時(shí)時(shí)間為20ms的定時(shí)器T1。T1的定時(shí)時(shí)間到后向MCU申請(qǐng)T1中斷,在T1的中斷服務(wù)器程序中置位相應(yīng)的中斷申請(qǐng)標(biāo)志(Message_Flag中的D1位)。


主程序檢測到此標(biāo)志位被置位后,啟動(dòng)鍵盤掃描模塊實(shí)現(xiàn)鍵盤輸入。鍵盤輸入完成(用戶按“確認(rèn)”鍵),置位鍵盤輸入確認(rèn)標(biāo)志(Message_Flag中的D7位)。

IC卡的讀寫

IC卡的SDA、SCL經(jīng)卡座分別通過P1.0、P1.1與MCU相連。當(dāng)IC卡插入卡座時(shí),座上的微動(dòng)開關(guān)使INT0變?yōu)榈碗娖剑騇CU申請(qǐng)INT0中斷。在INT0中斷服務(wù)程序中置位相應(yīng)的中斷申請(qǐng)標(biāo)志(Message_Flag中的D2位),主程序檢測到此標(biāo)志位被置位后,啟動(dòng)IC卡的讀模塊,以軟件模塊I2C協(xié)議來實(shí)現(xiàn)讀卡操作。在數(shù)據(jù)處理完成后,同樣通過軟件模塊I2C協(xié)議來完成寫卡的操作。

串口通訊

實(shí)際應(yīng)用中可把UART轉(zhuǎn)換成RS232C與PC相連或轉(zhuǎn)換成RS485等其它協(xié)議組成單片機(jī)網(wǎng)。MCU與外部的通訊采用中斷方式,在串口的中斷服務(wù)程序中置位相應(yīng)的中斷申請(qǐng)標(biāo)志(Message_Flag中的D4位)。主程序檢測到此標(biāo)志位被置位后,啟動(dòng)串口通訊模塊,實(shí)現(xiàn)與外部的數(shù)據(jù)通訊。

主程序的設(shè)計(jì)

綜上所述,主程序首先完成系統(tǒng)的初始化,然后循環(huán)檢測各中斷的中斷申請(qǐng)標(biāo)志,如有某標(biāo)志被置位,則啟動(dòng)相應(yīng)的處理模塊完成相應(yīng)的任務(wù)。程序結(jié)構(gòu)如下(用C51編寫):

vnsigned 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 uum_proc(void); /*數(shù)據(jù)處理模塊*/
void ledbuf_write(unsigned,unsigned int); /*數(shù)據(jù)處理*/
void system_init(void); /*系統(tǒng)初始化*/
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); /*設(shè)置定時(shí)器*/
void t0_int_sever(void); /*定時(shí)器T0中斷服務(wù)*/
void t1_int_sever(void); /*定時(shí)器T1中斷服務(wù)*/
void int0_int_sever(void); /*INT0中斷服務(wù)*/
void int1_int_sever(void); /*INT1中斷服務(wù)*/
void uart_int_sever(void); /*串口中斷服務(wù)*/
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);
}
}
}

事件驅(qū)動(dòng)的單片機(jī)程序設(shè)計(jì)是通過在中斷服務(wù)程序中置位相位標(biāo)志,把耗時(shí)的中斷服務(wù)中的處理部分分離出來,中斷返回后,再由主程序根據(jù)標(biāo)志啟動(dòng)相應(yīng)的處理模塊。在任務(wù)處理完成后,清除相應(yīng)的標(biāo)志。由于中斷服務(wù)程序短小,所以一般能實(shí)時(shí)地響應(yīng)各種中斷;而處理程序之間不會(huì)被相互調(diào)用,所以不會(huì)產(chǎn)生代碼重入;各模塊界限分明,給程序中各模塊的統(tǒng)調(diào)帶來很大的方便。

實(shí)踐證明,運(yùn)用事件驅(qū)動(dòng)機(jī)制來紡織單片機(jī)程序,即使對(duì)于要求定時(shí)準(zhǔn),耗時(shí)多的多中斷、多模塊系統(tǒng),也可輕松地完成。
本文地址:http://m.qingdxww.cn/thread-18347-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評(píng)論 登錄 | 立即注冊(cè)

廠商推薦

  • Microchip視頻專區(qū)
  • 使用SAM-IoT Wx v2開發(fā)板演示AWS IoT Core應(yīng)用程序
  • 使用Harmony3加速TCP/IP應(yīng)用的開發(fā)培訓(xùn)教程
  • 集成高級(jí)模擬外設(shè)的PIC18F-Q71家族介紹培訓(xùn)教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿(mào)澤電子(Mouser)專區(qū)
關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产一级片网址 | 99爱免费视频 | 欧美黑人成人www在线观看 | 欧美成人专区 | 国产性大片黄在线观看在线放 | 嫩草影院永久在线一二三四 | 久久精品8| 中文国产成人精品少久久 | 久伊人网| 91热久久免费频精品黑人99 | 激情综合久久 | 日韩黄色在线播放 | 日韩精品一区二区三区高清 | 四虎在线最新永久免费 | h日本动漫无删减在线观看免 | 色婷婷激婷婷深爱五月小蛇 | 国产精品成人va | 手机在线免费不卡一区二 | 黄色免费网页 | 国产日韩精品视频一区二区三区 | 亚洲视频www | 成人午夜亚洲影视在线观看 | 日韩在线视频免费播放 | 欧美香蕉爽爽人人爽观看猫咪 | 五月婷婷综合色 | 99精品视频在线成人精彩视频 | 99热免费在线观看 | 日韩欧美不卡视频 | h视频网站在线观看 | 妈妈的朋友韩国三级 | 成人午夜小视频手机在线看 | 久久99热精品免费观看动漫 | 91免费在线看 | 高颜值露脸极品在线播放 | 亚洲综合色网站 | 国产美女白嫩嫩在线观看 | 国产免费爽爽视频免费可以看 | 亚洲欧美中文日韩二区一区 | 天天干天天射天天操 | 亚洲免费黄色 | 久久国产精品99国产精 |