在线观看av毛片亚洲_伊人久久大香线蕉成人综合网_一级片黄色视频播放_日韩免费86av网址_亚洲av理论在线电影网_一区二区国产免费高清在线观看视频_亚洲国产精品久久99人人更爽_精品少妇人妻久久免费

首頁 > 文章中心 > 單片機程序設(shè)計

單片機程序設(shè)計

前言:想要寫出一篇令人眼前一亮的文章嗎?我們特意為您整理了5篇單片機程序設(shè)計范文,相信會為您的寫作帶來幫助,發(fā)現(xiàn)更多的寫作思路和靈感。

單片機程序設(shè)計范文第1篇

[關(guān)鍵詞]:紅外遙控 解碼 單片機

1紅外遙控系統(tǒng)組成

通用紅外遙控系統(tǒng)由發(fā)射和接收兩大部分組成,應(yīng)用編/解碼專用集成電路芯片來進行控制操作,如圖1所示。發(fā)射部分包括鍵盤矩陣、編碼調(diào)制、LED紅外發(fā)送器;接收部分包括紅外接收器、光電轉(zhuǎn)換放大器、解調(diào)等。

2紅外遙控發(fā)射和接收原理

按下遙控器的某一個鍵,遙控器會發(fā)出一連串經(jīng)過調(diào)制后的信號,這個信號經(jīng)過紅外一體化模塊接收后,輸出解調(diào)后的數(shù)字脈沖,每個按鍵對應(yīng)不同的脈沖,故識別出不同的脈沖就能識別出不同的按鍵。按鍵信息采用脈寬調(diào)制的串行碼,以脈寬為0.565ms、間隔0.56ms、周期為1.125ms的組合表示二進制的“0”;以脈寬為0.565ms、間隔1.685ms、周期為2.25ms的組合表示二進制的“1”,其波形如圖2所示。

上述“0”和“1”組成的32位二進制碼經(jīng)38kHz的載頻進行二次調(diào)制以提高發(fā)射效率,達到降低電源功耗的目的,然后再通過紅外發(fā)射二極管產(chǎn)生紅外線向空間發(fā)射,如圖3所示。

3單片機解碼程序設(shè)計

紅外一體化接收頭輸出信號連接到單片機外中斷輸入引腳,設(shè)置為下降沿中斷方式。引導(dǎo)碼解碼過程只解碼帶數(shù)據(jù)的引導(dǎo)碼,不對連發(fā)碼引導(dǎo)碼進行解碼。這就要求使用過程中,長按操作不起作用。

關(guān)鍵解碼流程設(shè)計如圖4所示。

中斷解碼完成后,完成酥局夢弧V鞒絳蛑脅檠到完成標(biāo)志,就對解碼數(shù)據(jù)進行反碼校驗并進行對應(yīng)的處理。

4效果與應(yīng)用

以上設(shè)計的單片機解碼程序,成功應(yīng)用于萬年歷、計算器、電機控制、旋轉(zhuǎn)LED廣告燈燈各種單片機項目教學(xué)過程中,完全取代矩陣鍵盤進行操作,電路簡單,程序可靠。稍有不足的是要占用一個外中斷,并且在中斷解碼操作時,會占用CPU時間。

對于時序有嚴(yán)格要求的項目應(yīng)用,可以考慮“外中斷+定時器”的方式,在每個下降沿時進入中斷,對數(shù)據(jù)進行處理。兩次進中斷的時間間隔采用定時器來記錄,省略此前中斷解碼流程中設(shè)計的各種延時和等待操作,減少時間占用,提高CPU利用率。

參考文獻:

單片機程序設(shè)計范文第2篇

[關(guān)鍵詞]USB ECP Driver Studio 設(shè)備驅(qū)動程序

[中圖分類號]TP[文獻標(biāo)識碼]A[文章編號]1007-9416(2010)02-0029-02

1 引言

由于現(xiàn)在大多數(shù)計算機沒有并行口而具有多個USB接口,因此很多并行口設(shè)備無法和計算機直接連接使用。利用基于單片機STC11F32XE的USB 轉(zhuǎn) ECP 模式并行口可以連接其他ECP模式并口設(shè)備,以達到讓具有ECP接口的設(shè)備可以和沒有并口的PC進行數(shù)據(jù)通信的目的。并口采用的是IEEE 1284-A接口, USB 接口驅(qū)動芯片采用Philips 半導(dǎo)體公司的PDIUSBD12,該芯片的數(shù)據(jù)端口D0-D7接單片機的P0 口,引腳WR_N、RD_N、及A0 分別接單片機的P3.6、P3.7、P3.5 引腳。整個硬件電路圖如圖 1 所示。當(dāng) USB 設(shè)備硬件設(shè)計完成之后,接著就必須根據(jù)硬件特點和需要完成的功能,設(shè)計出合乎產(chǎn)品的USB驅(qū)動程序,否則,設(shè)備將無法被PC機識別,不能正常使用。

2 WDM型的USB驅(qū)動程序結(jié)構(gòu)

USB設(shè)備的驅(qū)動程序是一種典型的WDM驅(qū)動程序。WDM驅(qū)動程序是分層的。對于USB設(shè)備驅(qū)動程序來說,其驅(qū)動程序包括兩個層次:設(shè)備(功能)驅(qū)動程序?qū)雍涂偩€(底層)驅(qū)動程序?qū)?。USB底層驅(qū)動程序由操作系統(tǒng)提供,不要開發(fā)者自己編寫,它位于USB功能驅(qū)動程序的下面,負責(zé)與實際的USB硬件打交道,實現(xiàn)復(fù)雜而繁瑣的底層通信;USB功能驅(qū)動程序必須要由開發(fā)者編寫,它不與實際的USB硬件打交道,是把包含URB(USB Request Block,USB 請求塊)的IRP發(fā)送到USB底層驅(qū)動程序,來實現(xiàn)對USB設(shè)備信息的發(fā)送和接收。(圖2) 給出了USB 驅(qū)動程序的結(jié)構(gòu)模型。

3 USB驅(qū)動開發(fā)編程環(huán)境的建立

開發(fā)一個WMD 驅(qū)動程序,必須要搭建合適的開發(fā)環(huán)境以此來減小開發(fā)難度。對于WDM 驅(qū)動的開發(fā),一般必須使用的軟件是VC++6.0和DDk (Driver Development Kit,驅(qū)動程序開發(fā)工具包)。但為了進一步降低開發(fā)難度,選擇使用了第三方驅(qū)動開發(fā)工具--Driver Studio。它以類的方式對DDK 進行封裝,可以十分容易地利用它提供的向?qū)懋a(chǎn)生一個必需的驅(qū)動程序框架。

一般首先安裝VC++6.0,接著安裝DDK,如果需要的話,還可以安裝Windows SDK 來輔助開發(fā),最后安裝Driver Studio 3.2。因為Driver Studio的類庫要使用DDK庫函數(shù),所以在安裝好Driver Studio 之后必須首先要編譯出一個庫文件,否則會提示找不到庫文件vdw_wdm.lib 等錯誤。編譯該庫文件的步驟如下:啟動VC++6.0,找到并打開Driver Studio3.2 安裝目錄下的vdwLibs.dsw工程文件,然后選擇DriverStudio->DDK Build Settings,在彈出的對話框中設(shè)置DDK的安裝路徑和運行的操作系統(tǒng)。然后選擇菜單Build->Batch Build,要根據(jù)驅(qū)動運行的平臺來選擇對應(yīng)的工程文件,這里選擇了x86對應(yīng)的工程,正確選擇之后,單擊Rebuild All 按鈕,開始編譯庫文件。這個類庫只需編譯一次,以后開發(fā)其他的驅(qū)動就不必再次編譯了。

4 USB驅(qū)動創(chuàng)建方法及步驟

該驅(qū)動程序的主要功能包括:端點0采用控制傳輸,可以保證傳輸過程中的數(shù)據(jù)的完整性和正確性,主要負責(zé)USB枚舉過程中的數(shù)據(jù)的讀寫。另外,又增加了端點1和端點2。端點1采用中斷傳輸,這種傳輸主要用在數(shù)據(jù)量不大,但對時間要求較嚴(yán)格的設(shè)備中。因此,模塊滿足了實時性的特點;端點2采用批量傳輸,該種傳輸通常用在數(shù)據(jù)量大、對數(shù)據(jù)的實時性要求不高的場合中,利用該方式可以完成大量數(shù)據(jù)的快速傳輸,可以與高速的ECP并行口相匹配,因此,模塊滿足了高速數(shù)據(jù)傳輸?shù)囊蟆?/p>

單擊VC菜單欄下的DriverStudio菜單項,選擇Driver Wizard菜單,會出現(xiàn)一個驅(qū)動向?qū)υ捒?。單擊Start a new Driver Project 將創(chuàng)建一個新的驅(qū)動工程。然后按照向?qū)稍擈?qū)動程序的框架。具體步驟如下:①設(shè)置工程名和路徑。在彈出的對話框中,設(shè)置工程名為UsbToECP、路徑為D:\。②選擇驅(qū)動工程的類型。在對話框中選擇 WDM Driver,驅(qū)動框架選擇DriverWorks C++ Framework。③選擇WDM驅(qū)動類型。在彈出的對話框中選擇 WDM Function Driver。④選擇驅(qū)動總線的類型。在對話框中選擇為 USB 總線,然后在分別設(shè)定USB Vendor ID 和USB Product ID。 ⑤設(shè)置USB 的端點資源。單擊Add增加端點。這里增加 4 個端點,Pipe Name 分別是Ep1_In、Ep1_Out、Ep2_In和Ep2_Out。其中Ep1_In和Ep1_Out選擇中斷傳輸,端點地址均為1,傳輸方向分別為輸入和輸出,最大包長為8字節(jié),最大傳輸大小為 4096字節(jié)。Ep2_In和Ep2_Out選擇批量傳輸,端點地址均為2,傳輸方向分別為輸入和輸出,最大包長為64字節(jié),最大傳輸大小為 40960字節(jié)。⑥選擇需要處理請求類型。這里選擇IRP_MJ_DEVICE_CONTROL、IRP_MJ_READ和IRP_MJ_WRITE。它們分別與API函數(shù) DeviceIoControl、ReadFile和WriteFile一一對應(yīng)。⑦設(shè)備I/O操作方式。配置IRP_MJ_READ和IRP_MJ_WRITE的緩沖方式分別為Buffered。另外還需要增加4個IO Control 的控制代碼:EP1_READ、EP1_WRITE、EP2_READ、EP2_WRITE。打開方式選擇Interface。⑧添加注冊表項。可以根據(jù)自己需要增加,這里增加了一個設(shè)備名稱。⑨設(shè)置電源管理。選擇Device requires an inrush of power at startup,說明該設(shè)備啟動時需要大電流,這樣做的目的是防止相同的設(shè)備同時上電,減少對電源的沖擊。步驟10-13按默認配置即可。

5 驅(qū)動的編程

USB驅(qū)動程序的編程最主要的就是編寫端點1和端點2的數(shù)據(jù)處理函數(shù),其中主要編寫的是UsbToECPDevice類成員函數(shù)Read()、Write()、及DeviceControl()中調(diào)用的4 個IoControl()函數(shù)。

Read()函數(shù)對應(yīng)著WIN32 API的ReadFile函數(shù),其參數(shù)通過KIrp I傳遞過來。因為端點1指定的緩沖方式為Buffered 方式,所以調(diào)用KIrp類的成員函數(shù)I.BufferedReadDest()來獲取保存數(shù)據(jù)的緩沖區(qū)地址,調(diào)用I.ReadSize()來獲取讀到的數(shù)據(jù)長度。如果獲取到的緩沖區(qū)地址為NULL,則說明參數(shù)無效,則以USB_STATUS_INVALID_PARAMETER來完成該IRP,然后返回USB_STATUS_INVALID_PARAMETER。若讀取的字節(jié)數(shù)是0,就直接完成該IRP,不需要進行數(shù)據(jù)處理。接著創(chuàng)建一個URB來完成數(shù)據(jù)的處理。因為端點1采用的是中斷傳輸,所以必須創(chuàng)建一個中斷傳輸?shù)?URB并提交它,端點管道KUsbPipe類提供一個創(chuàng)建中斷傳輸URB的函數(shù)BuildInterruptTransfer。這樣底層的USB 總線驅(qū)動程序就會負責(zé)從端點 1 讀取數(shù)據(jù),當(dāng)完成數(shù)據(jù)的讀取后,提交相應(yīng)URB的函數(shù)就會返回。當(dāng)URB創(chuàng)建成功后,利用KUsbPipe類的成員函數(shù)SubmitUrb()來提交這個URB,否則返回資源不足的錯誤信息。SubmitUrb()函數(shù)返回后,可以用URB的成員變量TransferBufferLength來獲取實際讀到的字節(jié)數(shù),最后刪除創(chuàng)建的URB。

本文為全文原貌 未安裝PDF瀏覽器用戶請先下載安裝 原版全文

Write()函數(shù)的處理方法與Read()函數(shù)的方法非常相似,不同之處在于利用KIrp類I的成員函數(shù) BufferedWriteSource()和WriteSize()來分別獲取緩沖區(qū)的地址和傳輸?shù)淖止?jié)數(shù)。另外,函數(shù)EP1_READ_Handler()和EP1_WRITE_Handler()的實現(xiàn)與Read()和Write()函數(shù)基本是一樣的,略有不同。

端點2 的EP2_READ_Handler(KIrp I)和EP2_WRITE_Handler(KIrp I)與端點 1的EP1_READ_Handler(KIrp I)和EP1_WRITE_Handler(KIrp I)處理方式幾乎是一樣的,主要的不同是在創(chuàng)建URB時要用到創(chuàng)建批量傳輸URB 的函數(shù)BuildBulkTransfer(),其參數(shù)及意義與BuildInterruptTransfer()相同。

6 驅(qū)動的安裝

在對端點1和端點2編程完成之后,然后對其進行編譯,如果沒有錯誤,可以看到編譯報告中有一行“MODULE=.\objfre\i386\UsbToECP.sys”,這個就是所要的驅(qū)動文件,另外,在目錄下還產(chǎn)生一個inf文件,其也是安裝驅(qū)動時需要的一個重要的文件,它里面有一些重要的安裝信息,可以根據(jù)需要進行修改。一般主要是對inf的Stings 進行修改,表1給出了該驅(qū)動的Strings 段的幾個重要屬性的修改。

將該設(shè)備與PC機連接,系統(tǒng)會提示安裝驅(qū)動,首先指定驅(qū)動安裝所要使用的inf文件所在的位置,該inf文件可以在驅(qū)動工程目錄的driver目錄下找到,是由向?qū)ё詣由傻?。然后選擇安裝驅(qū)動所需要的UsbToECP.sys文件,該文件在D:\ UsbToECP\driver\objfre\i386下。正確安裝驅(qū)動之后,打開計算機的設(shè)備管理器,將會看到該USB設(shè)備。如下圖3所示。打開圖3中的Class for BinBinUsb devices下的BinBinUsb Device屬性,選擇相應(yīng)標(biāo)簽,將會看到如下圖4的驅(qū)動信息。

7 結(jié)語

USB設(shè)備驅(qū)動的開發(fā)是設(shè)備開發(fā)過程中必不可少的一項任務(wù)。通過研究利用VC++、DDK和Driver Studio對USB驅(qū)動程序的設(shè)計方法,成功地設(shè)計了基于單片機的USB轉(zhuǎn)并口設(shè)備的驅(qū)動程序。通過測試,使用該驅(qū)動的USB轉(zhuǎn)并口設(shè)備運行穩(wěn)定,達到了預(yù)期的效果。這種USB驅(qū)動的設(shè)計方法簡化了開發(fā)難度,開發(fā)的驅(qū)動穩(wěn)定可靠,必將受到USB設(shè)備開發(fā)者的廣泛關(guān)注,同時也給其他的基于WDM驅(qū)動的開發(fā)提供一個新途徑。

[參考文獻]

[1] 榮佳波,常明志,井科偉,楊少勇.USB 設(shè)備的WDM驅(qū)動程序設(shè)計[J].應(yīng)用科技,2004,31(3);39-41.

單片機程序設(shè)計范文第3篇

關(guān)鍵詞:工作過程;C語言程序設(shè)計;單片機課程;電子設(shè)計競賽

在電子信息專業(yè)中,C語言主要服務(wù)于單片機應(yīng)用,而單片機的運用對《C語言程序設(shè)計》的要求,從思維方式上講,培養(yǎng)學(xué)生的邏輯思維能力,分析問題、解決問題的能力等;從行為能力上講,培養(yǎng)學(xué)生利用C語言編程能力對單片機綜合項目進行控制設(shè)計。然而,在具體的教學(xué)過程中,由于課程本身的難度以及受學(xué)生基礎(chǔ)、教學(xué)內(nèi)容、教學(xué)方法、教學(xué)條件等各方面的限制,其教學(xué)目標(biāo)的培養(yǎng)大打折扣。為了學(xué)生能夠通過學(xué)習(xí)C語言從而獲得與單片機密切結(jié)合的綜合職業(yè)能力,并保證其相關(guān)的經(jīng)驗、知識和技能在結(jié)構(gòu)上的系統(tǒng)化,本文以“基于工作過程的學(xué)習(xí)方法”為核心,將“工作過程中單片機的運用學(xué)習(xí)”和“課堂上C語言知識的學(xué)習(xí)”整合為一個有機整體,[1]形成一套新的課程改革模式,從而提高教學(xué)質(zhì)量,增強學(xué)生的職業(yè)技能,拓寬學(xué)生的求職渠道。

一、C語言程序設(shè)計在電子類專業(yè)中的現(xiàn)狀

(1)目前大部分高職電子類專業(yè)的人才培養(yǎng)方案中,仍沿用本科院校的課程體系,[2]其《C語言程序設(shè)計》教材仍采用本科院校計算機專業(yè)教師編寫,針對性不強,很難有效的服務(wù)于高職電子類專業(yè)課程的學(xué)習(xí)。(2)《C語言程序設(shè)計》的學(xué)習(xí)與專業(yè)課程單片機的學(xué)習(xí)脫鉤,使學(xué)生學(xué)習(xí)C語言的目標(biāo)不明確,很難將C語言知識與專業(yè)核心課程單片機的學(xué)習(xí)有效結(jié)合,從而影響單片機教學(xué)的有效展開。(3)《C語言程序設(shè)計》課程本身的難度以及學(xué)生自身的底子薄,形成學(xué)生難學(xué)、厭學(xué),進而逃課的惡性循環(huán)。

二、基于工作過程的C語言課程與單片機課程總體設(shè)計

本文提出了一種基于工作過程的C語言課程與單片機課程有效結(jié)合的課程改革模式,如下圖1所示。

圖1 改革的課程體系

從工作過程出發(fā),將單片綜合項目的應(yīng)用分解為C語言課程任務(wù)、C語言與單片機的結(jié)合、單片機課程任務(wù)三個部分,C語言課程任務(wù)和單片機課程任務(wù)兩者服務(wù)于C語言與單片機的結(jié)合;C語言課程任務(wù)主要面向C語言程序設(shè)計的知識點學(xué)習(xí)即C語言的課程領(lǐng)域;C語言與單片機的結(jié)合又可分解為C語言在單片機中的算法學(xué)習(xí)和單片機中的C語言程序設(shè)計;單片機課程任務(wù)主要面向單片機內(nèi)部資源的學(xué)習(xí)即單片機課程領(lǐng)域;最后將 C語言的課程領(lǐng)域和C語言在單片機中的算法學(xué)習(xí)相結(jié)合,形成一門《基于單片機的C語言程序設(shè)計》課程,并將單片機課程領(lǐng)域和單片機中的C語言程序設(shè)計相結(jié)合,形成一門《單片機綜合應(yīng)用》課程。

三、基于單片機運用領(lǐng)域的C語言學(xué)習(xí)領(lǐng)域重構(gòu)

(一)C語言學(xué)習(xí)領(lǐng)域重構(gòu)。如下圖表1所示,將七個典型單片機項目所需要的C語言知識點打勾,根據(jù)各個項目所需要的知識點,重新組織C語言課程的學(xué)習(xí)領(lǐng)域,形成重、難點突出,與專業(yè)課程緊密結(jié)合,針對性強的具有專業(yè)特色的C語言程序設(shè)計教程。

表1 基于單片機項目的C語言學(xué)習(xí)領(lǐng)域重構(gòu)

(二) C語言學(xué)習(xí)領(lǐng)域中教學(xué)例子選取。在C語言知識講解中,我們將典型單片機項目分割成多個獨立完整的子任務(wù),并將這些子任務(wù)稍加調(diào)整修改,使C語言知識點貫穿其中,讓學(xué)生從專業(yè)的實際運用中來學(xué)習(xí)C語言,既保證了C語言知識的系統(tǒng)性,又將C語言理論知識融入實踐任務(wù),不僅可以培養(yǎng)學(xué)生專業(yè)技能,而且還培養(yǎng)學(xué)生學(xué)習(xí)C語言的興趣。

四、全文總結(jié)

本文融“教、學(xué)、做”為一體,強化學(xué)生能力的培養(yǎng),將C語言課程與單片機課程進行了有機結(jié)合,形成新的課程模式,并對新的課程模式中《基于單片機的C語言程序設(shè)計》課程的知識領(lǐng)域進行了重構(gòu)、教學(xué)例子進行了選取,從而促進了人才培養(yǎng)方案的正確修訂、課程體系的科學(xué)整合。

單片機程序設(shè)計范文第4篇

關(guān)鍵詞 單片機 教學(xué)模式研究 任務(wù)驅(qū)動 實踐教學(xué)

中圖分類號:G424 文獻標(biāo)識碼:A

單片機自20世紀(jì)70年代問世以來,已對人類社會產(chǎn)生了巨大的影響。目前單片機在工業(yè)控制、智能儀器儀表、辦公室自動化、家用電器等諸多領(lǐng)域得到廣泛應(yīng)用。①單片機原理與應(yīng)用課程已經(jīng)在許多高等院校的電子電氣類、計算機類、控制類、機械類等專業(yè)作為專業(yè)必修課開設(shè)。

本文從該課程的特點和目前教學(xué)的不足出發(fā),結(jié)合筆者在課程教學(xué)中的實際經(jīng)驗,探討改進單片機課程教學(xué)模式的途徑,提高課程的教學(xué)效果。

1 單片機課程特點與教學(xué)現(xiàn)狀

單片機原理與應(yīng)用是一門應(yīng)用性極強的綜合性課程,包含理論與實踐兩部分,單片機技術(shù)是硬件設(shè)計與軟件編程的有機結(jié)合。對于初學(xué)者而言,往往感覺單片機概念繁多,內(nèi)容枯燥,結(jié)構(gòu)抽象,入門較難。其次,單片機常采用匯編語言作為編程語言,而匯編語言是面向機器的語言,缺乏通用性,設(shè)計程序時必須對單片機的硬件結(jié)構(gòu)有相當(dāng)深入的了解。相較于不受具體機器限制且參照一些數(shù)學(xué)語言設(shè)計的高級語言(如C語言)來說,匯編語言缺乏了直觀、易懂、可讀性好的特點,學(xué)習(xí)起來難度更大。另外,單片機技術(shù)綜合性強,涉及內(nèi)容涵蓋了電路、模擬電子、數(shù)字電子、接口技術(shù)、傳感與檢測技術(shù)、自動控制原理等諸多課程的內(nèi)容。②

鑒于單片機課程的特點,傳統(tǒng)的教學(xué)模式存在著以下不足之處:③(1)課程講授重理論、輕實踐,講授內(nèi)容仍按照硬件結(jié)構(gòu)、指令系統(tǒng)、匯編語言程序設(shè)計、中斷與定時器/計數(shù)器、接口技術(shù)這一固定模式進行,教學(xué)以灌輸單片機結(jié)構(gòu)知識為主,忽略其實際應(yīng)用,讓學(xué)生感到抽象、乏味,失去興趣。(2)強調(diào)單片機應(yīng)用程序設(shè)計的講授和訓(xùn)練,忽略系統(tǒng)整體設(shè)計,使學(xué)生缺乏對單片機系統(tǒng)軟硬件有機結(jié)合的認識,常常出現(xiàn)學(xué)生編寫的程序與自己設(shè)計的單片機系統(tǒng)完全不對應(yīng)的情況。(3)實踐環(huán)節(jié)相對薄弱,多以驗證性和演示性實驗為主,設(shè)計性、綜合性實驗不足,實驗條件和實驗學(xué)時有限,學(xué)生沒有足夠的機會在實踐中去理解和提高,更談不上培養(yǎng)學(xué)生主動設(shè)計和創(chuàng)新的能力。

2 課程教學(xué)模式研究

改進單片機課程的教學(xué)模式,應(yīng)通過改進教學(xué)方法,調(diào)整教學(xué)內(nèi)容,優(yōu)化實踐教學(xué)體系,達到激發(fā)學(xué)生的學(xué)習(xí)興趣和主動性,改善教學(xué)效果,培養(yǎng)應(yīng)用型人才的目的。

2.1 改進教學(xué)方法

合適的教學(xué)方法能夠有效地提高學(xué)生對課程的興趣。傳統(tǒng)的以教師灌輸知識為主的教學(xué)方式與單片機的課程特點大為不符,嚴(yán)重影響了學(xué)生的學(xué)習(xí)熱情,而引入任務(wù)驅(qū)動式的教學(xué)法能有效地解決這個問題。任務(wù)驅(qū)動法是一種探究式的教學(xué)模式,其主要形式是將教學(xué)內(nèi)容轉(zhuǎn)換成一項或幾項任務(wù)來完成,通過任務(wù)的提出、分析到實現(xiàn)來引導(dǎo)學(xué)生主動思考,培養(yǎng)其獨立分析和解決問題的能力。譬如,在單片機控制LED閃爍的教學(xué)中,首先設(shè)定為簡單的驅(qū)動一個LED定時閃爍任務(wù),使學(xué)生掌握延時程序和定時器控制兩種不同的方法;接著將其擴展為8個LED的跑馬燈控制任務(wù),使學(xué)生學(xué)習(xí)分別應(yīng)用左移(右移)方式和查表方式實現(xiàn);繼而在該系統(tǒng)上引入按鍵控制跑馬燈的開始和停止,使學(xué)生學(xué)習(xí)按鍵的使用和按鍵去抖動的方法。學(xué)生在任務(wù)中學(xué)到知識的同時,獲得了成就感,學(xué)習(xí)興趣也自然提高了。

2.2 調(diào)整教學(xué)內(nèi)容

單片機應(yīng)用系統(tǒng)的程序設(shè)計,既可以采用匯編語言,也可以采用C語言。且在單片機的實際開發(fā)中,由于應(yīng)用系統(tǒng)的規(guī)模較大,設(shè)計人員更趨于采用C語言進行程序設(shè)計。C語言相比于匯編語言,具有良好的可讀性,可移植性。采用C語言進行程序設(shè)計時,編譯器能自動完成變量的存儲單元的分配,使得學(xué)習(xí)編程者可以更多地專注于應(yīng)用程序的邏輯思想。④此外,在開設(shè)單片機課程之前,一般都已開設(shè)過C語言程序設(shè)計課程。學(xué)生對C語言已有基礎(chǔ),利于接受和理解。因此在講授匯編語言程序設(shè)計之后,引入單片機標(biāo)準(zhǔn)C語言的教學(xué)內(nèi)容,可以讓學(xué)生在兩種語言的對照學(xué)習(xí)中更快地掌握單片機的編程技術(shù),也使得學(xué)生對于單片機的學(xué)習(xí)更具實用性。

2.3 優(yōu)化實踐教學(xué)體系

傳統(tǒng)的實踐教學(xué)多以演示性、驗證性實驗為主,實驗設(shè)備以單片機實驗箱居多。學(xué)生進行實驗時直接按照實驗指導(dǎo)書中現(xiàn)成的電路圖在實驗箱上進行簡單的電路連接并照搬現(xiàn)有的程序代碼,并不理解該實驗電路的設(shè)計原理和程序的設(shè)計思想,只是將指導(dǎo)書中的示例進行了簡單的驗證,沒有達到訓(xùn)練學(xué)生獨立設(shè)計的目的。有效的實踐教學(xué)應(yīng)該加大實驗學(xué)時比重,盡量減少驗證性實驗,增加設(shè)計性、綜合性實驗。在布置實驗任務(wù)時,應(yīng)只說明本次實驗的目的和功能要求,提前讓學(xué)生進行預(yù)習(xí)和準(zhǔn)備,待學(xué)生有了初步的設(shè)計思路和程序初稿方可開始實驗。這樣,有限的實驗時間主要用于學(xué)生的自行驗證、調(diào)試、修改中,即使一個簡單的實驗也能鍛煉學(xué)生的獨立思考和解決問題的能力。此外,增加獨立于課程外的實訓(xùn)環(huán)節(jié),以綜合性的課題設(shè)計來培養(yǎng)學(xué)生對單片機應(yīng)用系統(tǒng)整體開發(fā)的能力。引入單片機系統(tǒng)虛擬仿真軟件-proteus,與開發(fā)工具keil及實驗板相結(jié)合,從電路原理圖設(shè)計、軟件設(shè)計到虛擬系統(tǒng)仿真再到實物系統(tǒng)調(diào)試和實現(xiàn),整個過程環(huán)環(huán)相扣,鍛煉了學(xué)生綜合設(shè)計的能力。

單片機程序設(shè)計范文第5篇

關(guān)鍵詞:單片機 按鍵識別 一次響應(yīng)

中圖分類號:TP368.12 文獻標(biāo)識碼:A 文章編號:1007-9416(2012)08-0175-02

1、引言

在以單片機為核心控制的應(yīng)用系統(tǒng)中,鍵盤按鍵能實現(xiàn)向單片機輸入數(shù)據(jù)、傳送命令等功能,是單片機應(yīng)用系統(tǒng)中人工干預(yù)單片機的主要手段。而單片機對按鍵閉合與否的判斷,主要是通過其引腳上的電壓高低進行的。本文以51單片機為例說明,所述鍵盤按鍵的硬件電路設(shè)計也非常簡單——輕觸開關(guān)的一端接地,另一端連接單片機引腳,該引腳同時接10K上拉電阻[1]。很明顯,單片機引腳呈現(xiàn)高電平表示按鍵開關(guān)斷開;反之,引腳電壓呈現(xiàn)低電平表示按鍵開關(guān)閉合。因此,對單片機的按鍵識別只要通過對其引腳電平的高低狀態(tài)的檢測,即可確認按鍵按下與否[2]。

眾所周知,按鍵為機械彈性開關(guān),加之按鍵按下或抬起瞬間均會產(chǎn)生抖動現(xiàn)象,因此消除按鍵抖動也是整個系統(tǒng)的關(guān)鍵。為更突出本文的討論重點,這里不再重點討論按鍵去抖的方法。

2、傳統(tǒng)按鍵識別方法

2.1 簡單的按鍵識別

該按鍵識別方法雖然簡單,但當(dāng)按下按鍵的瞬間,卻可能讓系統(tǒng)多次循環(huán)處理同一按鍵事件,造成CPU資源的浪費。以下為該方法的程序設(shè)計思路,下述中的“按鍵確實按下”表示延遲10ms后,按鍵仍處于按下狀態(tài)。

(1)初始化按鍵;

(2)if(按下按鍵){

延遲10ms去抖;

if(按鍵確實按下){事件處理,退出}

}else {未按按鍵,退出}

單片機程序可能是一個循環(huán)執(zhí)行的過程,當(dāng)按鍵按下閉合,程序進入按鍵事件,執(zhí)行完該事件,若按鍵仍未被抬起,則程序循環(huán)又再一次進入同樣的按鍵事件執(zhí)行。事實上,如果采用12MHZ外部晶振,單片機處理器執(zhí)行一個指令通常只要2個機器周期的時間,也即4us。如此短暫的時間,當(dāng)我們松開按鍵時,程序可能早已經(jīng)循環(huán)執(zhí)行很多次按鍵事件。因此該按鍵識別的程序思路并不合適。為了不重復(fù)執(zhí)行同一個按鍵事件,可改進為如下所述的按鍵識別的方法:

(1)初始化按鍵;

(2)if(按下按鍵){

延遲10ms去抖;

if(按鍵確實按下){事件處理,等待按鍵釋放,退出}

}else {未按按鍵,退出}

此方法雖然可識別按鍵釋放,即實現(xiàn)每一次按鍵,系統(tǒng)只會調(diào)用一次按鍵處理事件。但若按鍵一直不釋放,則程序只可在此原地踏步等待,浪費系統(tǒng)執(zhí)行時間,CPU每個時鐘周期均做無用功。解決方法是,在識別到第一次按鍵,并執(zhí)行完按鍵事件后,將忽略后續(xù)的按鍵狀態(tài),從而實現(xiàn)對按鍵的一次響應(yīng),解決多次冗余響應(yīng)的缺陷。

2.2 帶標(biāo)志的按鍵識別

為了解決多次冗余響應(yīng)的缺陷,可設(shè)置按鍵按下與釋放兩種狀態(tài)的標(biāo)志,在程序執(zhí)行過程中,檢測標(biāo)志位內(nèi)容,識別按鍵的狀態(tài)。根據(jù)該思路,可在初始化按鍵時,設(shè)置按鍵按下與否的標(biāo)志位,并賦予“0”與“1”兩種狀態(tài)。標(biāo)志狀態(tài)為“0”表示按鍵無效,為“1”表示按鍵被按下。以下為帶標(biāo)志位的按鍵識別的程序設(shè)計思路[2],這里假定標(biāo)志位為key_mark,初始值為0。

(1)初始化按鍵;

(2)if(按下按鍵 && !key_mark){

延遲10ms去抖;

key_mark = 1; //將狀態(tài)“1”賦予標(biāo)志位。表示按鍵已按下

if(按鍵確實按下){事件處理,退出}

}else if(未按按鍵){

key_mark = 0,退出}

該方法可行有效,其中標(biāo)志位key_mark起了至關(guān)重要的作用。只有當(dāng)按鍵按下,key_mark=0,且延遲10ms去抖后,程序才會確認是否真的有按鍵被按下。此時馬上對key_mark=1,使得下一次查詢key_mark標(biāo)志時,得知按鍵正處于按下狀態(tài)。如此,不僅使得按鍵被按下時可被準(zhǔn)確檢測到,還可以在按鍵還沒被抬起釋放時,不重復(fù)響應(yīng)同一個按鍵事件。由于此時標(biāo)志位key_mark的值被賦值為“1”,因此if(按下按鍵 && !key_mark)將不再成立,直到按鍵抬起,才重新賦值key_mark為“0”,實現(xiàn)了每一次按鍵,系統(tǒng)只會調(diào)用一次按鍵處理事件。

3、快速按鍵識別方法

對于程序員來說,實現(xiàn)同樣功能的程序,簡潔、高效對設(shè)計非常關(guān)鍵。本文討論的快速按鍵識別方法,嘗試使用單片機C語言中的邏輯運算方法,同樣快速有效地解決了按鍵識別的程序設(shè)計問題。該方法在初始化設(shè)置后,只需要使用一句異或運算語句,兩句賦值語句,即可快速進行按鍵識別。

下面給出該快速按鍵識別方法的思路。先初始化三個標(biāo)志位:key_now,key_old,key_change。其中,key_now表示當(dāng)前讀取到的按鍵電平;key_old表示之前一次讀取到的按鍵電平;key_change表示按鍵被按下后出現(xiàn)的變化情況,即當(dāng)key_change=0,表示按鍵處于斷開狀態(tài),key_change=1,表示按鍵處于閉合狀態(tài)。這三個標(biāo)志位的初始化值均為“1”。現(xiàn)在給出該方法的程序設(shè)計思路。

(1)初始化按鍵

(2)key_now = P1.0; //讀取當(dāng)前按鍵電平(假定使用單片機P1.0引腳連接按鍵)

key_change = (key_now ^ key_old) ^ key_change;

key_old = key_now;

根據(jù)上述方法,當(dāng)未按下按鍵時,與按鍵連接的引腳P1.0為高電平,則key_now也為高電平,key_change與(key_now ^ key_old)異或運算后結(jié)果為“0”,并重新賦值給key_change,標(biāo)志著當(dāng)前沒有按鍵按下;當(dāng)按鍵被按下,引腳P1.0為低電平,key_change與(key_now ^ key_old)異或運算后結(jié)果為“1”,同樣賦值給key_change,標(biāo)志著當(dāng)前按鍵已按下;若此時按鍵保持低電平,即按鍵未抬起釋放,則key_now仍為低電平,key_change的異或運算結(jié)果仍為“0”;只有當(dāng)按鍵被抬起時,引腳P1.0恢復(fù)為高電平,對應(yīng)的key_change異或為“1”??傊灰邪存I按下,key_change對應(yīng)的位就為“1”,按鍵彈起后key_change對應(yīng)的位為“0”,表示按鍵未被按下。這大大簡化了按鍵的識別,不需要再去進行其他判斷,程序設(shè)計也簡潔明了。

4、結(jié)語

本文首先介紹了鍵盤按鍵識別的工作原理,并以51單片機為例探討基于單片機的鍵盤按鍵識別方法,這些方法同樣適用于AVR、PIC、凌陽單片機等應(yīng)用的程序設(shè)計中。圍繞如何進行快速有效的鍵盤按鍵識別,本文深入研究了傳統(tǒng)的鍵盤識別方法、帶標(biāo)志位的鍵盤識別方法,以及一種通過異或運算得到的快速鍵盤按鍵識別方法。詳細比較各種方法,并采用單片機開發(fā)板(外部12M晶振,編程軟件為Keil uVision2)試驗[4],結(jié)果表明上述三種鍵盤識別程序思路均可,而后者只需要使用三句C語言語句,即可實現(xiàn)鍵盤按鍵識別,是一種可行有效的方法。

參考文獻

[1]林伸茂編著,管繼斌,白雁鈞改編.8051單片機徹底研究基礎(chǔ)篇.人民郵電出版社,2004.05:105-108.

[2]張毅剛,彭喜元,姜守達,喬立巖編著.新編MCS-51單片機應(yīng)用設(shè)計.哈爾濱工業(yè)大學(xué)出版社,2003.07:157-164.

冕宁县| 明水县| 齐河县| 隆子县| 紫金县| 岑巩县| 和龙市| 望谟县| 牡丹江市| 涿鹿县| 瑞昌市| 灵山县| 涿鹿县| 饶平县| 正镶白旗| 吴川市| 广东省| 宣城市| 德庆县| 鄄城县| 蒙阴县| 江都市| 营山县| 金川县| 永和县| 应用必备| 专栏| 韶山市| 伊川县| 民乐县| 瑞丽市| 广宁县| 潍坊市| 西贡区| 资溪县| 永康市| 来安县| 金昌市| 遂昌县| 肥城市| 桑植县|