前言:想要寫出一篇令人眼前一亮的文章嗎?我們特意為您整理了5篇單片機(jī)原理范文,相信會為您的寫作帶來幫助,發(fā)現(xiàn)更多的寫作思路和靈感。
一、背景
“單片機(jī)原理與應(yīng)用”是一門電子類專業(yè)的核心課程,對于基礎(chǔ)薄弱的中職學(xué)生來說,這門課程的學(xué)習(xí)難度比較大。究其原因,一方面由于中職學(xué)生起點(diǎn)低、基礎(chǔ)知識較差;另一方面,當(dāng)前單片機(jī)課程現(xiàn)有的教材教學(xué)內(nèi)容獨(dú)立化、模塊化,各塊之間缺乏有機(jī)聯(lián)系,造成了學(xué)生難學(xué)、教師難教的局面,以至于全部內(nèi)容學(xué)完時,學(xué)生對一個完整的單片機(jī)開發(fā)過程還缺乏了解,這樣培養(yǎng)出的學(xué)生無法適應(yīng)企業(yè)的需求。所以我們提出:以一個較為具體的涵蓋知識點(diǎn)全面的典型項(xiàng)目為引領(lǐng),在完成這個項(xiàng)目的過程中,學(xué)生學(xué)會并能運(yùn)用相關(guān)單片機(jī)知識,練就了技能。該典型項(xiàng)目就是wifi小車的開發(fā)。
二、課程項(xiàng)目設(shè)計和實(shí)施
1、走訪企業(yè),明確課程定位。為了更好的培養(yǎng)適合企業(yè)需求的學(xué)生,我們特地走訪了當(dāng)?shù)囟鄠€單片機(jī)產(chǎn)品生產(chǎn)與研發(fā)的相關(guān)企業(yè),對企業(yè)崗位職業(yè)能力與工作過程進(jìn)行調(diào)研,了解企業(yè)對人才的需求;與企業(yè)一線技術(shù)人員共同商討如何選取合適的工程項(xiàng)目作為教學(xué)載體,確定教學(xué)任務(wù)與內(nèi)容;回訪了大量的畢業(yè)學(xué)生,與在企業(yè)一線從事單片機(jī)相關(guān)電子產(chǎn)品生產(chǎn)和研發(fā)的畢業(yè)生進(jìn)行交流,聽取畢業(yè)生對本課程教學(xué)的反饋意見,以他們的親身經(jīng)歷和切身體會幫助我們發(fā)現(xiàn)教學(xué)體系中存在的問題,對我們的教學(xué)實(shí)施提出合理的修改意見。
2、確定課程項(xiàng)目設(shè)計的總體思路。在和行業(yè)企業(yè)的深入交流過程中,我們發(fā)現(xiàn)企業(yè)在單片機(jī)應(yīng)用產(chǎn)品的研發(fā)和生產(chǎn)上有其典型的工作過程。如下圖所示:
我們仔細(xì)分析了這個過程,結(jié)合畢業(yè)生的反饋和在校學(xué)生的實(shí)際情況,確立了以培養(yǎng)學(xué)生在相關(guān)企業(yè)的單片機(jī)產(chǎn)品研發(fā)與生產(chǎn)崗位上,完成各項(xiàng)工作任務(wù)過程中應(yīng)具備的職業(yè)能力為目標(biāo)進(jìn)行教學(xué)情境設(shè)計的思路,具體實(shí)現(xiàn)方法為,采用實(shí)踐教學(xué),設(shè)計一個完整的學(xué)生感興趣的單片機(jī)產(chǎn)品開發(fā)項(xiàng)目,將所有的學(xué)習(xí)內(nèi)容貫穿于項(xiàng)目中,分解在多個學(xué)習(xí)情境中,讓學(xué)生既完成了教學(xué)內(nèi)容的學(xué)習(xí),又體驗(yàn)了企業(yè)生產(chǎn)的工作過程。
3、教學(xué)項(xiàng)目內(nèi)容的選取。教學(xué)項(xiàng)目內(nèi)容選擇的合適與否是關(guān)系到教學(xué)效果好壞的關(guān)鍵,本著以提高學(xué)生的職業(yè)崗位能力與職業(yè)素養(yǎng)為目標(biāo),我們從多個環(huán)節(jié)進(jìn)行了精心思考,挑選教學(xué)項(xiàng)目內(nèi)容。
我們選取了具有典型工作任務(wù)的“wifi小車制作項(xiàng)目”作為教學(xué)內(nèi)容的載體。該wifi小車以單片機(jī)作為控制核心,包括運(yùn)動模塊(電機(jī))、顯示模塊、遙控模塊以及各種傳感與轉(zhuǎn)換模塊等。針對wifi 小車各功能部分的實(shí)現(xiàn),設(shè)計出不同的學(xué)習(xí)情境,訓(xùn)練學(xué)生分析和設(shè)計單片機(jī)應(yīng)用程序的基本技能。
Wifi小車的功能設(shè)計具有很強(qiáng)的擴(kuò)展性,這主要取決與它具有的功能、性能和控制方法,功能越多,所需的技術(shù)與器件種類就越多;性能越好,對應(yīng)的技術(shù)含量也越高;控制方法越多控制電路也就越復(fù)雜。例如顯示模塊可以選擇led或數(shù)碼管,也可以選擇字符液晶或者圖形液晶顯示;控制方式可以選擇遙控也可以加入聲控等,所以選擇wifi小車作為教學(xué)項(xiàng)目具有很好的可選性與擴(kuò)展性。
本項(xiàng)目分為4個學(xué)習(xí)情境,整個情境的實(shí)施是按照學(xué)習(xí)的認(rèn)知規(guī)律、職業(yè)成長規(guī)律,從簡單到復(fù)雜,從局部到整體進(jìn)行學(xué)習(xí)單片機(jī)知識、訓(xùn)練職業(yè)崗位能力。
總體上采取知識由淺入深、技術(shù)逐漸綜合的原則。由一個綜合單片機(jī)產(chǎn)品制作項(xiàng)目――制作單片機(jī)wifi小車,按照不同的功能模塊分解成4個學(xué)習(xí)情境(見下圖),①小車零部件的選擇和裝配②小車的顯示系統(tǒng)③小車的運(yùn)動控制系統(tǒng)④小車智能感應(yīng)系統(tǒng), 如下圖所示,每個學(xué)習(xí)情境包含可選的子情境。
每個學(xué)習(xí)情境均訓(xùn)練對應(yīng)的職業(yè)能力
①、學(xué)習(xí)情境一訓(xùn)練學(xué)生電子產(chǎn)品裝配基本功,完成要求如下:
電子元器件的選取與檢測
小車電路焊接與裝配
②、學(xué)習(xí)情境二訓(xùn)練學(xué)生單片機(jī)基礎(chǔ)技術(shù)與基礎(chǔ)器件的集成能力,完成如下功能:
小車的前進(jìn)、后退、左右轉(zhuǎn)向及停止運(yùn)行狀態(tài)顯示;
完成各種動作的計時時間顯示。
③、學(xué)習(xí)情境三訓(xùn)練學(xué)生接口技術(shù)與接口器件的集成能力,完成如下功能:
小車的前進(jìn)、后退、左右轉(zhuǎn)向及停止驅(qū)動控制;無線遙控。
④、學(xué)習(xí)情境四訓(xùn)練學(xué)生將單片機(jī)基礎(chǔ)技術(shù)運(yùn)用、接口技術(shù)運(yùn)用和傳感器等各種技術(shù)與器件集成的能力,完成如下功能:
監(jiān)測距離,自動避障;
4、教學(xué)方法的使用。通過實(shí)踐,我們認(rèn)識到要提高教學(xué)效果必須采用多樣化的教學(xué)方法,以學(xué)生為主體,以教師為引導(dǎo)。為此我們引入了工作過程與教學(xué)方法的對照圖(參考下圖:工作過程學(xué)習(xí)方法對照圖)。以子情境2中的實(shí)訓(xùn)項(xiàng)目“汽車轉(zhuǎn)向燈”為例,來具體說明課堂教學(xué)實(shí)施過程中各種教學(xué)方法的使用:首先提出項(xiàng)目要求,明確這個項(xiàng)目做什么,激發(fā)學(xué)生學(xué)習(xí)興趣(采用了項(xiàng)目案例激勵教學(xué)法),接著引導(dǎo)學(xué)生思考,跟老師想(采用項(xiàng)目分析引探法),然后跟老師做,最后學(xué)生自己做,自己練,互助學(xué)習(xí)項(xiàng)目制作(采用協(xié)作互助討論法),老師跟蹤檢查,指導(dǎo),評價(采用項(xiàng)目檢查評價法),課后布置學(xué)生對產(chǎn)品功能進(jìn)行擴(kuò)展(采用項(xiàng)目制作進(jìn)階法)。通過這樣的教學(xué)過程,讓學(xué)生達(dá)到了積極思考,樂于實(shí)踐、快樂學(xué)習(xí)、享受成功的學(xué)習(xí)狀態(tài),培養(yǎng)了學(xué)生的職業(yè)崗位能力,為以后順利走上工作崗位打下堅實(shí)的基礎(chǔ)。
5、考核方案設(shè)計
考核分為三部分,過程性考核(占分50%)、綜合性考核(占分15%)、結(jié)業(yè)性考核(占分35%),其中過程性考核考察學(xué)生每一個項(xiàng)目情境的完成情況。綜合性考核考察學(xué)生對單片機(jī)技術(shù)的綜合運(yùn)用能力,強(qiáng)調(diào)學(xué)生的創(chuàng)新意識,鼓勵學(xué)生多使用新技術(shù)、新器件。結(jié)業(yè)性考核安排在期末,采用現(xiàn)場抽題,考察一個項(xiàng)目的完整制作,學(xué)生也可提前申請參加開放性考核,考試合格可免除期末結(jié)業(yè)性考核,也可以參加各類單片機(jī)競賽,取得好成績者也可免除結(jié)業(yè)性考核。
關(guān)鍵詞:單片機(jī);C8051F;匯編語言;C51
中圖分類號:G642 文獻(xiàn)標(biāo)識碼:B
1引言
“單片機(jī)原理及應(yīng)用”是計算機(jī)科學(xué)與技術(shù)、通信工程等專業(yè)的一門主要專業(yè)課程,因單片機(jī)在生產(chǎn)實(shí)踐中應(yīng)用廣泛,各高校都將該課程定位在以培養(yǎng)學(xué)生動手能力和創(chuàng)新能力的目的上。但長期以來國內(nèi)高校都以MCS-51為該課程的主講內(nèi)容,雖然該系列單片機(jī)在國內(nèi)的應(yīng)用經(jīng)久不衰,但隨著技術(shù)的發(fā)展,芯片的生產(chǎn)工藝、功能、運(yùn)行速度、開發(fā)環(huán)竟、編程語言等都有了很大的變化,在實(shí)際的科研開發(fā)中更多選用與MCS-51兼容的高檔單片機(jī),而很少直接選用標(biāo)準(zhǔn)8051單片機(jī),因此傳統(tǒng)的教學(xué)內(nèi)容和知識已經(jīng)與實(shí)際應(yīng)用脫節(jié),不能滿足需要。根據(jù)多年的教學(xué)經(jīng)驗(yàn)和科研積累,我們對“單片機(jī)原理及應(yīng)用”課程的教學(xué)內(nèi)容、實(shí)驗(yàn)手段、實(shí)驗(yàn)內(nèi)容、教學(xué)方法等進(jìn)行了更新。兩年多的教學(xué)實(shí)踐表明,改革后的“單片機(jī)原理及應(yīng)用”很受學(xué)生的歡迎,大大提高了學(xué)生學(xué)習(xí)單片機(jī)課程的興趣,達(dá)到了該課程培養(yǎng)和鍛煉學(xué)生動手能力、開發(fā)應(yīng)用系統(tǒng)能力的目的。
2課程改革
2.1更新教學(xué)內(nèi)容
MCS-51單片機(jī)及其衍生產(chǎn)品在我國乃至世界范圍都獲得了非常廣泛的應(yīng)用,尤其是在我國大部分大專院校都采用MCS-51單片機(jī)作為教學(xué)機(jī)型,單片機(jī)系統(tǒng)工程師大都熟悉 MCS-51單片機(jī)。但隨著一些高集成度、高性能的8位和16位RISC單片機(jī)的推出,基于標(biāo)準(zhǔn)8051內(nèi)核的單片機(jī)正面臨著退出市場的境地。因此一些半導(dǎo)體公司開始對傳統(tǒng)8051內(nèi)核進(jìn)行大的改造,主要是提高速度和增加片內(nèi)模擬和數(shù)字外設(shè),以期大幅提高單片機(jī)的整體性能。
近年來我們承擔(dān)了較多企業(yè)委托的單片機(jī)應(yīng)用開發(fā)項(xiàng)目,在實(shí)際的科研開發(fā)中我們也感覺到用標(biāo)準(zhǔn)8051單片機(jī)作微控制器不僅需要擴(kuò)充大量資源,而且編程調(diào)試都比較困難,而隨著技術(shù)的發(fā)展,新一代的單片機(jī)芯片已不僅包含微處理器,而且包含應(yīng)用系統(tǒng)所需的各類外部接口設(shè)備,存儲器也從光擦除變?yōu)殡姴脸?、可在系統(tǒng)編程的FLASH存儲器,編程語言從匯編語言為主變?yōu)橐訡51語言為主,以JTAG接口構(gòu)成的JTAG調(diào)試器可以進(jìn)行非侵入式全速在系統(tǒng)調(diào)試,比以前的專用在線仿真器(ICE)要方便得多。因此我們在幾個單片機(jī)開發(fā)項(xiàng)目中都選擇了原美國Cygnal集成產(chǎn)品公司(1999年3月成立的一家新興的半導(dǎo)體公司,專門從事混合信號片上系統(tǒng)單片機(jī)的設(shè)計與制造,2003年并入Silicon Laboratories公司)推出的C8051F系列產(chǎn)品。C8051F系列單片機(jī)是集成混合信號的片上系統(tǒng)(SOC,System Of Chip),與MCS-51兼容的內(nèi)核CIP-51采用流水線結(jié)構(gòu),峰值速度可達(dá)25MIPS。C8051F具備控制系統(tǒng)所需的模擬和數(shù)字外設(shè),包括看門狗(Watchdog)、ADC、DAC、電壓比較器、電壓基準(zhǔn)輸出、定時器、PWM、定時器捕捉和方波輸出等,并具備多種總線接口,包括UART、SPI、SMBUS(與I2C兼容)總線以及CAN總線等。C8051F系列單片機(jī)采用Flash ROM技術(shù),集成JTAG接口,支持在線編程和調(diào)試。C8051F系列單片機(jī)的諸多特點(diǎn)和優(yōu)越性,使其廣受單片機(jī)系統(tǒng)設(shè)計工程師的青睞,成為很多測控系統(tǒng)設(shè)計的首選機(jī)型。
既然實(shí)際科研開發(fā)中多使用新一代高性能單片機(jī),那么我們的教學(xué)內(nèi)容就應(yīng)該及時更新,以減少學(xué)生工作后的二次學(xué)習(xí)。為此,2004年課程組在參與編寫機(jī)械工業(yè)出版社的教材《單片機(jī)原理及應(yīng)用》時專門用一章的篇幅把C8051F寫了進(jìn)去。后來我們發(fā)現(xiàn)僅僅用一章內(nèi)容講C8051F,教學(xué)內(nèi)容的改革還不徹底,因此2006年我們又對教學(xué)內(nèi)容進(jìn)行了徹底改革,編寫了以C8051F為教學(xué)機(jī)型的教材《C8051F單片機(jī)原理及應(yīng)用》,由中國電力出版社出版,教材除了更新了教學(xué)機(jī)型外,編程語言也從匯編語言改成以C51語言為主,兼顧匯編語言的形式。我們編寫該教材的時候國內(nèi)還基本上沒有同類教材,目前已經(jīng)有了一些,這說明國內(nèi)高校已經(jīng)在注重單片機(jī)課程教學(xué)內(nèi)容的改革。在多屆學(xué)生中的使用實(shí)踐表明,內(nèi)容更新后的教材很受學(xué)生的歡迎。
2.2更新實(shí)驗(yàn)手段
以MCS-51為主講機(jī)型的單片機(jī)課程的實(shí)驗(yàn)?zāi)J蕉嗖捎肞C機(jī)+仿真器+目標(biāo)實(shí)驗(yàn)臺的方法,我校選用了臺灣MICETEK公司Easyscope8052F單片機(jī)仿真器,這種仿真器專門仿真51系列單片機(jī),采用Windows環(huán)境的仿真軟件,價格低,性能好。綜合實(shí)驗(yàn)板選用改造后的復(fù)旦大學(xué)教學(xué)儀器廠的產(chǎn)品,與PC機(jī)連接構(gòu)成的單片機(jī)開發(fā)系統(tǒng)結(jié)構(gòu)如圖1所示。
傳統(tǒng)采用仿真器的實(shí)驗(yàn)?zāi)J诫m然能滿足學(xué)生實(shí)驗(yàn)、課程設(shè)計之用,但SOC型單片機(jī)出現(xiàn)后,實(shí)驗(yàn)?zāi)J娇梢愿颖平鼘?shí)際開發(fā)應(yīng)用的形式,根據(jù)原有單片機(jī)實(shí)驗(yàn)系統(tǒng)的使用經(jīng)驗(yàn),2003年我們提出了一個新的單片機(jī)實(shí)驗(yàn)系統(tǒng)方案,與新華龍電子有限公司合作,設(shè)計出NCD-CIP51F020系統(tǒng)實(shí)驗(yàn)設(shè)備,該系統(tǒng)由SOC單片機(jī)集成開發(fā)環(huán)境(IDE)、可用于以太網(wǎng)測控的NMC-20XX核心模塊、系統(tǒng)實(shí)驗(yàn)板三部分組成,應(yīng)用該設(shè)備可完成單片機(jī)系統(tǒng)的許多典型應(yīng)用實(shí)驗(yàn),并可做較復(fù)雜的應(yīng)用系統(tǒng)實(shí)驗(yàn),如高速數(shù)據(jù)采集、嵌入式Web實(shí)驗(yàn)等。片內(nèi)JTAG調(diào)試電路允許對安裝在最終應(yīng)用系統(tǒng)上的產(chǎn)品進(jìn)行全速、非侵入式(不占用系統(tǒng)資源)、在系統(tǒng)調(diào)試。該調(diào)試系統(tǒng)支持觀察和修改存儲器和寄存器,支持?jǐn)帱c(diǎn)、觀察點(diǎn)、單步及運(yùn)行和停機(jī)命令。使用JTAG調(diào)試時,所有模擬和數(shù)字外設(shè)都可以全功能運(yùn)行。Silicon Laboratories提供的集成開發(fā)環(huán)境包括編輯器、宏匯編器、調(diào)試器與編程器,同時也支持第三方提供的匯編器和C51編譯器(如Keil等)。采用SOC單片機(jī)JTAG接口的先進(jìn)調(diào)試環(huán)境如圖2所示。
2.3更新教學(xué)方法
我們除了注重教學(xué)內(nèi)容的更新,使學(xué)生學(xué)到最新最實(shí)用的知識外,還注重教學(xué)手段和方法的改革與研究。
首先,課程組注重現(xiàn)代先進(jìn)教育手段的應(yīng)用。C8051F單片機(jī)的內(nèi)部資源豐富、原理復(fù)雜,因此新課程的內(nèi)容要遠(yuǎn)比傳統(tǒng)的MCS-51多且增加了大量復(fù)雜的圖、表,傳統(tǒng)的板書式教學(xué)難以勝任,所以在課時量不可能增加的情況下,先進(jìn)的多媒體教學(xué)方法成為必然。其實(shí)課程組早在2003年就開始用多媒體方式講授該課程,教學(xué)內(nèi)容更新后課程組重新制作了該課程的多媒體課件,課件結(jié)構(gòu)清晰、層次分明、圖文并茂,結(jié)合計算機(jī)動畫把復(fù)雜的內(nèi)容簡單化、抽象的內(nèi)容具體化,明顯提高了課堂教學(xué)效率。課程組還開發(fā)了該課程的教學(xué)網(wǎng)站,與課程相關(guān)的課件、實(shí)驗(yàn)軟件、參考資料等都放在網(wǎng)上供同學(xué)隨時下載或?yàn)g覽,網(wǎng)站也提供了師生交流的平臺。
其次,課程組注重教學(xué)方法的研究與改革。在多年的計算機(jī)硬件課程教學(xué)中我們發(fā)現(xiàn),由于內(nèi)容枯燥、知識面廣等原因,學(xué)生對計算機(jī)硬件課程的學(xué)習(xí)興趣大大降低,甚至有些硬件選修課程因?yàn)檫x修的人數(shù)太少而開不出來。這種學(xué)習(xí)中喜軟怕硬的現(xiàn)象必須引起重視,否則培養(yǎng)出來的學(xué)生很難滿足用人單位的需要,這也是近年來嵌入式系統(tǒng)方向畢業(yè)生比較容易找工作原因的一個方面。教學(xué)中我們發(fā)現(xiàn)學(xué)生并非對所有硬件內(nèi)容都不感興趣,對有些內(nèi)容興趣還是比較高的,比如“數(shù)字邏輯電路設(shè)計”課程中“自動售貨機(jī)設(shè)計”、“單片機(jī)”課程中“日歷時鐘的液晶顯示模塊的設(shè)計”等。因此我們設(shè)想可以在講解具體內(nèi)容前先把學(xué)生感興趣的問題提出來,然后在解決問題的過程中把相關(guān)內(nèi)容講解清楚,這就是所謂的“案例”法教學(xué)。我們設(shè)計了部分“案例”在計算機(jī)硬件課程中試點(diǎn),取得了滿意的效果。我們提出的計算機(jī)硬件課程“案例”教學(xué)法得到江蘇大學(xué)2007年校教改重點(diǎn)項(xiàng)目的立項(xiàng)資助,將對計算機(jī)硬件課程“案例”教學(xué)法進(jìn)行更深入的研究。
3結(jié)束語
我校采用SOC型單片機(jī)C8051F作為“單片機(jī)原理及應(yīng)用”課程的主講機(jī)型,對該課程的教學(xué)內(nèi)容進(jìn)行了全面更新,已在多屆學(xué)生中進(jìn)行講授,學(xué)生對該課程的學(xué)習(xí)興趣大幅提高,實(shí)驗(yàn)和課程設(shè)計質(zhì)量也比以前有較大改觀。“單片機(jī)原理及應(yīng)用”已經(jīng)建設(shè)成江蘇大學(xué)校級精品課程。對計算機(jī)硬件課程采用“案例”教學(xué)法進(jìn)行了一些研究,單片機(jī)課程的部分內(nèi)容采用“案例”教學(xué)法進(jìn)行了試點(diǎn),取得了較好的效果?!鞍咐苯虒W(xué)法是我們近年來在計算機(jī)硬件課程上的試點(diǎn),目前還不成熟,我們將在“案例”開發(fā)、課件制作等環(huán)節(jié)對“案例”教學(xué)法進(jìn)行更深入的研究。
參考文獻(xiàn)
【關(guān)鍵詞】單片機(jī);教學(xué);改革
當(dāng)今世界,單片機(jī)在工業(yè)過程控制、智能儀表、計算機(jī)集成控制、人工智能、通信設(shè)備的智能化方面應(yīng)用非常廣泛,而且隨著電子和計算機(jī)技術(shù)的發(fā)展,以單片機(jī)和各種微處理器為核心必然是實(shí)現(xiàn)智能化技術(shù)的主流方向。同時,《單片機(jī)原理與應(yīng)用》是高職院校電子、電氣等相關(guān)專業(yè)最重要的核心課程之一,是一門實(shí)踐性、應(yīng)用性很強(qiáng)的學(xué)科,該方向?qū)W(xué)生進(jìn)行畢業(yè)設(shè)計和就業(yè)都起著重要的作用。
《單片機(jī)原理與應(yīng)用》傳統(tǒng)教學(xué)一般包括理論課和實(shí)踐課。理論課學(xué)生普通反應(yīng)知識抽象、難學(xué)、難懂,學(xué)了后面又忘了前面,學(xué)生學(xué)得吃力,老師教得辛苦。實(shí)踐課主要采用驗(yàn)證性實(shí)驗(yàn),學(xué)生只要連線正確、程序輸入無誤就能看到結(jié)果,這樣往往造成學(xué)生只關(guān)注實(shí)驗(yàn)結(jié)果,而忽略了思考過程。學(xué)生無法從中提高分析問題、思考問題、解決問題能力,甚至到最后還是無法獨(dú)立設(shè)計一個簡單的單片機(jī)系統(tǒng),實(shí)踐動手能力非常差。這樣的教學(xué)方法不能體現(xiàn)單片機(jī)實(shí)踐性和應(yīng)用性強(qiáng)的特點(diǎn),也與社會發(fā)展脫軌,因此,《單片機(jī)原理與運(yùn)用》教學(xué)改革迫在眉睫。我們總結(jié)了以往教學(xué)過程中的一些經(jīng)驗(yàn)和教訓(xùn),提出以下幾點(diǎn)《單片機(jī)原理與運(yùn)用》教學(xué)改革的思路和方法。
1.教學(xué)內(nèi)容選取
以培養(yǎng)學(xué)生具備從事單片機(jī)系統(tǒng)設(shè)計崗位能力和相關(guān)職業(yè)群為目標(biāo),增強(qiáng)學(xué)生實(shí)踐動手能力和工程實(shí)際運(yùn)用能力為導(dǎo)向,來選取教學(xué)內(nèi)容。在本課程的開始的時候,介紹單片機(jī)的發(fā)展現(xiàn)狀,例舉日常生活中單片機(jī)控制的設(shè)備,把科研項(xiàng)目或往屆畢業(yè)設(shè)計中的一些應(yīng)用板帶進(jìn)課堂,通過圖片、實(shí)物展示使學(xué)生對單片機(jī)有一定的感性認(rèn)識,激發(fā)他們的學(xué)習(xí)興趣和熱情。
選取以單片機(jī)C語言貫穿各章節(jié),并且是項(xiàng)目化教學(xué)形式的教材。C語言可讀性、可維護(hù)性和可移植性都比匯編語言好,在實(shí)際單片機(jī)設(shè)計中,基本上都采用C語言。項(xiàng)目教學(xué)改變了傳統(tǒng)教材內(nèi)容安排強(qiáng)調(diào)只是系統(tǒng)性為主的思路;把課程教學(xué)內(nèi)容劃分為若干個項(xiàng)目形式來完成,項(xiàng)目又以任務(wù)的方式出現(xiàn),突出體現(xiàn)高職生理論知識“必需、夠用”的原則。
多增加日常生活常見案例為項(xiàng)目,每個項(xiàng)目又包括幾個任務(wù),通過每個任務(wù)的完成過程,使學(xué)生學(xué)習(xí)相應(yīng)的理論知識。通過常見案例的剖析,引起學(xué)生的注意,激發(fā)他們的興趣,每個任務(wù)完成后,教師進(jìn)行知識點(diǎn)得總結(jié),這樣學(xué)生在實(shí)踐動手中不知不覺就掌握的理論知識。比如交通燈控制系統(tǒng),這一項(xiàng)目可以分成單片機(jī)控制單燈亮滅、流水燈控制、定時器控制流水燈、帶時間顯示系統(tǒng)等,其中通過單片機(jī)控制單燈亮滅這一任務(wù)的設(shè)計,學(xué)生可以學(xué)習(xí)單片機(jī)結(jié)構(gòu)、I/O口、單片機(jī)最小系統(tǒng)等基本知識。通過流水燈控制這一任務(wù),學(xué)生可以學(xué)習(xí)單片機(jī)C語言的各種語句等。
2.教學(xué)方法使用
我們以項(xiàng)目為教學(xué)單元,以任務(wù)驅(qū)動進(jìn)行教學(xué)。我們的教學(xué)是在一體化教室實(shí)施,只要在一體化教室中通過仿企業(yè)的工作環(huán)境進(jìn)行項(xiàng)目化教學(xué),教學(xué)過程才能實(shí)現(xiàn)真正的教、學(xué)、做融為一體,并充分調(diào)用學(xué)生學(xué)習(xí)的主動性和創(chuàng)造性。
每個任務(wù)包括任務(wù)目標(biāo)要求、學(xué)生知識與能力準(zhǔn)備、計劃、實(shí)施過程、評估。教師先布置任務(wù),說明這個任務(wù)要到達(dá)的功能及要求。教師可根據(jù)教學(xué)內(nèi)容,制作多媒體課件,將理論知識通過多媒體手段以聲音、圖像、文字等方面表現(xiàn)出來,使枯燥抽象的理論知識變得生動直觀,學(xué)生更容易理解。也可以通過Flas演示或Proteus仿真軟件展示任務(wù)的運(yùn)行結(jié)果,使學(xué)生對任務(wù)要求更加清楚。學(xué)生分組后,每個小組進(jìn)行任務(wù)設(shè)計的討論,并確定設(shè)計方案。學(xué)生任務(wù)實(shí)施過程中,教師對學(xué)生操作過程中存在的問題進(jìn)行實(shí)時點(diǎn)評,實(shí)施后,教師對每組的實(shí)施結(jié)果進(jìn)行驗(yàn)收和評估,最后總結(jié)任務(wù)實(shí)現(xiàn)過程中碰到的普遍問題、知識運(yùn)用的難點(diǎn)關(guān)鍵點(diǎn)。這樣的教學(xué)方法能提高學(xué)生分析問題、思考問題、解決問題能力,而且通過每個任務(wù)的制作,學(xué)生積極性提高、自主學(xué)習(xí)能力和動手能力增強(qiáng)。
另外,教師可以把多媒體課件、儀器設(shè)備電路圖、設(shè)備的使用方法、任務(wù)要求、本課程相關(guān)的學(xué)習(xí)資料等掛在網(wǎng)上,進(jìn)行資源共享,供學(xué)生查閱學(xué)習(xí),通過網(wǎng)絡(luò)來提高學(xué)生的學(xué)習(xí)興趣。
3.加強(qiáng)實(shí)踐環(huán)節(jié)
實(shí)踐環(huán)節(jié)是《單片機(jī)原理與運(yùn)用》課程的重要環(huán)節(jié),通過實(shí)踐環(huán)節(jié),可以提高學(xué)生動手操作能力。我們把實(shí)踐環(huán)節(jié)分成基礎(chǔ)性實(shí)踐、開放性實(shí)踐、綜合設(shè)計實(shí)踐三個部分。
基礎(chǔ)性實(shí)踐主要是實(shí)現(xiàn)指令練習(xí)、基本程序結(jié)構(gòu)編寫,或是一些驗(yàn)證理論知識準(zhǔn)確性的實(shí)驗(yàn),通過這一環(huán)節(jié),學(xué)生所學(xué)的理論知識得以鞏固。開發(fā)性實(shí)踐要求學(xué)生具有扎實(shí)的理論基礎(chǔ),具有分析問題解決問題的能力,培養(yǎng)學(xué)生對常見接口的硬件設(shè)計、軟件編程及仿真器下載調(diào)試的能力。在綜合設(shè)計實(shí)踐過程中,教師只提出實(shí)驗(yàn)?zāi)康暮鸵?,學(xué)生要自主確定設(shè)計方案,并設(shè)計硬件電路圖、制作電路PCB圖,并在自己做的PCB板上焊接元器件。硬件調(diào)試成功后,再把編寫好的程序利用仿真器下載到電路板上,進(jìn)行調(diào)試。這樣,學(xué)生熟悉了單片機(jī)系統(tǒng)設(shè)計的整個過程,他們的實(shí)踐動手能力也得到很好的提高。
除了上面三個實(shí)踐環(huán)節(jié)外,我們還要鼓勵學(xué)生參加全國電子設(shè)計大賽和大學(xué)生創(chuàng)新科技項(xiàng)目,使學(xué)生在實(shí)踐過程中不斷的學(xué)習(xí)新知識,提高設(shè)計創(chuàng)新能力。
4.考核方式確定
傳統(tǒng)的教學(xué)模式中,課程考核是由期末閉卷考核占70%,平時表現(xiàn)占30%組成,這樣的考核方式只能一定程度上反應(yīng)學(xué)生理論知識的掌握情況,很難體現(xiàn)學(xué)生的分析能力和實(shí)踐動手能力,也與單片機(jī)課程實(shí)踐性強(qiáng)的特點(diǎn)不相符合。
一個好的考核方法對于學(xué)習(xí)一門課程至關(guān)重要??己瞬粌H是對教師教學(xué)效果的檢驗(yàn)和學(xué)生水平的測試,同時也是學(xué)生學(xué)習(xí)習(xí)慣和學(xué)習(xí)方法的導(dǎo)向。筆者提出的考核方式包括期末考核30%、項(xiàng)目考核50%、平時表現(xiàn)20%。其中平時表現(xiàn)包括出勤表現(xiàn)、作業(yè)完成情況。期末考核是對課程基礎(chǔ)知識進(jìn)行閉卷測試。項(xiàng)目考核是每個項(xiàng)目成績的平均分,每完成一個項(xiàng)目,教師根據(jù)學(xué)生的工作態(tài)度、完成情況、回答問題情況進(jìn)行評分。每個項(xiàng)目完成后,學(xué)生都能看到自己的成果,這樣也調(diào)動了學(xué)生的學(xué)習(xí)興趣和學(xué)習(xí)熱情。這樣的課程考核方式不僅包括基礎(chǔ)知識掌握程度考核,還包括學(xué)生的分析、學(xué)習(xí)、動手、應(yīng)用等方面能力的考核,能比較客觀的反應(yīng)學(xué)生的學(xué)習(xí)情況。
5.總結(jié)
教學(xué)改革實(shí)施后,課堂氣氛變的更加活躍,學(xué)生學(xué)習(xí)興趣更加濃厚。實(shí)踐表明,我們的教學(xué)改革方案不僅提高了學(xué)生學(xué)習(xí)積極性、應(yīng)用能力和動手能力,而且對學(xué)生的獨(dú)立思考和分析問題、解決問題的能力的提高也起到了很好效果。當(dāng)然,教學(xué)改革是一個無止境的過程,我們還要不斷更新教學(xué)觀念,不斷的探索和實(shí)踐,來提高教學(xué)質(zhì)量和效果。
參考文獻(xiàn)
[1]莫莉,趙悅等.“單片機(jī)原理”課程教改探析[J].教育與教學(xué)研究,2010(1).
[2]張培仁,孫占輝等.基于C語言編程MCS-51單片機(jī)及應(yīng)用[M].北京:清華大學(xué)出版社,2003.
[3]歐陽慧平,王茜等.系統(tǒng)化的“單片機(jī)應(yīng)用技術(shù)”課程建設(shè)與改革[J].教育與職業(yè),2011(2).
[4]牛分中,宋風(fēng)娟.高校單片機(jī)課程實(shí)踐教學(xué)的改革與探討[J].教育與職業(yè),2008(21).
一、考核知識點(diǎn):
1、計算機(jī)的數(shù)據(jù)表示和數(shù)據(jù)運(yùn)算
2、計算機(jī)的各種編碼
3、計算機(jī)的組成及工作過程
二、考核要求:
1、識記計算機(jī)的各種編碼
2、領(lǐng)會計算機(jī)的組成及工作過程
3、簡明應(yīng)用計算機(jī)的數(shù)據(jù)表示和數(shù)據(jù)運(yùn)算
第二章51單片機(jī)的硬件結(jié)構(gòu)和原理
一、考核知識點(diǎn):
1、單片機(jī)的發(fā)展史及各方面的應(yīng)用
2、51單片機(jī)的分類和內(nèi)部結(jié)構(gòu)
3、單片機(jī)的引腳和功能
4、單片機(jī)工作的時序
二、考核要求:
1、識記單片機(jī)的發(fā)展史及各方面的應(yīng)用
2、識記單片機(jī)的引腳和功能
3、領(lǐng)會單片機(jī)工作的時序
4、簡明應(yīng)用51單片機(jī)的分類和內(nèi)部結(jié)構(gòu)
第三章51單片機(jī)指令系統(tǒng)
一、考核知識點(diǎn):
1、單片機(jī)的尋址方式
2、單片機(jī)的指令系統(tǒng)
3、助記符指令和二進(jìn)制代碼指令的異同
二、考核要求:
1、領(lǐng)會助記符指令和二進(jìn)制代碼指令的異同
2、綜合應(yīng)用單片機(jī)的尋址方式
3、綜合應(yīng)用單片機(jī)的指令系統(tǒng)
第四章匯編語言程序設(shè)計
一、考核知識點(diǎn):
1、偽指令
2、匯編語言設(shè)計技巧
3、匯編語言到機(jī)器語言的編譯過程
二、考核要求:
1、領(lǐng)會偽指令
2、簡明應(yīng)用匯編語言設(shè)計技巧
3、綜合應(yīng)用匯編語言到機(jī)器語言的編譯過程
第五章51單片機(jī)的中斷系統(tǒng)
一、考核知識點(diǎn):
1、中斷基本概念
2、中斷系統(tǒng)的程序編制
3、中斷系統(tǒng)的初步應(yīng)用
二、考核要求:
1、領(lǐng)會中斷基本概念
2、簡明應(yīng)用中斷系統(tǒng)解決工程問題
3、綜合簡明應(yīng)用中斷系統(tǒng)的程序編制
第六章51單片機(jī)的內(nèi)部定時器/計數(shù)器及串行接口
一、考核知識點(diǎn):
1、單片機(jī)內(nèi)部定時器/計數(shù)器的結(jié)構(gòu)及工作原理
2、定時器/計數(shù)器的程序編制
3、定時器/計數(shù)器的初步應(yīng)用
4、串行口的基本概念
5、串行口的程序編制
6、串行口的初步應(yīng)用
二、考核要求:
1、識記串行口的基本概念
2、領(lǐng)會單片機(jī)內(nèi)部定時器/計數(shù)器的結(jié)構(gòu)及工作原理
3、簡明應(yīng)用定時器/計數(shù)器解決工程問題
4、簡明應(yīng)用串行口的程序編制
5、簡明應(yīng)用串行口解決工程問題
6、綜合應(yīng)用定時器/計數(shù)器的程序編制
第七章單片機(jī)的系統(tǒng)擴(kuò)展與接口技術(shù)
一、考核知識點(diǎn):
1、單片機(jī)外部總線的擴(kuò)展
2、外部存儲器的擴(kuò)展
3、I/O接口的擴(kuò)展
4、管理功能部件的擴(kuò)展
5、A/D和D/A接口功能的擴(kuò)展
二、考核要求:
1、識記單片機(jī)外部總線的擴(kuò)展
2、識記管理功能部件的擴(kuò)展
3、簡明應(yīng)用A/D和D/A接口功能的擴(kuò)展
4、綜合應(yīng)用外部存儲器的擴(kuò)展
5、綜合應(yīng)用I/O接口的擴(kuò)展
第八章單片機(jī)應(yīng)用系統(tǒng)設(shè)計
一、考核知識點(diǎn):
1、單片機(jī)應(yīng)用系統(tǒng)的開發(fā)過程
2、單片機(jī)開發(fā)工具的分類和使用
3、單片機(jī)應(yīng)用系統(tǒng)的軟件和硬件調(diào)試過程
二、考核要求:
1、識記單片機(jī)應(yīng)用系統(tǒng)的軟件和硬件調(diào)試過程
2、領(lǐng)會單片機(jī)應(yīng)用系統(tǒng)的開發(fā)過程
3、領(lǐng)會單片機(jī)開發(fā)工具的分類和使用
第九章單片機(jī)系統(tǒng)的抗干擾技術(shù)
一、考核知識點(diǎn):
1、單片機(jī)干擾源與分類
2、干擾對單片機(jī)系統(tǒng)的影響
3、硬件抗干擾技術(shù)
4、軟件抗干擾技術(shù)
5、數(shù)字濾波
二、考核要求:
1、識記單片機(jī)干擾源與分類
2、識記干擾對單片機(jī)系統(tǒng)的影響
3、識記數(shù)字濾波
4、簡明應(yīng)用硬件抗干擾技術(shù)
5、簡明應(yīng)用軟件抗干擾技術(shù)
第十章其它單片機(jī)簡介
一、考核知識點(diǎn):
1、AT89C系列單片機(jī)的特點(diǎn)與性能
2、其它8位單片機(jī)的特點(diǎn)與性能
3、16位、32位單片機(jī)的特點(diǎn)與性能
二、考核要求:
1、識記其它8位單片機(jī)的特點(diǎn)與性能
2、識記16位、32位單片機(jī)的特點(diǎn)與性能
3、領(lǐng)會AT89C系列單片機(jī)的特點(diǎn)與性能
《單片機(jī)原理及應(yīng)用技術(shù)》考試大綱
《單片機(jī)原理及應(yīng)用技術(shù)》課程是一門面向應(yīng)用的專業(yè)技術(shù)課。單片機(jī)原理與應(yīng)用介紹了單片機(jī)的基本知識和單片機(jī)技術(shù)的應(yīng)用,其內(nèi)容與工程實(shí)際緊密聯(lián)系,實(shí)用性很強(qiáng),是一門在理論指導(dǎo)下,偏重于實(shí)際應(yīng)用的課程。本課程具有實(shí)用性強(qiáng)、理論和實(shí)踐結(jié)合、軟硬件結(jié)合等特點(diǎn)。本課程圍繞使用較為廣泛的MCS-51系列單片機(jī)進(jìn)行學(xué)習(xí)。本課程已成為理、工科電子類專業(yè)的一門基礎(chǔ)課程,這是從電子系統(tǒng)設(shè)計角度考慮的,它體現(xiàn)了電子系統(tǒng)設(shè)計的方法和硬件結(jié)構(gòu)的變化。通過該課程的學(xué)習(xí),要求學(xué)生掌握80C51單片機(jī)的工作原理、編程技術(shù),掌握單片機(jī)應(yīng)用系統(tǒng)的擴(kuò)展方法和實(shí)際應(yīng)用。因此,以單片機(jī)為內(nèi)核,分析和設(shè)計一個簡單的計算機(jī)應(yīng)用系統(tǒng)是我們學(xué)習(xí)本課程要達(dá)到的目的。
第一部分考試大綱
1單片機(jī)概述
本章為單片機(jī)的基本概念。
1.掌握有關(guān)單片機(jī)的基本概念、單片機(jī)的特點(diǎn)、單片機(jī)的應(yīng)用。
2.理解單片機(jī)的總體組成。
3.了解單片微型計算機(jī)的產(chǎn)生、發(fā)展歷史、主要品種及系列。
2單片機(jī)結(jié)構(gòu)和原理
本章以80C51單片機(jī)為例介紹了主要硬件結(jié)構(gòu)和主要功能,著重掌握系統(tǒng)所提供的資源特性及其功能特性。
1.掌握80C51的內(nèi)部結(jié)構(gòu)。
2.掌握80C51單片機(jī)的存儲器組成。
3.掌握單片機(jī)并行輸入/輸出端口結(jié)構(gòu)及功能。
4.了解單片機(jī)的時序概念和復(fù)位工作方式。
5.掌握單片機(jī)引腳功能
3指令系統(tǒng)
1.掌握指令與偽指令的正確格式。
2.掌握七種尋址方式的使用及尋址方式的含義。
3.掌握
五類指令的功能和使用,特別是傳送指令。
4.理解書中所列例題與習(xí)題。
4匯編語言程序設(shè)計舉例
本章為MCS-51的一些常用偽指令,介紹順序結(jié)構(gòu)程序設(shè)計、分支結(jié)構(gòu)程序設(shè)計、循環(huán)結(jié)構(gòu)程序設(shè)計和子程序的設(shè)計。
1.程序設(shè)計的基本步驟、各種基本的結(jié)構(gòu)化程序設(shè)計方法;讀懂較復(fù)雜的常用程序。
2.掌握數(shù)據(jù)傳送指令的編寫。
3.理解算術(shù)運(yùn)算程序設(shè)計。
4.理解數(shù)碼轉(zhuǎn)換程序設(shè)計。
5.理解查表程序設(shè)計。
6.理解子程序設(shè)計和參數(shù)傳遞。
7.理解邏輯運(yùn)算程序設(shè)計
5中斷系統(tǒng)
1.掌握有關(guān)中斷、中斷源、中斷優(yōu)先級等概念。
2.掌握中斷響應(yīng)過程。
3.掌握中斷優(yōu)先級排列。
4.掌握中斷允許寄存器IE、中斷優(yōu)先級寄存器IP各位的含義及設(shè)置。
5.掌握外部中斷的兩種觸發(fā)方式:電平觸發(fā)、邊沿觸發(fā)。
6定時/計數(shù)器
1.掌握定時器/計數(shù)器的四種工作方式及有何不同。
2.掌握TMOD和TCON中各位的含義、作用。
4.掌握不同工作方式計數(shù)初值與定時時間的關(guān)系,即能根據(jù)定時時間算出計數(shù)初值,完成定時器的初始化編程和簡單應(yīng)用編程。
7串行通信
1.理解有關(guān)通信、協(xié)議的概念。
2.理解串行口的四種工作方式。
3.掌握SBUF的含義及作用。
4.了解串行口的工作原理。
5.了解SCON中每一位的含義及SMOD位的作用。
6.掌握串行通信總線RS-232C標(biāo)準(zhǔn)、RS-232C電平轉(zhuǎn)換。
7.了解RS-232C與MCS-51的接口。
8系統(tǒng)擴(kuò)展技術(shù)
1.掌握總線、驅(qū)動、鎖存和譯碼、地址重疊的概念。
2.掌握程序存儲器的擴(kuò)展:EPROM程序存儲器及其擴(kuò)展方法。
3.掌握數(shù)據(jù)存儲器的擴(kuò)展:靜態(tài)存儲器SRAM及其擴(kuò)展方法。
4.掌握簡單I/O口的擴(kuò)展。
5.掌握8255A可編程并行接口:結(jié)構(gòu)、控制字、工作方式、與8255A的接口方法。
9A/D和D/A轉(zhuǎn)換器接口技術(shù)
1.掌握DAC0832與單片機(jī)的接口方法與編程。
2.掌握ADC0809與單片機(jī)的接口方法與編程。
10鍵盤/顯示接口技術(shù)
1.掌握LED顯示器結(jié)構(gòu)、工作原理和顯示方式。
2.掌握鍵盤接口原理。
3.理解LED顯示器與80C51單片機(jī)接口。
4.理解鍵輸入程序設(shè)計方法。
5.了解行列式鍵盤與80C51單片機(jī)接口。
11、功率接口技術(shù)
1.掌握簡單開關(guān)量接口、光電耦合接口和繼電器接口。
2.晶閘管與故態(tài)繼電器的應(yīng)用接口。
12、單片機(jī)系統(tǒng)設(shè)計技術(shù)
掌握單片機(jī)系統(tǒng)的設(shè)計、開發(fā)、調(diào)試的原則、步驟及方法。
13、實(shí)用舉例
了解一兩個典型的單片機(jī)開發(fā)應(yīng)用系統(tǒng)的設(shè)計思想和實(shí)現(xiàn)方法。
14、新型單片機(jī)介紹
了解MCS-51常見8位單片機(jī)。
第二部分考試考核改革方案
一、考試考核要求
《單片機(jī)技術(shù)及應(yīng)用》選擇具有代表性的、使用較為廣泛的MCS-51系列單片機(jī)進(jìn)行學(xué)習(xí)(具體以80C51為例),介紹了80C51單片機(jī)的硬件組成、軟件編程及一般應(yīng)用系統(tǒng)組成。通過本課程的學(xué)習(xí),要求掌握80C51單片機(jī)的系統(tǒng)結(jié)構(gòu)、指令系統(tǒng)、程序設(shè)計方法、系統(tǒng)擴(kuò)展方法、單片機(jī)常用接口等應(yīng)用技術(shù)。本課程的教學(xué)過程由面授輔導(dǎo)、自學(xué)、實(shí)驗(yàn)及作業(yè)四個環(huán)節(jié)組成,因此本課程考試考核要求為:
1.作業(yè)、實(shí)驗(yàn)成績與期末考試成績共同評定為課程總成績。
2.作業(yè)、實(shí)驗(yàn)占課程總分的60,期末理論考試占總分的40。
為使學(xué)生不把注意力僅僅放在期末考試上,培養(yǎng)學(xué)生系統(tǒng)學(xué)習(xí)的能力,加強(qiáng)學(xué)生各方面能力的培養(yǎng),平時、實(shí)驗(yàn)課、作業(yè)、考試都納入本課程的成績評定。平時的成績包括出勤、課堂提問和隨堂測試。期末考試可以選擇筆試、口試和進(jìn)行實(shí)際實(shí)驗(yàn)、設(shè)計等多種形式。
二、平時成績考核要求及說明
1.每章作業(yè)按要求完成后交教師批改,完成作業(yè)80為12分(及格);所有作業(yè)均完成,且質(zhì)量較好者,20分(滿分)。中間情況酌情給分。
2.每次實(shí)驗(yàn)均能按照教師安排進(jìn)行,實(shí)驗(yàn)態(tài)度好,至少完成5個實(shí)驗(yàn)且實(shí)驗(yàn)報告完整,為18分(及格);能基本獨(dú)立完成6個或以上實(shí)驗(yàn),實(shí)驗(yàn)報告完整、無誤,實(shí)驗(yàn)質(zhì)量高,30分(滿分)。中間情況酌情給分。如果實(shí)驗(yàn)有創(chuàng)新的特點(diǎn),酌情加分。
3.作業(yè)與實(shí)驗(yàn)的平均分為平時成績,滿分50分。
4.課程設(shè)計單獨(dú)計算成績,考評方法見其大綱。
三、理論考試說明
1.單片機(jī)技術(shù)及應(yīng)用理論考試,采用閉卷筆試形式,考試時間120分鐘。
2.期末考試試題根據(jù)教學(xué)大綱,其范圍和難度按照本方案中制訂的考試考核內(nèi)容和要求確定??荚嚸}覆蓋考試大綱要求范圍。
3.期末考試試題類型有以下幾種:
①填空題;
②選擇題;
③判斷題;
④簡答題
⑤綜合應(yīng)用題。
四、考試考核要求層次
按照教學(xué)大綱的要求,理論考試要求分為掌握、理解和了解三個層次。
掌握:
對于本課程的重點(diǎn)內(nèi)容要求學(xué)生達(dá)到掌握的程度。即能夠全面、深入理解和熟練掌握所學(xué)內(nèi)容,并能夠用其分析、初步設(shè)計和解答與應(yīng)用相關(guān)的問題,能夠舉一反三。要求學(xué)生掌握的內(nèi)容也就是考試的主要內(nèi)容,在考試中所占比例約70。
理解:
對于本課程的一般內(nèi)容要求學(xué)生能夠理解。即要求學(xué)生能夠較好地理解所學(xué)內(nèi)容,并且對所涉及的內(nèi)容能夠進(jìn)行簡單分析和判斷。要求學(xué)生理解的內(nèi)容也是考試的內(nèi)容,在考試中所占比例約25。
了解:
對于本課程的次要內(nèi)容要求學(xué)生能夠了解。要求學(xué)生了解的內(nèi)容,一般是指在眼下不必進(jìn)一步深入和擴(kuò)展,有些也許需要學(xué)生自己今后在工作中進(jìn)行深入研究。對要求了解的內(nèi)容,在考試中占較小比例,不超過5。
實(shí)驗(yàn)五:按鍵電路、顯示電路實(shí)驗(yàn)
一、實(shí)驗(yàn)?zāi)康模?/p>
1.掌握獨(dú)立式按鍵電路與矩陣式按鍵電路的設(shè)計方法。
2.掌握數(shù)碼管顯示電路的工作原理
3.掌握源程序編輯軟件UltraEdit,編譯軟件KeilC51、仿真軟件Proteus的使用方法
4.掌握硬件仿真器ME-52A的使用方法
二、實(shí)驗(yàn)器材:
1.單片機(jī)實(shí)驗(yàn)板
2.單片機(jī)硬件仿真器ME-51A
3.計算機(jī)
4.電源
三、實(shí)驗(yàn)要求:
1.電路如圖5所示,用單片機(jī)的P3口所接的四個獨(dú)立式按鍵控制p1口流水燈花樣的方法;具體表現(xiàn)為:p3.0、P3.1、P3.2、P3.3四個小按鍵分別實(shí)現(xiàn)了四個控制:
(1)跑燈:即P1.0---1.7亮點(diǎn)流動:
(2)流水燈:即P1.0-1.7依次點(diǎn)
亮(3)交叉閃爍:即P0.0,P0.2,P0.4,P0.6和P0.1,P0.3,P0.5,P0.7輪流點(diǎn)亮
(4)停止;在任何狀態(tài)下按此鍵程序停止運(yùn)行.
2.電路如圖6所示,用P2口所接的4×4矩陣式鍵盤作為輸入,在P1口所接的數(shù)碼管上顯示出每個按鍵的0~F序號,鍵盤的布局如下表所示:
F
E
D
C
B
A
9
8
7
6
5
4
3
2
1
四、實(shí)驗(yàn)原理:
1.獨(dú)立式按鍵電路顯示如圖5所示,從圖中可看出,判斷有無鍵按下,只要檢測P3.0~P3.3相應(yīng)端口的高低電平即可,若檢測有某一端口為低電平,表明該端口有按鍵按下,經(jīng)延時消抖后轉(zhuǎn)去執(zhí)行相應(yīng)的功能子程序。若為高電平,表明無鍵按1.獨(dú)立式按鍵電路如圖5所示,下,繼續(xù)檢測。
示例程序如下:
ORG000H
LJMPSTAR1
ORG0030H
STAR1:MOVP3,#0FFH;置P3口為輸入態(tài)
JNBP3.0,FUN0;判別P3.0是否有鍵按下,是,則轉(zhuǎn)FUN0
JNBP3.1,FUN1;判別P3.1是否有鍵按下,是,則轉(zhuǎn)FUN1
JNBP3.2,FUN2;判別P3.2是否有鍵按下,是,則轉(zhuǎn)FUN2
JNBP3.3,FUN3;判別P3.3是否有鍵按下,是,則轉(zhuǎn)FUN3
JNBF0,STAR1;曾經(jīng)有鍵按下F0置1
RET
圖5
FUN0:LCALLDL10MS;消岸抖動
JBP3.0,STAR1
WAITL0:JNBP3.0,WAITL0;等待鍵釋放
SETBF0
FUN01:LCALLFUN00
LCALLSTAR1
LJMPFUN01
FUN1:LCALLDL10MS;消岸抖動
JBP3.1,STAR1
WAITL1:JNBP3.1,WAITL1;等待鍵釋放
SETBF0
FUN10:LCALLFUN11
LCALLSTAR1
LJMPFUN10
FUN2:LCALLDL10MS;消岸抖動
JBP3.2,STAR1
WAITL2:JNBP3.2,WAITL2;等待鍵釋放
SETBF0
FUN20:LCALLFUN22
LCALLSTAR1
LJMPFUN20
FUN3:LCALLDL10MS;消岸抖動
JBP3.3,STAR1
WAITL3:JNBP3.3,WAITL3;等待鍵釋放
CLRF0
MOVP1,#0FFH;關(guān)顯示
LJMPSTAR1
FUN00:MOVA,#0FEH;跑燈子程序
FUN000:MOVP1,A
LCALLDL05S
JNBACC.7,OUT
RLA
AJMPFUN000
OUT:RET
FUN11:MOVA,#0FEH;流水燈子程序
FUN111:MOVP1,A
LCALLDL05S
JZOUT
RLA
ANLA,P1
AJMPFUN111
FUN22:MOVA,#0AAH;交叉點(diǎn)亮子程序
MOVP1,A
LCALLDL30S
CPLA
MOVP1,A
LCALLDL30S
RET
;____________;
;延時程序;
;____________;
DL512:MOVR2,#0FFH
LOOP1:DJNZR2,LOOP1
RET
DL10MS:MOVR3,#14H
LOOP2:LCALLDL512
DJNZR3,LOOP2
RET
DL05S:MOVR4,#0AH
LOOP3:LCALLDL10MS
DJNZR4,LOOP3
RET
DL30S:MOVR5,#03H
LOOP4:LCALLDL05S
DJNZR5,LOOP4
RET
END
2.矩陣式按鍵電路顯示如圖6所示。采用掃描方式進(jìn)行按鍵的識別檢測,并將對應(yīng)按鍵的鍵號用查表指令將對應(yīng)的代碼顯示在數(shù)碼管上。
圖6
參考程序如下:
ORG0000H
LJMPSTART
ORG0030H
START:MOVSP,#60H;設(shè)置堆棧指針
SCAN:MOVR3,#0F7H;置行掃描初值
MOVR1,#00H;到TABLE表中取碼的指針
SCAN1:MOVA,R3
MOVP2,A;掃描輸出
MOVA,P2;重讀P2口狀態(tài)
MOVR4,A;暫存于R4呂中
SETBC;C=1
MOVR5,#03H;掃描4列初值
L1:RLCA;A中內(nèi)容循環(huán)左移
JNCKEYIN;C=0,有鍵按下,轉(zhuǎn)消抖
INCR1;取碼指針加1
DJNZR5,L1;無鍵按下,繼續(xù)檢測
MOVA,R3;掃描下一行
SETBC
RRCA
MOVR3,A
JCSCAN1;4行是否掃描完,未完,繼續(xù)
LJMPSCAN
KEYIN:MOVR7,#10;削除抖動
D2:MOVR6,#248
DJNZR6,$
DJNZR7,D2
D3:MOVA,P2;按鍵放開否?
XRLA,R4
JZD3
MOVA,R1
MOVDPTR,#TABLE;到TABLE中取碼
MOVCA,@A DPTR
MOVP1,A
LJMPSCAN
TABLE:DB0C0H,0F9H,0A4H,0B0H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH
END
DB80H,90H,88H,83H
DB0C6H,0A1H,86H,8EH
END
五、實(shí)驗(yàn)步驟:
1.運(yùn)行UltraEdit-32源程序編輯軟件,輸入、編輯匯編語言源程序。
2.運(yùn)行KeiluVision2源程序編譯軟件,對源程序進(jìn)行編譯,得到目標(biāo)代碼文件。
3.運(yùn)行Proteus模擬仿真軟件,打開已繪制好的仿真電路原理圖,進(jìn)行模擬仿真。
4.把硬件仿真器ME-52A與單片實(shí)驗(yàn)板連接好,再用硬件仿真器進(jìn)行仿真驗(yàn)證。
六、實(shí)驗(yàn)分析與總結(jié)
1.用仿真系統(tǒng)調(diào)試簡單程序結(jié)構(gòu)、分支程序結(jié)構(gòu)、循環(huán)程序結(jié)構(gòu)、子程序結(jié)構(gòu)和中斷結(jié)構(gòu)的關(guān)鍵在于,如何將對程序的分析理解和開發(fā)系統(tǒng)提供的基本功能有機(jī)地結(jié)合起來,其前提條件是必須對源程序的作用、結(jié)構(gòu)特點(diǎn)、運(yùn)行過程與結(jié)果有較全面的認(rèn)識,并能根據(jù)程序運(yùn)行過程中出現(xiàn)的現(xiàn)象和結(jié)果分析并判斷產(chǎn)生各種故障現(xiàn)象的原因,再運(yùn)用排除法逐一檢驗(yàn)各種判斷是否準(zhǔn)確。
2.掌握程序結(jié)構(gòu)特點(diǎn)的基礎(chǔ)上,合理選擇觀測點(diǎn),通過觀察在觀測點(diǎn)處參數(shù)及路徑的變化檢驗(yàn)程序運(yùn)行的結(jié)果。
3.高調(diào)試程序的效率,應(yīng)對單片機(jī)開發(fā)系統(tǒng)所提供的幾種程序運(yùn)行調(diào)試方式有
足夠的了解并能熟練地運(yùn)用。例如,在調(diào)試過程中,若要觀察最終結(jié)果,則可選擇全速運(yùn)行調(diào)試;若要觀察相關(guān)指令的運(yùn)行結(jié)果或運(yùn)行路徑的變化過程,則可選擇單步運(yùn)行;若要檢查子程序的運(yùn)行過程,則可選擇跟蹤運(yùn)行調(diào)試;若要檢查循環(huán)程序或中斷服務(wù)程序,則可選擇斷點(diǎn)運(yùn)行調(diào)試;若要定點(diǎn)檢查程序運(yùn)行到某處的結(jié)果時,則可選擇快速運(yùn)行到光標(biāo)處調(diào)試。但實(shí)際中究竟選用哪種方法更適宜或哪幾種方法結(jié)合使用更快捷,將隨著分析能力與操作的熟練程度逐步提高。4.程序運(yùn)行結(jié)果是否正確時,應(yīng)運(yùn)用單片機(jī)開發(fā)系統(tǒng)所提供的交互界面,將程序運(yùn)行過程中程序計數(shù)器PC(地址)的變化、各單元(內(nèi)部RAM和外部RAM)內(nèi)容的變化、特殊功能寄存器內(nèi)容的變化、堆棧指針SP內(nèi)容的變化與程序的理論分析結(jié)果相對照。
5.程序和調(diào)試程序時,需要多次反復(fù)的過程,并非一次就能排除全部故障,特別是單片機(jī)應(yīng)用系統(tǒng)的硬件電路和匯編程序相結(jié)合的綜合調(diào)試就更加復(fù)雜,因此,必須通過反復(fù)調(diào)試,不斷修改硬件和軟件,直到最終符合設(shè)計要求為止。如果在調(diào)試中能夠根據(jù)實(shí)驗(yàn)現(xiàn)象預(yù)先對產(chǎn)生故障的原因加以判斷和分析,并制定出相應(yīng)的調(diào)試方法和步驟,可縮小排除故障的范圍,提高調(diào)試效率。
七、思考與練習(xí)
填空題
1、設(shè)X=5AH,Y=36H,則X與Y“或”運(yùn)算為__7EH_______,X與Y的“異或”運(yùn)算為___6CH_____。
2、若機(jī)器的字長為8位,X=17,Y=35,則X+Y=__110100_____,X-Y=_11101110______(要求結(jié)果寫出二進(jìn)制形式)。
3、單片機(jī)的復(fù)位操作是____高電平______(高電平/低電平),單片機(jī)復(fù)位后,堆棧指針SP的值是___07h_____。
4、單片機(jī)中,常用作地址鎖存器的芯片是__74HC373____________,常用作地址譯碼器芯片是_____74HC138____________。
5、若選擇內(nèi)部程序存儲器,應(yīng)該設(shè)置為_____高_(dá)______(高電平/低電平),那么,PSEN信號的處理方式為___不用__________________。
6、單片機(jī)程序的入口地址是____0000H__________,外部中斷1的入口地址是______0013H_________。
7、若采用6MHz的晶體振蕩器,則MCS-51單片機(jī)的振蕩周期為__0.5us_______,機(jī)器周期為_____2us__________。
8、擴(kuò)展芯片的選擇方法有兩種,它們分別是___線選法_______________和_____譯碼法__________。
9、單片機(jī)的內(nèi)部RAM區(qū)中,可以位尋址的地址范圍是____20H~2FH______________,特殊功能寄存器中,可位尋址的地址是___是能被8整除的地址_________________。
10、子程序返回指令是___ret______,中斷子程序返回指令是__reti。
11、8051單片機(jī)的存儲器的最大特點(diǎn)是內(nèi)部RAM與外部RAM分開編址。
12、8051最多可以有32個并行輸入輸出口,最少也可以有8個并行口。
13、函數(shù)是C語言的基本單位。
14、串行口方式2接收到的第9位數(shù)據(jù)送SCON寄存器的RB8位中保存。
15、MCS-51內(nèi)部提供3個可編程的16位定時/計數(shù)器,定時器有4種工作方式。
16、一個函數(shù)由兩部分組成,即說明部分和語句部分。
17、串行口方式3發(fā)送的第9位數(shù)據(jù)要事先寫入SCON寄存器的TB8位。
18、利用8155H可以擴(kuò)展3個并行口,256個RAM單元。
19、C語言中輸入和輸出操作是由庫函數(shù)scanf和printf等函數(shù)來完成。
二、選擇題
1、C語言中最簡單的數(shù)據(jù)類型包括(B)。
A、整型、實(shí)型、邏輯型B、整型、實(shí)型、字符型
C、整型、字符型、邏輯型D、整型、實(shí)型、邏輯型、字符型
2、當(dāng)MCS-51單片機(jī)接有外部存儲器,P2口可作為(C)。
A、數(shù)據(jù)輸入口B、數(shù)據(jù)的輸出口
C、準(zhǔn)雙向輸入/輸出口D、輸出高8位地址
3、下列描述中正確的是(D)。
A、程序就是軟件B、軟件開發(fā)不受計算機(jī)系統(tǒng)的限制
C、軟件既是邏輯實(shí)體,又是物理實(shí)體D、軟件是程序、數(shù)據(jù)與相關(guān)文檔的集合
4、下列計算機(jī)語言中,CPU能直接識別的是(D)。
A、自然語言B、高級語言C、匯編語言D、機(jī)器語言
5、MCS-5l單片機(jī)的堆棧區(qū)是設(shè)置在(C)中。
A、片內(nèi)ROM區(qū)B、片外ROM區(qū)C、片內(nèi)RAM區(qū)D、片外RAM區(qū)
6、以下敘述中正確的是(C)。
A、用C語言實(shí)現(xiàn)的算法必須要有輸入和輸出操作
B、用C語言實(shí)現(xiàn)的算法可以沒有輸出但必須要有輸入
C、用C程序?qū)崿F(xiàn)的算法可以沒有輸入但必須要有輸出
D、用C程序?qū)崿F(xiàn)的算法可以既沒有輸入也沒有輸出
7、定時器/計數(shù)器工作方式1是(D)。
A、8位計數(shù)器結(jié)構(gòu)B、2個8位計數(shù)器結(jié)構(gòu)
C、13位計數(shù)結(jié)構(gòu)D、16位計數(shù)結(jié)構(gòu)
8、C語言提供的合法的數(shù)據(jù)類型關(guān)鍵字是(B)。
A、DoubleB、shortC、integerD、Char
9、片內(nèi)RAM的20H~2FH為位尋址區(qū),所包含的位地址是(B)。
A、00H~20HB、00H~7FHC、20H~2FHD、00H~FFH
10、以下能正確定義一維數(shù)組的選項(xiàng)是(B)。
A、inta[5]={0,1,2,3,4,5};B、chara[]={0,1,2,3,4,5};
C、chara={’A’,’B’,’C’};D、inta[5]="0123";
11、數(shù)據(jù)的存儲結(jié)構(gòu)是指(D)。
A、存儲在外存中的數(shù)據(jù)B、數(shù)據(jù)所占的存儲空間量
C、數(shù)據(jù)在計算機(jī)中的順序存儲方式D、數(shù)據(jù)的邏輯結(jié)構(gòu)在計算機(jī)中的表示
12、下列關(guān)于棧的描述中錯誤的是(C)。
A、棧是先進(jìn)后出的先性表B、棧只能順序存儲
C、棧具有記憶作用D、對棧的插入和刪除操作中,不需要改變棧底指針
13、在寄存器間接尋址方式中,間址寄存器中存放的數(shù)據(jù)是(B)。
A、參與操作的數(shù)據(jù)B、操作數(shù)的地址值
C、程序的轉(zhuǎn)換地址D、指令的操作碼
14、MCS-51單片機(jī)的復(fù)位信號是(A)有效。
A、高電平B、低電平C、脈沖D、下降沿
15、為了使模塊盡可能獨(dú)立,要求(B)。
A、模塊的內(nèi)聚程度要盡量高,且各模塊間的耦合程度要盡量強(qiáng)
B、模塊的內(nèi)聚程度要盡量高,且各模塊間的耦合程度要盡量弱
C、模塊的內(nèi)聚程度要盡量低,且各模塊間的耦合程度要盡量弱
D、模塊的內(nèi)聚程度要盡量低,且各模塊間的耦合程度要盡量強(qiáng)
16、若MCS-51單片機(jī)使用晶振頻率為6MHz時,其復(fù)位持續(xù)時間應(yīng)該超過(B)。
A、2μsB、4μsC、8μsD、1ms
17、以下選項(xiàng)中可作為C語言合法常量的是(A)
A、-80B、-080C、-8e1.0D、-80.0e
18、能夠用紫外光擦除ROM中程序的只讀存儲器稱為(C)。
A、掩膜ROMB、PROMC、EPROMD、EEPROM
19、以下不能定義為用戶標(biāo)識符是(D)。
A、MainB、_0C、_intD、sizeof
20、下選項(xiàng)中,不能作為合法常量的是(B)。//冪不能為小數(shù)
A、1.234e04B、1.234e0.4C、1.234e 4D、1.234e0
21、以下敘述中錯誤的是(C)
A、對于double類型數(shù)組,不可以直接用數(shù)組名對數(shù)組進(jìn)行整體輸入或輸出
B、數(shù)組名代表的是數(shù)組所占存儲區(qū)的首地址,其值不可改變
C、當(dāng)程序執(zhí)行中,數(shù)組元素的下標(biāo)超出所定義的下標(biāo)范圍時,系統(tǒng)將給出“下標(biāo)越界”的出錯信息
D、可以通過賦初值的方式確定數(shù)組元素的個數(shù)
22、以下與函數(shù)fseek(fp,0L,SEEK_SET)有相同作用的是(D)
A、feof(f
p)B、ftell(fp)C、fgetc(fp)D、rewind(fp)
23、存儲16×16點(diǎn)陣的一個漢字信息,需要的字節(jié)數(shù)為(A)
A、32B、64C、128D、256
24、已知1只共陰極LED顯示器,其中a筆段為字形代碼的最低位,若需顯示數(shù)字1,則它的字形代碼應(yīng)為(B)。
A、06HB、F9HC、30HD、CFH
25、在C語言中,合法的長整型常數(shù)是(A)
A、OLB、4962710C、324562&D、216D
26、以下選項(xiàng)中合法的字符常量是(B)
A、"B"B、’\010’C、68D、D
27、若PSW.4=0,PSW.3=1,要想把寄存器R0的內(nèi)容入棧,應(yīng)使用(D)指令。
A、PUSHR0B、PUSH@R0C、PUSH00HD、PUSH08H
28、在片外擴(kuò)展一片2764程序存儲器芯片要(B)地址線。
A、8根B、13根C、16根D、20根
29、設(shè)MCS-51單片機(jī)晶振頻率為12MHz,定時器作計數(shù)器使用時,其最高的輸入計數(shù)頻率應(yīng)為(C)
A、2MHzB、1MHzC、500kHzD、250kHz
30、下列數(shù)據(jù)字定義的數(shù)表中,(A)是錯誤的。
A、DW“AA”B、DW“A”C、DW“OABC”D、DWOABCH
三、判斷題
(√)1、在對某一函數(shù)進(jìn)行多次調(diào)用時,系統(tǒng)會對相應(yīng)的自動變量重新分配存儲單元。
(×)2、在C語言的復(fù)合語句中,只能包含可執(zhí)行語句。
(√)3、自動變量屬于局部變量。
(×)4、Continue和break都可用來實(shí)現(xiàn)循環(huán)體的中止。
(√)5、字符常量的長度肯定為1。
(×)6、在MCS-51系統(tǒng)中,一個機(jī)器周期等于1.5μs。
(√)7、C語言允許在復(fù)合語句內(nèi)定義自動變量。
(√)8、若一個函數(shù)的返回類型為void,則表示其沒有返回值。
(×)9、所有定義在主函數(shù)之前的函數(shù)無需進(jìn)行聲明。
(×)10、定時器與計數(shù)器的工作原理均是對輸入脈沖進(jìn)行計數(shù)。
(×)11、END表示指令執(zhí)行到此結(jié)束。
(√)12、ADC0809是8位逐次逼近式模/數(shù)轉(zhuǎn)換接口。
(√)13、MCS-51的相對轉(zhuǎn)移指令最大負(fù)跳距是127B。
(×)14、MCS-51的程序存儲器只是用來存放程序的。
(√)15、TMOD中的GATE=1時,表示由兩個信號控制定時器的的啟停。
(×)16、MCS-51的特殊功能寄存器分布在60H~80H地址范圍內(nèi)。
(×)17、MCS-51系統(tǒng)可以沒有復(fù)位電路。
(×)18、片內(nèi)RAM與外部設(shè)備統(tǒng)一編址時,需要專門的輸入/輸出指令。
(√)19、鎖存器、三態(tài)緩沖寄存器等簡單芯片中沒有命令寄存和狀態(tài)寄存等功能。
(√)20、使用8751且=1時,仍可外擴(kuò)64KB的程序存儲器。
四、簡答題
1、在使用8051的定時器/計數(shù)器前,應(yīng)對它進(jìn)行初始化,其步驟是什么?
答:(1)確定T/C的工作方式——編程TMOD寄存器;
(2)計算T/C中的計數(shù)初值,并裝載到TH和TL;
(3)T/C在中斷方式工作時,須開CPU中斷和源中斷——編程IE寄存器;
(4)啟動定時器/計數(shù)器——編程TCON中TR1或TR0位。
2、什么是重入函數(shù)?重入函數(shù)一般什么情況下使用,使用時有哪些需要注意的地方?答:多個函數(shù)可以同時使用的函數(shù),稱為重入函數(shù)。
通常情況下,C51函數(shù)不能被遞歸調(diào)用,也不能應(yīng)用導(dǎo)致遞歸調(diào)用的結(jié)構(gòu)。有此限制是由于函數(shù)參數(shù)和局部變量是存儲在固定的地址單元中。重入函數(shù)特性允許你聲明一個重入函數(shù)。即可以被遞歸調(diào)用的函數(shù)。
重入函數(shù)可以被遞歸調(diào)用,也可以同時被兩個或更多的進(jìn)程調(diào)用。重入函數(shù)在實(shí)時應(yīng)用中及中斷服務(wù)程序代碼和非中斷程序代碼必須共用一個函數(shù)的場合中經(jīng)常用到。
3、8051引腳有多少I/O線?他們和單片機(jī)對外的地址總線和數(shù)據(jù)總線有什么關(guān)系?地址總線和數(shù)據(jù)總線各是幾位?
答:8051引腳共有40個引腳,8051的地址總線由P2和P0口提供,P2口是地址總線的高8位,P0口是地址總線的低8位;數(shù)據(jù)總線由P0口提供;P0口的地址總線和數(shù)據(jù)總線是分時進(jìn)行的,P0口的地址總線需要外接地址鎖存器完成地址鎖存。
地址總線共16位,數(shù)據(jù)總線是8位。
4、在有串行通信時,定時器/計數(shù)器1的作用是什么,怎樣確定串行口的波特率?
答:在有串行通信時,定時器/計數(shù)器1的作用是串行口發(fā)生器。
串行口的波特率根據(jù)串行口的工作方式具有不同的計算方式:
方式0的波特率固定為晶體振蕩器的十二分之一;
方式1的波特率=2SMOD.(定時器1的溢出率)/32;
方式2波特率=2SMOD.(fosc/64);
方式3波特率同方式1(定時器l作波特率發(fā)生器)。
5、如何消除鍵盤的抖動?怎樣設(shè)置鍵盤中的復(fù)合鍵?
答:由于按鍵是機(jī)械開關(guān)結(jié)構(gòu),所以當(dāng)用手按下其中一個鍵時,往往會出現(xiàn)所按鍵在閉合位置和斷開位置之間發(fā)生跳幾下后才會穩(wěn)定到閉合狀態(tài)的情況。在釋放一個鍵時,也會出現(xiàn)類似的情況,這就是鍵的抖動,抖動的持續(xù)時間不一,但通常不會大于10ms。
若抖動問題不解決,就會引起對閉合鍵的多次讀入。對于鍵抖動最方便的解決方法就是當(dāng)發(fā)現(xiàn)有鍵按下后,不是立即進(jìn)行掃描,而是延時大約10ms后再進(jìn)行。由于一個鍵按下的時間一般會持續(xù)上百毫秒,所以延遲10ms后再掃描處理并不遲。
復(fù)合鍵可以仿照計算機(jī)復(fù)合鍵的處理方法,通??梢约僭O(shè)一個鍵具有復(fù)合功能,再與其它減的鍵值組合成復(fù)合鍵。
1、矩陣式鍵盤的結(jié)構(gòu)與工作原理
在鍵盤中按鍵數(shù)量較多時,為了減少I/O口的占用,通常將按鍵排列成矩陣形式,如圖1所示。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接。這樣,一個端口(如P1口)就可以構(gòu)成4*4=16個按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數(shù)越多,區(qū)別越明顯,比如再多加一條線就可以構(gòu)成20鍵的鍵盤,而直接用端口線則只能多出一鍵(9鍵)。由此可見,在需要的鍵數(shù)比較多時,采用矩陣法來做鍵盤是合理的。
矩陣式結(jié)構(gòu)的鍵盤顯然比直接法要復(fù)雜一些,識別也要復(fù)雜一些,上圖中,列線通過電阻接正電源,并將行線所接的單片機(jī)的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當(dāng)按鍵沒有按下時,所有的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態(tài)就可得知是否有鍵按下了。具體的識別及編程方法如下所述。
2、矩陣式鍵盤的按鍵識別方法
確定矩陣式鍵盤上何鍵被按下介紹一種“行掃描法”。
行掃描法行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識別方法,如上圖所示鍵盤,介紹過程如下。
1、判斷鍵盤中有無鍵按下將全部行線Y0-Y3置低電平,然后檢測列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。
2、判斷閉合鍵所在的位置在確認(rèn)有鍵按下后,即可進(jìn)入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態(tài)。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。
下面給出一個具體的例子:
圖仍如上所示。8031單片機(jī)的P1口用作鍵盤I/O口,鍵盤的列線接到P1口的低4位,鍵盤的行線接到P1口的高4位。列線P1.0-P1.3分別接有4個上拉電阻到正電源 5V,并把列線P1.0-P1.3設(shè)置為輸入線,行線P1.4-P.17設(shè)置為輸出線。4根行線和4根列線形成16個相交點(diǎn)。
1、檢測當(dāng)前是否有鍵被按下。檢測的方法是P1.4-P
1.7輸出全“0”,讀取P1.0-P1.3的狀態(tài),若P1.0-P1.3為全“1”,則無鍵閉合,否則有鍵閉合。
2、去除鍵抖動。當(dāng)檢測到有鍵按下后,延時一段時間再做下一步的檢測判斷。
3、若有鍵被按下,應(yīng)識別出是哪一個鍵閉合。方法是對鍵盤的行線進(jìn)行掃描。P1.4-P1.7按下述4種組合依次輸出:
P1.71110
P1.61101
P1.51011
P1.40111
在每組行輸出時讀取P1.0-P1.3,若全為“1”,則表示為“0”這一行沒有鍵閉合,否則有鍵閉合。由此得到閉合鍵的行值和列值,然后可采用計算法或查表法將閉合鍵的行值和列值轉(zhuǎn)換成所定義的鍵值
4、為了保證鍵每閉合一次CPU僅作一次處理,必須卻除鍵釋放時的抖動。
鍵盤掃描程序:
從以上分析得到鍵盤掃描程序的流程圖如圖2所示。程序如下
SCAN:MOVP1,#0FH
MOVA,P1
ANLA,#0FH
CJNEA,#0FH,NEXT1
SJMPNEXT3
NEXT1:ACALLD20MS
MOVA,#0EFH
NEXT2:MOVR1,A
MOVP1,A
MOVA,P1
ANLA,#0FH
CJNEA,#0FH,KCODE;
MOVA,R1
SETBC
RLCA
JCNEXT2
NEXT3:MOVR0,#00H
RET
KCODE:MOVB,#0FBH
NEXT4:RRCA
INCB
JCNEXT4
MOVA,R1
SWAPA
NEXT5:RRCA
INCB
INCB
INCB
INCB
JCNEXT5
NEXT6:MOVA,P1
ANLA,#0FH
CJNEA,#0FH,NEXT6
MOVR0,#0FFH
RET
鍵盤處理程序就作這么一個簡單的介紹,實(shí)際上,鍵盤、顯示處理是很復(fù)雜的,它往往占到一個應(yīng)用程序的大部份代碼,可見其重要性,但說到,這種復(fù)雜并不來自于單片機(jī)的本身,而是來自于操作者的習(xí)慣等等問題,因此,在編寫鍵盤處理程序之前,最好先把它從邏輯上理清,然后用適當(dāng)?shù)乃惴ū硎境鰜恚詈笤偃懘a,這樣,才能快速有效地寫好代碼。
到本課為止,本站教程暫告一個段落!感謝大家的關(guān)心和支持!
矩陣按鍵部分由16個輕觸按鍵按照4行4列排列,連接到JP50端口。將行線所接的單片機(jī)的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當(dāng)按鍵沒有按下時,所有的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態(tài)就可得知是否有鍵按下了。確定矩陣式鍵盤上何鍵被按下,介紹一種“行掃描法”。行掃描法行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識別方法.判斷鍵盤中有無鍵按下:將全部行線置低電平,然后檢測列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。判斷閉合鍵所在的位置:在確認(rèn)有鍵按下后,即可進(jìn)入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態(tài)。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。
下面給出一個具體的例子:
電路圖路徑:G:\圖片\電路圖片\xl100097.jpg
8031單片機(jī)的P1口用作鍵盤I/O口,鍵盤的列線接到P1口的低4位,鍵盤的行線接到P1口的高4位。列線P1.0-P1.3設(shè)置為輸入線,行線P1.4-P.17設(shè)置為輸出線。4根行線和4根列線形成16個相交點(diǎn)。
1.檢測當(dāng)前是否有鍵被按下。檢測的方法是P1.4-P1.7輸出全“0”,讀取P1.0-P1.3的狀態(tài),若P1.0-P1.3為全“1”,則無鍵閉合,否則有鍵閉合。
2.去除鍵抖動。當(dāng)檢測到有鍵按下后,延時一段時間再做下一步的檢測判斷。
3.若有鍵被按下,應(yīng)識別出是哪一個鍵閉合。方法是對鍵盤的行線進(jìn)行掃描。P1.4-P1.7按下述4種組合依次輸出:
P1.71110
P1.61101
P1.51011
P1.40111
在每組行輸出時讀取P1.0-P1.3,若全為“1”,則表示為“0”這一行沒有鍵閉合,否則有鍵閉合。由此得到閉合鍵的行值和列值,然后可采用計算法或查表法將閉合鍵的行值和列值轉(zhuǎn)換成所定義的鍵值。
4.為了保證鍵每閉合一次CPU僅作一次處理,必須去除鍵釋放時的抖動。
實(shí)驗(yàn)?zāi)康模和ㄟ^XL1000的16位矩陣按鍵,在數(shù)碼管上分別顯示0---9,A,B,C,D,E,F。
接線方法:1用一條8PIN數(shù)據(jù)排線,把矩陣按鍵部份的JP50,接到CPU部份的P1口JP44.
2接8位數(shù)碼管的數(shù)據(jù)線。將數(shù)碼管部份的數(shù)據(jù)口JP5接到CPU部份的P0口JP51.
3接8位數(shù)碼管的顯示位線。將數(shù)碼管部份的顯示位口JP8接到CPU部份的P2口JP52.
參考程序:
;本程序?qū)崿F(xiàn)掃描按鍵顯示功能.
;分別按16個鍵盤顯示分別顯示數(shù)字123A456B789C*0#D
;鍵盤口P1,數(shù)碼管顯示第二位p21,數(shù)碼管段位p0口
org0000h
ajmpmain
org0030h
main:
movdptr,#tab;將表頭放入DPTR
lcallkey;調(diào)用鍵盤掃描程序
movca,@a dptr;查表后將鍵值送入ACC
movp0,a;將Acc值送入P0口
CLRP2.1;開顯示
ljmpmain;返回反復(fù)循環(huán)顯示
KEY:
LCALLKS;調(diào)用檢測按鍵子程序
JNZK1;有鍵按下繼續(xù)
LCALLDELAY2;無鍵按調(diào)用延時去抖
AJMPKEY;返回繼續(xù)檢測按鍵
K1:LCALLDELAY2
LCALLDELAY2;有鍵按下延時去抖動
LCALLKS;再調(diào)用檢測按鍵程序
JNZK2;確認(rèn)有按下進(jìn)行下一步
AJMPKEY;無鍵按下返回繼續(xù)檢測
K2:MOVR2,#0EFH;將掃描值送入R2暫存
MOVR4,#00H;將第一列值送入R4暫存
K3:MOVP1,R2;將R2的值送入P1口
L6:JBP1.0,L1;P1.0等于1跳轉(zhuǎn)到L1
MOVA,#00H;將第一行值送入ACC
AJMPLK;跳轉(zhuǎn)到鍵值處理程序
L1:JBP1.1,L2;P1.1等于1跳轉(zhuǎn)到L2
MOVA,#04H;將第二行的行值送入ACC
AJMPLK;跳轉(zhuǎn)到鍵值理程序進(jìn)行鍵值處理
L2:JBP1.2,L3;P1.2等于1跳轉(zhuǎn)到L3
MOVA,#08H;將第三行的行值送入ACC
AJMPLK;跳轉(zhuǎn)到鍵值處理程序
L3:JBP1.3,NEXT;P1.3等于1跳轉(zhuǎn)到NEXT處
MOVA,#0cH;將第四行的行值送入ACC
LK:ADDA,R4;行值與列值相加后的鍵值送入A
PUSHACC;將A中的值送入堆棧暫存
K4:LCALLDELAY2;調(diào)用延時去抖動程序
LCALLKS;調(diào)用按鍵檢測程序
JNZK4;按鍵沒有松
開繼續(xù)返回檢測POPACC;將堆棧的值送入ACC
RET
NEXT:
INCR4;將列值加一
MOVA,R2;將R2的值送入A
JNBACC.7,KEY;掃描完至KEY處進(jìn)行下一掃描
RLA;掃描未完將A中的值右移一位進(jìn)行下一列的掃描
MOVR2,A;將ACC的值送入R2暫存
AJMPK3;跳轉(zhuǎn)到K3繼續(xù)
KS:MOVP1,#0FH;將P1口高四位置0低四位值1
MOVA,P1;讀P1口
XRLA,#0FH;將A中的值與A中的值相異或
RET;子程序返回
DELAY2:;40ms延時去抖動子程序
MOVR5,#08H
L7:MOVR6,#0FAH
L8:DJNZR6,L8
DJNZR5,L7
RET
tab:
db28h,34h,28h,34h,0a9h,60h,20h,7ah,
20h,21h,61h,74h,30h,62h,0a2h,7eh
;0h0hc9878654a321輪流顯示鍵盤因?yàn)闊o法表達(dá)*#就用H表示,B用8表示
end
這是我做成功的4X4鍵盤掃描源程序,P1.0-P1.3做四根列線,P1.4-P1.7做四根行線。
數(shù)碼管的字型表是按照標(biāo)準(zhǔn)接法做的,按對應(yīng)的按鍵數(shù)碼管顯示對應(yīng)的數(shù)字。
以下是源程序:
KEYBUFEQU30H
ORG00H
START:MOVKEYBUF,#2
MOVP2,#00001111B
WAIT:
MOVP1,#0FFH
CLRP1.4
MOVA,P1
ANLA,#0FH
XRLA,#0FH
JZNOKEY1
LCALLDELY10MS
MOVA,P1
ANLA,#0FH
XRLA,#0FH
JZNOKEY1
MOVA,P1
ANLA,#0FH
CJNEA,#0EH,NK1
MOVKEYBUF,#0
LJMPDK1
NK1:CJNEA,#0DH,NK2
MOVKEYBUF,#1
LJMPDK1
NK2:CJNEA,#0BH,NK3
MOVKEYBUF,#2
LJMPDK1
NK3:CJNEA,#07H,NK4
MOVKEYBUF,#3
LJMPDK1
NK4:NOP
DK1:
MOVA,KEYBUF
MOVDPTR,#TABLE
MOVCA,@A DPTR
MOVP0,A
DK1A:MOVA,P1
ANLA,#0FH
XRLA,#0FH
JNZDK1A
NOKEY1:
MOVP1,#0FFH
CLRP1.5
MOVA,P1
ANLA,#0FH
XRLA,#0FH
JZNOKEY2
LCALLDELY10MS
MOVA,P1
ANLA,#0FH
XRLA,#0FH
JZNOKEY2
MOVA,P1
ANLA,#0FH
CJNEA,#0EH,NK5
MOVKEYBUF,#4
LJMPDK2
NK5:CJNEA,#0DH,NK6
MOVKEYBUF,#5
LJMPDK2
NK6:CJNEA,#0BH,NK7
MOVKEYBUF,#6
LJMPDK2
NK7:CJNEA,#07H,NK8
MOVKEYBUF,#7
LJMPDK2
NK8:NOP
DK2:
MOVA,KEYBUF
MOVDPTR,#TABLE
MOVCA,@A DPTR
MOVP0,A
DK2A:MOVA,P1
ANLA,#0FH
XRLA,#0FH
JNZDK2A
NOKEY2:
MOVP1,#0FFH
CLRP1.6
MOVA,P1
ANLA,#0FH
XRLA,#0FH
JZNOKEY3
LCALLDELY10MS
MOVA,P1
ANLA,#0FH
XRLA,#0FH
JZNOKEY3
MOVA,P1
ANLA,#0FH
CJNEA,#0EH,NK9
MOVKEYBUF,#8
LJMPDK3
NK9:CJNEA,#0DH,NK10
MOVKEYBUF,#9
LJMPDK3
NK10:CJNEA,#0BH,NK11
MOVKEYBUF,#10
LJMPDK3
NK11:CJNEA,#07H,NK12
MOVKEYBUF,#11
LJMPDK3
NK12:NOP
DK3:
MOVA,KEYBUF
MOVDPTR,#TABLE
MOVCA,@A DPTR
MOVP0,A
DK3A:MOVA,P1
ANLA,#0FH
XRLA,#0FH
JNZDK3A
NOKEY3:
MOVP1,#0FFH
CLRP1.7
MOVA,P1
ANLA,#0FH
XRLA,#0FH
JZNOKEY4
LCALLDELY10MS
MOVA,P1
ANLA,#0FH
XRLA,#0FH
JZNOKEY4
MOVA,P1
ANLA,#0FH
CJNEA,#0EH,NK13
MOVKEYBUF,#12
LJMPDK4
NK13:CJNEA,#0DH,NK14
MOVKEYBUF,#13
LJMPDK4
NK14:CJNEA,#0BH,NK15
MOVKEYBUF,#14
LJMPDK4
NK15:CJNEA,#07H,NK16
MOVKEYBUF,#15
LJMPDK4
NK16:NOP
DK4:
MOVA,KEYBUF
MOVDPTR,#TABLE
MOVCA,@A DPTR
MOVP0,A
DK4A:MOVA,P1
ANLA,#0FH
XRLA,#0FH
JNZDK4A
NOKEY4:
LJMPWAIT
DELY10MS:
MOVR6,#10
D1:MOVR7,#248
DJNZR7,$
DJNZR6,D1
RET
TABLE:DB0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H;0-9
DB088H,083H,0C6H,0A1H,086H,08EH,089H,0CFH,0C7H,0C8H;A,B,C,D,E,F,H,I,L,N,
END
;P3.1數(shù)據(jù)采集控制
;P2.6P2.7個位十位顯示轉(zhuǎn)換控制
;P1口接8個開關(guān)模擬數(shù)據(jù)
;P1.0-P1.3為個位開關(guān)量輸入
;P1.4-P1.7為十位開關(guān)量輸入
;此程序僅供參考
;功能P1口接8個開關(guān)輸入量4個一組,分別為個位,十位輸入
;P0口接一個數(shù)碼管,依次顯示輸入量。P3.1控制是否讀入
;開關(guān)量。P2.6P2.7控制是否顯示個位
或十位
ORG100h
LJMPSTAR
STAR:MOVP1,#0FFH
SETBP3.1數(shù)據(jù)讀入標(biāo)志
MOVR0,#100,循環(huán)工作次數(shù)
LOOP:JBP3.1,$P3.1低電平時,采集P1口數(shù)據(jù)開關(guān)量處理顯示階段不再應(yīng)答P3.1
MOVA,P1
PUSHACC
ANLA,#0FH取個位數(shù)值
MOVR1,A個位數(shù)值保存到R1
POPACC
ANLA,#0F0H
SWAPA高4位轉(zhuǎn)成字節(jié)信息
MOVR2,A十位數(shù)值保存到R2
MOVDPTR,#TABLED
MOVA,R1
MOVCA,@A DPTR
MOVP0,A
CLRP2.6個位顯示
ACALLDELAY500MS
SETBP2.6
MOVA,R2
MOVCA,@A DPTR
MOVP0,A
CLRP2.7十位顯示
ACALLDELAY500MS
SETBP2.7
DJNZR0,LOOP
DELAY500MS:延時500毫秒子程略
RET
TABLED:DB0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8hDB80H,90H,88h,83h,0c6h,0a1h,86h,8eh
END
#include
typedefunsignedcharBYTE;
BYTEcodeTABLED[16]={0Xc0,0Xf9,0Xa4,0Xb0,0X99,0X92,0X82,0X0f8,0X80,0X90,0X88,0X83,0Xc6,0Xa1,0X86,0X8e};
BYTEDATled;
sbitP26=P2^6;
sbitP27=P2^7;
sbitP31=P3^1;
intTIME;
voidtimedelay(DTIME)
intDTIME;
{
intI;
for(I=0;I4;
P0=TABLED[TEMP];
P27=0;
timedelay(TIME);
P27=1;
}
}
}
1.實(shí)驗(yàn)任務(wù)
在8X8 LED點(diǎn)陣上顯示柱形,讓其先從左到右平滑移動三次,其次從右到左平滑移動三次,再次從上到下平滑移動三次,最后從下到上平滑移動三次,如此循環(huán)下去。
2.電路原理圖
圖4.24.1
3.硬件電路連線
(1).把“單片機(jī)系統(tǒng)”區(qū)域中的P1端口用8芯排芯連接到“點(diǎn)陣模塊”區(qū)域中的“DR1-DR8”端口上;
(2).把“單片機(jī)系統(tǒng)”區(qū)域中的P3端口用8芯排芯連接到“點(diǎn)陣模塊”區(qū)域中的“DC1-DC8”端口上;
4.程序設(shè)計內(nèi)容
(1).8X8 點(diǎn)陣LED工作原理說明
8X8點(diǎn)陣LED結(jié)構(gòu)如下圖所示
圖4.24.2
從圖4.24.2中可以看出,8X8點(diǎn)陣共需要64個發(fā)光二極管組成,且每個發(fā)光二極管是放置在行線和列線的交叉點(diǎn)上,當(dāng)對應(yīng)的某一列置1電平,某一行置0電平,則相應(yīng)的二極管就亮;因此要實(shí)現(xiàn)一根柱形的亮法,如圖49所示,對應(yīng)的一列為一根豎柱,或者對應(yīng)的一行為一根橫柱,因此實(shí)現(xiàn)柱的亮的方法如下所述:
一根豎柱:對應(yīng)的列置1,而行則采用掃描的方法來實(shí)現(xiàn)。
一根橫柱:對應(yīng)的行置0,而列則采用掃描的方法來實(shí)現(xiàn)。
5.匯編源程序
ORG00H
START:NOP
MOVR3,#3
LOP2:MOVR4,#8
MOVR2,#0
LOP1:MOVP1,#0FFH
MOVDPTR,#TABA
MOVA,R2
MOVCA,@A DPTR
MOVP3,A
INCR2
LCALLDELAY
DJNZR4,LOP1
DJNZR3,LOP2
MOVR3,#3
LOP4:MOVR4,#8
MOVR2,#7
LOP3:MOVP1,#0FFH
MOVDPTR,#TABA
MOVA,R2
MOVCA,@A DPTR
MOVP3,A
DECR2
LCALLDELAY
DJNZR4,LOP3
DJNZR3,LOP4
MOVR3,#3
LOP6:MOVR4,#8
MOVR2,#0
LOP5:MOVP3,#00H
MOVDPTR,#TABB
MOVA,R2
MOVCA,@A DPTR
MOVP1,A
INCR2
LCALLDELAY
DJNZR4,LOP5
DJNZR3,LOP6
MOVR3,#3
LOP8:MOVR4,#8
MOVR2,#7
LOP7:MOVP3,#00H
MOVDPTR,#TABB
MOVA,R2
MOVCA,@A DPTR
MOVP1,A
DECR2
LCALLDELAY
DJNZR4,LOP7
DJNZR3,LOP8
LJMPSTART
DELAY:MOVR5,#10
D2:MOVR6,#20
D1:MOVR7,#248
DJNZR7,$
DJNZR6,D1
DJNZR5,D2
RET
TABA:DB0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH
TABB:DB01H,02H,04H,08H,10H,20H,40H,80H
END
6.C語言源程序
#include0;j--);
}
voidmain(void)
{
unsignedchari,j;
while(1)
{
for(j=0;j<3;j )
//fromlefttoright3time
{
for(i=0;i<8;i )
{
P3=taba[i];
P1=0xff;
delay1();
}
}
for(j=0;j<3;j )
//fromrighttoleft3time
{
for(i=0;i<8;i )
{
P3=taba[7-i];
P1=0xff;
delay1();
}
}
for(j=0;j<3;j )
//fromtoptobottom3time
{
for(i=0;i<8;i )
{
P3=0x00;
P1=tabb[7-i];
delay1();
}
}
for(j=0;j<3;j )
//frombottomtotop3time
{
for(i=0;i<8;i )
{
P3=0x00;
P1=tabb[i];
delay1();
}
}}
}
LED點(diǎn)陣顯示實(shí)驗(yàn)
一.實(shí)驗(yàn)要求
編程實(shí)現(xiàn)中英文字符的顯示。
二.實(shí)驗(yàn)?zāi)康?/p>
1.了解LED點(diǎn)陣顯示的基本原理和實(shí)現(xiàn)方法。
2.掌握點(diǎn)陣漢字庫的編碼和從標(biāo)準(zhǔn)字庫中提取漢字編碼的方法。
三.實(shí)驗(yàn)電路及連線
點(diǎn)陣顯示模塊WTD3088的(紅色)列輸入線接至內(nèi)部LED的陰極端,行輸入線接至內(nèi)部LED的陽極端(若陽極端輸入為高電平,陰極端輸入低電平,則該LED點(diǎn)亮)。發(fā)光點(diǎn)的分布如圖22-0所示。
Fig22-0WTD3088LED分布
如圖22-1示,本實(shí)驗(yàn)?zāi)K使用74LS374來控制列輸入線的電平值。將74LS374的某輸出置0,則對應(yīng)的LED陰極端被置低。如圖22-2示,本實(shí)驗(yàn)?zāi)K使用74LS273來控制行輸入線,并通過9013提供電流驅(qū)動。將74LS273的某輸出置1,則對應(yīng)的LED陽極端被置高。每次系統(tǒng)重新開啟或總清后,74LS273輸出為全0,LED顯示被關(guān)閉。
通過編程控制各顯示點(diǎn)對應(yīng)LED陽極和陰極端的電平,就可以有效的控制各顯示點(diǎn)的亮滅。
Fig22-1LED模塊及列掃描電路
Fig22-2行掃描電路
Fig22-3地址譯碼電路
本實(shí)驗(yàn)?zāi)K使用4塊WTD3088組成16×16點(diǎn)陣,以滿足漢字顯示的要求。為了方便的控制四個單元,使用了一片74LS139譯碼,產(chǎn)生四個地址片選信號:CLKR1=CSLED,CLKR2=CSLED 1,用于行控制的兩片74LS273;CLKC1=CSLED 2,CLKC2=CSLED 3,用于列控制的兩片74LS374。
實(shí)驗(yàn)接線:按示例程序,模塊的CSLED接51/96地址的8000H。
四.實(shí)驗(yàn)說明
使用高亮度LED發(fā)光管構(gòu)成點(diǎn)陣,通過編程控制可以顯示中英文字符、圖形及視頻動態(tài)圖形。LED顯示以其組構(gòu)方式靈活、亮度高、技術(shù)成熟、成本低廉等特點(diǎn)在證券、運(yùn)動場館及各種室內(nèi)/外顯示場合得到廣泛的應(yīng)用。
所顯示字符的點(diǎn)陣數(shù)據(jù)可以自行編寫(即直接點(diǎn)陣畫圖),也可從標(biāo)準(zhǔn)字庫(如ASC16、HZ16)中提取。后者需要正確掌握字庫的編碼方法和字符定位的計算。
實(shí)驗(yàn)盤片中“字符轉(zhuǎn)換”子目錄下提供的Basc16.exe,BHz16.exe可方便的將單個字符的碼表從標(biāo)準(zhǔn)字庫Asc16,Hzk16中提取出來。具體使用方法是運(yùn)行上述可執(zhí)行程序,根據(jù)提示輸入所需字符(如是漢字還需要先啟動dos下的漢字環(huán)境,如ucdos,pdos95等)。程序?qū)⒃撟址拇a表提取出來,存放在該字符ASC或區(qū)位碼為文件名稱的.dat文件中。用戶只需將該文件中內(nèi)容拷貝、粘貼到自己的程序中即可。但需要注意字節(jié)排列順序、字節(jié)中每一位與具體顯示點(diǎn)的一一對應(yīng)關(guān)系,必要時還要對碼表稍作修改。同一目錄下還提供了上述可執(zhí)行程序的源文件,使用BC3.1編寫,供用戶參考。
五.實(shí)驗(yàn)程序框圖
用戶應(yīng)留心其中行掃描的實(shí)現(xiàn)及碼表的處理。
六.實(shí)驗(yàn)程序:
(一)提供LEDA51演示Asc16字符的簡單點(diǎn)陣顯示。
;________*LED點(diǎn)陣顯示示例程序______________________*
;__該程序顯示Asc16字符__
;__為了簡單起見,程序只顯示一個字符__
;__該程序針對T598實(shí)驗(yàn)機(jī)的模塊14__
;____________________________________________________
CSLEDEQU8000H
CSR1EQUCSLED;行1273
CSR2EQUCSLED 1H;行2273
CSC1EQUCSLED 2H;列1374
CSC2EQUCSLED 3H;列2374
ORG0000H
MOVSP,#60H
INIT:MOVA,#0H;關(guān)閉行
MOVDPTR,#CSR1
MOVX@DPTR,A
MOVDPTR,#CSR2
MOVX@DPTR,A
MOVA,#0FFH;關(guān)閉列
MOVDPTR,#CSC1
MOVX@DPTR,A
MOVDPTR,#CSC2
MOVX@DPTR,A
D:MOVR5,#00H
MOVR4,#01H;每次為單行掃描
DISP:
MOVA,R5
MOVDPTR,#ASCE;此處設(shè)定所要顯示的字符
MOVCA,@A DPTR
CPLACC;代碼取反,決定顯示的陰陽
MOVDPTR,#CSC2
MOVX@DPTR,A
MOVDPTR,#CSR1
MOVA,R4
MOVX@DPTR,A
RLACC
MOVR4,ACC
INCR5
LCALLDELAY
CJNER5,#8H,DISP
MOVA,#0H
MOVX@DPTR,A
MOVR5,#08H
MOVR4,#01H
DISP2:
MOVA,R5
MOVDPTR,#ASCE
MOVCA,@A DPTR
CPLACC
MOVDPTR,#CSC2
MOVX@DPTR,A
MOVDPTR,#CSR2
MOVA,R4
MOVX@DPTR,A
RLACC
MOVR4,ACC
INCR5
LCALLDELAY
CJNER5,#10H,DISP2
MOVA,#0H
MOVX@DPTR,A
SJMPD
;________延時子程序,協(xié)調(diào)字符顯示速度____________*
DELAY:MOVR7,#1H
DL1:MOVR6,#00H
DL2:DJNZR6,DL2
DJNZR7,DL1
RET
;________字符點(diǎn)陣字庫______________*
;ASC16字符編碼排列
;0
;1
;|
;|
;14
;15
;高位D7--D0
;請注意編碼的排列次序和實(shí)際顯示點(diǎn)陣分布的關(guān)系
ASCA:DB00H,00H,10H,38H,6CH,0C6H,0C6H,0FEH
DB0C6H,0C6H,0C6H,0C6H,00H,00H,00H,00H
ASCE:DB00H,00H,0FEH,66H,62H,68H,78H,68H
DB60H,62H,66H,0FEH,00H,00H,00H,00H
ASCD:DB00H,00H,0F8H,6CH,66H,66H,66H,66H
DB66H,66H,6CH,0F8H,00H,00H,00H,00H
ASCK:DB00H,00H,0E6H,66H,66H,6CH,78H,78H
DB6CH,66H,66H,0E6H,00H,00H,00H,00H
;____________________________________________________
END
(二)LEDHZ51兩個示例程序。和Hz16字符的簡單點(diǎn)陣顯示。
;________*LED點(diǎn)陣顯示示例程序______________________*
;__該程序顯示hz16字符__
;__為了簡單起見,程序只顯示一個字符__
;__該程序針對T598實(shí)驗(yàn)機(jī)的模塊14__
;____________________________________________________
CSLEDEQU8000H
CSR1EQUCSLED;行1273
CSR2EQUCSLED 1H;行2273
CSC1EQUCSLED 2H;列1374
CSC2EQUCSLED 3H;列2374ORG0000H
MOVSP,#60H
INIT:MOVA,#0H;關(guān)閉LED顯示
MOVDPTR,#CSR1
MOVX@DPTR,A
MOVDPTR,#CSR2
MOVX@DPTR,A
MOVA,#0FFH;關(guān)閉LED顯示
MOVDPTR,#CSC1
MOVX@DPTR,A
MOVDPTR,#CSC2
MOVX@DPTR,A
D:MOVR5,#00H
MOVR4,#01H
DISP:
MOVA,R5
RLACC
MOVDPTR,#HZAI
MOVCA,@A DPTR
CPLACC
MOVDPTR,#CSC2
MOVX@DPTR,A
MOVA,R5
RLACC
INCACC
MOVDPTR,#HZAI
MOVCA,@A DPTR
CPLACC
MOVDPTR,#CSC1
MOVX@DPTR,A
MOVDPTR,#CSR1
MOVA,R4
MOVX@DPTR,A
RLACC
MOVR4,ACC
INCR5
LCALLDELAY
CJNER5,#8H,DISP
MOVA,#0H
MOVX@DPTR,A
MOVR5,#08H
MOVR4,#01H
DISP2:
MOVA,R5
RLACC
MOVDPTR,#HZAI
MOVCA,@A DPTR
CPLACC
MOVDPTR,#CSC2
MOVX@DPTR,A
MOVA,R5
RLACC
INCACC
MOVDPTR,#HZAI
MOVCA,@A DPTR
CPLACC
MOVDPTR,#CSC1
MOVX@DPTR,A
MOVDPTR,#CSR2
MOVA,R4
MOVX@DPTR,A
RLACC
MOVR4,ACC
INCR5
LCALLDELAY
CJNER5,#10H,DISP2
MOVA,#0H
MOVX@DPTR,A
SJMPD
;________延時子程序,協(xié)調(diào)字符顯示速度____________*
DELAY:MOVR7,#1H
DL1:MOVR6,#00H
DL2:DJNZR6,DL2
DJNZR7,DL1
RET
;________字符點(diǎn)陣字庫______________*
;HZ16字符編碼排列
;01
;23
;|
;|
;2829
;3031
;高位D7--D0
HZAI:DB00H,78H,3FH,80H,11H,10H,09H,20H
DB7FH,0FEH,42H,02H,82H,04H,7FH,0F8H
DB04H,00H,07H,0F0H,0AH,20H,09H,40H
DB10H,80H,11H,60H,22H,1CH,0CH,08H
HZDI:DB00H,80H,40H,80H,20H,88H,2FH,0FCH
DB08H,88H,08H,88H,0E8H,88H,2FH,0F8H
DB28H,88H,28H,88H,28H,88H,2FH,0F8H
DB28H,08H,50H,06H,8FH,0FCH,00H,00H
HZKE:DB01H,00H,01H,04H,0FFH,0FEH,01H,00H
DB01H,10H,1FH,0F8H,10H,10H,10H,10H
DB10H,10H,1FH,0F0H,14H,50H,04H,40H
DB04H,40H,08H,42H,10H,42H,60H,3EH
;____________________________________________________
END
基于89C51的計算機(jī)可鎖定加密鍵盤設(shè)計
摘要:介紹PC鍵盤和鍵盤接口的PS/2通信協(xié)議,以及用89C51實(shí)現(xiàn)可鎖定鍵盤的軟件和硬件設(shè)計方法。具有安全可靠、容錯能力強(qiáng)、可以直接采用標(biāo)準(zhǔn)鍵盤進(jìn)行改裝、便于實(shí)現(xiàn)等優(yōu)點(diǎn),并保留標(biāo)準(zhǔn)鍵盤的全部功能。
關(guān)鍵詞:PS/289C51C51鍵盤
引言
在智能儀器、自動控制等領(lǐng)域,已大量使用嵌入式PC,如Advantech公司的PC/104、AMD公司的DIMM-PC等。為適應(yīng)開放式、模塊化的要求,嵌入式PC具有標(biāo)準(zhǔn)的PC接口,如VGA顯示器控制接口、以太網(wǎng)接口、RS232接口、PC/AT鍵盤接口等。所以,可以用標(biāo)準(zhǔn)的PC鍵盤對嵌入式PC進(jìn)行操作與控制。鍵盤在輸入指令之后,可能很長一段時間不用。為計算機(jī)安全和防止誤觸發(fā),需要將鍵盤鎖定,還要對某些鍵采取屏蔽措施,但是PC標(biāo)準(zhǔn)鍵盤不能滿足這些要求。本文介紹一種用89C51設(shè)計實(shí)現(xiàn)的可鎖定加密PC/AT鍵盤。
1鍵盤功能及工作原理
PC鍵盤功能主要有按鍵識別、去抖、重鍵處理、發(fā)送掃描碼、自動重發(fā)、接收鍵盤命令、處理命令等。鍵盤有編碼鍵盤和非編碼鍵盤。編碼鍵盤程序設(shè)計簡單,但硬件電路復(fù)雜,價格較高;非編碼鍵盤用軟件來實(shí)現(xiàn)識別鍵、編碼轉(zhuǎn)換、去抖等功能,硬件電路簡單,價格便宜?,F(xiàn)代微機(jī)系統(tǒng)中廣泛采用非編碼鍵盤。PC鍵盤多采用18行×8列的二維矩陣行列結(jié)構(gòu)。采用行掃描法識別按下的按鍵。
2PS/2協(xié)議
PS/2協(xié)議是外設(shè)與主機(jī)之間通信的一種同步雙向串行協(xié)議。在該協(xié)議中主機(jī)擁有較高的優(yōu)先級,在一定條件下可以終止外設(shè)正在進(jìn)行的發(fā)送過程。PS/2協(xié)議采用的傳送數(shù)據(jù)幀的格式為:1位起始位(0)、8位數(shù)據(jù)位、1位奇偶校驗(yàn)位、1位停止位(1)。數(shù)據(jù)發(fā)送時低位在前,高位在后。外設(shè)每收到主機(jī)發(fā)來的1幀數(shù)據(jù),都要緊隨該幀的停止位發(fā)送一個握手位ACK(0)應(yīng)答主機(jī)。然后,外設(shè)還要發(fā)1幀應(yīng)答數(shù)據(jù)(0xF0),表示外設(shè)已經(jīng)完整地接收到了主機(jī)的命令;而主機(jī)則不需發(fā)送握手位,也不需要發(fā)送應(yīng)答幀。
2.1鍵盤到PC鍵盤接口的通信
當(dāng)時鐘線和數(shù)據(jù)線均為高電平時,允許鍵盤發(fā)送數(shù)據(jù),系統(tǒng)將接收數(shù)據(jù);當(dāng)時鐘線被拉為低電平時,表明系統(tǒng)禁止數(shù)據(jù)傳輸。圖1給出了發(fā)送時序,包含1個低電平觸發(fā)的起始位、8位數(shù)據(jù)位、1個奇校驗(yàn)位和1個高電平的結(jié)束位。
2.2PC系統(tǒng)到鍵盤的通信協(xié)議
若時鐘線出現(xiàn)高電平,數(shù)據(jù)線出現(xiàn)低電平,表明系統(tǒng)請求發(fā)送,鍵盤準(zhǔn)備產(chǎn)生同步時鐘脈沖串,并接收數(shù)據(jù)。包含了1個低電平觸發(fā)的起始位、8位數(shù)據(jù)位、1個奇校驗(yàn)位、1個應(yīng)答位、1個高電平的結(jié)束位。圖2為時序圖。
(1)鍵盤命令及執(zhí)行過程
①FFH:復(fù)位鍵盤。系統(tǒng)通過此軟件復(fù)位命令使鍵盤進(jìn)入程序復(fù)位和內(nèi)部自測試,稱為基本保證測試(BAT)。復(fù)位鍵盤的過程如下:
a.鍵盤收到FFH后立即回送ACK(FAH)作答;
b.鍵盤接口收到ACK后,將鍵盤時鐘和數(shù)據(jù)線置為高電平;
c.鍵盤檢測到此狀態(tài)后開始BAT操作;
d.如果BAT正確完成,鍵盤發(fā)送AAH以表示結(jié)束,
否則以FDH(或其它任何值)表示診斷有誤。
②FEH:重新發(fā)送。當(dāng)系統(tǒng)檢測
到從鍵盤送來的任何傳輸錯誤時,它便向鍵盤發(fā)送FEH命令。鍵盤接收到此命令后,將重新送出原來的內(nèi)容。③FDH~F7H:空操作(保留未用)。
④F6H:設(shè)置缺省值。此命令使鍵盤所有條件復(fù)位到電源接通時的缺省狀態(tài),鍵盤繼續(xù)掃描。
⑤F5H:設(shè)置缺省值和停止鍵盤。此命令使鍵盤所有條件復(fù)位到電源接通時的缺省狀態(tài),并停止鍵盤掃描,等待下一個鍵盤命令。
⑥F4H:啟動鍵盤。鍵盤接收到此命令后,用ACK(FAH)作答,清除輸出緩沖器,并啟動鍵盤開始掃描。
⑦F3H:設(shè)置拍發(fā)速率和延時參數(shù)。每當(dāng)按下任一鍵時,鍵盤以拍發(fā)速率連續(xù)送出鍵的接通碼,直到鍵被釋放為止。延時參數(shù)是指按下一鍵后,鍵盤輸出的響應(yīng)時間。
系統(tǒng)缺省設(shè)置:拍發(fā)速率=10個/s±20,延時=500ms±20。
當(dāng)要改變設(shè)置時可以使用F3H命令,并后跟一個字節(jié)的參數(shù)。參數(shù)定義如表1所列。
表1
D7
D6D5
D4D3
D2D1D0
C
B
A
計算拍發(fā)速率和響應(yīng)延時的公式如下:
拍發(fā)速率=1/[(8 A)×2B×0.00417](1/s)
響應(yīng)延時=(1 C)×250(ms)
注:缺省的延時參數(shù)值為2CH。
此命令的執(zhí)行過程如下:
a.鍵盤收到F3H命令后,用FAH予以響應(yīng),并停止
掃描和等待隨后的參數(shù);
b.鍵盤若收到隨后的設(shè)置參數(shù),用另一個ACK響
應(yīng),并按其參數(shù)設(shè)置新的拍發(fā)速率和響應(yīng)延時,
之后重新開始掃描(若鍵盤原來是開放的);
c.鍵盤若收到FAH命令,但無隨后的設(shè)置參數(shù),則
鍵盤結(jié)束命令設(shè)置,并保持原來的拍發(fā)速率和響
應(yīng)延時,停止掃描。
⑧F2H,F(xiàn)1,EFH:保留未用。
⑨F0H:設(shè)置鍵盤掃描碼命令。此命令用于設(shè)置鍵盤的掃描碼,后跟參數(shù)指定三種掃描碼的哪一種。鍵盤復(fù)位時,默認(rèn)掃描碼是第二種。
⑩EEH:回送命令。此命令用于輔助診斷,要求鍵盤接收到EEH時也要回送EEH予以響應(yīng)。若鍵盤原來是開放的,則繼續(xù)掃描。
EDH:置位/復(fù)位LED指示器。鍵盤右上角有三個LED指示器,分別反映Caps、Num和Scroll三個鍵的鎖定情況。參數(shù)字節(jié)如表2所列。
表2
D7D3
D2
D1
D0
保留
1=激勵CapsLED
1=激勵NumLED
1=激勵ScrollLED
此命令執(zhí)行過程與F3H相似。若命令后跟參數(shù),則按參數(shù)設(shè)定LED狀態(tài)并繼續(xù)掃描。若僅有命令無參數(shù),則不改變LED原狀態(tài),并停止掃描。
(2)鍵盤響應(yīng)
鍵盤在下列四種情況下都會向鍵盤接口發(fā)送數(shù)據(jù)。
①按下任一鍵,鍵盤以拍發(fā)速率向接口發(fā)送鍵盤接通掃描碼。
②釋放所按下的鍵,鍵盤發(fā)送斷開掃描碼。
③系統(tǒng)向鍵盤發(fā)送鍵盤命令后,鍵盤回送應(yīng)答。
④當(dāng)用戶按鍵速度超出鍵盤所能容納的最大鍵個數(shù)時,鍵盤做出響應(yīng)。
后三種情況稱為鍵盤響應(yīng)。響應(yīng)字節(jié)有7個,定義如下。
①FEH:重新發(fā)送響應(yīng)。當(dāng)鍵盤收到一個無效的鍵盤命令,或者檢測到奇偶錯的鍵盤命令時,鍵盤回送響應(yīng)字節(jié)為FEH,要求系統(tǒng)重發(fā)鍵盤命令。
②FAH:正常應(yīng)答。對任何一個有效的鍵盤命令,鍵盤回送FAH予以響應(yīng)。
③00H:超限應(yīng)答。當(dāng)用戶按鍵速度超出鍵盤所能容納的最大鍵符個數(shù)時(16個字節(jié)的緩沖器),鍵盤發(fā)送00H。
④FDH:診斷故障應(yīng)答。鍵盤接受軟件復(fù)位命令,執(zhí)行自測試過程中。若檢測到故障,則以FDH應(yīng)答。此時,鍵盤停止掃描并等待下一個鍵盤命令。
⑤AAH:診斷正常應(yīng)答。鍵盤在軟件復(fù)位過程中,正常完成BAT測試,以AAH應(yīng)答。
⑥FEH:回響命令的應(yīng)答,對鍵盤FEH命令的應(yīng)答。
⑦F0H:斷開掃描碼前綴,鍵盤對鍵符按下后釋放的應(yīng)答,第一個字節(jié)為F0H,第二個字節(jié)為接通掃描碼(有幾個鍵例外)。
3硬件設(shè)計
PC系列鍵盤采用18行×8列的矩陣行列結(jié)構(gòu)。89C51單片機(jī)有4個8位I/O端口,因此可以采用P0、P2口再加上P3口的2個(P3.6和P3.7)作為行掃描線。P1口作為列輸入線(如果用P0口作列輸入線,必須加上拉電阻)。采用P3.0、P3.1作為數(shù)據(jù)線和時鐘線與PC系統(tǒng)進(jìn)行通信,用P3.2、P3.4、P3.5控制鍵盤上的3個指示燈。硬件原理如圖3所示。
鍵盤與計算機(jī)通過一個五芯(PS/2接口為六芯)插座相接,4個有效引腳的定義分別是電源(VCC)、地(GND)、串行時鐘線(SCK)、串行數(shù)據(jù)線(SIO)。
4軟件設(shè)計
①消抖及重鍵處理:通過軟件上延時程序來消除抖動;采用后按鍵優(yōu)先處理,即多鍵同時按下時,只重復(fù)發(fā)送最后按下鍵的掃描碼。
②程序包括鍵盤掃描子程序、發(fā)送鍵碼子程序、發(fā)送數(shù)據(jù)子程序、接收命令子程序、定時器1中斷服務(wù)程序、主程序等。鍵盤掃描子程序用于掃描鍵狀態(tài),將被按鍵的位置號存入緩沖器中;發(fā)送鍵碼子程序用于將緩沖區(qū)鍵的接通碼或斷開碼發(fā)送給計算機(jī)鍵盤接口或者存在鍵盤密碼緩沖區(qū)中;發(fā)送數(shù)據(jù)子程序用于將數(shù)據(jù)發(fā)給計算機(jī)鍵盤接口;接收命令子程序用于接收計算機(jī)鍵盤接口發(fā)來的鍵盤命令;定時器1中斷服務(wù)子程序用于給程序中的延時提供標(biāo)準(zhǔn)時鐘,并具有軟件看門狗功能,防止軟件出現(xiàn)死機(jī)現(xiàn)象;主程序用于系統(tǒng)初始化,子程序調(diào)度,鎖定狀態(tài)的顯示等。
圖6發(fā)送緩沖區(qū)鍵碼子程序流程圖
圖4~6是主要軟件模塊的流程圖。單片機(jī)源程序見本刊網(wǎng)絡(luò)補(bǔ)充版(.com)。
5結(jié)論
本文介紹的PC/AT鍵盤具有結(jié)構(gòu)簡單、設(shè)計靈活、安全可靠的特點(diǎn),可用于標(biāo)準(zhǔn)PC和嵌入式PC。本鍵盤可以在標(biāo)準(zhǔn)的鍵盤基礎(chǔ)上進(jìn)行改造,只需換掉原來的控制芯片即可,可節(jié)省設(shè)計成本。
單片機(jī)C51編程幾個有用的模塊(1)
KeilC51常用功能模塊使用說明
說明
本文檔包括單片機(jī)系統(tǒng)中常用到的時鐘中斷、通訊及鍵盤掃描等模塊(見所附源程序)的說明。這些模塊使用前后臺系統(tǒng)模型。為達(dá)到最大的靈活性,需要在用戶工程中定義config.h文件,在其中定義各模塊可選參數(shù)的設(shè)置,而不是直接更改源代碼。
這些可選內(nèi)容大部分為宏定義,如果不定義宏相應(yīng)的功能在編譯時被屏蔽,不會增加代碼長度。具體可選內(nèi)容見各模塊中的說明。
在Config.h文件中還要包含一個單片機(jī)硬件的資源頭文件。
各模塊使用了定義在Common.h中的一些數(shù)據(jù)類型。如:BIT(bit)BYTE(unsignedchar)等,具體請參見源程序。
時鐘模塊
在單片機(jī)軟件設(shè)計中,時鐘是重要資源,為了充分利用時鐘資源,故設(shè)計本時鐘模塊。本模塊使用定時器0,在完成用戶指定功能的同時,還能夠自動處理一些其它模塊中與時鐘相關(guān)的信息。
時鐘模塊由聲明文件Timer.h以及實(shí)現(xiàn)文件Timer.c組成。
用戶應(yīng)該在Config.h中定義宏TIMER_RELOAD來設(shè)定定時器0的重裝載初值。推薦的定時器0的中斷時間大于1毫秒。
在程序的初始化階段調(diào)用時鐘模塊的初始化函數(shù)InitTimerModule()之后,就可以使用時鐘模塊所以支持的各種功能。具體描述如下:
延時:當(dāng)用戶需要進(jìn)行一定時間的延時時,可以通過調(diào)用Delay()來進(jìn)行,參數(shù)為時鐘中斷的次數(shù)。如時鐘中斷周期為1ms,想進(jìn)行100ms的延時,則可以調(diào)用Delay(100)。
注意:
如果延時的絕對時間小于時鐘中斷的周期,則不能夠用本方法做到延時。
定時:當(dāng)程序中需要使用定時功能時,如等待某外部事件,如果在一定時間內(nèi)發(fā)生則繼續(xù)執(zhí)行,如果在這段時間內(nèi)發(fā)生,則認(rèn)為出現(xiàn)錯誤,轉(zhuǎn)向錯誤處理機(jī)制。
在此推薦一種編程模式,但用戶可以用自己認(rèn)為更合理的方式處理此類問題。
這里簡單說明一下關(guān)于阻塞式函數(shù)及非阻塞式函數(shù)。簡單說,阻塞式函數(shù)就是當(dāng)檢測完成條件,如
果不能夠完成則等待,如:
voidCheckSomething()
{
//gbitSuccessFlagisaglobalvariable
while(gbitSuccessFlag==FALSE)
{
//donothingbutwaiting
}
}
可以看到,當(dāng)bitSuccessFlag沒有被設(shè)置為TRUE時,函數(shù)保持等待狀態(tài)不返回,這樣就是阻塞式的函數(shù)。
另外一種情況:
BITCheckSomething()
{
if(gbitSuccessFlag==TRUE)
{
//…
returnTRUE;
}
returnFALSE;
}
在這里,如果所檢測的事件有沒有完成,函數(shù)進(jìn)行檢測之后,立刻返回,通過返回值報告完成情況,如果沒有完成,則等待調(diào)用者分配再次執(zhí)行的機(jī)會。這樣的函數(shù)就是非阻塞函數(shù)。
在應(yīng)用定時功能時,首先要將檢測函數(shù)定義成非阻塞函數(shù)。如上面的第二個版本的CheckSomething。
然后下面模式:
BITbitDone=FALSE;
ResetClock();//cleartimerinterrupttimescounter
while(GetClock()
{
if(CheckSomething()==TRUE)
{
bitDone=TRUE;
break;
}
}
if(bitDone==FALSE)
{
//processtimeout
}或者簡單寫成:
BITbitDone=FALSE;
ResetClock();
while(GetClock()=(z))
當(dāng)然,用戶也可以將IsPackageHeader和IsPackageTailer定義成為函數(shù),通過BIT類型的返回值來向調(diào)用者提供與相應(yīng)宏相同的信息。
另一種辦法需要在Config.h文件中定義宏SCOMM_ComplexPackageFormat。(需要注意的是,不能夠同時定義SCOMM_SimplePackageFormat和SCOMM_ComplexPackageFormat宏,否則會造成嚴(yán)重的不可預(yù)見性錯誤。
這時需要提供回調(diào)函數(shù)QueryPackageFormat,原形如下:
BYTEQueryPackageFormat(BYTEbyData,BYTEbyCount,BYTEbyParam);
函數(shù)中三個參數(shù)的含義與使用簡單數(shù)據(jù)包格式時判斷數(shù)據(jù)包尾的宏的參數(shù)相同。
函數(shù)通過返回值來通知作為調(diào)用者的接收函數(shù)對接收到的數(shù)據(jù)如何處理,但目前這種方法僅為需要處理復(fù)雜數(shù)據(jù)包格式時的一種可選方法,但不推薦。用戶如果想使用這種方法可以自己更改接收函數(shù)中相應(yīng)的
#ifdefSCOM_ComplexPackageFormat
#endif//SCOMM_ComplexPackageFormat
預(yù)編譯指令之間的內(nèi)容。
例如指定QueryPackageFormat的返回值的含義:
0:繼續(xù)找數(shù)據(jù)包頭或繼續(xù)找數(shù)據(jù)包尾。
1:找到數(shù)據(jù)包頭。
2:找到數(shù)據(jù)包尾。
3:數(shù)據(jù)包出錯,需要拋棄。
然后更改源代碼來實(shí)現(xiàn)上面的協(xié)議。
注意:當(dāng)用戶需要使用字符串的時候,可以利用簡單的包裝函數(shù)將字符串轉(zhuǎn)換為字節(jié)數(shù)組。所以沒有必要提供專用的字符串處理函數(shù)。
鍵盤掃描模塊
鍵盤掃描模塊有兩種工作方式,一種為自動的由時鐘模塊調(diào)用,另一種是由程序員自行調(diào)用。
1)由時鐘模塊自動調(diào)用的方式
將時鐘模塊實(shí)現(xiàn)文件(Timer.h)及鍵盤掃描模塊的實(shí)現(xiàn)文件(KBScan。c)包含進(jìn)工程,在Config.h文件中添加TIMER_KBSCANDELAY宏。時鐘模塊自動對時鐘中斷進(jìn)行計數(shù),當(dāng)達(dá)到TIMER_KBSCANDELAY宏所定義的值后,自動調(diào)用鍵盤掃描模塊中的函數(shù)KBScanProcess()進(jìn)行鍵盤掃描,也就是說,這個宏的值可以決定按鍵消抖動的時間。
用戶應(yīng)該提供兩個回調(diào)函數(shù)OnKBScan()及OnKeysPressed()。在函數(shù)OnKBScan中進(jìn)行鍵盤掃描,并返回掃描碼。掃描碼的類型缺省為BYTE,當(dāng)鍵盤規(guī)模較大時,BYTE不能夠完全包含鍵盤信息時,可在Config.h文件中重定義宏KBvalue,如下:
#defineKBvalueWORD
這樣,就可以使用16位的鍵盤掃描碼,如果此時還達(dá)不到要求,可以將鍵盤掃描碼定義成一個結(jié)構(gòu),但這樣做將會增加代碼量及消耗更多的RAM資源,故不推薦。
掃描模塊調(diào)用OnKBScan取得掃描碼,并調(diào)用用戶可以重定義的宏IsNoKeyPressed來判斷是否有鍵按下,缺省的IsNoKeyPressed實(shí)現(xiàn)如下:
#defineIsNoKeyPressed(x)((x)==0x00)
即認(rèn)為OnKBScan返回0掃描碼時為沒有鍵按下,如果掃描函數(shù)返回其它非零掃描碼做為無鍵按下的掃描碼時,可以在Config.h文件中重定義IsNoKeyPressed宏的實(shí)現(xiàn)。
8位鍵盤掃描碼(缺省值)時,相應(yīng)的掃描函數(shù)為:
BYTEOnKBScan()
當(dāng)掃描模塊經(jīng)過軟件消抖動之后,發(fā)現(xiàn)有鍵按下,就會調(diào)用另一個回調(diào)函數(shù)OnKeysPressed。函數(shù)的聲明應(yīng)該如下:
voidOnKeyPressed(BYTEbyKBvalue,BYTEbyState)
其中中的參數(shù)byKBvalue的類型為BYTE,此為缺省值,如果使用其它類型的掃描碼,就將此參數(shù)變?yōu)橄鄳?yīng)類型。這個值由OnKBScan返回。另一個參數(shù)byState在通常情況下為零。但當(dāng)用戶在Config.h中定義宏KBSCAN_BRUSTCOUNT,同時鍵盤上的某鍵被按住不放時,掃描模塊對它自己的調(diào)用(注意這里和TIMER_KBSCANDELAY宏不同,TIMER_KBSCANDELAY是時鐘中斷足夠的次數(shù)后調(diào)用掃描模塊,而KBSCAN_BRUSHCOUNT為掃描模塊自身的被調(diào)用次數(shù))進(jìn)行計數(shù),當(dāng)達(dá)到KBSCAN_BRUSTCOUNT時,掃描模塊調(diào)用OnKeysPressed,此時第一個參數(shù)的含義不變,而byState變成1,同時計數(shù)器復(fù)位,又經(jīng)過一段時間后,用值為3的byState調(diào)用OnKeysPressed。這樣就可以很方便的實(shí)現(xiàn)多功能鍵或者檢測某鍵的長時間被按下。
2)由用戶自行調(diào)用
由用戶自行在程序中調(diào)用掃描模塊,而不是由時鐘中斷自行調(diào)用。其它與方式1相同。
注意:
1)函數(shù)KBScanProcess為非阻塞函數(shù),它將在很快的時間內(nèi)返回,等待再次分配給它執(zhí)行的機(jī)會。
2)函數(shù)KBScanProcess是在時鐘中斷外部運(yùn)行的,它的過程可以被任何中斷打斷,但不影響系統(tǒng)運(yùn)行。
3)byState的最大值為250,之后被復(fù)位為零。
應(yīng)用舉例
現(xiàn)在來舉例說明上述幾個模塊的使用方法。
硬件環(huán)境描述:
為了控制一盞燈,需要單片機(jī)提供一個做控制功能的開關(guān)量,這里不描述外部接口電路,只說明當(dāng)單片機(jī)的P10腳為高電平時,燈滅,當(dāng)P10腳為低電平時,燈亮。
可以通過計算機(jī)由串口發(fā)送命令來控制,或通過一個按鍵(pus
hbutton不是自鎖式的按鍵)來手動控制(按鍵接在P11腳上,當(dāng)鍵沒有按下時,P11電平為高,鍵按下時,引腳電平被接低),當(dāng)使用按鍵手動控制的時候,需要給計算機(jī)發(fā)送通知。
設(shè)定串口通訊指令如下:
數(shù)據(jù)包由0xff做包頭,4個字節(jié)長,第二個字節(jié)為命令代碼,第三個字節(jié)為數(shù)據(jù),最后一個字節(jié)為校驗(yàn)位。
命令和數(shù)據(jù)代碼有如下組合:
(計算機(jī)發(fā)給單片機(jī))
0x100x01:計算機(jī)控制燈亮。(數(shù)據(jù)位是非零值即可)
0x100x00:計算機(jī)控制燈滅。
(單片機(jī)發(fā)給計算機(jī))
0x110x01:單片機(jī)正常執(zhí)行控制指令,返回。(數(shù)據(jù)位是非零值即可)
0x110x00:單片機(jī)不能夠正常執(zhí)行控制指令,或控制指令錯(不明含義的數(shù)據(jù)包或校驗(yàn)錯等)。
0x120x01:手動控制燈亮。(數(shù)據(jù)位是非零值即可)
0x120x00:手動控制燈滅。建立工程:
在硬盤上建立文件夾Projects,在Projects下建立Common文件夾及Example文件夾。將各模塊的頭文件及實(shí)現(xiàn)文件拷貝到Common文件夾下(推薦使用這樣的文件組織結(jié)構(gòu),其它工程也可以建立在Projects下,各工程共享Common文件夾中的代碼)。
啟動KeilC的IDE,在Example下建立新工程,將各模塊的實(shí)現(xiàn)文件包含進(jìn)工程。
在Example文件夾下建立Output文件夾,更改工程設(shè)置,將Output作為輸出文件和List文件的輸出文件夾(推薦使用這樣的結(jié)構(gòu),當(dāng)保存工程文件時,可以簡單的刪除Output文件夾中的內(nèi)容而不會誤刪有用的工程文件)。
建立工程配置頭文件Config.h及工程主文件Example.c,并將Exmaple.c文件加入工程。
輸入代碼:
代碼的具體編寫過程略。下面是最后的Config.h文件及Example.c文件。
//
//file:onfig.h
//
#ifndef_CONFIG_H_
#define_CONFIG_H_
#include//使用AT89C52做控制
#include“../Common/Common.h”//使用自定義的數(shù)據(jù)類型
#defineTIMER_RELOAD922//11.0592MHz晶振,1ms中斷周期
#defineTIMER_KBSCANDELAY40//40ms重檢測按鍵狀態(tài),即40ms消抖
#defineSCOMM_AsyncInterface//使用異步通訊服務(wù)
#defineIsPackageHeader(x)((x)==0xff)//判斷包頭是不是0xff
#defineIsPackageTailer(x,y,z)((y)<=(z))//判斷包的長度是不是足夠
#endif//_CONFIG_H_
//
//file:xample.c
//
#include
#include“../Common/Common.h”
#include“../Common/Timer.h”
#include“../Common/Scomm.h”
#include“../Common/KBScan.h”
BITgbitLampState=1;//燈的狀態(tài),缺省為off
staticvoidInitialize()
{
InitTimerModule();//初始化時鐘模塊
InitSCommModule(0xfd,TRUE);//初始化通訊模塊,11.0592MHz晶振,
//波特率為19200
EA=1;//開中斷
}
voidmain()
{
Initialize();//初始化
while(TRUE)//主循環(huán)
{
ImpTimerService();//實(shí)現(xiàn)時鐘中斷服務(wù),如鍵盤掃描
AsyncRecePackage(4);//接收4個字節(jié)長的數(shù)據(jù)包
}
}
//在中斷外部響應(yīng)時鐘中斷事件
voidOnTimerEvent()
{
//donothing
}
//控制外部燈
staticvoidTriggerLamp(BITbEnable)
{
P10=~bEnable;//需要反相控制
}
//鍵掃描回調(diào)函數(shù)
BYTEKBScan()
{
BITb;
P11=1;//讀之前拉高引腳電平
b=P11;//讀入引腳狀態(tài)
return~b;//數(shù)據(jù)反相做掃描碼
}
//計算校驗(yàn)和
staticBYTECalcCheckSum(BYTE*pbyBuf,BYTEbyLen)
{
BYTEby,bySum=0;
for(by=0;by
return0–bySum;
}
//接收到鍵盤消息回調(diào)函數(shù)
voidOnKeyPressed(BYTEbyvalue,BYTEbyState)
{
BYTEby[4];
if(byState==0)
{
switch(byvalue)
{
case0x01:
gbitLampState=~gbitLampState;//燈狀態(tài)取反
TriggerLamp(gbitLampState);//執(zhí)行控制
by[0]=0xff;//構(gòu)造數(shù)據(jù)包
by[1]=0x12;
by[2]=(BYTE)gbitLampState;
by[3]=CalcCheckSum(by,3);//求校驗(yàn)和
SendPackage(by,4);//發(fā)送數(shù)據(jù)包
break;
//處理其它掃描碼
default:
break;
}
}
//接收到數(shù)據(jù)包回調(diào)函數(shù)
voidOnRecePackage(BYTE*pbyBuf,BYTEbyBufLen)
{
BYTEby[4];
by[0]=0xff;
by[1]=0x11;
if(byBufLen!=4||pbyBuf[3]!=CalcCheckSum(pbyBuf,3))
{
by[2]=0;
by[3]=CalcCheckSum(by,3);
SendPackage(by,4);//處理長度或校驗(yàn)和不正確
}
switch(pbyBuf[1])
{
case0x10:
gbitLampState=(BIT)pbyBuf[2];
TriggerLamp(gbitLampState);
by[2]=1;
by[3]=CalcCheckSum(by,3);
SendPackage(by,4);//發(fā)送成功執(zhí)行通知
break;
default://不知道的命令
by[2]=0;
by[3]=CalcCheckSum(by,3);
SendPackage(by,4);//發(fā)送沒有成功執(zhí)行通知
break;
}
}
4.課程設(shè)計單獨(dú)計算成績,考評方法見其大綱。
三、理論考試說明
1.單片機(jī)技術(shù)及應(yīng)用理論考試,采用閉卷筆試形式,考試時間120分鐘。
2.期末考試試題根據(jù)教學(xué)大綱,其范圍和難度按照本方案中制訂的考試考核內(nèi)容和要求確定??荚嚸}覆蓋考試大綱要求范圍。
3.期末考試試題類型有以下幾種:
①填空題;
②選擇題;
③判斷題;
④簡答題⑤綜合應(yīng)用題。
四、考試考核要求層次
按照教學(xué)大綱的要求,理論考試要求分為掌握、理解和了解三個層次。
掌握:
對于本課程的重點(diǎn)內(nèi)容要求學(xué)生達(dá)到掌握的程度。即能夠全面、深入理解和熟練掌握所學(xué)內(nèi)容,并能夠用其分析、初步設(shè)計和解答與應(yīng)用相關(guān)的問題,能夠舉一反三。要求學(xué)生掌握的內(nèi)容也就是考試的主要內(nèi)容,在考試中所占比例約70。
理解:
對于本課程的一般內(nèi)容要求學(xué)生能夠理解。即要求學(xué)生能夠較好地理解所學(xué)內(nèi)容,并且對所涉及的內(nèi)容能夠進(jìn)行簡單分析和判斷。要求學(xué)生理解的內(nèi)容也是考試的內(nèi)容,在考試中所占比例約25。
了解:
對于本課程的次要內(nèi)容要求學(xué)生能夠了解。要求學(xué)生了解的內(nèi)容,一般是指在眼下不必進(jìn)一步深入和擴(kuò)展,有些也許需要學(xué)生自己今后在工作中進(jìn)行深入研究。對要求了解的內(nèi)容,在考試中占較小比例,不超過5。實(shí)驗(yàn)五:按鍵電路、顯示電路實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康模?.掌握獨(dú)立式按鍵電路與矩陣式按鍵電路的設(shè)計方法。2.掌握數(shù)碼管顯示電路的工作原理3.掌握源程序編輯軟件UltraEdit,編譯軟件KeilC51、仿真軟件Proteus的使用方法4.掌握硬件仿真器ME-52A的使用方法二、實(shí)驗(yàn)器材:1.單片機(jī)實(shí)驗(yàn)板2.單片機(jī)硬件仿真器ME-51A3.計算機(jī)4.電源三、實(shí)驗(yàn)要求:1.電路如圖5所示,用單片機(jī)的P3口所接的四個獨(dú)立式按鍵控制p1口流水燈花樣的方法;具體表現(xiàn)為:p3.0、P3.1、P3.2、P3.3四個小按鍵分別實(shí)現(xiàn)了四個控制:(1)跑燈:即P1.0---1.7亮點(diǎn)流動:(2)流水燈:即P1.0-1.7依次點(diǎn)亮(3)交叉閃爍:即P0.0,P0.2,P0.4,P0.6和P0.1,P0.3,P0.5,P0.7輪流點(diǎn)亮(4)停止;在任何狀態(tài)下按此鍵程序停止運(yùn)行.2.電路如圖6所示,用P2口所接的4×4矩陣式鍵盤作為輸入,在P1口所接的數(shù)碼管上顯示出每個按鍵的0~F序號,鍵盤的布局如下表所示:FEDCBA9876543210四、實(shí)驗(yàn)原理:1.獨(dú)立式按鍵電路顯示如圖5所示,從圖中可看出,判斷有無鍵按下,只要檢測P3.0~P3.3相應(yīng)端口的高低電平即可,若檢測有某一端口為低電平,表明該端口有按鍵按下,經(jīng)延時消抖后轉(zhuǎn)去執(zhí)行相應(yīng)的功能子程序。若為高電平,表明無鍵按1.獨(dú)立式按鍵電路如圖5所示,下,繼續(xù)檢測。示例程序如下:ORG000HLJMPSTAR1ORG0030HSTAR1:MOVP3,#0FFH;置P3口為輸入態(tài)JNBP3.0,FUN0;判別P3.0是否有鍵按下,是,則轉(zhuǎn)FUN0JNBP3.1,FUN1;判別P3.1是否有鍵按下,是,則轉(zhuǎn)FUN1JNBP3.2,FUN2;判別P3.2是否有鍵按下,是,則轉(zhuǎn)FUN2JNBP3.3,FUN3;判別P3.3是否有鍵按下,是,則轉(zhuǎn)FUN3JNBF0,STAR1;曾經(jīng)有鍵按下F0置1RET圖5FUN0:LCALLDL10MS;消岸抖動JBP3.0,STAR1WAITL0:JNBP3.0,WAITL0;等待鍵釋放SETBF0FUN01:LCALLFUN00LCALLSTAR1LJMPFUN01FUN1:LCALLDL10MS;消岸抖動JBP3.1,STAR1WAITL1:JNBP3.1,WAITL1;等待鍵釋放SETBF0FUN10:LCALLFUN11LCALLSTAR1LJMPFUN10FUN2:LCALLDL10MS;消岸抖動JBP3.2,STAR1WAITL2:JNBP3.2,WAITL2;等待鍵釋放SETBF0FUN20:LCALLFUN22LCALLSTAR1LJMPFUN20FUN3:LCALLDL10MS;消岸抖動JBP3.3,STAR1WAITL3:JNBP3.3,WAITL3;等待鍵釋放CLRF0MOVP1,#0FFH;關(guān)顯示LJMPSTAR1FUN00:MOVA,#0FEH;跑燈子程序FUN000:MOVP1,ALCALLDL05SJNBACC.7,OUTRLAAJMPFUN000OUT:RETFUN11:MOVA,#0FEH;流水燈子程序FUN111:MOVP1,ALCALLDL05SJZOUTRLAANLA,P1AJMPFUN111FUN22:MOVA,#0AAH;交叉點(diǎn)亮子程序MOVP1,ALCALLDL30SCPLAMOVP1,ALCALLDL30SRET;____________;;延時程序;;____________;DL512:MOVR2,#0FFHLOOP1:DJNZR2,LOOP1RETDL10MS:MOVR3,#14HLOOP2:LCALLDL512DJNZR3,LOOP2RETDL05S:MOVR4,#0AHLOOP3:LCALLDL10MSDJNZR4,LOOP3RETDL30S:MOVR5,#03HLOOP4:LCALLDL05SDJNZR5,LOOP4RETEND2.矩陣式按鍵電路顯示如圖6所示。采用掃描方式進(jìn)行按鍵的識別檢測,并將對應(yīng)按鍵的鍵號用查表指令將對應(yīng)的代碼顯示在數(shù)碼管上。圖6參考程序如下:ORG0000HLJMPSTARTORG0030HSTART:MOVSP,#60H;設(shè)置堆棧指針SCAN:MOVR3,#0F7H;置行掃描初值MOVR1,#00H;到TABLE表中取碼的指針SCAN1:MOVA,R3MOVP2,A;掃描輸出MOVA,P2;重讀P2口狀態(tài)MOVR4,A;暫存于R4呂中SETBC;C=1MOVR5,#03H;掃描4列初值L1:RLCA;A中內(nèi)容循環(huán)左移JNCKEYIN;C=0,有鍵按下,轉(zhuǎn)消抖INCR1;取碼指針加1DJNZR5,L1;無鍵按下,繼續(xù)檢測MOVA,R3;掃描下一行SETBCRRCAMOVR3,AJCSCAN1;4行是否掃描完,未完,繼續(xù)LJMPSCANKEYIN:MOVR7,#10;削除抖動D2:MOVR6,#248DJNZR6,$DJNZR7,D2D3:MOVA,P2;按鍵放開否?XRLA,R4JZD3MOVA,R1MOVDPTR,#TABLE;到TABLE中取碼MOVCA,@A DPTRMOVP1,ALJMPSCANTABLE:DB0C0H,0F9H,0A4H,0B0H,80H,90H,88H,83H,0C6H,0A1H,86H,8EHENDDB80H,90H,88H,83HDB0C6H,0A1H,86H,8EHEND五、實(shí)驗(yàn)步驟:1.運(yùn)行UltraEdit-32源程序編輯軟件,輸入、編輯匯編語言源程序。2.運(yùn)行KeiluVision2源程序編譯軟件,對源程序進(jìn)行編譯,得到目標(biāo)代碼文件。3.運(yùn)行Proteus模擬仿真軟件,打開已繪制好的仿真電路原理圖,進(jìn)行模擬 仿真。4.把硬件仿真器ME-52A與單片實(shí)驗(yàn)板連接好,再用硬件仿真器進(jìn)行仿真驗(yàn)證。六、實(shí)驗(yàn)分析與總結(jié)1.用仿真系統(tǒng)調(diào)試簡單程序結(jié)構(gòu)、分支程序結(jié)構(gòu)、循環(huán)程序結(jié)構(gòu)、子程序結(jié)構(gòu)和中斷結(jié)構(gòu)的關(guān)鍵在于,如何將對程序的分析理解和開發(fā)系統(tǒng)提供的基本功能有機(jī)地結(jié)合起來,其前提條件是必須對源程序的作用、結(jié)構(gòu)特點(diǎn)、運(yùn)行過程與結(jié)果有較全面的認(rèn)識,并能根據(jù)程序運(yùn)行過程中出現(xiàn)的現(xiàn)象和結(jié)果分析并判斷產(chǎn)生各種故障現(xiàn)象的原因,再運(yùn)用排除法逐一檢驗(yàn)各種判斷是否準(zhǔn)確。2.掌握程序結(jié)構(gòu)特點(diǎn)的基礎(chǔ)上,合理選擇觀測點(diǎn),通過觀察在觀測點(diǎn)處參數(shù)及路徑的變化檢驗(yàn)程序運(yùn)行的結(jié)果。3.高調(diào)試程序的效率,應(yīng)對單片機(jī)開發(fā)系統(tǒng)所提供的幾種程序運(yùn)行調(diào)試方式有足夠的了解并能熟練地運(yùn)用。例如,在調(diào)試過程中,若要觀察最終結(jié)果,則可選擇全速運(yùn)行調(diào)試;若要觀察相關(guān)指令的運(yùn)行結(jié)果或運(yùn)行路徑的變化過程,則可選擇單步運(yùn)行;若要檢查子程序的運(yùn)行過程,則可選擇跟蹤運(yùn)行調(diào)試;若要檢查循環(huán)程序或中斷服務(wù)程序,則可選擇斷點(diǎn)運(yùn)行調(diào)試;若要定點(diǎn)檢查程序運(yùn)行到某處的結(jié)果時,則可選擇快速運(yùn)行到光標(biāo)處調(diào)試。但實(shí)際中究竟選用哪種方法更適宜或哪幾種方法結(jié)合使用更快捷,將隨著分析能力與操作的熟練程度逐步提高。4.程序運(yùn)行結(jié)果是否正確時,應(yīng)運(yùn)用單片機(jī)開發(fā)系統(tǒng)所提供的交互界面,將程序運(yùn)行過程中程序計數(shù)器PC(地址)的變化、各單元(內(nèi)部RAM和外部RAM)內(nèi)容的變化、特殊功能寄存器內(nèi)容的變化、堆棧指針SP內(nèi)容的變化與程序的理論分析結(jié)果相對照。5.程序和調(diào)試程序時,需要多次反復(fù)的過程,并非一次就能排除全部故障,特別是單片機(jī)應(yīng)用系統(tǒng)的硬件電路和匯編程序相結(jié)合的綜合調(diào)試就更加復(fù)雜,因此,必須通過反復(fù)調(diào)試,不斷修改硬件和軟件,直到最終符合設(shè)計要求為止。如果在調(diào)試中能夠根據(jù)實(shí)驗(yàn)現(xiàn)象預(yù)先對產(chǎn)生故障的原因加以判斷和分析,并制定出相應(yīng)的調(diào)試方法和步驟,可縮小排除故障的范圍,提高調(diào)試效率。七、思考與練習(xí)填空題
1、設(shè)X=5AH,Y=36H,則X與Y“或”運(yùn)算為__7EH_______,X與Y的“異或”運(yùn)算為___6CH_____。
2、若機(jī)器的字長為8位,X=17,Y=35,則X+Y=__110100_____,X-Y=_11101110______(要求結(jié)果寫出二進(jìn)制形式)。
3、單片機(jī)的復(fù)位操作是____高電平______(高電平/低電平),單片機(jī)復(fù)位后,堆棧指針SP的值是___07h_____。
4、單片機(jī)中,常用作地址鎖存器的芯片是__74HC373____________,常用作地址譯碼器芯片是_____74HC138____________。
5、若選擇內(nèi)部程序存儲器,應(yīng)該設(shè)置為_____高_(dá)______(高電平/低電平),那么,PSEN信號的處理方式為___不用__________________。
6、單片機(jī)程序的入口地址是____0000H__________,外部中斷1的入口地址是______0013H_________。
7、若采用6MHz的晶體振蕩器,則MCS-51單片機(jī)的振蕩周期為__0.5us_______,機(jī)器周期為_____2us__________。
8、擴(kuò)展芯片的選擇方法有兩種,它們分別是___線選法_______________和_____譯碼法__________。
9、單片機(jī)的內(nèi)部RAM區(qū)中,可以位尋址的地址范圍是____20H~2FH______________,特殊功能寄存器中,可位尋址的地址是___是能被8整除的地址_________________。
10、子程序返回指令是___ret______,中斷子程序返回指令是__reti。
11、8051單片機(jī)的存儲器的最大特點(diǎn)是內(nèi)部RAM與外部RAM分開編址。
12、8051最多可以有32個并行輸入輸出口,最少也可以有8個并行口。
13、函數(shù)是C語言的基本單位。
14、串行口方式2接收到的第9位數(shù)據(jù)送SCON寄存器的RB8位中保存。
15、MCS-51內(nèi)部提供3個可編程的16位定時/計數(shù)器,定時器有4種工作方式。
16、一個函數(shù)由兩部分組成,即說明部分和語句部分。
17、串行口方式3發(fā)送的第9位數(shù)據(jù)要事先寫入SCON寄存器的TB8位。
18、利用8155H可以擴(kuò)展3個并行口,256個RAM單元。
19、C語言中輸入和輸出操作是由庫函數(shù)scanf和printf等函數(shù)來完成。
二、選擇題
1、C語言中最簡單的數(shù)據(jù)類型包括(B)。
A、整型、實(shí)型、邏輯型B、整型、實(shí)型、字符型
C、整型、字符型、邏輯型D、整型、實(shí)型、邏輯型、字符型
2、當(dāng)MCS-51單片機(jī)接有外部存儲器,P2口可作為(C)。
A、數(shù)據(jù)輸入口B、數(shù)據(jù)的輸出口
C、準(zhǔn)雙向輸入/輸出口D、輸出高8位地址
3、下列描述中正確的是(D)。
A、程序就是軟件B、軟件開發(fā)不受計算機(jī)系統(tǒng)的限制
C、軟件既是邏輯實(shí)體,又是物理實(shí)體D、軟件是程序、數(shù)據(jù)與相關(guān)文檔的集合
4、下列計算機(jī)語言中,CPU能直接識別的是(D)。
A、自然語言B、高級語言C、匯編語言D、機(jī)器語言
5、MCS-5l單片機(jī)的堆棧區(qū)是設(shè)置在(C)中。
A、片內(nèi)ROM區(qū)B、片外ROM區(qū)C、片內(nèi)RAM區(qū)D、片外RAM區(qū)
6、以下敘述中正確的是(C)。
A、用C語言實(shí)現(xiàn)的算法必須要有輸入和輸出操作
B、用C語言實(shí)現(xiàn)的算法可以沒有輸出但必須要有輸入
C、用C程序?qū)崿F(xiàn)的算法可以沒有輸入但必須要有輸出
D、用C程序?qū)崿F(xiàn)的算法可以既沒有輸入也沒有輸出
7、定時器/計數(shù)器工作方式1是(D)。
A、8位計數(shù)器結(jié)構(gòu)B、2個8位計數(shù)器結(jié)構(gòu)
C、13位計數(shù)結(jié)構(gòu)D、16位計數(shù)結(jié)構(gòu)
8、C語言提供的合法的數(shù)據(jù)類型關(guān)鍵字是(B)。
A、DoubleB、shortC、integerD、Char
9、片內(nèi)RAM的20H~2FH為位尋址區(qū),所包含的位地址是(B)。
A、00H~20HB、00H~7FHC、20H~2FHD、00H~FFH
10、以下能正確定義一維數(shù)組的選項(xiàng)是(B)。
A、inta[5]={0,1,2,3,4,5};B、chara[]={0,1,2,3,4,5};
C、chara={’A’,’B’,’C’};D、inta[5]="0123";
11、數(shù)據(jù)的存儲結(jié)構(gòu)是指(D)。
A、存儲在外存中的數(shù)據(jù)B、數(shù)據(jù)所占的存儲空間量
C、數(shù)據(jù)在計算機(jī)中的順序存儲方式D、數(shù)據(jù)的邏輯結(jié)構(gòu)在計算機(jī)中的表示
12、下列關(guān)于棧的描述中錯誤的是(C)。
A、棧是先進(jìn)后出的先性表B、棧只能順序存儲
C、棧具有記憶作用D、對棧的插入和刪除操作中,不需要改變棧底指針
13、在寄存器間接尋址方式中,間址寄存器中存放的數(shù)據(jù)是(B)。
A、參與操作的數(shù)據(jù)B、操作數(shù)的地址值
C、程序的轉(zhuǎn)換地址D、指令的操作碼
14、MCS-51單片機(jī)的復(fù)位信號是(A)有效。
A、高電平B、低電平C、脈沖D、下降沿
15、為了使模塊盡可能獨(dú)立,要求(B)。
A、模塊的內(nèi)聚程度要盡量高,且各模塊間的耦合程度要盡量強(qiáng)
B、模塊的內(nèi)聚程度要盡量高,且各模塊間的耦合程度要盡量弱
C、模塊的內(nèi)聚程度要盡量低,且各模塊間的耦合程度要盡量弱
D、模塊的內(nèi)聚程度要盡量低,且各模塊間的耦合程度要盡量強(qiáng)
16、若MCS-51單片機(jī)使用晶振頻率為6MHz時,其復(fù)位持續(xù)時間應(yīng)該超過(B)。
A、2μsB、4μsC、8μsD、1ms
17、以下選項(xiàng)中可作為C語言合法常量的是(A)
A、-80B、-080C、-8e1.0D、-80.0e
18、能夠用紫外光擦除ROM中程序的只讀存儲器稱為(C)。
A、掩膜ROMB、PROMC、EPROMD、EEPROM
19、以下不能定義為用戶標(biāo)識符是(D)。
A、MainB、_0C、_intD、sizeof
20、下選項(xiàng)中,不能作為合法常量的是(B)。//冪不能為小數(shù)
A、1.234e04B、1.234e0.4C、1.234e 4D、1.234e0
21、以下敘述中錯誤的是(C)
A、對于double類型數(shù)組,不可以直接用數(shù)組名對數(shù)組進(jìn)行整體輸入或輸出
B、數(shù)組名代表的是數(shù)組所占存儲區(qū)的首地址,其值不可改變
C、當(dāng)程序執(zhí)行中,數(shù)組元素的下標(biāo)超出所定義的下標(biāo)范圍時,系統(tǒng)將給出“下標(biāo)越界”的出錯信息
D、可以通過賦初值的方式確定數(shù)組元素的個數(shù)
22、以下與函數(shù)fseek(fp,0L,SEEK_SET)有相同作用的是(D)
A、feof(fp)B、ftell(fp)C、fgetc(fp)D、rewind(fp)
23、存儲16×16點(diǎn)陣的一個漢字信息,需要的字節(jié)數(shù)為(A)
A、32B、64C、128D、256
24、已知1只共陰極LED顯示器,其中a筆段為字形代碼的最低位,若需顯示數(shù)字1,則它的字形代碼應(yīng)為(B)。
A、06HB、F9HC、30HD、CFH
25、在C語言中,合法的長整型常數(shù)是(A)
A、OLB、4962710C、324562&D、216D
26、以下選項(xiàng)中合法的字符常量是(B)
A、"B"B、’\010’C、68D、D
27、若PSW.4=0,PSW.3=1,要想把寄存器R0的內(nèi)容入棧,應(yīng)使用(D)指令。
A、PUSHR0B、PUSH@R0C、PUSH00HD、PUSH08H
28、在片外擴(kuò)展一片2764程序存儲器芯片要(B)地址線。
A、8根B、13根C、16根D、20根
29、設(shè)MCS-51單片機(jī)晶振頻率為12MHz,定時器作計數(shù)器使用時,其最高的輸入計數(shù)頻率應(yīng)為(C)
A、2MHzB、1MHzC、500kHzD、250kHz
30、下列數(shù)據(jù)字定義的數(shù)表中,(A)是錯誤的。
A、DW“AA”B、DW“A”C、DW“OABC”D、DWOABCH
三、判斷題
(√)1、在對某一函數(shù)進(jìn)行多次調(diào)用時,系統(tǒng)會對相應(yīng)的自動變量重新分配存儲單元。
(×)2、在C語言的復(fù)合語句中,只能包含可執(zhí)行語句。
(√)3、自動變量屬于局部變量。
(×)4、Continue和break都可用來實(shí)現(xiàn)循環(huán)體的中止。
(√)5、字符常量的長度肯定為1。
(×)6、在MCS-51系統(tǒng)中,一個機(jī)器周期等于1.5μs。
(√)7、C語言允許在復(fù)合語句內(nèi)定義自動變量。
(√)8、若一個函數(shù)的返回類型為void,則表示其沒有返回值。
(×)9、所有定義在主函數(shù)之前的函數(shù)無需進(jìn)行聲明。
(×)10、定時器與計數(shù)器的工作原理均是對輸入脈沖進(jìn)行計數(shù)。
(×)11、END表示指令執(zhí)行到此結(jié)束。
(√)12、ADC0809是8位逐次逼近式模/數(shù)轉(zhuǎn)換接口。
(√)13、MCS-51的相對轉(zhuǎn)移指令最大負(fù)跳距是127B。
(×)14、MCS-51的程序存儲器只是用來存放程序的。
(√)15、TMOD中的GATE=1時,表示由兩個信號控制定時器的的啟停。
(×)16、MCS-51的特殊功能寄存器分布在60H~80H地址范圍內(nèi)。
(×)17、MCS-51系統(tǒng)可以沒有復(fù)位電路。
(×)18、片內(nèi)RAM與外部設(shè)備統(tǒng)一編址時,需要專門的輸入/輸出指令。
(√)19、鎖存器、三態(tài)緩沖寄存器等簡單芯片中沒有命令寄存和狀態(tài)寄存等功能。
(√)20、使用8751且=1時,仍可外擴(kuò)64KB的程序存儲器。
四、簡答題
1、在使用8051的定時器/計數(shù)器前,應(yīng)對它進(jìn)行初始化,其步驟是什么?
答:(1)確定T/C的工作方式——編程TMOD寄存器;
(2)計算T/C中的計數(shù)初值,并裝載到TH和TL;
(3)T/C在中斷方式工作時,須開CPU中斷和源中斷——編程IE寄存器;
(4)啟動定時器/計數(shù)器——編程TCON中TR1或TR0位。
2、什么是重入函數(shù)?重入函數(shù)一般什么情況下使用,使用時有哪些需要注意的地方?
答:多個函數(shù)可以同時使用的函數(shù),稱為重入函數(shù)。
通常情況下,C51函數(shù)不能被遞歸調(diào)用,也不能應(yīng)用導(dǎo)致遞歸調(diào)用的結(jié)構(gòu)。有此限制是由于函數(shù)參數(shù)和局部變量是存儲在固定的地址單元中。重入函數(shù)特性允許你聲明一個重入函數(shù)。即可以被遞歸調(diào)用的函數(shù)。
重入函數(shù)可以被遞歸調(diào)用,也可以同時被兩個或更多的進(jìn)程調(diào)用。重入函數(shù)在實(shí)時應(yīng)用中及中斷服務(wù)程序代碼和非中斷程序代碼必須共用一個函數(shù)的場合中經(jīng)常用到。
3、8051引腳有多少I/O線?他們和單片機(jī)對外的地址總線和數(shù)據(jù)總線有什么關(guān)系?地址總線和數(shù)據(jù)總線各是幾位?
答:8051引腳共有40個引腳,8051的地址總線由P2和P0口提供,P2口是地址總線的高8位,P0口是地址總線的低8位;數(shù)據(jù)總線由P0口提供;P0口的地址總線和數(shù)據(jù)總線是分時進(jìn)行的,P0口的地址總線需要外接地址鎖存器完成地址鎖存。
地址總線共16位,數(shù)據(jù)總線是8位。
4、在有串行通信時,定時器/計數(shù)器1的作用是什么,怎樣確定串行口的波特率?
答:在有串行通信時,定時器/計數(shù)器1的作用是串行口發(fā)生器。
串行口的波特率根據(jù)串行口的工作方式具有不同的計算方式:
方式0的波特率固定為晶體振蕩器的十二分之一;
方式1的波特率=2SMOD.(定時器1的溢出率)/32;
方式2波特率=2SMOD.(fosc/64);
方式3波特率同方式1(定時器l作波特率發(fā)生器)。
5、如何消除鍵盤的抖動?怎樣設(shè)置鍵盤中的復(fù)合鍵?
答:由于按鍵是機(jī)械開關(guān)結(jié)構(gòu),所以當(dāng)用手按下其中一個鍵時,往往會出現(xiàn)所按鍵在閉合位置和斷開位置之間發(fā)生跳幾下后才會穩(wěn)定到閉合狀態(tài)的情況。在釋放一個鍵時,也會出現(xiàn)類似的情況,這就是鍵的抖動,抖動的持續(xù)時間不一,但通常不會大于10ms。
若抖動問題不解決,就會引起對閉合鍵的多次讀入。對于鍵抖動最方便的解決方法就是當(dāng)發(fā)現(xiàn)有鍵按下后,不是立即進(jìn)行掃描,而是延時大約10ms后再進(jìn)行。由于一個鍵按下的時間一般會持續(xù)上百毫秒,所以延遲10ms后再掃描處理并不遲。
復(fù)合鍵可以仿照計算機(jī)復(fù)合鍵的處理方法,通??梢约僭O(shè)一個鍵具有復(fù)合功能,再與其它減的鍵值組合成復(fù)合鍵。1、矩陣式鍵盤的結(jié)構(gòu)與工作原理
在鍵盤中按鍵數(shù)量較多時,為了減少I/O口的占用,通常將按鍵排列成矩陣形式,如圖1所示。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接。這樣,一個端口(如P1口)就可以構(gòu)成4*4=16個按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數(shù)越多,區(qū)別越明顯,比如再多加一條線就可以構(gòu)成20鍵的鍵盤,而直接用端口線則只能多出一鍵(9鍵)。由此可見,在需要的鍵數(shù)比較多時,采用矩陣法來做鍵盤是合理的。
矩陣式結(jié)構(gòu)的鍵盤顯然比直接法要復(fù)雜一些,識別也要復(fù)雜一些,上圖中,列線通過電阻接正電源,并將行線所接的單片機(jī)的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當(dāng)按鍵沒有按下時,所有的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態(tài)就可得知是否有鍵按下了。具體的識別及編程方法如下所述。
2、矩陣式鍵盤的按鍵識別方法
確定矩陣式鍵盤上何鍵被按下介紹一種“行掃描法”。
行掃描法行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識別方法,如上圖所示鍵盤,介紹過程如下。
1、判斷鍵盤中有無鍵按下將全部行線Y0-Y3置低電平,然后檢測列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。
2、判斷閉合鍵所在的位置在確認(rèn)有鍵按下后,即可進(jìn)入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為 高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態(tài)。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。
下面給出一個具體的例子:
圖仍如上所示。8031單片機(jī)的P1口用作鍵盤I/O口,鍵盤的列線接到P1口的低4位,鍵盤的行線接到P1口的高4位。列線P1.0-P1.3分別接有4個上拉電阻到正電源 5V,并把列線P1.0-P1.3設(shè)置為輸入線,行線P1.4-P.17設(shè)置為輸出線。4根行線和4根列線形成16個相交點(diǎn)。
1、檢測當(dāng)前是否有鍵被按下。檢測的方法是P1.4-P1.7輸出全“0”,讀取P1.0-P1.3的狀態(tài),若P1.0-P1.3為全“1”,則無鍵閉合,否則有鍵閉合。
2、去除鍵抖動。當(dāng)檢測到有鍵按下后,延時一段時間再做下一步的檢測判斷。
3、若有鍵被按下,應(yīng)識別出是哪一個鍵閉合。方法是對鍵盤的行線進(jìn)行掃描。P1.4-P1.7按下述4種組合依次輸出:
P1.71110
P1.61101
P1.51011
P1.40111
在每組行輸出時讀取P1.0-P1.3,若全為“1”,則表示為“0”這一行沒有鍵閉合,否則有鍵閉合。由此得到閉合鍵的行值和列值,然后可采用計算法或查表法將閉合鍵的行值和列值轉(zhuǎn)換成所定義的鍵值
4、為了保證鍵每閉合一次CPU僅作一次處理,必須卻除鍵釋放時的抖動。
鍵盤掃描程序:
從以上分析得到鍵盤掃描程序的流程圖如圖2所示。程序如下
SCAN:MOVP1,#0FH
MOVA,P1
ANLA,#0FH
CJNEA,#0FH,NEXT1
SJMPNEXT3
NEXT1:ACALLD20MS
MOVA,#0EFH
NEXT2:MOVR1,A
MOVP1,A
MOVA,P1
ANLA,#0FH
CJNEA,#0FH,KCODE;
MOVA,R1
SETBC
RLCA
JCNEXT2
NEXT3:MOVR0,#00H
RET
KCODE:MOVB,#0FBH
NEXT4:RRCA
INCB
JCNEXT4
MOVA,R1
SWAPA
NEXT5:RRCA
INCB
INCB
INCB
INCB
JCNEXT5
NEXT6:MOVA,P1
ANLA,#0FH
CJNEA,#0FH,NEXT6
MOVR0,#0FFH
RET
鍵盤處理程序就作這么一個簡單的介紹,實(shí)際上,鍵盤、顯示處理是很復(fù)雜的,它往往占到一個應(yīng)用程序的大部份代碼,可見其重要性,但說到,這種復(fù)雜并不來自于單片機(jī)的本身,而是來自于操作者的習(xí)慣等等問題,因此,在編寫鍵盤處理程序之前,最好先把它從邏輯上理清,然后用適當(dāng)?shù)乃惴ū硎境鰜?,最后再去寫代碼,這樣,才能快速有效地寫好代碼。
到本課為止,本站教程暫告一個段落!感謝大家的關(guān)心和支持!矩陣按鍵部分由16個輕觸按鍵按照4行4列排列,連接到JP50端口。將行線所接的單片機(jī)的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當(dāng)按鍵沒有按下時,所有的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態(tài)就可得知是否有鍵按下了。確定矩陣式鍵盤上何鍵被按下,介紹一種“行掃描法”。行掃描法行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識別方法.判斷鍵盤中有無鍵按下:將全部行線置低電平,然后檢測列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。判斷閉合鍵所在的位置:在確認(rèn)有鍵按下后,即可進(jìn)入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態(tài)。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。下面給出一個具體的例子:電路圖路徑:G:\圖片\電路圖片\xl100097.jpg8031單片機(jī)的P1口用作鍵盤I/O口,鍵盤的列線接到P1口的低4位,鍵盤的行線接到P1口的高4位。列線P1.0-P1.3設(shè)置為輸入線,行線P1.4-P.17設(shè)置為輸出線。4根行線和4根列線形成16個相交點(diǎn)。1.檢測當(dāng)前是否有鍵被按下。檢測的方法是P1.4-P1.7輸出全“0”,讀取P1.0-P1.3的狀態(tài),若P1.0-P1.3為全“1”,則無鍵閉合,否則有鍵閉合。2.去除鍵抖動。當(dāng)檢測到有鍵按下后,延時一段時間再做下一步的檢測判斷。3.若有鍵被按下,應(yīng)識別出是哪一個鍵閉合。方法是對鍵盤的行線進(jìn)行掃描。P1.4-P1.7按下述4種組合依次輸出:P1.71110P1.61101P1.51011P1.40111在每組行輸出時讀取P1.0-P1.3,若全為“1”,則表示為“0”這一行沒有鍵閉合,否則有鍵閉合。由此得到閉合鍵的行值和列值,然后可采用計算法或查表法將閉合鍵的行值和列值轉(zhuǎn)換成所定義的鍵值。4.為了保證鍵每閉合一次CPU僅作一次處理,必須去除鍵釋放時的抖動。實(shí)驗(yàn)?zāi)康模和ㄟ^XL1000的16位矩陣按鍵,在數(shù)碼管上分別顯示0---9,A,B,C,D,E,F。接線方法:1用一條8PIN數(shù)據(jù)排線,把矩陣按鍵部份的JP50,接到CPU部份的P1口JP44.2接8位數(shù)碼管的數(shù)據(jù)線。將數(shù)碼管部份的數(shù)據(jù)口JP5接到CPU部份的P0口JP51.3接8位數(shù)碼管的顯示位線。將數(shù)碼管部份的顯示位口JP8接到CPU部份的P2口JP52.參考程序:;本程序?qū)崿F(xiàn)掃描按鍵顯示功能.;分別按16個鍵盤顯示分別顯示數(shù)字123A456B789C*0#D;鍵盤口P1,數(shù)碼管顯示第二位p21,數(shù)碼管段位p0口org0000hajmpmainorg0030hmain:movdptr,#tab;將表頭放入DPTRlcallkey;調(diào)用鍵盤掃描程序movca,@a dptr;查表后將鍵值送入ACCmovp0,a;將Acc值送入P0口CLRP2.1;開顯示ljmpmain;返回反復(fù)循環(huán)顯示KEY:LCALLKS;調(diào)用檢測按鍵子程序JNZK1;有鍵按下繼續(xù)LCALLDELAY2;無鍵按調(diào)用延時去抖AJMPKEY;返回繼續(xù)檢測按鍵K1:LCALLDELAY2LCALLDELAY2;有鍵按下延時去抖動LCALLKS;再調(diào)用檢測按鍵程序JNZK2;確認(rèn)有按下進(jìn)行下一步AJMPKEY;無鍵按下返回繼續(xù)檢測K2:MOVR2,#0EFH;將掃描值送入R2暫存MOVR4,#00H;將第一列值送入R4暫存K3:MOVP1,R2;將R2的值送入P1口L6:JBP1.0,L1;P1.0等于1跳轉(zhuǎn)到L1MOVA,#00H;將第一行值送入ACCAJMPLK;跳轉(zhuǎn)到鍵值處理程序L1:JBP1.1,L2;P1.1等于1跳轉(zhuǎn)到L2MOVA,#04H;將第二行的行值送入ACCAJMPLK;跳轉(zhuǎn)到鍵值理程序進(jìn)行鍵值處理L2:JBP1.2,L3;P1.2等于1跳轉(zhuǎn)到L3MOVA,#08H;將第三行的行值送入ACCAJMPLK;跳轉(zhuǎn)到鍵值處理程序L3:JBP1.3,NEXT;P1.3等于1跳轉(zhuǎn)到NEXT處MOVA,#0cH;將第四行的行值送入ACCLK:ADDA,R4;行值與列值相加后的鍵值送入APUSHACC;將A中的值送入堆棧暫存K4:LCALLDELAY2;調(diào)用延時去抖動程序LCALL KS;調(diào)用按鍵檢測程序JNZK4;按鍵沒有松開繼續(xù)返回檢測POPACC;將堆棧的值送入ACCRETNEXT:INCR4;將列值加一MOVA,R2;將R2的值送入AJNBACC.7,KEY;掃描完至KEY處進(jìn)行下一掃描RLA;掃描未完將A中的值右移一位進(jìn)行下一列的掃描MOVR2,A;將ACC的值送入R2暫存AJMPK3;跳轉(zhuǎn)到K3繼續(xù)KS:MOVP1,#0FH;將P1口高四位置0低四位值1MOVA,P1;讀P1口XRLA,#0FH;將A中的值與A中的值相異或RET;子程序返回DELAY2:;40ms延時去抖動子程序MOVR5,#08HL7:MOVR6,#0FAHL8:DJNZR6,L8DJNZR5,L7RETtab:db28h,34h,28h,34h,0a9h,60h,20h,7ah,20h,21h,61h,74h,30h,62h,0a2h,7eh;0h0hc9878654a321輪流顯示鍵盤因?yàn)闊o法表達(dá)*#就用H表示,B用8表示end這是我做成功的4X4鍵盤掃描源程序,P1.0-P1.3做四根列線,P1.4-P1.7做四根行線。
數(shù)碼管的字型表是按照標(biāo)準(zhǔn)接法做的,按對應(yīng)的按鍵數(shù)碼管顯示對應(yīng)的數(shù)字。
以下是源程序:
KEYBUFEQU30H
ORG00H
START:MOVKEYBUF,#2
MOVP2,#00001111B
WAIT:
MOVP1,#0FFH
CLRP1.4
MOVA,P1
ANLA,#0FH
XRLA,#0FH
JZNOKEY1
LCALLDELY10MS
MOVA,P1
ANLA,#0FH
XRLA,#0FH
JZNOKEY1
MOVA,P1
ANLA,#0FH
CJNEA,#0EH,NK1
MOVKEYBUF,#0
LJMPDK1
NK1:CJNEA,#0DH,NK2
MOVKEYBUF,#1
LJMPDK1
NK2:CJNEA,#0BH,NK3
MOVKEYBUF,#2
LJMPDK1
NK3:CJNEA,#07H,NK4
MOVKEYBUF,#3
LJMPDK1
NK4:NOP
DK1:
MOVA,KEYBUF
MOVDPTR,#TABLE
MOVCA,@A DPTR
MOVP0,A
DK1A:MOVA,P1
ANLA,#0FH
XRLA,#0FH
JNZDK1A
NOKEY1:
MOVP1,#0FFH
CLRP1.5
MOVA,P1
ANLA,#0FH
XRLA,#0FH
JZNOKEY2
LCALLDELY10MS
MOVA,P1
ANLA,#0FH
XRLA,#0FH
JZNOKEY2
MOVA,P1
ANLA,#0FH
CJNEA,#0EH,NK5
MOVKEYBUF,#4
LJMPDK2
NK5:CJNEA,#0DH,NK6
MOVKEYBUF,#5
LJMPDK2
NK6:CJNEA,#0BH,NK7
MOVKEYBUF,#6
LJMPDK2
NK7:CJNEA,#07H,NK8
MOVKEYBUF,#7
LJMPDK2
NK8:NOP
DK2:
MOVA,KEYBUF
MOVDPTR,#TABLE
MOVCA,@A DPTR
MOVP0,A
DK2A:MOVA,P1
ANLA,#0FH
XRLA,#0FH
JNZDK2A
NOKEY2:
MOVP1,#0FFH
CLRP1.6
MOVA,P1
ANLA,#0FH
XRLA,#0FH
JZNOKEY3
LCALLDELY10MS
MOVA,P1
ANLA,#0FH
XRLA,#0FH
JZNOKEY3
MOVA,P1
ANLA,#0FH
CJNEA,#0EH,NK9
MOVKEYBUF,#8
LJMPDK3
NK9:CJNEA,#0DH,NK10
MOVKEYBUF,#9
LJMPDK3
NK10:CJNEA,#0BH,NK11
MOVKEYBUF,#10
LJMPDK3
NK11:CJNEA,#07H,NK12
MOVKEYBUF,#11
LJMPDK3
NK12:NOP
DK3:
MOVA,KEYBUF
MOVDPTR,#TABLE
MOVCA,@A DPTR
MOVP0,A
DK3A:MOVA,P1
ANLA,#0FH
XRLA,#0FH
JNZDK3A
NOKEY3:
MOVP1,#0FFH
CLRP1.7
MOVA,P1
ANLA,#0FH
XRLA,#0FH
JZNOKEY4
LCALLDELY10MS
MOVA,P1
ANLA,#0FH
XRLA,#0FH
JZNOKEY4
MOVA,P1
ANLA,#0FH
CJNEA,#0EH,NK13
MOVKEYBUF,#12
LJMPDK4
NK13:CJNEA,#0DH,NK14
MOVKEYBUF,#13
LJMPDK4
NK14:CJNEA,#0BH,NK15
MOVKEYBUF,#14
LJMPDK4
NK15:CJNEA,#07H,NK16
MOVKEYBUF,#15
LJMPDK4
NK16:NOP
DK4:
MOVA,KEYBUF
MOVDPTR,#TABLE
MOVCA,@A DPTR
MOVP0,A
DK4A:MOVA,P1
ANLA,#0FH
XRLA,#0FH
JNZDK4A
NOKEY4:
LJMPWAIT
DELY10MS:
MOVR6,#10
D1:MOVR7,#248
DJNZR7,$
DJNZR6,D1
RET
TABLE:DB0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H;0-9
DB088H,083H,0C6H,0A1H,086H,08EH,089H,0CFH,0C7H,0C8H;A,B,C,D,E,F,H,I,L,N,
END;P3.1數(shù)據(jù)采集控制
;P2.6P2.7個位十位顯示轉(zhuǎn)換控制
;P1口接8個開關(guān)模擬數(shù)據(jù)
;P1.0-P1.3為個位開關(guān)量輸入
;P1.4-P1.7為十位開關(guān)量輸入
;此程序僅供參考
;功能P1口接8個開關(guān)輸入量4個一組,分別為個位,十位輸入
;P0口接一個數(shù)碼管,依次顯示輸入量。P3.1控制是否讀入
;開關(guān)量。P2.6P2.7控制是否顯示個位或十位
ORG100h
LJMPSTAR
STAR:MOVP1,#0FFH
SETBP3.1數(shù)據(jù)讀入標(biāo)志
MOVR0,#100,循環(huán)工作次數(shù)
LOOP:JBP3.1,$P3.1低電平時,采集P1口數(shù)據(jù)開關(guān)量處理顯示階段不再應(yīng)答P3.1
MOVA,P1
PUSHACC
ANLA,#0FH取個位數(shù)值
MOVR1,A個位數(shù)值保存到R1
POPACC
ANLA,#0F0H
SWAPA高4位轉(zhuǎn)成字節(jié)信息
MOVR2,A十位數(shù)值保存到R2
MOVDPTR,#TABLED
MOVA,R1
MOVCA,@A DPTR
MOVP0,A
CLRP2.6個位顯示
ACALLDELAY500MS
SETBP2.6
MOVA,R2
MOVCA,@A DPTR
MOVP0,A
CLRP2.7十位顯示
ACALLDELAY500MS
SETBP2.7
DJNZR0,LOOP
DELAY500MS:延時500毫秒子程略
RET
TABLED:DB0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h
DB80H,90H,88h,83h,0c6h,0a1h,86h,8eh
END#include
typedefunsignedcharBYTE;
BYTEcodeTABLED[16]={0Xc0,0Xf9,0Xa4,0Xb0,0X99,0X92,0X82,0X0f8,0X80,0X90,0X88,0X83,0Xc6,0Xa1,0X86,0X8e};
BYTEDATled;
sbitP26=P2^6;
sbitP27=P2^7;
sbitP31=P3^1;
intTIME;
voidtimedelay(DTIME)
intDTIME;
{
intI;
for(I=0;I<=DTIME;I );
}
voidmain()
{
intTEMP;
P26=1;
P27=1;
P31=1;
P1=0xFF;
TIME=1000;
while(1){
while(P31==0){
DATled=P1;
TEMP=DATled&0x0f4;
P0=TABLED[TEMP];
P27=0;
timedelay(TIME);
P27=1;
}
}
}1.實(shí)驗(yàn)任務(wù)在8X8 LED點(diǎn)陣上顯示柱形,讓其先從左到右平滑移動三次,其次從右到左平滑移動三次,再次從上到下平滑移動三次,最后從下到上平滑移動三次,如此循環(huán)下去。2.電路原理圖圖4.24.13.硬件電路連線(1).把“單片機(jī)系統(tǒng)”區(qū)域中的P1端口用8芯排芯連接到“點(diǎn)陣模塊”區(qū)域中的“DR1-DR8”端口上;(2).把“單片機(jī)系統(tǒng)”區(qū)域中的P3端口用8芯排芯連接到“點(diǎn)陣模塊”區(qū)域中的“DC1-DC8”端口上;4.程序設(shè)計內(nèi)容(1).8X8 點(diǎn)陣LED工作原理說明8X8點(diǎn)陣LED結(jié)構(gòu)如下圖所示圖4.24.2從圖4.24.2中可以看出,8X8點(diǎn)陣共需要64個發(fā)光二極管組成,且每個發(fā)光二極管是放置在行線和列線的交叉點(diǎn)上,當(dāng)對應(yīng)的某一列置1電平,某一行置0電平,則相應(yīng)的二極管就亮;因此要實(shí)現(xiàn)一根柱形的亮法,如圖49所示,對應(yīng)的一列為一根豎柱,或者對應(yīng)的一行為一根橫柱,因此實(shí)現(xiàn)柱的亮的方法如下所述:一根豎柱:對應(yīng)的列置1,而行則采用掃描的方法來實(shí)現(xiàn)。一根橫柱:對應(yīng)的行置0,而列則采用掃描的方法來實(shí)現(xiàn)。5.匯編源程序
ORG00H
START:NOP
MOVR3,#3
LOP2:MOVR4,#8
MOVR2,#0
LOP1:MOVP1,#0FFH
MOVDPTR,#TABA
MOVA,R2
MOVCA,@A DPTR
MOVP3,A
INCR2
LCALLDELAY
DJNZR4,LOP1
DJNZR3,LOP2
MOVR3,#3
LOP4:MOVR4,#8
MOVR2,#7
LOP3:MOVP1,#0FFH
MOVDPTR,#TABA
MOVA,R2
MOVCA,@A DPTR
MOVP3,A
DECR2
LCALLDELAY
DJNZR4,LOP3
DJNZR3,LOP4
MOVR3,#3
LOP6:MOVR4,#8
MOVR2,#0
LOP5:MOVP3,#00H
MOVDPTR,#TABB
MOVA,R2
MOVCA,@A DPTR
MOVP1,A
INCR2
LCALLDELAY
DJNZR4,LOP5
DJNZR3,LOP6
MOVR3,#3
LOP8:MOVR4,#8
MOVR2,#7
LOP7:MOVP3,#00H
MOVDPTR,#TABB
MOVA,R2
MOVCA,@A DPTR
MOVP1,A
DECR2
LCALLDELAY
DJNZR4,LOP7
DJNZR3,LOP8
LJMPSTART
DELAY:MOVR5,#10
D2:MOVR6,#20
D1:MOVR7,#248
DJNZR7,$
DJNZR6,D1
DJNZR5,D2
RET
TABA:DB0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH
TABB:DB01H,02H,04H,08H,10H,20H,40H,80H
END
6.C語言源程序
#include
unsignedcharcodetaba[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f0;j--);
}
voidmain(void)
{
unsignedchari,j;
while(1)
{
for(j=0;j<3;j )
//fromlefttoright3time
{
for(i=0;i<8;i )
{
P3=taba[i];
P1=0xff;
delay1();
}
}
for(j=0;j<3;j )
//fromrighttoleft3time
{
for(i=0;i<8;i )
{
P3=taba[7-i];
P1=0xff;
delay1();
}
}
for(j=0;j<3;j )
//fromtoptobottom3time
{
for(i=0;i<8;i )
{
P3=0x00;
P1=tabb[7-i];
delay1();
}
}
for(j=0;j<3;j )
//frombottomtotop3time
{
for(i=0;i<8;i )
{
P3=0x00;
P1=tabb[i];
delay1();
}
}
}
}LED點(diǎn)陣顯示實(shí)驗(yàn)一.實(shí)驗(yàn)要求
編程實(shí)現(xiàn)中英文字符的顯示。
二.實(shí)驗(yàn)?zāi)康?/p>
1.了解LED點(diǎn)陣顯示的基本原理和實(shí)現(xiàn)方法。
2.掌握點(diǎn)陣漢字庫的編碼和從標(biāo)準(zhǔn)字庫中提取漢字編碼的方法。
三.實(shí)驗(yàn)電路及連線
點(diǎn)陣顯示模塊WTD3088的(紅色)列輸入線接至內(nèi)部LED的陰極端,行輸入線接至內(nèi)部LED的陽極端(若陽極端輸入為高電平,陰極端輸入低電平,則該LED點(diǎn)亮)。發(fā)光點(diǎn)的分布如圖22-0所示。
Fig22-0WTD3088LED分布
如圖22-1示,本實(shí)驗(yàn)?zāi)K使用74LS374來控制列輸入線的電平值。將74LS374的某輸出置0,則對應(yīng)的LED陰極端被置低。如圖22-2示,本實(shí)驗(yàn)?zāi)K使用74LS273來控制行輸入線,并通過9013提供電流驅(qū)動。將74LS273的某輸出置1,則對應(yīng)的LED陽極端被置高。每次系統(tǒng)重新開啟或總清后,74LS273輸出為全0,LED顯示被關(guān)閉。
通過編程控制各顯示點(diǎn)對應(yīng)LED陽極和陰極端的電平,就可以有效的控制各顯示點(diǎn)的亮滅。
Fig22-1LED模塊及列掃描電路Fig22-2行掃描電路
Fig22-3地址譯碼電路
本實(shí)驗(yàn)?zāi)K使用4塊WTD3088組成16×16點(diǎn)陣,以滿足漢字顯示的要求。為了方便的控制四個單元,使用了一片74LS139譯碼,產(chǎn)生四個地址片選信號:CLKR1=CSLED,CLKR2=CSLED 1,用于行控制的兩片74LS273;CLKC1=CSLED 2,CLKC2=CSLED 3,用于列控制的兩片74LS374。
實(shí)驗(yàn)接線:按示例程序,模塊的CSLED接51/96地址的8000H。
四.實(shí)驗(yàn)說明
使用高亮度LED發(fā)光管構(gòu)成點(diǎn)陣,通過編程控制可以顯示中英文字符、圖形及視頻動態(tài)圖形。LED顯示以其組構(gòu)方式靈活、亮度高、技術(shù)成熟、成本低廉等特點(diǎn)在證券、運(yùn)動場館及各種室內(nèi)/外顯示場合得到廣泛的應(yīng)用。
所顯示字符的點(diǎn)陣數(shù)據(jù)可以自行編寫(即直接點(diǎn)陣畫圖),也可從標(biāo)準(zhǔn)字庫(如ASC16、HZ16)中提取。后者需要正確掌握字庫的編碼方法和字符定位的計算。
實(shí)驗(yàn)盤片中“字符轉(zhuǎn)換”子目錄下提供的Basc16.exe,BHz16.exe可方便的將單個字符的碼表從標(biāo)準(zhǔn)字庫Asc16,Hzk16中提取出來。具體使用方法是運(yùn)行上述可執(zhí)行程序,根據(jù)提示輸入所需字符(如是漢字還需要先啟動dos下的漢字環(huán)境,如ucdos,pdos95等)。程序?qū)⒃撟址拇a表提取出來,存放在該字符ASC或區(qū)位碼為文件名稱的.dat文件中。用戶只需將該文件中內(nèi)容拷貝、粘貼到自己的程序中即可。但需要注意字節(jié)排列順序、字節(jié)中每一位與具體顯示點(diǎn)的一一對應(yīng)關(guān)系,必要時還要對碼表稍作修改。同一目錄下還提供了上述可執(zhí)行程序的源文件,使用BC3.1編寫,供用戶參考。
五.實(shí)驗(yàn)程序框圖
用戶應(yīng)留心其中行掃描的實(shí)現(xiàn)及碼表的處理。
六.實(shí)驗(yàn)程序:(一)提供LEDA51演示Asc16字符的簡單點(diǎn)陣顯示。
;________*LED點(diǎn)陣顯示示例程序______________________*
;__該程序顯示Asc16字符__
;__為了簡單起見,程序只顯示一個字符__
;__該程序針對T598實(shí)驗(yàn)機(jī)的模塊14__
;____________________________________________________
CSLEDEQU8000H
CSR1EQUCSLED;行1273
CSR2EQUCSLED 1H;行2273
CSC1EQUCSLED 2H;列1374
CSC2EQUCSLED 3H;列2374
ORG0000H
MOVSP,#60H
INIT:MOVA,#0H;關(guān)閉行
MOVDPTR,#CSR1
MOVX@DPTR,A
MOVDPTR,#CSR2
MOVX@DPTR,A
MOVA,#0FFH;關(guān)閉列
MOVDPTR,#CSC1
MOVX@DPTR,A
MOVDPTR,#CSC2
MOVX@DPTR,A
D:MOVR5,#00H
MOVR4,#01H;每次為單行掃描
DISP:
MOVA,R5
MOVDPTR,#ASCE;此處設(shè)定所要顯示的字符
MOVCA,@A DPTR
CPLACC;代碼取反,決定顯示的陰陽
MOVDPTR,#CSC2
MOVX@DPTR,A
MOVDPTR,#CSR1
MOVA,R4
MOVX@DPTR,A
RLACC
MOVR4,ACC
INCR5
LCALLDELAY
CJNER5,#8H,DISP
MOVA,#0H
MOVX@DPTR,A
MOVR5,#08H
MOVR4,#01H
DISP2:
MOVA,R5
MOVDPTR,#ASCE
MOVCA,@A DPTR
CPLACC
MOVDPTR,#CSC2
MOVX@DPTR,A
MOVDPTR,#CSR2
MOVA,R4
MOVX@DPTR,A
RLACC
MOVR4,ACC
INCR5
LCALLDELAY
CJNER5,#10H,DISP2
MOVA,#0H
MOVX@DPTR,A
SJMPD
;________延時子程序,協(xié)調(diào)字符顯示速度____________*
DELAY:MOVR7,#1H
DL1:MOVR6,#00H
DL2:DJNZR6,DL2
DJNZR7,DL1
RET
;________字符點(diǎn)陣字庫______________*
;ASC16字符編碼排列
;0
;1
;|
;|
;14
;15
;高位D7--D0
;請注意編碼的排列次序和實(shí)際顯示點(diǎn)陣分布的關(guān)系
ASCA:DB00H,00H,10H,38H,6CH,0C6H,0C6H,0FEH
DB0C6H,0C6H,0C6H,0C6H,00H,00H,00H,00H
ASCE:DB00H,00H,0FEH,66H,62H,68H,78H,68H
DB60H,62H,66H,0FEH,00H,00H,00H,00H
ASCD:DB00H,00H,0F8H,6CH,66H,66H,66H,66H
DB66H,66H,6CH,0F8H,00H,00H,00H,00H
ASCK:DB00H,00H,0E6H,66H,66H,6CH,78H,78H
DB6CH,66H,66H,0E6H,00H,00H,00H,00H
;____________________________________________________
END
(二)LEDHZ51兩個示例程序。和Hz16字符的簡單點(diǎn)陣顯示。
;________*LED點(diǎn)陣顯示示例程序______________________*
;__該程序顯示hz16字符__
;__為了簡單起見,程序只顯示一個字符__
;__該程序針對T598實(shí)驗(yàn)機(jī)的模塊14__
;____________________________________________________
CSLEDEQU8000H
CSR1EQUCSLED;行1273
CSR2EQUCSLED 1H;行2273
CSC1EQU CSLED 2H;列1374
CSC2EQUCSLED 3H;列2374
ORG0000H
MOVSP,#60H
INIT:MOVA,#0H;關(guān)閉LED顯示
MOVDPTR,#CSR1
MOVX@DPTR,A
MOVDPTR,#CSR2
MOVX@DPTR,A
MOVA,#0FFH;關(guān)閉LED顯示
MOVDPTR,#CSC1
MOVX@DPTR,A
MOVDPTR,#CSC2
MOVX@DPTR,A
D:MOVR5,#00H
MOVR4,#01H
DISP:
MOVA,R5
RLACC
MOVDPTR,#HZAI
MOVCA,@A DPTR
CPLACC
MOVDPTR,#CSC2
MOVX@DPTR,A
MOVA,R5
RLACC
INCACC
MOVDPTR,#HZAI
MOVCA,@A DPTR
CPLACC
MOVDPTR,#CSC1
MOVX@DPTR,A
MOVDPTR,#CSR1
MOVA,R4
MOVX@DPTR,A
RLACC
MOVR4,ACC
INCR5
LCALLDELAY
CJNER5,#8H,DISP
MOVA,#0H
MOVX@DPTR,A
MOVR5,#08H
MOVR4,#01H
DISP2:
MOVA,R5
RLACC
MOVDPTR,#HZAI
MOVCA,@A DPTR
CPLACC
MOVDPTR,#CSC2
MOVX@DPTR,A
MOVA,R5
RLACC
INCACC
MOVDPTR,#HZAI
MOVCA,@A DPTR
CPLACC
MOVDPTR,#CSC1
MOVX@DPTR,A
MOVDPTR,#CSR2
MOVA,R4
MOVX@DPTR,A
RLACC
MOVR4,ACC
INCR5
LCALLDELAY
CJNER5,#10H,DISP2
MOVA,#0H
MOVX@DPTR,A
SJMPD
;________延時子程序,協(xié)調(diào)字符顯示速度____________*
DELAY:MOVR7,#1H
DL1:MOVR6,#00H
DL2:DJNZR6,DL2
DJNZR7,DL1
RET
;________字符點(diǎn)陣字庫______________*
;HZ16字符編碼排列
;01
;23
;|
;|
;2829
;3031
;高位D7--D0
HZAI:DB00H,78H,3FH,80H,11H,10H,09H,20H
DB7FH,0FEH,42H,02H,82H,04H,7FH,0F8H
DB04H,00H,07H,0F0H,0AH,20H,09H,40H
DB10H,80H,11H,60H,22H,1CH,0CH,08H
HZDI:DB00H,80H,40H,80H,20H,88H,2FH,0FCH
DB08H,88H,08H,88H,0E8H,88H,2FH,0F8H
DB28H,88H,28H,88H,28H,88H,2FH,0F8H
DB28H,08H,50H,06H,8FH,0FCH,00H,00H
HZKE:DB01H,00H,01H,04H,0FFH,0FEH,01H,00H
DB01H,10H,1FH,0F8H,10H,10H,10H,10H
DB10H,10H,1FH,0F0H,14H,50H,04H,40H
DB04H,40H,08H,42H,10H,42H,60H,3EH
;____________________________________________________
END基于89C51的計算機(jī)可鎖定加密鍵盤設(shè)計摘要:介紹PC鍵盤和鍵盤接口的PS/2通信協(xié)議,以及用89C51實(shí)現(xiàn)可鎖定鍵盤的軟件和硬件設(shè)計方法。具有安全可靠、容錯能力強(qiáng)、可以直接采用標(biāo)準(zhǔn)鍵盤進(jìn)行改裝、便于實(shí)現(xiàn)等優(yōu)點(diǎn),并保留標(biāo)準(zhǔn)鍵盤的全部功能。關(guān)鍵詞:PS/289C51C51鍵盤引言
在智能儀器、自動控制等領(lǐng)域,已大量使用嵌入式PC,如Advantech公司的PC/104、AMD公司的DIMM-PC等。為適應(yīng)開放式、模塊化的要求,嵌入式PC具有標(biāo)準(zhǔn)的PC接口,如VGA顯示器控制接口、以太網(wǎng)接口、RS232接口、PC/AT鍵盤接口等。所以,可以用標(biāo)準(zhǔn)的PC鍵盤對嵌入式PC進(jìn)行操作與控制。鍵盤在輸入指令之后,可能很長一段時間不用。為計算機(jī)安全和防止誤觸發(fā),需要將鍵盤鎖定,還要對某些鍵采取屏蔽措施,但是PC標(biāo)準(zhǔn)鍵盤不能滿足這些要求。本文介紹一種用89C51設(shè)計實(shí)現(xiàn)的可鎖定加密PC/AT鍵盤。
1鍵盤功能及工作原理
PC鍵盤功能主要有按鍵識別、去抖、重鍵處理、發(fā)送掃描碼、自動重發(fā)、接收鍵盤命令、處理命令等。鍵盤有編碼鍵盤和非編碼鍵盤。編碼鍵盤程序設(shè)計簡單,但硬件電路復(fù)雜,價格較高;非編碼鍵盤用軟件來實(shí)現(xiàn)識別鍵、編碼轉(zhuǎn)換、去抖等功能,硬件電路簡單,價格便宜。現(xiàn)代微機(jī)系統(tǒng)中廣泛采用非編碼鍵盤。PC鍵盤多采用18行×8列的二維矩陣行列結(jié)構(gòu)。采用行掃描法識別按下的按鍵。2PS/2協(xié)議
PS/2協(xié)議是外設(shè)與主機(jī)之間通信的一種同步雙向串行協(xié)議。在該協(xié)議中主機(jī)擁有較高的優(yōu)先級,在一定條件下可以終止外設(shè)正在進(jìn)行的發(fā)送過程。PS/2協(xié)議采用的傳送數(shù)據(jù)幀的格式為:1位起始位(0)、8位數(shù)據(jù)位、1位奇偶校驗(yàn)位、1位停止位(1)。數(shù)據(jù)發(fā)送時低位在前,高位在后。外設(shè)每收到主機(jī)發(fā)來的1幀數(shù)據(jù),都要緊隨該幀的停止位發(fā)送一個握手位ACK(0)應(yīng)答主機(jī)。然后,外設(shè)還要發(fā)1幀應(yīng)答數(shù)據(jù)(0xF0),表示外設(shè)已經(jīng)完整地接收到了主機(jī)的命令;而主機(jī)則不需發(fā)送握手位,也不需要發(fā)送應(yīng)答幀。
2.1鍵盤到PC鍵盤接口的通信
當(dāng)時鐘線和數(shù)據(jù)線均為高電平時,允許鍵盤發(fā)送數(shù)據(jù),系統(tǒng)將接收數(shù)據(jù);當(dāng)時鐘線被拉為低電平時,表明系統(tǒng)禁止數(shù)據(jù)傳輸。圖1給出了發(fā)送時序,包含1個低電平觸發(fā)的起始位、8位數(shù)據(jù)位、1個奇校驗(yàn)位和1個高電平的結(jié)束位。2.2PC系統(tǒng)到鍵盤的通信協(xié)議
若時鐘線出現(xiàn)高電平,數(shù)據(jù)線出現(xiàn)低電平,表明系統(tǒng)請求發(fā)送,鍵盤準(zhǔn)備產(chǎn)生同步時鐘脈沖串,并接收數(shù)據(jù)。包含了1個低電平觸發(fā)的起始位、8位數(shù)據(jù)位、1個奇校驗(yàn)位、1個應(yīng)答位、1個高電平的結(jié)束位。圖2為時序圖。(1)鍵盤命令及執(zhí)行過程①FFH:復(fù)位鍵盤。系統(tǒng)通過此軟件復(fù)位命令使鍵盤進(jìn)入程序復(fù)位和內(nèi)部自測試,稱為基本保證測試(BAT)。復(fù)位鍵盤的過程如下:a.鍵盤收到FFH后立即回送ACK(FAH)作答;b.鍵盤接口收到ACK后,將鍵盤時鐘和數(shù)據(jù)線置為高電平;c.鍵盤檢測到此狀態(tài)后開始BAT操作;d.如果BAT正確完成,鍵盤發(fā)送AAH以表示結(jié)束,
否則以FDH(或其它任何值)表示診斷有誤。②FEH:重新發(fā)送。當(dāng)系統(tǒng)檢測到從鍵盤送來的任何傳輸錯誤時,它便向鍵盤發(fā)送FEH命令。鍵盤接收到此命令后,將重新送出原來的內(nèi)容。③FDH~F7H:空操作(保留未用)。④F6H:設(shè)置缺省值。此命令使鍵盤所有條件復(fù)位到電源接通時的缺省狀態(tài),鍵盤繼續(xù)掃描。⑤F5H:設(shè)置缺省值和停止鍵盤。此命令使鍵盤所有條件復(fù)位到電源接通時的缺省狀態(tài),并停止鍵盤掃描,等待下一個鍵盤命令。⑥F4H:啟動鍵盤。鍵盤接收到此命令后,用ACK(FAH)作答,清除輸出緩沖器,并啟動鍵盤開始掃描。⑦F3H:設(shè)置拍發(fā)速率和延時參數(shù)。每當(dāng)按下任 一鍵時,鍵盤以拍發(fā)速率連續(xù)送出鍵的接通碼,直到鍵被釋放為止。延時參數(shù)是指按下一鍵后,鍵盤輸出的響應(yīng)時間。
系統(tǒng)缺省設(shè)置:拍發(fā)速率=10個/s±20,延時=500ms±20。
當(dāng)要改變設(shè)置時可以使用F3H命令,并后跟一個字節(jié)的參數(shù)。參數(shù)定義如表1所列。
表1D7D6D5D4D3D2D1D00CBA
計算拍發(fā)速率和響應(yīng)延時的公式如下:
拍發(fā)速率=1/[(8 A)×2B×0.00417](1/s)
響應(yīng)延時=(1 C)×250(ms)注:缺省的延時參數(shù)值為2CH。此命令的執(zhí)行過程如下:a.鍵盤收到F3H命令后,用FAH予以響應(yīng),并停止掃描和等待隨后的參數(shù);b.鍵盤若收到隨后的設(shè)置參數(shù),用另一個ACK響應(yīng),并按其參數(shù)設(shè)置新的拍發(fā)速率和響應(yīng)延時,之后重新開始掃描(若鍵盤原來是開放的);c.鍵盤若收到FAH命令,但無隨后的設(shè)置參數(shù),則鍵盤結(jié)束命令設(shè)置,并保持原來的拍發(fā)速率和響應(yīng)延時,停止掃描。⑧F2H,F(xiàn)1,EFH:保留未用。⑨F0H:設(shè)置鍵盤掃描碼命令。此命令用于設(shè)置鍵盤的掃描碼,后跟參數(shù)指定三種掃描碼的哪一種。鍵盤復(fù)位時,默認(rèn)掃描碼是第二種。⑩EEH:回送命令。此命令用于輔助診斷,要求鍵盤接收到EEH時也要回送EEH予以響應(yīng)。若鍵盤原來是開放的,則繼續(xù)掃描。EDH:置位/復(fù)位LED指示器。鍵盤右上角有三個LED指示器,分別反映Caps、Num和Scroll三個鍵的鎖定情況。參數(shù)字節(jié)如表2所列。
表2D7D3D2D1D0保留1=激勵CapsLED1=激勵NumLED1=激勵ScrollLED
此命令執(zhí)行過程與F3H相似。若命令后跟參數(shù),則按參數(shù)設(shè)定LED狀態(tài)并繼續(xù)掃描。若僅有命令無參數(shù),則不改變LED原狀態(tài),并停止掃描。(2)鍵盤響應(yīng)鍵盤在下列四種情況下都會向鍵盤接口發(fā)送數(shù)據(jù)。①按下任一鍵,鍵盤以拍發(fā)速率向接口發(fā)送鍵盤接通掃描碼。②釋放所按下的鍵,鍵盤發(fā)送斷開掃描碼。③系統(tǒng)向鍵盤發(fā)送鍵盤命令后,鍵盤回送應(yīng)答。④當(dāng)用戶按鍵速度超出鍵盤所能容納的最大鍵個數(shù)時,鍵盤做出響應(yīng)。后三種情況稱為鍵盤響應(yīng)。響應(yīng)字節(jié)有7個,定義如下。
①FEH:重新發(fā)送響應(yīng)。當(dāng)鍵盤收到一個無效的鍵盤命令,或者檢測到奇偶錯的鍵盤命令時,鍵盤回送響應(yīng)字節(jié)為FEH,要求系統(tǒng)重發(fā)鍵盤命令。②FAH:正常應(yīng)答。對任何一個有效的鍵盤命令,鍵盤回送FAH予以響應(yīng)。③00H:超限應(yīng)答。當(dāng)用戶按鍵速度超出鍵盤所能容納的最大鍵符個數(shù)時(16個字節(jié)的緩沖器),鍵盤發(fā)送00H。④FDH:診斷故障應(yīng)答。鍵盤接受軟件復(fù)位命令,執(zhí)行自測試過程中。若檢測到故障,則以FDH應(yīng)答。此時,鍵盤停止掃描并等待下一個鍵盤命令。⑤AAH:診斷正常應(yīng)答。鍵盤在軟件復(fù)位過程中,正常完成BAT測試,以AAH應(yīng)答。⑥FEH:回響命令的應(yīng)答,對鍵盤FEH命令的應(yīng)答。⑦F0H:斷開掃描碼前綴,鍵盤對鍵符按下后釋放的應(yīng)答,第一個字節(jié)為F0H,第二個字節(jié)為接通掃描碼(有幾個鍵例外)。3硬件設(shè)計
PC系列鍵盤采用18行×8列的矩陣行列結(jié)構(gòu)。89C51單片機(jī)有4個8位I/O端口,因此可以采用P0、P2口再加上P3口的2個(P3.6和P3.7)作為行掃描線。P1口作為列輸入線(如果用P0口作列輸入線,必須加上拉電阻)。采用P3.0、P3.1作為數(shù)據(jù)線和時鐘線與PC系統(tǒng)進(jìn)行通信,用P3.2、P3.4、P3.5控制鍵盤上的3個指示燈。硬件原理如圖3所示。
鍵盤與計算機(jī)通過一個五芯(PS/2接口為六芯)插座相接,4個有效引腳的定義分別是電源(VCC)、地(GND)、串行時鐘線(SCK)、串行數(shù)據(jù)線(SIO)。
4軟件設(shè)計①消抖及重鍵處理:通過軟件上延時程序來消除抖動;采用后按鍵優(yōu)先處理,即多鍵同時按下時,只重復(fù)發(fā)送最后按下鍵的掃描碼。②程序包括鍵盤掃描子程序、發(fā)送鍵碼子程序、發(fā)送數(shù)據(jù)子程序、接收命令子程序、定時器1中斷服務(wù)程序、主程序等。鍵盤掃描子程序用于掃描鍵狀態(tài),將被按鍵的位置號存入緩沖器中;發(fā)送鍵碼子程序用于將緩沖區(qū)鍵的接通碼或斷開碼發(fā)送給計算機(jī)鍵盤接口或者存在鍵盤密碼緩沖區(qū)中;發(fā)送數(shù)據(jù)子程序用于將數(shù)據(jù)發(fā)給計算機(jī)鍵盤接口;接收命令子程序用于接收計算機(jī)鍵盤接口發(fā)來的鍵盤命令;定時器1中斷服務(wù)子程序用于給程序中的延時提供標(biāo)準(zhǔn)時鐘,并具有軟件看門狗功能,防止軟件出現(xiàn)死機(jī)現(xiàn)象;主程序用于系統(tǒng)初始化,子程序調(diào)度,鎖定狀態(tài)的顯示等。
圖6發(fā)送緩沖區(qū)鍵碼子程序流程圖
圖4~6是主要軟件模塊的流程圖。單片機(jī)源程序見本刊網(wǎng)絡(luò)補(bǔ)充版(.com)。
5結(jié)論
本文介紹的PC/AT鍵盤具有結(jié)構(gòu)簡單、設(shè)計靈活、安全可靠的特點(diǎn),可用于標(biāo)準(zhǔn)PC和嵌入式PC。本鍵盤可以在標(biāo)準(zhǔn)的鍵盤基礎(chǔ)上進(jìn)行改造,只需換掉原來的控制芯片即可,可節(jié)省設(shè)計成本。單片機(jī)C51編程幾個有用的模塊(1)KeilC51常用功能模塊使用說明
說明
本文檔包括單片機(jī)系統(tǒng)中常用到的時鐘中斷、通訊及鍵盤掃描等模塊(見所附源程序)的說明。這些模塊使用前后臺系統(tǒng)模型。為達(dá)到最大的靈活性,需要在用戶工程中定義config.h文件,在其中定義各模塊可選參數(shù)的設(shè)置,而不是直接更改源代碼。
這些可選內(nèi)容大部分為宏定義,如果不定義宏相應(yīng)的功能在編譯時被屏蔽,不會增加代碼長度。具體可選內(nèi)容見各模塊中的說明。
在Config.h文件中還要包含一個單片機(jī)硬件的資源頭文件。
各模塊使用了定義在Common.h中的一些數(shù)據(jù)類型。如:BIT(bit)BYTE(unsignedchar)等,具體請參見源程序。
時鐘模塊
在單片機(jī)軟件設(shè)計中,時鐘是重要資源,為了充分利用時鐘資源,故設(shè)計本時鐘模塊。本模塊使用定時器0,在完成用戶指定功能的同時,還能夠自動處理一些其它模塊中與時鐘相關(guān)的信息。
時鐘模塊由聲明文件Timer.h以及實(shí)現(xiàn)文件Timer.c組成。
用戶應(yīng)該在Config.h中定義宏TIMER_RELOAD來設(shè)定定時器0的重裝載初值。推薦的定時器0的中斷時間大于1毫秒。
在程序的初始化階段調(diào)用時鐘模塊的初始化函數(shù)InitTimerModule()之后,就可以使用時鐘模塊所以支持的各種功能。具體描述如下:
延時:當(dāng)用戶需要進(jìn)行一定時間的延時時,可以通過調(diào)用Delay()來進(jìn)行,參數(shù)為時鐘中斷的次數(shù)。如時鐘中斷周期為1ms,想進(jìn)行100ms的延時,則可以調(diào)用Delay(100)。
注意:
如果延時的絕對時間小于時鐘中斷的周期,則不能夠用本方法做到延時。
定時:當(dāng)程序中需要使用定時功能時,如等待某外部事件,如果在一定時間內(nèi)發(fā)生則繼續(xù)執(zhí)行,如果在這段時間內(nèi)發(fā)生,則認(rèn)為出現(xiàn)錯誤,轉(zhuǎn)向錯誤處理機(jī)制。
在此推薦一種編程模式,但用戶可以用自己認(rèn)為更合理的方式處理此類問題。
這里簡單說明一下關(guān)于阻塞式函數(shù)及非阻塞式函數(shù)。簡單說,阻塞式函數(shù)就是當(dāng)檢測完成條件,如果不能夠完成則等待,如:
voidCheckSomething()
{
//gbitSuccessFlagisaglobalvariable
while(gbitSuccessFlag==FALSE)
{
//donothingbutwaiting
}
}
可以看到,當(dāng)bitSuccessFlag沒有被設(shè)置為TRUE時,函數(shù)保持等待狀態(tài)不返回,這樣就是阻塞式的函數(shù)。
另外一種情況:
BITCheckSomething()
{
if(gbitSuccessFlag==TRUE)
{
//…
returnTRUE;
}
returnFALSE;
}
在這里,如果所檢測的事件有沒有完成,函數(shù)進(jìn)行檢測之后,立刻返回, 通過返回值報告完成情況,如果沒有完成,則等待調(diào)用者分配再次執(zhí)行的機(jī)會。這樣的函數(shù)就是非阻塞函數(shù)。
在應(yīng)用定時功能時,首先要將檢測函數(shù)定義成非阻塞函數(shù)。如上面的第二個版本的CheckSomething。
然后下面模式:
BITbitDone=FALSE;
ResetClock();//cleartimerinterrupttimescounter
while(GetClock()
{
if(CheckSomething()==TRUE)
{
bitDone=TRUE;
break;
}
}
if(bitDone==FALSE)
{
//processtimeout
}
或者簡單寫成:
BITbitDone=FALSE;
ResetClock();
while(GetClock()=(z))
當(dāng)然,用戶也可以將IsPackageHeader和IsPackageTailer定義成為函數(shù),通過BIT類型的返回值來向調(diào)用者提供與相應(yīng)宏相同的信息。
另一種辦法需要在Config.h文件中定義宏SCOMM_ComplexPackageFormat。(需要注意的是,不能夠同時定義SCOMM_SimplePackageFormat和SCOMM_ComplexPackageFormat宏,否則會造成嚴(yán)重的不可預(yù)見性錯誤。
這時需要提供回調(diào)函數(shù)QueryPackageFormat,原形如下:
BYTEQueryPackageFormat(BYTEbyData,BYTEbyCount,BYTEbyParam);
函數(shù)中三個參數(shù)的含義與使用簡單數(shù)據(jù)包格式時判斷數(shù)據(jù)包尾的宏的參數(shù)相同。
函數(shù)通過返回值來通知作為調(diào)用者的接收函數(shù)對接收到的數(shù)據(jù)如何處理,但目前這種方法僅為需要處理復(fù)雜數(shù)據(jù)包格式時的一種可選方法,但不推薦。用戶如果想使用這種方法可以自己更改接收函數(shù)中相應(yīng)的
#ifdefSCOM_ComplexPackageFormat
#endif//SCOMM_ComplexPackageFormat
預(yù)編譯指令之間的內(nèi)容。
例如指定QueryPackageFormat的返回值的含義:
0:繼續(xù)找數(shù)據(jù)包頭或繼續(xù)找數(shù)據(jù)包尾。
1:找到數(shù)據(jù)包頭。
2:找到數(shù)據(jù)包尾。
3:數(shù)據(jù)包出錯,需要拋棄。
然后更改源代碼來實(shí)現(xiàn)上面的協(xié)議。
注意:當(dāng)用戶需要使用字符串的時候,可以利用簡單的包裝函數(shù)將字符串轉(zhuǎn)換為字節(jié)數(shù)組。所以沒有必要提供專用的字符串處理函數(shù)。
鍵盤掃描模塊
鍵盤掃描模塊有兩種工作方式,一種為自動的由時鐘模塊調(diào)用,另一種是由程序員自行調(diào)用。
1)由時鐘模塊自動調(diào)用的方式
將時鐘模塊實(shí)現(xiàn)文件(Timer.h)及鍵盤掃描模塊的實(shí)現(xiàn)文件(KBScan。c)包含進(jìn)工程,在Config.h文件中添加TIMER_KBSCANDELAY宏。時鐘模塊自動對時鐘中斷進(jìn)行計數(shù),當(dāng)達(dá)到TIMER_KBSCANDELAY宏所定義的值后,自動調(diào)用鍵盤掃描模塊中的函數(shù)KBScanProcess()進(jìn)行鍵盤掃描,也就是說,這個宏的值可以決定按鍵消抖動的時間。
用戶應(yīng)該提供兩個回調(diào)函數(shù)OnKBScan()及OnKeysPressed()。在函數(shù)OnKBScan中進(jìn)行鍵盤掃描,并返回掃描碼。掃描碼的類型缺省為BYTE,當(dāng)鍵盤規(guī)模較大時,BYTE不能夠完全包含鍵盤信息時,可在Config.h文件中重定義宏KBvalue,如下:
#defineKBvalueWORD
這樣,就可以使用16位的鍵盤掃描碼,如果此時還達(dá)不到要求,可以將鍵盤掃描碼定義成一個結(jié)構(gòu),但這樣做將會增加代碼量及消耗更多的RAM資源,故不推薦。
掃描模塊調(diào)用OnKBScan取得掃描碼,并調(diào)用用戶可以重定義的宏IsNoKeyPressed來判斷是否有鍵按下,缺省的IsNoKeyPressed實(shí)現(xiàn)如下:
#defineIsNoKeyPressed(x)((x)==0x00)
即認(rèn)為OnKBScan返回0掃描碼時為沒有鍵按下,如果掃描函數(shù)返回其它非零掃描碼做為無鍵按下的掃描碼時,可以在Config.h文件中重定義IsNoKeyPressed宏的實(shí)現(xiàn)。
8位鍵盤掃描碼(缺省值)時,相應(yīng)的掃描函數(shù)為:
BYTEOnKBScan()
當(dāng)掃描模塊經(jīng)過軟件消抖動之后,發(fā)現(xiàn)有鍵按下,就會調(diào)用另一個回調(diào)函數(shù)OnKeysPressed。函數(shù)的聲明應(yīng)該如下:
voidOnKeyPressed(BYTEbyKBvalue,BYTEbyState)
其中中的參數(shù)byKBvalue的類型為BYTE,此為缺省值,如果使用其它類型的掃描碼,就將此參數(shù)變?yōu)橄鄳?yīng)類型。這個值由OnKBScan返回。另一個參數(shù)byState在通常情況下為零。但當(dāng)用戶在Config.h中定義宏KBSCAN_BRUSTCOUNT,同時鍵盤上的某鍵被按住不放時,掃描模塊對它自己的調(diào)用(注意這里和TIMER_KBSCANDELAY宏不同,TIMER_KBSCANDELAY是時鐘中斷足夠的次數(shù)后調(diào)用掃描模塊,而KBSCAN_BRUSHCOUNT為掃描模塊自身的被調(diào)用次數(shù))進(jìn)行計數(shù),當(dāng)達(dá)到KBSCAN_BRUSTCOUNT時,掃描模塊調(diào)用OnKeysPressed,此時第一個參數(shù)的含義不變,而byState變成1,同時計數(shù)器復(fù)位,又經(jīng)過一段時間后,用值為3的byState調(diào)用OnKeysPressed。這樣就可以很方便的實(shí)現(xiàn)多功能鍵或者檢測某鍵的長時間被按下。
2)由用戶自行調(diào)用
由用戶自行在程序中調(diào)用掃描模塊,而不是由時鐘中斷自行調(diào)用。其它與方式1相同。
注意:
1)函數(shù)KBScanProcess為非阻塞函數(shù),它將在很快的時間內(nèi)返回,等待再次分配給它執(zhí)行的機(jī)會。
2)函數(shù)KBScanProcess是在時鐘中斷外部運(yùn)行的,它的過程可以被任何中斷打斷,但不影響系統(tǒng)運(yùn)行。
3)byState的最大值為250,之后被復(fù)位為零。應(yīng)用舉例
現(xiàn)在來舉例說明上述幾個模塊的使用方法。
硬件環(huán)境描述:
為了控制一盞燈,需要單片機(jī)提供一個做控制功能的開關(guān)量,這里不描述外部接口電路,只說明當(dāng)單片機(jī)的P10腳為高電平時,燈滅,當(dāng)P10腳為低電平時,燈亮。
可以通過計算機(jī)由串口發(fā)送命令來控制,或通過一個按鍵(pushbutton不是自鎖式的按鍵)來手動控制(按鍵接在P11腳上,當(dāng)鍵沒有按下時,P11電平為高,鍵按下時,引腳電平被接低),當(dāng)使用按鍵手動控制的時候,需要給計算機(jī)發(fā)送通知。
設(shè)定串口通訊指令如下:
數(shù)據(jù)包由0xff做包頭,4個字節(jié)長,第二個字節(jié)為命令代碼,第三個字節(jié)為數(shù)據(jù),最后一個字節(jié)為校驗(yàn)位。
命令和數(shù)據(jù)代碼有如下組合:
(計算機(jī)發(fā)給單片機(jī))
0x100x01:計算機(jī)控制燈亮。(數(shù)據(jù)位是非零值即可)
0x100x00:計算機(jī)控制燈滅。
(單片機(jī)發(fā)給計算機(jī))
0x110x01:單片機(jī)正常執(zhí)行控制指令,返回。(數(shù)據(jù)位是非零值即可)
0x110x00:單片機(jī)不能夠正常執(zhí)行控制指令,或控制指令錯(不明含義的數(shù)據(jù)包或校驗(yàn)錯等)。
0x120x01:手動控制燈亮。(數(shù)據(jù)位是非零值即可)
0x120x00:手動控制燈滅。
建立工程:
在硬盤上建立文件夾Projects,在Projects下建立Common文件夾及Example文件夾。將各模塊的頭文件及實(shí)現(xiàn)文件拷貝到Common文件夾下(推薦使用這樣的文件組織結(jié)構(gòu),其它工程也可以建立在Projects下,各工程共享Common文件夾中的代碼)。
啟動KeilC的IDE,在Example下建立新工程,將各模塊的實(shí)現(xiàn)文件包含進(jìn)工程。
在Example文件夾下建立Output文件夾,更改工程設(shè)置,將Output作為輸出文件和List文件的輸出文件夾(推薦使用這樣的結(jié)構(gòu), 當(dāng)保存工程文件時,可以簡單的刪除Output文件夾中的內(nèi)容而不會誤刪有用的工程文件)。
建立工程配置頭文件Config.h及工程主文件Example.c,并將Exmaple.c文件加入工程。
輸入代碼:
代碼的具體編寫過程略。下面是最后的Config.h文件及Example.c文件。
//
//file:onfig.h
//
#ifndef_CONFIG_H_
#define_CONFIG_H_
#include//使用AT89C52做控制
#include“../Common/Common.h”//使用自定義的數(shù)據(jù)類型
#defineTIMER_RELOAD922//11.0592MHz晶振,1ms中斷周期
#defineTIMER_KBSCANDELAY40//40ms重檢測按鍵狀態(tài),即40ms消抖
#defineSCOMM_AsyncInterface//使用異步通訊服務(wù)
#defineIsPackageHeader(x)((x)==0xff)//判斷包頭是不是0xff
#defineIsPackageTailer(x,y,z)((y)<=(z))//判斷包的長度是不是足夠
#endif//_CONFIG_H_
//
//file:xample.c
//
#include
#include“../Common/Common.h”
#include“../Common/Timer.h”
#include“../Common/Scomm.h”
#include“../Common/KBScan.h”
BITgbitLampState=1;//燈的狀態(tài),缺省為off
staticvoidInitialize()
{
InitTimerModule();//初始化時鐘模塊
InitSCommModule(0xfd,TRUE);//初始化通訊模塊,11.0592MHz晶振,
//波特率為19200
EA=1;//開中斷
}
voidmain()
{
Initialize();//初始化
while(TRUE)//主循環(huán)
{
ImpTimerService();//實(shí)現(xiàn)時鐘中斷服務(wù),如鍵盤掃描
AsyncRecePackage(4);//接收4個字節(jié)長的數(shù)據(jù)包
}
}
//在中斷外部響應(yīng)時鐘中斷事件
voidOnTimerEvent()
{
//donothing
}
//控制外部燈
staticvoidTriggerLamp(BITbEnable)
{
P10=~bEnable;//需要反相控制
}
//鍵掃描回調(diào)函數(shù)
BYTEKBScan()
{
BITb;
P11=1;//讀之前拉高引腳電平
b=P11;//讀入引腳狀態(tài)
return~b;//數(shù)據(jù)反相做掃描碼
}
//計算校驗(yàn)和
staticBYTECalcCheckSum(BYTE*pbyBuf,BYTEbyLen)
{
BYTEby,bySum=0;
for(by=0;by
return0–bySum;
}
//接收到鍵盤消息回調(diào)函數(shù)
voidOnKeyPressed(BYTEbyvalue,BYTEbyState)
{
BYTEby[4];
if(byState==0)
{
switch(byvalue)
{
case0x01:
gbitLampState=~gbitLampState;//燈狀態(tài)取反
TriggerLamp(gbitLampState);//執(zhí)行控制
by[0]=0xff;//構(gòu)造數(shù)據(jù)包
by[1]=0x12;
by[2]=(BYTE)gbitLampState;
by[3]=CalcCheckSum(by,3);//求校驗(yàn)和
SendPackage(by,4);//發(fā)送數(shù)據(jù)包
break;
//處理其它掃描碼
default:
break;
}
}
//接收到數(shù)據(jù)包回調(diào)函數(shù)
voidOnRecePackage(BYTE*pbyBuf,BYTEbyBufLen)
{
BYTEby[4];
by[0]=0xff;
by[1]=0x11;
if(byBufLen!=4||pbyBuf[3]!=CalcCheckSum(pbyBuf,3))
{
by[2]=0;
by[3]=CalcCheckSum(by,3);
SendPackage(by,4);//處理長度或校驗(yàn)和不正確
}
switch(pbyBuf[1])
{
case0x10:
gbitLampState=(BIT)pbyBuf[2];
TriggerLamp(gbitLampState);
by[2]=1;
by[3]=CalcCheckSum(by,3);
SendPackage(by,4);//發(fā)送成功執(zhí)行通知
break;
default://不知道的命令
by[2]=0;
by[3]=CalcCheckSum(by,3);
SendPackage(by,4);//發(fā)送沒有成功執(zhí)行通知
break;
關(guān)鍵詞:單片機(jī) 教學(xué)改革 培養(yǎng)能力
一、引言
單片機(jī)在現(xiàn)代電子系統(tǒng)智能化中扮演著至關(guān)重要的角色。無論是現(xiàn)代工業(yè)、農(nóng)業(yè)及生活領(lǐng)域,還是尖端科技等諸多領(lǐng)域,都離不開單片機(jī),其應(yīng)用率和普及率是其他類型的計算機(jī)不能比擬的。單片機(jī)技術(shù)被廣泛地應(yīng)用在智能儀器儀表、機(jī)電一體化產(chǎn)品、實(shí)時工業(yè)控制、分布系統(tǒng)的前端模塊、家用電器、醫(yī)療和軍事等領(lǐng)域。所以單片機(jī)原理與應(yīng)用是電子、自動化等專業(yè)的一門必修課。單片機(jī)原理與應(yīng)用是電氣信息類、自動化類、機(jī)電設(shè)備類、計算機(jī)類及儀器儀表類等專業(yè)的專業(yè)基礎(chǔ)課或?qū)I(yè)課。單片機(jī)教學(xué)的改革就是使學(xué)生將學(xué)到的單片機(jī)理論知識轉(zhuǎn)化為適應(yīng)就業(yè)和工作需要的實(shí)際能力。
二、改革單片機(jī)原理及應(yīng)用教學(xué)的意義
(一)單片機(jī)原理及應(yīng)用教學(xué)存在的問題
傳統(tǒng)的理論教學(xué)是按教材編寫的順序,先講單片機(jī)的硬件基礎(chǔ)知識,然后講指令系統(tǒng)、匯編語言編程,接著是講接口技術(shù),教學(xué)形式和手段單一、方法簡單呆板。在教學(xué)中,學(xué)生普遍反映單片機(jī)概念多、太抽象、難入門、指令太難記。學(xué)生感到枯燥乏味,學(xué)習(xí)難度很大,課堂教學(xué)效果不夠理想。
傳統(tǒng)實(shí)訓(xùn)課則以教師為中心,基本都是教師先進(jìn)行講解、示范,然后學(xué)生開始實(shí)操訓(xùn)練,學(xué)生模仿教師按實(shí)訓(xùn)步驟操作實(shí)訓(xùn)項(xiàng)目。在這個過程中,教師巡回查看輔導(dǎo)學(xué)生。實(shí)訓(xùn)考核則是操作一個操作過的題目,教師要據(jù)學(xué)生實(shí)訓(xùn)項(xiàng)目完成的結(jié)果和所用的時間給出學(xué)生實(shí)訓(xùn)實(shí)操考核成績。用一個模式,完全按照指導(dǎo)書上規(guī)定的步驟做相同的實(shí)訓(xùn)。學(xué)生感到學(xué)習(xí)內(nèi)容枯燥無味,沒有興趣。學(xué)生的學(xué)習(xí)積極性和教師的授課積極性都受到極大的挫傷。
(二)改革單片機(jī)原理及應(yīng)用教學(xué)的意義
針對單片機(jī)原理應(yīng)用教學(xué)存在的問題,要對單片機(jī)原理及應(yīng)用教學(xué)進(jìn)行改革,培養(yǎng)學(xué)生學(xué)習(xí)單片機(jī)原理及應(yīng)用課程的興趣,著重培養(yǎng)學(xué)生的學(xué)習(xí)能力、綜合運(yùn)用知識的能力、動手能力和創(chuàng)新能力,培養(yǎng)高技能人才。
三、單片機(jī)原理及應(yīng)用理論教學(xué)改革
(一)單片機(jī)原理及應(yīng)用理論課中,引入案例教學(xué)
本著“理論夠用”就可以的原則,把夠用的理論優(yōu)化整合到一個個案例中,案例中包含的理論由簡到難,符合理論掌握的邏輯順序,使“死”的大量的理論內(nèi)容分散活化到每一個實(shí)際案例中。在應(yīng)用中學(xué)習(xí)理論,理論因運(yùn)用的具體而不再抽象,每個案例中學(xué)到的理論數(shù)量適中、遷移和內(nèi)化的程度高,解決了單片機(jī)概念多、太抽象、難入門、指令太難記憶等問題。
案例教學(xué)有利于培養(yǎng)學(xué)生學(xué)習(xí)單片機(jī)原理及應(yīng)用的興趣,一個個案例生動具體,給學(xué)生展示單片機(jī)應(yīng)用的廣闊前景,使學(xué)生對學(xué)習(xí)單片機(jī)原理及應(yīng)用產(chǎn)生濃厚興趣。學(xué)生在學(xué)習(xí)抽象內(nèi)容之前,教師可以通過案例給學(xué)生介紹單片機(jī)無比優(yōu)越的性價比,并且應(yīng)用大量的事例說明單片機(jī)的應(yīng)用無所不在。將抽象的教學(xué)內(nèi)容與這些生動的現(xiàn)實(shí)應(yīng)用實(shí)例相結(jié)合,給學(xué)生一個能看到、能聽到、能摸著的學(xué)習(xí)目標(biāo),提高了學(xué)生學(xué)習(xí)單片機(jī)原理及應(yīng)用的興趣。
案例教學(xué)有利于培養(yǎng)學(xué)生學(xué)習(xí)單片機(jī)原理應(yīng)用的積極性。案例教學(xué)過程中,可以滲透就業(yè)熱點(diǎn)介紹,使學(xué)生認(rèn)識到單片機(jī)從低端應(yīng)用到高端應(yīng)用都有廣闊前景。學(xué)好單片機(jī)原理及應(yīng)用既能為低端應(yīng)用打好基礎(chǔ),又能為高端處理器的學(xué)習(xí)做好準(zhǔn)備。如此,使學(xué)生把學(xué)習(xí)單片機(jī)原理及應(yīng)用與自己的就業(yè)前景結(jié)合起來,學(xué)生學(xué)習(xí)積極性得到調(diào)動。
單片機(jī)原理及應(yīng)用理論課教學(xué)中,使用案例教學(xué),能縮短理論與實(shí)踐的距離,培養(yǎng)學(xué)生綜合運(yùn)用知識、解決實(shí)際問題的能力。不少學(xué)生都反映,在理論課上學(xué)到的理論知識,到實(shí)踐中不知道怎么使用,怎么入手。其原因就是沒有把理論與實(shí)際相結(jié)合好,使用案例進(jìn)行理論教學(xué),使學(xué)生接觸到了與實(shí)際應(yīng)用相近的案例,可以縮短學(xué)生學(xué)習(xí)時間。比如,以一個完整的項(xiàng)目開發(fā)為案例,介紹交通信號燈控制系統(tǒng),這樣增強(qiáng)了趣味性,學(xué)生也很容易接受,而且可以促進(jìn)學(xué)生思維發(fā)展,實(shí)現(xiàn)分析、反思、體驗(yàn)和感悟。當(dāng)其領(lǐng)悟后,就能模仿,也會舉一反三。
(二)單片機(jī)原理及應(yīng)用理論課中,豐富教學(xué)手段
學(xué)生覺得單片機(jī)原理及應(yīng)用難學(xué)抽象,很大一部分原因,是傳統(tǒng)教學(xué)的講授加板書,無法為學(xué)生展示單片機(jī)內(nèi)部數(shù)據(jù)動態(tài)流動的過程和圖景。學(xué)生腦海中形不成單片機(jī)內(nèi)部數(shù)據(jù)動態(tài)流動的過程和圖景,產(chǎn)生了極大的困惑。制作生動形象的多媒體課件可以解決這個問題,利用多媒體課件把單片機(jī)中難懂的尋址方式指令舉例和有代表性的指令,做成動畫準(zhǔn)確生動呈現(xiàn)出其數(shù)據(jù)流動的完整過程,學(xué)生瞬間就理解了尋址方式和典型指令,并且迅速發(fā)展了學(xué)生的形象思維能力、抽象思維能力和舉一反三的能力。
單片機(jī)原理及應(yīng)用課程信息量大,要求授課容量大,制作生動形象的多媒體課件可以滿足這一要求,利用多媒體課件授課,節(jié)省了板書和大量的畫圖時間,可以在有限的課時內(nèi)講深、講透課程內(nèi)容;利用多媒體課件演示,可以隨機(jī)重復(fù),前后可以隨意翻看的特點(diǎn),便于突出重點(diǎn)、突破難點(diǎn)。實(shí)踐表明,將傳統(tǒng)教學(xué)的講授加板書與計算機(jī)輔助教學(xué)手段相結(jié)合,豐富了教學(xué)手段,提高了教學(xué)效率,激發(fā)了學(xué)生學(xué)習(xí)的積極性和主動性,收到了良好的教學(xué)效果。
四、單片機(jī)原理及應(yīng)用實(shí)踐教學(xué)改革
(一)單片機(jī)原理及應(yīng)用實(shí)訓(xùn)課中,多開發(fā)趣味實(shí)訓(xùn)項(xiàng)目
利用單片機(jī)編程可以實(shí)現(xiàn)許多電子電路,這是非常有趣的。例如,利用位操作指令可以實(shí)現(xiàn)各種門電路和組合邏輯電路;利用循環(huán)或定時器能實(shí)現(xiàn)軟延時;利用定時器可以實(shí)現(xiàn)各種矩形脈沖發(fā)生器,這些都可以從示波器上觀察到有趣的結(jié)果。這些實(shí)訓(xùn)項(xiàng)目可以激發(fā)學(xué)生的學(xué)習(xí)興趣,調(diào)動學(xué)生的學(xué)習(xí)積極性和主動性。
(二)單片機(jī)原理及應(yīng)用實(shí)訓(xùn)課中,引入模塊化教學(xué)
把實(shí)踐教學(xué)內(nèi)容優(yōu)化整合成若干個模塊,每個模塊中包含的知識點(diǎn)和技能又可分解到若干個實(shí)訓(xùn)題目中,例如燈光控制模塊,包含了閃燈控制、排燈控制、轉(zhuǎn)燈控制、流水燈控制、交通信號燈控制。每個模塊的教學(xué)又可分成三個層次,對學(xué)生來說就是三個層面的學(xué)習(xí),即模仿學(xué)習(xí)、舉一反三和創(chuàng)新。就拿燈光控制模塊來說,直接按照實(shí)訓(xùn)指導(dǎo)書上的程序進(jìn)行實(shí)訓(xùn)就是模仿學(xué)習(xí),在此基礎(chǔ)上對指導(dǎo)書上的程序進(jìn)行改編實(shí)現(xiàn)延時和燈光花樣的變化是舉一反三,最后編制一個全新的燈光控制程序?qū)崿F(xiàn)創(chuàng)新設(shè)計。這樣的學(xué)習(xí)符合學(xué)生的思維發(fā)展規(guī)律,使其發(fā)揮主觀能動性及創(chuàng)造性思維,有效培養(yǎng)了學(xué)生的學(xué)習(xí)能力,綜合運(yùn)用知識解決實(shí)際問題的能力和創(chuàng)新能力。
五、小結(jié)
單片機(jī)原理及應(yīng)用理論教學(xué)和實(shí)踐教學(xué)手段和方法很多,這里從個人教學(xué)改革心得出發(fā)探討了幾個做法。在今后的教學(xué)改革中只要不斷改進(jìn)教學(xué)方法, 使用各種教學(xué)手段,激發(fā)學(xué)生的學(xué)習(xí)興趣,注重學(xué)習(xí)能力的培養(yǎng)和綜合運(yùn)用知識解決實(shí)際問題的能力的培養(yǎng),就能獲得良好的教學(xué)效果。但要深入教學(xué)改革,還需要不斷努力和探索。
參考文獻(xiàn):
[1]周紹平.單片機(jī)教學(xué)改革的實(shí)踐與思考.揚(yáng)州職業(yè)大學(xué)學(xué)報,2004,8(2):60~62
[2]廖平.單片機(jī)實(shí)驗(yàn)教學(xué)的改革.實(shí)驗(yàn)室研究與探索,2004(7):36~38
[3]陳 亮.單片機(jī)課程的教學(xué)改革.實(shí)驗(yàn)室研究與探索,2008(9):121~123
[4]徐海黎,劉明.單片機(jī)課程教學(xué)的改革.南通大學(xué)學(xué)報(教育科學(xué)版),2005(4):96~97