婷婷超碰在线在线看a片网站|中国黄色电影一级片现场直播|欧美色欧美另类少妇|日韩精品性爱亚洲一级性爱|五月天婷婷乱轮网站|久久嫩草91婷婷操在线|日日影院永久免费高清版|一级日韩,一级鸥美A级|日韩AV无码一区小说|精品一级黄色毛片

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

單片機(jī)程序設(shè)計(jì)

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

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

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

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

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

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

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

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

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

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

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

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

4效果與應(yīng)用

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

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

參考文獻(xiàn):

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

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

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

1 引言

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

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

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

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

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

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

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

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

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

5 驅(qū)動(dòng)的編程

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

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

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

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

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

6 驅(qū)動(dòng)的安裝

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

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

7 結(jié)語

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

[參考文獻(xiàn)]

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

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

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

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

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

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

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

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

圖1 改革的課程體系

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

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

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

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

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

四、全文總結(jié)

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

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

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

中圖分類號(hào):G424 文獻(xiàn)標(biāo)識(shí)碼:A

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

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

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

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

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

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

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

2.1 改進(jìn)教學(xué)方法

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

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

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

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

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

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

關(guān)鍵詞:?jiǎn)纹瑱C(jī) 按鍵識(shí)別 一次響應(yīng)

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

1、引言

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

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

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

2.1 簡(jiǎn)單的按鍵識(shí)別

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

(1)初始化按鍵;

(2)if(按下按鍵){

延遲10ms去抖;

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

}else {未按按鍵,退出}

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

(1)初始化按鍵;

(2)if(按下按鍵){

延遲10ms去抖;

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

}else {未按按鍵,退出}

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

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

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

(1)初始化按鍵;

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

延遲10ms去抖;

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

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

}else if(未按按鍵){

key_mark = 0,退出}

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

3、快速按鍵識(shí)別方法

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

下面給出該快速按鍵識(shí)別方法的思路。先初始化三個(gè)標(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)。這三個(gè)標(biāo)志位的初始化值均為“1”。現(xiàn)在給出該方法的程序設(shè)計(jì)思路。

(1)初始化按鍵

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

key_change = (key_now ^ key_old) ^ key_change;

key_old = key_now;

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

4、結(jié)語

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

參考文獻(xiàn)

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

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