首頁 > 文章中心 > 單片機原理

      單片機原理

      前言:想要寫出一篇令人眼前一亮的文章嗎?我們特意為您整理了5篇單片機原理范文,相信會為您的寫作帶來幫助,發現更多的寫作思路和靈感。

      單片機原理

      單片機原理范文第1篇

      一、背景

      單片機原理與應用”是一門電子類專業的核心課程,對于基礎薄弱的中職學生來說,這門課程的學習難度比較大。究其原因,一方面由于中職學生起點低、基礎知識較差;另一方面,當前單片機課程現有的教材教學內容獨立化、模塊化,各塊之間缺乏有機聯系,造成了學生難學、教師難教的局面,以至于全部內容學完時,學生對一個完整的單片機開發過程還缺乏了解,這樣培養出的學生無法適應企業的需求。所以我們提出:以一個較為具體的涵蓋知識點全面的典型項目為引領,在完成這個項目的過程中,學生學會并能運用相關單片機知識,練就了技能。該典型項目就是wifi小車的開發。

      二、課程項目設計和實施

      1、走訪企業,明確課程定位。為了更好的培養適合企業需求的學生,我們特地走訪了當地多個單片機產品生產與研發的相關企業,對企業崗位職業能力與工作過程進行調研,了解企業對人才的需求;與企業一線技術人員共同商討如何選取合適的工程項目作為教學載體,確定教學任務與內容;回訪了大量的畢業學生,與在企業一線從事單片機相關電子產品生產和研發的畢業生進行交流,聽取畢業生對本課程教學的反饋意見,以他們的親身經歷和切身體會幫助我們發現教學體系中存在的問題,對我們的教學實施提出合理的修改意見。

      2、確定課程項目設計的總體思路。在和行業企業的深入交流過程中,我們發現企業在單片機應用產品的研發和生產上有其典型的工作過程。如下圖所示:

      我們仔細分析了這個過程,結合畢業生的反饋和在校學生的實際情況,確立了以培養學生在相關企業的單片機產品研發與生產崗位上,完成各項工作任務過程中應具備的職業能力為目標進行教學情境設計的思路,具體實現方法為,采用實踐教學,設計一個完整的學生感興趣的單片機產品開發項目,將所有的學習內容貫穿于項目中,分解在多個學習情境中,讓學生既完成了教學內容的學習,又體驗了企業生產的工作過程。

      3、教學項目內容的選取。教學項目內容選擇的合適與否是關系到教學效果好壞的關鍵,本著以提高學生的職業崗位能力與職業素養為目標,我們從多個環節進行了精心思考,挑選教學項目內容。

      我們選取了具有典型工作任務的“wifi小車制作項目”作為教學內容的載體。該wifi小車以單片機作為控制核心,包括運動模塊(電機)、顯示模塊、遙控模塊以及各種傳感與轉換模塊等。針對wifi 小車各功能部分的實現,設計出不同的學習情境,訓練學生分析和設計單片機應用程序的基本技能。

      Wifi小車的功能設計具有很強的擴展性,這主要取決與它具有的功能、性能和控制方法,功能越多,所需的技術與器件種類就越多;性能越好,對應的技術含量也越高;控制方法越多控制電路也就越復雜。例如顯示模塊可以選擇led或數碼管,也可以選擇字符液晶或者圖形液晶顯示;控制方式可以選擇遙控也可以加入聲控等,所以選擇wifi小車作為教學項目具有很好的可選性與擴展性。

      本項目分為4個學習情境,整個情境的實施是按照學習的認知規律、職業成長規律,從簡單到復雜,從局部到整體進行學習單片機知識、訓練職業崗位能力。

      總體上采取知識由淺入深、技術逐漸綜合的原則。由一個綜合單片機產品制作項目――制作單片機wifi小車,按照不同的功能模塊分解成4個學習情境(見下圖),①小車零部件的選擇和裝配②小車的顯示系統③小車的運動控制系統④小車智能感應系統, 如下圖所示,每個學習情境包含可選的子情境。

      每個學習情境均訓練對應的職業能力

      ①、學習情境一訓練學生電子產品裝配基本功,完成要求如下:

      電子元器件的選取與檢測

      小車電路焊接與裝配

      ②、學習情境二訓練學生單片機基礎技術與基礎器件的集成能力,完成如下功能:

      小車的前進、后退、左右轉向及停止運行狀態顯示;

      完成各種動作的計時時間顯示。

      ③、學習情境三訓練學生接口技術與接口器件的集成能力,完成如下功能:

      小車的前進、后退、左右轉向及停止驅動控制;無線遙控。

      ④、學習情境四訓練學生將單片機基礎技術運用、接口技術運用和傳感器等各種技術與器件集成的能力,完成如下功能:

      監測距離,自動避障;

      4、教學方法的使用。通過實踐,我們認識到要提高教學效果必須采用多樣化的教學方法,以學生為主體,以教師為引導。為此我們引入了工作過程與教學方法的對照圖(參考下圖:工作過程學習方法對照圖)。以子情境2中的實訓項目“汽車轉向燈”為例,來具體說明課堂教學實施過程中各種教學方法的使用:首先提出項目要求,明確這個項目做什么,激發學生學習興趣(采用了項目案例激勵教學法),接著引導學生思考,跟老師想(采用項目分析引探法),然后跟老師做,最后學生自己做,自己練,互助學習項目制作(采用協作互助討論法),老師跟蹤檢查,指導,評價(采用項目檢查評價法),課后布置學生對產品功能進行擴展(采用項目制作進階法)。通過這樣的教學過程,讓學生達到了積極思考,樂于實踐、快樂學習、享受成功的學習狀態,培養了學生的職業崗位能力,為以后順利走上工作崗位打下堅實的基礎。

      5、考核方案設計

      考核分為三部分,過程性考核(占分50%)、綜合性考核(占分15%)、結業性考核(占分35%),其中過程性考核考察學生每一個項目情境的完成情況。綜合性考核考察學生對單片機技術的綜合運用能力,強調學生的創新意識,鼓勵學生多使用新技術、新器件。結業性考核安排在期末,采用現場抽題,考察一個項目的完整制作,學生也可提前申請參加開放性考核,考試合格可免除期末結業性考核,也可以參加各類單片機競賽,取得好成績者也可免除結業性考核。

      單片機原理范文第2篇

      關鍵詞:單片機;C8051F;匯編語言;C51

      中圖分類號:G642 文獻標識碼:B

      1引言

      “單片機原理及應用”是計算機科學與技術、通信工程等專業的一門主要專業課程,因單片機在生產實踐中應用廣泛,各高校都將該課程定位在以培養學生動手能力和創新能力的目的上。但長期以來國內高校都以MCS-51為該課程的主講內容,雖然該系列單片機在國內的應用經久不衰,但隨著技術的發展,芯片的生產工藝、功能、運行速度、開發環竟、編程語言等都有了很大的變化,在實際的科研開發中更多選用與MCS-51兼容的高檔單片機,而很少直接選用標準8051單片機,因此傳統的教學內容和知識已經與實際應用脫節,不能滿足需要。根據多年的教學經驗和科研積累,我們對“單片機原理及應用”課程的教學內容、實驗手段、實驗內容、教學方法等進行了更新。兩年多的教學實踐表明,改革后的“單片機原理及應用”很受學生的歡迎,大大提高了學生學習單片機課程的興趣,達到了該課程培養和鍛煉學生動手能力、開發應用系統能力的目的。

      2課程改革

      2.1更新教學內容

      MCS-51單片機及其衍生產品在我國乃至世界范圍都獲得了非常廣泛的應用,尤其是在我國大部分大專院校都采用MCS-51單片機作為教學機型,單片機系統工程師大都熟悉 MCS-51單片機。但隨著一些高集成度、高性能的8位和16位RISC單片機的推出,基于標準8051內核的單片機正面臨著退出市場的境地。因此一些半導體公司開始對傳統8051內核進行大的改造,主要是提高速度和增加片內模擬和數字外設,以期大幅提高單片機的整體性能。

      近年來我們承擔了較多企業委托的單片機應用開發項目,在實際的科研開發中我們也感覺到用標準8051單片機作微控制器不僅需要擴充大量資源,而且編程調試都比較困難,而隨著技術的發展,新一代的單片機芯片已不僅包含微處理器,而且包含應用系統所需的各類外部接口設備,存儲器也從光擦除變為電擦除、可在系統編程的FLASH存儲器,編程語言從匯編語言為主變為以C51語言為主,以JTAG接口構成的JTAG調試器可以進行非侵入式全速在系統調試,比以前的專用在線仿真器(ICE)要方便得多。因此我們在幾個單片機開發項目中都選擇了原美國Cygnal集成產品公司(1999年3月成立的一家新興的半導體公司,專門從事混合信號片上系統單片機的設計與制造,2003年并入Silicon Laboratories公司)推出的C8051F系列產品。C8051F系列單片機是集成混合信號的片上系統(SOC,System Of Chip),與MCS-51兼容的內核CIP-51采用流水線結構,峰值速度可達25MIPS。C8051F具備控制系統所需的模擬和數字外設,包括看門狗(Watchdog)、ADC、DAC、電壓比較器、電壓基準輸出、定時器、PWM、定時器捕捉和方波輸出等,并具備多種總線接口,包括UART、SPI、SMBUS(與I2C兼容)總線以及CAN總線等。C8051F系列單片機采用Flash ROM技術,集成JTAG接口,支持在線編程和調試。C8051F系列單片機的諸多特點和優越性,使其廣受單片機系統設計工程師的青睞,成為很多測控系統設計的首選機型。

      既然實際科研開發中多使用新一代高性能單片機,那么我們的教學內容就應該及時更新,以減少學生工作后的二次學習。為此,2004年課程組在參與編寫機械工業出版社的教材《單片機原理及應用》時專門用一章的篇幅把C8051F寫了進去。后來我們發現僅僅用一章內容講C8051F,教學內容的改革還不徹底,因此2006年我們又對教學內容進行了徹底改革,編寫了以C8051F為教學機型的教材《C8051F單片機原理及應用》,由中國電力出版社出版,教材除了更新了教學機型外,編程語言也從匯編語言改成以C51語言為主,兼顧匯編語言的形式。我們編寫該教材的時候國內還基本上沒有同類教材,目前已經有了一些,這說明國內高校已經在注重單片機課程教學內容的改革。在多屆學生中的使用實踐表明,內容更新后的教材很受學生的歡迎。

      2.2更新實驗手段

      以MCS-51為主講機型的單片機課程的實驗模式多采用PC機+仿真器+目標實驗臺的方法,我校選用了臺灣MICETEK公司Easyscope8052F單片機仿真器,這種仿真器專門仿真51系列單片機,采用Windows環境的仿真軟件,價格低,性能好。綜合實驗板選用改造后的復旦大學教學儀器廠的產品,與PC機連接構成的單片機開發系統結構如圖1所示。

      傳統采用仿真器的實驗模式雖然能滿足學生實驗、課程設計之用,但SOC型單片機出現后,實驗模式可以更加逼近實際開發應用的形式,根據原有單片機實驗系統的使用經驗,2003年我們提出了一個新的單片機實驗系統方案,與新華龍電子有限公司合作,設計出NCD-CIP51F020系統實驗設備,該系統由SOC單片機集成開發環境(IDE)、可用于以太網測控的NMC-20XX核心模塊、系統實驗板三部分組成,應用該設備可完成單片機系統的許多典型應用實驗,并可做較復雜的應用系統實驗,如高速數據采集、嵌入式Web實驗等。片內JTAG調試電路允許對安裝在最終應用系統上的產品進行全速、非侵入式(不占用系統資源)、在系統調試。該調試系統支持觀察和修改存儲器和寄存器,支持斷點、觀察點、單步及運行和停機命令。使用JTAG調試時,所有模擬和數字外設都可以全功能運行。Silicon Laboratories提供的集成開發環境包括編輯器、宏匯編器、調試器與編程器,同時也支持第三方提供的匯編器和C51編譯器(如Keil等)。采用SOC單片機JTAG接口的先進調試環境如圖2所示。

      2.3更新教學方法

      我們除了注重教學內容的更新,使學生學到最新最實用的知識外,還注重教學手段和方法的改革與研究。

      首先,課程組注重現代先進教育手段的應用。C8051F單片機的內部資源豐富、原理復雜,因此新課程的內容要遠比傳統的MCS-51多且增加了大量復雜的圖、表,傳統的板書式教學難以勝任,所以在課時量不可能增加的情況下,先進的多媒體教學方法成為必然。其實課程組早在2003年就開始用多媒體方式講授該課程,教學內容更新后課程組重新制作了該課程的多媒體課件,課件結構清晰、層次分明、圖文并茂,結合計算機動畫把復雜的內容簡單化、抽象的內容具體化,明顯提高了課堂教學效率。課程組還開發了該課程的教學網站,與課程相關的課件、實驗軟件、參考資料等都放在網上供同學隨時下載或瀏覽,網站也提供了師生交流的平臺。

      其次,課程組注重教學方法的研究與改革。在多年的計算機硬件課程教學中我們發現,由于內容枯燥、知識面廣等原因,學生對計算機硬件課程的學習興趣大大降低,甚至有些硬件選修課程因為選修的人數太少而開不出來。這種學習中喜軟怕硬的現象必須引起重視,否則培養出來的學生很難滿足用人單位的需要,這也是近年來嵌入式系統方向畢業生比較容易找工作原因的一個方面。教學中我們發現學生并非對所有硬件內容都不感興趣,對有些內容興趣還是比較高的,比如“數字邏輯電路設計”課程中“自動售貨機設計”、“單片機”課程中“日歷時鐘的液晶顯示模塊的設計”等。因此我們設想可以在講解具體內容前先把學生感興趣的問題提出來,然后在解決問題的過程中把相關內容講解清楚,這就是所謂的“案例”法教學。我們設計了部分“案例”在計算機硬件課程中試點,取得了滿意的效果。我們提出的計算機硬件課程“案例”教學法得到江蘇大學2007年校教改重點項目的立項資助,將對計算機硬件課程“案例”教學法進行更深入的研究。

      3結束語

      我校采用SOC型單片機C8051F作為“單片機原理及應用”課程的主講機型,對該課程的教學內容進行了全面更新,已在多屆學生中進行講授,學生對該課程的學習興趣大幅提高,實驗和課程設計質量也比以前有較大改觀。“單片機原理及應用”已經建設成江蘇大學校級精品課程。對計算機硬件課程采用“案例”教學法進行了一些研究,單片機課程的部分內容采用“案例”教學法進行了試點,取得了較好的效果。“案例”教學法是我們近年來在計算機硬件課程上的試點,目前還不成熟,我們將在“案例”開發、課件制作等環節對“案例”教學法進行更深入的研究。

      參考文獻

      單片機原理范文第3篇

      【關鍵詞】單片機;教學;改革

      當今世界,單片機在工業過程控制、智能儀表、計算機集成控制、人工智能、通信設備的智能化方面應用非常廣泛,而且隨著電子和計算機技術的發展,以單片機和各種微處理器為核心必然是實現智能化技術的主流方向。同時,《單片機原理與應用》是高職院校電子、電氣等相關專業最重要的核心課程之一,是一門實踐性、應用性很強的學科,該方向對學生進行畢業設計和就業都起著重要的作用。

      《單片機原理與應用》傳統教學一般包括理論課和實踐課。理論課學生普通反應知識抽象、難學、難懂,學了后面又忘了前面,學生學得吃力,老師教得辛苦。實踐課主要采用驗證性實驗,學生只要連線正確、程序輸入無誤就能看到結果,這樣往往造成學生只關注實驗結果,而忽略了思考過程。學生無法從中提高分析問題、思考問題、解決問題能力,甚至到最后還是無法獨立設計一個簡單的單片機系統,實踐動手能力非常差。這樣的教學方法不能體現單片機實踐性和應用性強的特點,也與社會發展脫軌,因此,《單片機原理與運用》教學改革迫在眉睫。我們總結了以往教學過程中的一些經驗和教訓,提出以下幾點《單片機原理與運用》教學改革的思路和方法。

      1.教學內容選取

      以培養學生具備從事單片機系統設計崗位能力和相關職業群為目標,增強學生實踐動手能力和工程實際運用能力為導向,來選取教學內容。在本課程的開始的時候,介紹單片機的發展現狀,例舉日常生活中單片機控制的設備,把科研項目或往屆畢業設計中的一些應用板帶進課堂,通過圖片、實物展示使學生對單片機有一定的感性認識,激發他們的學習興趣和熱情。

      選取以單片機C語言貫穿各章節,并且是項目化教學形式的教材。C語言可讀性、可維護性和可移植性都比匯編語言好,在實際單片機設計中,基本上都采用C語言。項目教學改變了傳統教材內容安排強調只是系統性為主的思路;把課程教學內容劃分為若干個項目形式來完成,項目又以任務的方式出現,突出體現高職生理論知識“必需、夠用”的原則。

      多增加日常生活常見案例為項目,每個項目又包括幾個任務,通過每個任務的完成過程,使學生學習相應的理論知識。通過常見案例的剖析,引起學生的注意,激發他們的興趣,每個任務完成后,教師進行知識點得總結,這樣學生在實踐動手中不知不覺就掌握的理論知識。比如交通燈控制系統,這一項目可以分成單片機控制單燈亮滅、流水燈控制、定時器控制流水燈、帶時間顯示系統等,其中通過單片機控制單燈亮滅這一任務的設計,學生可以學習單片機結構、I/O口、單片機最小系統等基本知識。通過流水燈控制這一任務,學生可以學習單片機C語言的各種語句等。

      2.教學方法使用

      我們以項目為教學單元,以任務驅動進行教學。我們的教學是在一體化教室實施,只要在一體化教室中通過仿企業的工作環境進行項目化教學,教學過程才能實現真正的教、學、做融為一體,并充分調用學生學習的主動性和創造性。

      每個任務包括任務目標要求、學生知識與能力準備、計劃、實施過程、評估。教師先布置任務,說明這個任務要到達的功能及要求。教師可根據教學內容,制作多媒體課件,將理論知識通過多媒體手段以聲音、圖像、文字等方面表現出來,使枯燥抽象的理論知識變得生動直觀,學生更容易理解。也可以通過Flas演示或Proteus仿真軟件展示任務的運行結果,使學生對任務要求更加清楚。學生分組后,每個小組進行任務設計的討論,并確定設計方案。學生任務實施過程中,教師對學生操作過程中存在的問題進行實時點評,實施后,教師對每組的實施結果進行驗收和評估,最后總結任務實現過程中碰到的普遍問題、知識運用的難點關鍵點。這樣的教學方法能提高學生分析問題、思考問題、解決問題能力,而且通過每個任務的制作,學生積極性提高、自主學習能力和動手能力增強。

      另外,教師可以把多媒體課件、儀器設備電路圖、設備的使用方法、任務要求、本課程相關的學習資料等掛在網上,進行資源共享,供學生查閱學習,通過網絡來提高學生的學習興趣。

      3.加強實踐環節

      實踐環節是《單片機原理與運用》課程的重要環節,通過實踐環節,可以提高學生動手操作能力。我們把實踐環節分成基礎性實踐、開放性實踐、綜合設計實踐三個部分。

      基礎性實踐主要是實現指令練習、基本程序結構編寫,或是一些驗證理論知識準確性的實驗,通過這一環節,學生所學的理論知識得以鞏固。開發性實踐要求學生具有扎實的理論基礎,具有分析問題解決問題的能力,培養學生對常見接口的硬件設計、軟件編程及仿真器下載調試的能力。在綜合設計實踐過程中,教師只提出實驗目的和要求,學生要自主確定設計方案,并設計硬件電路圖、制作電路PCB圖,并在自己做的PCB板上焊接元器件。硬件調試成功后,再把編寫好的程序利用仿真器下載到電路板上,進行調試。這樣,學生熟悉了單片機系統設計的整個過程,他們的實踐動手能力也得到很好的提高。

      除了上面三個實踐環節外,我們還要鼓勵學生參加全國電子設計大賽和大學生創新科技項目,使學生在實踐過程中不斷的學習新知識,提高設計創新能力。

      4.考核方式確定

      傳統的教學模式中,課程考核是由期末閉卷考核占70%,平時表現占30%組成,這樣的考核方式只能一定程度上反應學生理論知識的掌握情況,很難體現學生的分析能力和實踐動手能力,也與單片機課程實踐性強的特點不相符合。

      一個好的考核方法對于學習一門課程至關重要。考核不僅是對教師教學效果的檢驗和學生水平的測試,同時也是學生學習習慣和學習方法的導向。筆者提出的考核方式包括期末考核30%、項目考核50%、平時表現20%。其中平時表現包括出勤表現、作業完成情況。期末考核是對課程基礎知識進行閉卷測試。項目考核是每個項目成績的平均分,每完成一個項目,教師根據學生的工作態度、完成情況、回答問題情況進行評分。每個項目完成后,學生都能看到自己的成果,這樣也調動了學生的學習興趣和學習熱情。這樣的課程考核方式不僅包括基礎知識掌握程度考核,還包括學生的分析、學習、動手、應用等方面能力的考核,能比較客觀的反應學生的學習情況。

      5.總結

      教學改革實施后,課堂氣氛變的更加活躍,學生學習興趣更加濃厚。實踐表明,我們的教學改革方案不僅提高了學生學習積極性、應用能力和動手能力,而且對學生的獨立思考和分析問題、解決問題的能力的提高也起到了很好效果。當然,教學改革是一個無止境的過程,我們還要不斷更新教學觀念,不斷的探索和實踐,來提高教學質量和效果。

      參考文獻

      [1]莫莉,趙悅等.“單片機原理”課程教改探析[J].教育與教學研究,2010(1).

      [2]張培仁,孫占輝等.基于C語言編程MCS-51單片機及應用[M].北京:清華大學出版社,2003.

      [3]歐陽慧平,王茜等.系統化的“單片機應用技術”課程建設與改革[J].教育與職業,2011(2).

      [4]牛分中,宋風娟.高校單片機課程實踐教學的改革與探討[J].教育與職業,2008(21).

      單片機原理范文第4篇

      一、考核知識點:

      1、計算機的數據表示和數據運算

      2、計算機的各種編碼

      3、計算機的組成及工作過程

      二、考核要求:

      1、識記計算機的各種編碼

      2、領會計算機的組成及工作過程

      3、簡明應用計算機的數據表示和數據運算

      第二章51單片機的硬件結構和原理

      一、考核知識點:

      1、單片機的發展史及各方面的應用

      2、51單片機的分類和內部結構

      3、單片機的引腳和功能

      4、單片機工作的時序

      二、考核要求:

      1、識記單片機的發展史及各方面的應用

      2、識記單片機的引腳和功能

      3、領會單片機工作的時序

      4、簡明應用51單片機的分類和內部結構

      第三章51單片機指令系統

      一、考核知識點:

      1、單片機的尋址方式

      2、單片機的指令系統

      3、助記符指令和二進制代碼指令的異同

      二、考核要求:

      1、領會助記符指令和二進制代碼指令的異同

      2、綜合應用單片機的尋址方式

      3、綜合應用單片機的指令系統

      第四章匯編語言程序設計

      一、考核知識點:

      1、偽指令

      2、匯編語言設計技巧

      3、匯編語言到機器語言的編譯過程

      二、考核要求:

      1、領會偽指令

      2、簡明應用匯編語言設計技巧

      3、綜合應用匯編語言到機器語言的編譯過程

      第五章51單片機的中斷系統

      一、考核知識點:

      1、中斷基本概念

      2、中斷系統的程序編制

      3、中斷系統的初步應用

      二、考核要求:

      1、領會中斷基本概念

      2、簡明應用中斷系統解決工程問題

      3、綜合簡明應用中斷系統的程序編制

      第六章51單片機的內部定時器/計數器及串行接口

      一、考核知識點:

      1、單片機內部定時器/計數器的結構及工作原理

      2、定時器/計數器的程序編制

      3、定時器/計數器的初步應用

      4、串行口的基本概念

      5、串行口的程序編制

      6、串行口的初步應用

      二、考核要求:

      1、識記串行口的基本概念

      2、領會單片機內部定時器/計數器的結構及工作原理

      3、簡明應用定時器/計數器解決工程問題

      4、簡明應用串行口的程序編制

      5、簡明應用串行口解決工程問題

      6、綜合應用定時器/計數器的程序編制

      第七章單片機的系統擴展與接口技術

      一、考核知識點:

      1、單片機外部總線的擴展

      2、外部存儲器的擴展

      3、I/O接口的擴展

      4、管理功能部件的擴展

      5、A/D和D/A接口功能的擴展

      二、考核要求:

      1、識記單片機外部總線的擴展

      2、識記管理功能部件的擴展

      3、簡明應用A/D和D/A接口功能的擴展

      4、綜合應用外部存儲器的擴展

      5、綜合應用I/O接口的擴展

      第八章單片機應用系統設計

      一、考核知識點:

      1、單片機應用系統的開發過程

      2、單片機開發工具的分類和使用

      3、單片機應用系統的軟件和硬件調試過程

      二、考核要求:

      1、識記單片機應用系統的軟件和硬件調試過程

      2、領會單片機應用系統的開發過程

      3、領會單片機開發工具的分類和使用

      第九章單片機系統的抗干擾技術

      一、考核知識點:

      1、單片機干擾源與分類

      2、干擾對單片機系統的影響

      3、硬件抗干擾技術

      4、軟件抗干擾技術

      5、數字濾波

      二、考核要求:

      1、識記單片機干擾源與分類

      2、識記干擾對單片機系統的影響

      3、識記數字濾波

      4、簡明應用硬件抗干擾技術

      5、簡明應用軟件抗干擾技術

      第十章其它單片機簡介

      一、考核知識點:

      1、AT89C系列單片機的特點與性能

      2、其它8位單片機的特點與性能

      3、16位、32位單片機的特點與性能

      二、考核要求:

      1、識記其它8位單片機的特點與性能

      2、識記16位、32位單片機的特點與性能

      3、領會AT89C系列單片機的特點與性能

      《單片機原理及應用技術》考試大綱

      《單片機原理及應用技術》課程是一門面向應用的專業技術課。單片機原理與應用介紹了單片機的基本知識和單片機技術的應用,其內容與工程實際緊密聯系,實用性很強,是一門在理論指導下,偏重于實際應用的課程。本課程具有實用性強、理論和實踐結合、軟硬件結合等特點。本課程圍繞使用較為廣泛的MCS-51系列單片機進行學習。本課程已成為理、工科電子類專業的一門基礎課程,這是從電子系統設計角度考慮的,它體現了電子系統設計的方法和硬件結構的變化。通過該課程的學習,要求學生掌握80C51單片機的工作原理、編程技術,掌握單片機應用系統的擴展方法和實際應用。因此,以單片機為內核,分析和設計一個簡單的計算機應用系統是我們學習本課程要達到的目的。

      第一部分考試大綱

      1單片機概述

      本章為單片機的基本概念。

      1.掌握有關單片機的基本概念、單片機的特點、單片機的應用。

      2.理解單片機的總體組成。

      3.了解單片微型計算機的產生、發展歷史、主要品種及系列。

      2單片機結構和原理

      本章以80C51單片機為例介紹了主要硬件結構和主要功能,著重掌握系統所提供的資源特性及其功能特性。

      1.掌握80C51的內部結構。

      2.掌握80C51單片機的存儲器組成。

      3.掌握單片機并行輸入/輸出端口結構及功能。

      4.了解單片機的時序概念和復位工作方式。

      5.掌握單片機引腳功能

      3指令系統

      1.掌握指令與偽指令的正確格式。

      2.掌握七種尋址方式的使用及尋址方式的含義。

      3.掌握

      五類指令的功能和使用,特別是傳送指令。

      4.理解書中所列例題與習題。

      4匯編語言程序設計舉例

      本章為MCS-51的一些常用偽指令,介紹順序結構程序設計、分支結構程序設計、循環結構程序設計和子程序的設計。

      1.程序設計的基本步驟、各種基本的結構化程序設計方法;讀懂較復雜的常用程序。

      2.掌握數據傳送指令的編寫。

      3.理解算術運算程序設計。

      4.理解數碼轉換程序設計。

      5.理解查表程序設計。

      6.理解子程序設計和參數傳遞。

      7.理解邏輯運算程序設計

      5中斷系統

      1.掌握有關中斷、中斷源、中斷優先級等概念。

      2.掌握中斷響應過程。

      3.掌握中斷優先級排列。

      4.掌握中斷允許寄存器IE、中斷優先級寄存器IP各位的含義及設置。

      5.掌握外部中斷的兩種觸發方式:電平觸發、邊沿觸發。

      6定時/計數器

      1.掌握定時器/計數器的四種工作方式及有何不同。

      2.掌握TMOD和TCON中各位的含義、作用。

      4.掌握不同工作方式計數初值與定時時間的關系,即能根據定時時間算出計數初值,完成定時器的初始化編程和簡單應用編程。

      7串行通信

      1.理解有關通信、協議的概念。

      2.理解串行口的四種工作方式。

      3.掌握SBUF的含義及作用。

      4.了解串行口的工作原理。

      5.了解SCON中每一位的含義及SMOD位的作用。

      6.掌握串行通信總線RS-232C標準、RS-232C電平轉換。

      7.了解RS-232C與MCS-51的接口。

      8系統擴展技術

      1.掌握總線、驅動、鎖存和譯碼、地址重疊的概念。

      2.掌握程序存儲器的擴展:EPROM程序存儲器及其擴展方法。

      3.掌握數據存儲器的擴展:靜態存儲器SRAM及其擴展方法。

      4.掌握簡單I/O口的擴展。

      5.掌握8255A可編程并行接口:結構、控制字、工作方式、與8255A的接口方法。

      9A/D和D/A轉換器接口技術

      1.掌握DAC0832與單片機的接口方法與編程。

      2.掌握ADC0809與單片機的接口方法與編程。

      10鍵盤/顯示接口技術

      1.掌握LED顯示器結構、工作原理和顯示方式。

      2.掌握鍵盤接口原理。

      3.理解LED顯示器與80C51單片機接口。

      4.理解鍵輸入程序設計方法。

      5.了解行列式鍵盤與80C51單片機接口。

      11、功率接口技術

      1.掌握簡單開關量接口、光電耦合接口和繼電器接口。

      2.晶閘管與故態繼電器的應用接口。

      12、單片機系統設計技術

      掌握單片機系統的設計、開發、調試的原則、步驟及方法。

      13、實用舉例

      了解一兩個典型的單片機開發應用系統的設計思想和實現方法。

      14、新型單片機介紹

      了解MCS-51常見8位單片機。

      第二部分考試考核改革方案

      一、考試考核要求

      《單片機技術及應用》選擇具有代表性的、使用較為廣泛的MCS-51系列單片機進行學習(具體以80C51為例),介紹了80C51單片機的硬件組成、軟件編程及一般應用系統組成。通過本課程的學習,要求掌握80C51單片機的系統結構、指令系統、程序設計方法、系統擴展方法、單片機常用接口等應用技術。本課程的教學過程由面授輔導、自學、實驗及作業四個環節組成,因此本課程考試考核要求為:

      1.作業、實驗成績與期末考試成績共同評定為課程總成績。

      2.作業、實驗占課程總分的60,期末理論考試占總分的40。

      為使學生不把注意力僅僅放在期末考試上,培養學生系統學習的能力,加強學生各方面能力的培養,平時、實驗課、作業、考試都納入本課程的成績評定。平時的成績包括出勤、課堂提問和隨堂測試。期末考試可以選擇筆試、口試和進行實際實驗、設計等多種形式。

      二、平時成績考核要求及說明

      1.每章作業按要求完成后交教師批改,完成作業80為12分(及格);所有作業均完成,且質量較好者,20分(滿分)。中間情況酌情給分。

      2.每次實驗均能按照教師安排進行,實驗態度好,至少完成5個實驗且實驗報告完整,為18分(及格);能基本獨立完成6個或以上實驗,實驗報告完整、無誤,實驗質量高,30分(滿分)。中間情況酌情給分。如果實驗有創新的特點,酌情加分。

      3.作業與實驗的平均分為平時成績,滿分50分。

      4.課程設計單獨計算成績,考評方法見其大綱。

      三、理論考試說明

      1.單片機技術及應用理論考試,采用閉卷筆試形式,考試時間120分鐘。

      2.期末考試試題根據教學大綱,其范圍和難度按照本方案中制訂的考試考核內容和要求確定。考試命題覆蓋考試大綱要求范圍。

      3.期末考試試題類型有以下幾種:

      ①填空題;

      ②選擇題;

      ③判斷題;

      ④簡答題

      ⑤綜合應用題。

      四、考試考核要求層次

      按照教學大綱的要求,理論考試要求分為掌握、理解和了解三個層次。

      掌握:

      對于本課程的重點內容要求學生達到掌握的程度。即能夠全面、深入理解和熟練掌握所學內容,并能夠用其分析、初步設計和解答與應用相關的問題,能夠舉一反三。要求學生掌握的內容也就是考試的主要內容,在考試中所占比例約70。

      理解:

      對于本課程的一般內容要求學生能夠理解。即要求學生能夠較好地理解所學內容,并且對所涉及的內容能夠進行簡單分析和判斷。要求學生理解的內容也是考試的內容,在考試中所占比例約25。

      了解:

      對于本課程的次要內容要求學生能夠了解。要求學生了解的內容,一般是指在眼下不必進一步深入和擴展,有些也許需要學生自己今后在工作中進行深入研究。對要求了解的內容,在考試中占較小比例,不超過5。

      實驗五:按鍵電路、顯示電路實驗

      一、實驗目的:

      1.掌握獨立式按鍵電路與矩陣式按鍵電路的設計方法。

      2.掌握數碼管顯示電路的工作原理

      3.掌握源程序編輯軟件UltraEdit,編譯軟件KeilC51、仿真軟件Proteus的使用方法

      4.掌握硬件仿真器ME-52A的使用方法

      二、實驗器材:

      1.單片機實驗板

      2.單片機硬件仿真器ME-51A

      3.計算機

      4.電源

      三、實驗要求:

      1.電路如圖5所示,用單片機的P3口所接的四個獨立式按鍵控制p1口流水燈花樣的方法;具體表現為:p3.0、P3.1、P3.2、P3.3四個小按鍵分別實現了四個控制:

      (1)跑燈:即P1.0---1.7亮點流動:

      (2)流水燈:即P1.0-1.7依次點

      亮(3)交叉閃爍:即P0.0,P0.2,P0.4,P0.6和P0.1,P0.3,P0.5,P0.7輪流點亮

      (4)停止;在任何狀態下按此鍵程序停止運行.

      2.電路如圖6所示,用P2口所接的4×4矩陣式鍵盤作為輸入,在P1口所接的數碼管上顯示出每個按鍵的0~F序號,鍵盤的布局如下表所示:

      F

      E

      D

      C

      B

      A

      9

      8

      7

      6

      5

      4

      3

      2

      1

      四、實驗原理:

      1.獨立式按鍵電路顯示如圖5所示,從圖中可看出,判斷有無鍵按下,只要檢測P3.0~P3.3相應端口的高低電平即可,若檢測有某一端口為低電平,表明該端口有按鍵按下,經延時消抖后轉去執行相應的功能子程序。若為高電平,表明無鍵按1.獨立式按鍵電路如圖5所示,下,繼續檢測。

      示例程序如下:

      ORG000H

      LJMPSTAR1

      ORG0030H

      STAR1:MOVP3,#0FFH;置P3口為輸入態

      JNBP3.0,FUN0;判別P3.0是否有鍵按下,是,則轉FUN0

      JNBP3.1,FUN1;判別P3.1是否有鍵按下,是,則轉FUN1

      JNBP3.2,FUN2;判別P3.2是否有鍵按下,是,則轉FUN2

      JNBP3.3,FUN3;判別P3.3是否有鍵按下,是,則轉FUN3

      JNBF0,STAR1;曾經有鍵按下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;關顯示

      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;交叉點亮子程序

      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所示。采用掃描方式進行按鍵的識別檢測,并將對應按鍵的鍵號用查表指令將對應的代碼顯示在數碼管上。

      圖6

      參考程序如下:

      ORG0000H

      LJMPSTART

      ORG0030H

      START:MOVSP,#60H;設置堆棧指針

      SCAN:MOVR3,#0F7H;置行掃描初值

      MOVR1,#00H;到TABLE表中取碼的指針

      SCAN1:MOVA,R3

      MOVP2,A;掃描輸出

      MOVA,P2;重讀P2口狀態

      MOVR4,A;暫存于R4呂中

      SETBC;C=1

      MOVR5,#03H;掃描4列初值

      L1:RLCA;A中內容循環左移

      JNCKEYIN;C=0,有鍵按下,轉消抖

      INCR1;取碼指針加1

      DJNZR5,L1;無鍵按下,繼續檢測

      MOVA,R3;掃描下一行

      SETBC

      RRCA

      MOVR3,A

      JCSCAN1;4行是否掃描完,未完,繼續

      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

      五、實驗步驟:

      1.運行UltraEdit-32源程序編輯軟件,輸入、編輯匯編語言源程序。

      2.運行KeiluVision2源程序編譯軟件,對源程序進行編譯,得到目標代碼文件。

      3.運行Proteus模擬仿真軟件,打開已繪制好的仿真電路原理圖,進行模擬仿真。

      4.把硬件仿真器ME-52A與單片實驗板連接好,再用硬件仿真器進行仿真驗證。

      六、實驗分析與總結

      1.用仿真系統調試簡單程序結構、分支程序結構、循環程序結構、子程序結構和中斷結構的關鍵在于,如何將對程序的分析理解和開發系統提供的基本功能有機地結合起來,其前提條件是必須對源程序的作用、結構特點、運行過程與結果有較全面的認識,并能根據程序運行過程中出現的現象和結果分析并判斷產生各種故障現象的原因,再運用排除法逐一檢驗各種判斷是否準確。

      2.掌握程序結構特點的基礎上,合理選擇觀測點,通過觀察在觀測點處參數及路徑的變化檢驗程序運行的結果。

      3.高調試程序的效率,應對單片機開發系統所提供的幾種程序運行調試方式有

      足夠的了解并能熟練地運用。例如,在調試過程中,若要觀察最終結果,則可選擇全速運行調試;若要觀察相關指令的運行結果或運行路徑的變化過程,則可選擇單步運行;若要檢查子程序的運行過程,則可選擇跟蹤運行調試;若要檢查循環程序或中斷服務程序,則可選擇斷點運行調試;若要定點檢查程序運行到某處的結果時,則可選擇快速運行到光標處調試。但實際中究竟選用哪種方法更適宜或哪幾種方法結合使用更快捷,將隨著分析能力與操作的熟練程度逐步提高。4.程序運行結果是否正確時,應運用單片機開發系統所提供的交互界面,將程序運行過程中程序計數器PC(地址)的變化、各單元(內部RAM和外部RAM)內容的變化、特殊功能寄存器內容的變化、堆棧指針SP內容的變化與程序的理論分析結果相對照。

      5.程序和調試程序時,需要多次反復的過程,并非一次就能排除全部故障,特別是單片機應用系統的硬件電路和匯編程序相結合的綜合調試就更加復雜,因此,必須通過反復調試,不斷修改硬件和軟件,直到最終符合設計要求為止。如果在調試中能夠根據實驗現象預先對產生故障的原因加以判斷和分析,并制定出相應的調試方法和步驟,可縮小排除故障的范圍,提高調試效率。

      七、思考與練習

      填空題

      1、設X=5AH,Y=36H,則X與Y“或”運算為__7EH_______,X與Y的“異或”運算為___6CH_____。

      2、若機器的字長為8位,X=17,Y=35,則X+Y=__110100_____,X-Y=_11101110______(要求結果寫出二進制形式)。

      3、單片機的復位操作是____高電平______(高電平/低電平),單片機復位后,堆棧指針SP的值是___07h_____。

      4、單片機中,常用作地址鎖存器的芯片是__74HC373____________,常用作地址譯碼器芯片是_____74HC138____________。

      5、若選擇內部程序存儲器,應該設置為_____高_______(高電平/低電平),那么,PSEN信號的處理方式為___不用__________________。

      6、單片機程序的入口地址是____0000H__________,外部中斷1的入口地址是______0013H_________。

      7、若采用6MHz的晶體振蕩器,則MCS-51單片機的振蕩周期為__0.5us_______,機器周期為_____2us__________。

      8、擴展芯片的選擇方法有兩種,它們分別是___線選法_______________和_____譯碼法__________。

      9、單片機的內部RAM區中,可以位尋址的地址范圍是____20H~2FH______________,特殊功能寄存器中,可位尋址的地址是___是能被8整除的地址_________________。

      10、子程序返回指令是___ret______,中斷子程序返回指令是__reti。

      11、8051單片機的存儲器的最大特點是內部RAM與外部RAM分開編址。

      12、8051最多可以有32個并行輸入輸出口,最少也可以有8個并行口。

      13、函數是C語言的基本單位。

      14、串行口方式2接收到的第9位數據送SCON寄存器的RB8位中保存。

      15、MCS-51內部提供3個可編程的16位定時/計數器,定時器有4種工作方式。

      16、一個函數由兩部分組成,即說明部分和語句部分。

      17、串行口方式3發送的第9位數據要事先寫入SCON寄存器的TB8位。

      18、利用8155H可以擴展3個并行口,256個RAM單元。

      19、C語言中輸入和輸出操作是由庫函數scanf和printf等函數來完成。

      二、選擇題

      1、C語言中最簡單的數據類型包括(B)。

      A、整型、實型、邏輯型B、整型、實型、字符型

      C、整型、字符型、邏輯型D、整型、實型、邏輯型、字符型

      2、當MCS-51單片機接有外部存儲器,P2口可作為(C)。

      A、數據輸入口B、數據的輸出口

      C、準雙向輸入/輸出口D、輸出高8位地址

      3、下列描述中正確的是(D)。

      A、程序就是軟件B、軟件開發不受計算機系統的限制

      C、軟件既是邏輯實體,又是物理實體D、軟件是程序、數據與相關文檔的集合

      4、下列計算機語言中,CPU能直接識別的是(D)。

      A、自然語言B、高級語言C、匯編語言D、機器語言

      5、MCS-5l單片機的堆棧區是設置在(C)中。

      A、片內ROM區B、片外ROM區C、片內RAM區D、片外RAM區

      6、以下敘述中正確的是(C)。

      A、用C語言實現的算法必須要有輸入和輸出操作

      B、用C語言實現的算法可以沒有輸出但必須要有輸入

      C、用C程序實現的算法可以沒有輸入但必須要有輸出

      D、用C程序實現的算法可以既沒有輸入也沒有輸出

      7、定時器/計數器工作方式1是(D)。

      A、8位計數器結構B、2個8位計數器結構

      C、13位計數結構D、16位計數結構

      8、C語言提供的合法的數據類型關鍵字是(B)。

      A、DoubleB、shortC、integerD、Char

      9、片內RAM的20H~2FH為位尋址區,所包含的位地址是(B)。

      A、00H~20HB、00H~7FHC、20H~2FHD、00H~FFH

      10、以下能正確定義一維數組的選項是(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、數據的存儲結構是指(D)。

      A、存儲在外存中的數據B、數據所占的存儲空間量

      C、數據在計算機中的順序存儲方式D、數據的邏輯結構在計算機中的表示

      12、下列關于棧的描述中錯誤的是(C)。

      A、棧是先進后出的先性表B、棧只能順序存儲

      C、棧具有記憶作用D、對棧的插入和刪除操作中,不需要改變棧底指針

      13、在寄存器間接尋址方式中,間址寄存器中存放的數據是(B)。

      A、參與操作的數據B、操作數的地址值

      C、程序的轉換地址D、指令的操作碼

      14、MCS-51單片機的復位信號是(A)有效。

      A、高電平B、低電平C、脈沖D、下降沿

      15、為了使模塊盡可能獨立,要求(B)。

      A、模塊的內聚程度要盡量高,且各模塊間的耦合程度要盡量強

      B、模塊的內聚程度要盡量高,且各模塊間的耦合程度要盡量弱

      C、模塊的內聚程度要盡量低,且各模塊間的耦合程度要盡量弱

      D、模塊的內聚程度要盡量低,且各模塊間的耦合程度要盡量強

      16、若MCS-51單片機使用晶振頻率為6MHz時,其復位持續時間應該超過(B)。

      A、2μsB、4μsC、8μsD、1ms

      17、以下選項中可作為C語言合法常量的是(A)

      A、-80B、-080C、-8e1.0D、-80.0e

      18、能夠用紫外光擦除ROM中程序的只讀存儲器稱為(C)。

      A、掩膜ROMB、PROMC、EPROMD、EEPROM

      19、以下不能定義為用戶標識符是(D)。

      A、MainB、_0C、_intD、sizeof

      20、下選項中,不能作為合法常量的是(B)。//冪不能為小數

      A、1.234e04B、1.234e0.4C、1.234e 4D、1.234e0

      21、以下敘述中錯誤的是(C)

      A、對于double類型數組,不可以直接用數組名對數組進行整體輸入或輸出

      B、數組名代表的是數組所占存儲區的首地址,其值不可改變

      C、當程序執行中,數組元素的下標超出所定義的下標范圍時,系統將給出“下標越界”的出錯信息

      D、可以通過賦初值的方式確定數組元素的個數

      22、以下與函數fseek(fp,0L,SEEK_SET)有相同作用的是(D)

      A、feof(f

      p)B、ftell(fp)C、fgetc(fp)D、rewind(fp)

      23、存儲16×16點陣的一個漢字信息,需要的字節數為(A)

      A、32B、64C、128D、256

      24、已知1只共陰極LED顯示器,其中a筆段為字形代碼的最低位,若需顯示數字1,則它的字形代碼應為(B)。

      A、06HB、F9HC、30HD、CFH

      25、在C語言中,合法的長整型常數是(A)

      A、OLB、4962710C、324562&D、216D

      26、以下選項中合法的字符常量是(B)

      A、"B"B、’\010’C、68D、D

      27、若PSW.4=0,PSW.3=1,要想把寄存器R0的內容入棧,應使用(D)指令。

      A、PUSHR0B、PUSH@R0C、PUSH00HD、PUSH08H

      28、在片外擴展一片2764程序存儲器芯片要(B)地址線。

      A、8根B、13根C、16根D、20根

      29、設MCS-51單片機晶振頻率為12MHz,定時器作計數器使用時,其最高的輸入計數頻率應為(C)

      A、2MHzB、1MHzC、500kHzD、250kHz

      30、下列數據字定義的數表中,(A)是錯誤的。

      A、DW“AA”B、DW“A”C、DW“OABC”D、DWOABCH

      三、判斷題

      (√)1、在對某一函數進行多次調用時,系統會對相應的自動變量重新分配存儲單元。

      (×)2、在C語言的復合語句中,只能包含可執行語句。

      (√)3、自動變量屬于局部變量。

      (×)4、Continue和break都可用來實現循環體的中止。

      (√)5、字符常量的長度肯定為1。

      (×)6、在MCS-51系統中,一個機器周期等于1.5μs。

      (√)7、C語言允許在復合語句內定義自動變量。

      (√)8、若一個函數的返回類型為void,則表示其沒有返回值。

      (×)9、所有定義在主函數之前的函數無需進行聲明。

      (×)10、定時器與計數器的工作原理均是對輸入脈沖進行計數。

      (×)11、END表示指令執行到此結束。

      (√)12、ADC0809是8位逐次逼近式模/數轉換接口。

      (√)13、MCS-51的相對轉移指令最大負跳距是127B。

      (×)14、MCS-51的程序存儲器只是用來存放程序的。

      (√)15、TMOD中的GATE=1時,表示由兩個信號控制定時器的的啟停。

      (×)16、MCS-51的特殊功能寄存器分布在60H~80H地址范圍內。

      (×)17、MCS-51系統可以沒有復位電路。

      (×)18、片內RAM與外部設備統一編址時,需要專門的輸入/輸出指令。

      (√)19、鎖存器、三態緩沖寄存器等簡單芯片中沒有命令寄存和狀態寄存等功能。

      (√)20、使用8751且=1時,仍可外擴64KB的程序存儲器。

      四、簡答題

      1、在使用8051的定時器/計數器前,應對它進行初始化,其步驟是什么?

      答:(1)確定T/C的工作方式——編程TMOD寄存器;

      (2)計算T/C中的計數初值,并裝載到TH和TL;

      (3)T/C在中斷方式工作時,須開CPU中斷和源中斷——編程IE寄存器;

      (4)啟動定時器/計數器——編程TCON中TR1或TR0位。

      2、什么是重入函數?重入函數一般什么情況下使用,使用時有哪些需要注意的地方?答:多個函數可以同時使用的函數,稱為重入函數。

      通常情況下,C51函數不能被遞歸調用,也不能應用導致遞歸調用的結構。有此限制是由于函數參數和局部變量是存儲在固定的地址單元中。重入函數特性允許你聲明一個重入函數。即可以被遞歸調用的函數。

      重入函數可以被遞歸調用,也可以同時被兩個或更多的進程調用。重入函數在實時應用中及中斷服務程序代碼和非中斷程序代碼必須共用一個函數的場合中經常用到。

      3、8051引腳有多少I/O線?他們和單片機對外的地址總線和數據總線有什么關系?地址總線和數據總線各是幾位?

      答:8051引腳共有40個引腳,8051的地址總線由P2和P0口提供,P2口是地址總線的高8位,P0口是地址總線的低8位;數據總線由P0口提供;P0口的地址總線和數據總線是分時進行的,P0口的地址總線需要外接地址鎖存器完成地址鎖存。

      地址總線共16位,數據總線是8位。

      4、在有串行通信時,定時器/計數器1的作用是什么,怎樣確定串行口的波特率?

      答:在有串行通信時,定時器/計數器1的作用是串行口發生器。

      串行口的波特率根據串行口的工作方式具有不同的計算方式:

      方式0的波特率固定為晶體振蕩器的十二分之一;

      方式1的波特率=2SMOD.(定時器1的溢出率)/32;

      方式2波特率=2SMOD.(fosc/64);

      方式3波特率同方式1(定時器l作波特率發生器)。

      5、如何消除鍵盤的抖動?怎樣設置鍵盤中的復合鍵?

      答:由于按鍵是機械開關結構,所以當用手按下其中一個鍵時,往往會出現所按鍵在閉合位置和斷開位置之間發生跳幾下后才會穩定到閉合狀態的情況。在釋放一個鍵時,也會出現類似的情況,這就是鍵的抖動,抖動的持續時間不一,但通常不會大于10ms。

      若抖動問題不解決,就會引起對閉合鍵的多次讀入。對于鍵抖動最方便的解決方法就是當發現有鍵按下后,不是立即進行掃描,而是延時大約10ms后再進行。由于一個鍵按下的時間一般會持續上百毫秒,所以延遲10ms后再掃描處理并不遲。

      復合鍵可以仿照計算機復合鍵的處理方法,通常可以假設一個鍵具有復合功能,再與其它減的鍵值組合成復合鍵。

      1、矩陣式鍵盤的結構與工作原理

      在鍵盤中按鍵數量較多時,為了減少I/O口的占用,通常將按鍵排列成矩陣形式,如圖1所示。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接。這樣,一個端口(如P1口)就可以構成4*4=16個按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數越多,區別越明顯,比如再多加一條線就可以構成20鍵的鍵盤,而直接用端口線則只能多出一鍵(9鍵)。由此可見,在需要的鍵數比較多時,采用矩陣法來做鍵盤是合理的。

      矩陣式結構的鍵盤顯然比直接法要復雜一些,識別也要復雜一些,上圖中,列線通過電阻接正電源,并將行線所接的單片機的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當按鍵沒有按下時,所有的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態就可得知是否有鍵按下了。具體的識別及編程方法如下所述。

      2、矩陣式鍵盤的按鍵識別方法

      確定矩陣式鍵盤上何鍵被按下介紹一種“行掃描法”。

      行掃描法行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識別方法,如上圖所示鍵盤,介紹過程如下。

      1、判斷鍵盤中有無鍵按下將全部行線Y0-Y3置低電平,然后檢測列線的狀態。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。

      2、判斷閉合鍵所在的位置在確認有鍵按下后,即可進入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。

      下面給出一個具體的例子:

      圖仍如上所示。8031單片機的P1口用作鍵盤I/O口,鍵盤的列線接到P1口的低4位,鍵盤的行線接到P1口的高4位。列線P1.0-P1.3分別接有4個上拉電阻到正電源 5V,并把列線P1.0-P1.3設置為輸入線,行線P1.4-P.17設置為輸出線。4根行線和4根列線形成16個相交點。

      1、檢測當前是否有鍵被按下。檢測的方法是P1.4-P

      1.7輸出全“0”,讀取P1.0-P1.3的狀態,若P1.0-P1.3為全“1”,則無鍵閉合,否則有鍵閉合。

      2、去除鍵抖動。當檢測到有鍵按下后,延時一段時間再做下一步的檢測判斷。

      3、若有鍵被按下,應識別出是哪一個鍵閉合。方法是對鍵盤的行線進行掃描。P1.4-P1.7按下述4種組合依次輸出:

      P1.71110

      P1.61101

      P1.51011

      P1.40111

      在每組行輸出時讀取P1.0-P1.3,若全為“1”,則表示為“0”這一行沒有鍵閉合,否則有鍵閉合。由此得到閉合鍵的行值和列值,然后可采用計算法或查表法將閉合鍵的行值和列值轉換成所定義的鍵值

      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

      鍵盤處理程序就作這么一個簡單的介紹,實際上,鍵盤、顯示處理是很復雜的,它往往占到一個應用程序的大部份代碼,可見其重要性,但說到,這種復雜并不來自于單片機的本身,而是來自于操作者的習慣等等問題,因此,在編寫鍵盤處理程序之前,最好先把它從邏輯上理清,然后用適當的算法表示出來,最后再去寫代碼,這樣,才能快速有效地寫好代碼。

      到本課為止,本站教程暫告一個段落!感謝大家的關心和支持!

      矩陣按鍵部分由16個輕觸按鍵按照4行4列排列,連接到JP50端口。將行線所接的單片機的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當按鍵沒有按下時,所有的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態就可得知是否有鍵按下了。確定矩陣式鍵盤上何鍵被按下,介紹一種“行掃描法”。行掃描法行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識別方法.判斷鍵盤中有無鍵按下:將全部行線置低電平,然后檢測列線的狀態。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。判斷閉合鍵所在的位置:在確認有鍵按下后,即可進入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。

      下面給出一個具體的例子:

      電路圖路徑:G:\圖片\電路圖片\xl100097.jpg

      8031單片機的P1口用作鍵盤I/O口,鍵盤的列線接到P1口的低4位,鍵盤的行線接到P1口的高4位。列線P1.0-P1.3設置為輸入線,行線P1.4-P.17設置為輸出線。4根行線和4根列線形成16個相交點。

      1.檢測當前是否有鍵被按下。檢測的方法是P1.4-P1.7輸出全“0”,讀取P1.0-P1.3的狀態,若P1.0-P1.3為全“1”,則無鍵閉合,否則有鍵閉合。

      2.去除鍵抖動。當檢測到有鍵按下后,延時一段時間再做下一步的檢測判斷。

      3.若有鍵被按下,應識別出是哪一個鍵閉合。方法是對鍵盤的行線進行掃描。P1.4-P1.7按下述4種組合依次輸出:

      P1.71110

      P1.61101

      P1.51011

      P1.40111

      在每組行輸出時讀取P1.0-P1.3,若全為“1”,則表示為“0”這一行沒有鍵閉合,否則有鍵閉合。由此得到閉合鍵的行值和列值,然后可采用計算法或查表法將閉合鍵的行值和列值轉換成所定義的鍵值。

      4.為了保證鍵每閉合一次CPU僅作一次處理,必須去除鍵釋放時的抖動。

      實驗目的:通過XL1000的16位矩陣按鍵,在數碼管上分別顯示0---9,A,B,C,D,E,F。

      接線方法:1用一條8PIN數據排線,把矩陣按鍵部份的JP50,接到CPU部份的P1口JP44.

      2接8位數碼管的數據線。將數碼管部份的數據口JP5接到CPU部份的P0口JP51.

      3接8位數碼管的顯示位線。將數碼管部份的顯示位口JP8接到CPU部份的P2口JP52.

      參考程序:

      ;本程序實現掃描按鍵顯示功能.

      ;分別按16個鍵盤顯示分別顯示數字123A456B789C*0#D

      ;鍵盤口P1,數碼管顯示第二位p21,數碼管段位p0口

      org0000h

      ajmpmain

      org0030h

      main:

      movdptr,#tab;將表頭放入DPTR

      lcallkey;調用鍵盤掃描程序

      movca,@a dptr;查表后將鍵值送入ACC

      movp0,a;將Acc值送入P0口

      CLRP2.1;開顯示

      ljmpmain;返回反復循環顯示

      KEY:

      LCALLKS;調用檢測按鍵子程序

      JNZK1;有鍵按下繼續

      LCALLDELAY2;無鍵按調用延時去抖

      AJMPKEY;返回繼續檢測按鍵

      K1:LCALLDELAY2

      LCALLDELAY2;有鍵按下延時去抖動

      LCALLKS;再調用檢測按鍵程序

      JNZK2;確認有按下進行下一步

      AJMPKEY;無鍵按下返回繼續檢測

      K2:MOVR2,#0EFH;將掃描值送入R2暫存

      MOVR4,#00H;將第一列值送入R4暫存

      K3:MOVP1,R2;將R2的值送入P1口

      L6:JBP1.0,L1;P1.0等于1跳轉到L1

      MOVA,#00H;將第一行值送入ACC

      AJMPLK;跳轉到鍵值處理程序

      L1:JBP1.1,L2;P1.1等于1跳轉到L2

      MOVA,#04H;將第二行的行值送入ACC

      AJMPLK;跳轉到鍵值理程序進行鍵值處理

      L2:JBP1.2,L3;P1.2等于1跳轉到L3

      MOVA,#08H;將第三行的行值送入ACC

      AJMPLK;跳轉到鍵值處理程序

      L3:JBP1.3,NEXT;P1.3等于1跳轉到NEXT處

      MOVA,#0cH;將第四行的行值送入ACC

      LK:ADDA,R4;行值與列值相加后的鍵值送入A

      PUSHACC;將A中的值送入堆棧暫存

      K4:LCALLDELAY2;調用延時去抖動程序

      LCALLKS;調用按鍵檢測程序

      JNZK4;按鍵沒有松

      開繼續返回檢測POPACC;將堆棧的值送入ACC

      RET

      NEXT:

      INCR4;將列值加一

      MOVA,R2;將R2的值送入A

      JNBACC.7,KEY;掃描完至KEY處進行下一掃描

      RLA;掃描未完將A中的值右移一位進行下一列的掃描

      MOVR2,A;將ACC的值送入R2暫存

      AJMPK3;跳轉到K3繼續

      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輪流顯示鍵盤因為無法表達*#就用H表示,B用8表示

      end

      這是我做成功的4X4鍵盤掃描源程序,P1.0-P1.3做四根列線,P1.4-P1.7做四根行線。

      數碼管的字型表是按照標準接法做的,按對應的按鍵數碼管顯示對應的數字。

      以下是源程序:

      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數據采集控制

      ;P2.6P2.7個位十位顯示轉換控制

      ;P1口接8個開關模擬數據

      ;P1.0-P1.3為個位開關量輸入

      ;P1.4-P1.7為十位開關量輸入

      ;此程序僅供參考

      ;功能P1口接8個開關輸入量4個一組,分別為個位,十位輸入

      ;P0口接一個數碼管,依次顯示輸入量。P3.1控制是否讀入

      ;開關量。P2.6P2.7控制是否顯示個位

      或十位

      ORG100h

      LJMPSTAR

      STAR:MOVP1,#0FFH

      SETBP3.1數據讀入標志

      MOVR0,#100,循環工作次數

      LOOP:JBP3.1,$P3.1低電平時,采集P1口數據開關量處理顯示階段不再應答P3.1

      MOVA,P1

      PUSHACC

      ANLA,#0FH取個位數值

      MOVR1,A個位數值保存到R1

      POPACC

      ANLA,#0F0H

      SWAPA高4位轉成字節信息

      MOVR2,A十位數值保存到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.實驗任務

      在8X8 LED點陣上顯示柱形,讓其先從左到右平滑移動三次,其次從右到左平滑移動三次,再次從上到下平滑移動三次,最后從下到上平滑移動三次,如此循環下去。

      2.電路原理圖

      圖4.24.1

      3.硬件電路連線

      (1).把“單片機系統”區域中的P1端口用8芯排芯連接到“點陣模塊”區域中的“DR1-DR8”端口上;

      (2).把“單片機系統”區域中的P3端口用8芯排芯連接到“點陣模塊”區域中的“DC1-DC8”端口上;

      4.程序設計內容

      (1).8X8 點陣LED工作原理說明

      8X8點陣LED結構如下圖所示

      圖4.24.2

      從圖4.24.2中可以看出,8X8點陣共需要64個發光二極管組成,且每個發光二極管是放置在行線和列線的交叉點上,當對應的某一列置1電平,某一行置0電平,則相應的二極管就亮;因此要實現一根柱形的亮法,如圖49所示,對應的一列為一根豎柱,或者對應的一行為一根橫柱,因此實現柱的亮的方法如下所述:

      一根豎柱:對應的列置1,而行則采用掃描的方法來實現。

      一根橫柱:對應的行置0,而列則采用掃描的方法來實現。

      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點陣顯示實驗

      一.實驗要求

      編程實現中英文字符的顯示。

      二.實驗目的

      1.了解LED點陣顯示的基本原理和實現方法。

      2.掌握點陣漢字庫的編碼和從標準字庫中提取漢字編碼的方法。

      三.實驗電路及連線

      點陣顯示模塊WTD3088的(紅色)列輸入線接至內部LED的陰極端,行輸入線接至內部LED的陽極端(若陽極端輸入為高電平,陰極端輸入低電平,則該LED點亮)。發光點的分布如圖22-0所示。

      Fig22-0WTD3088LED分布

      如圖22-1示,本實驗模塊使用74LS374來控制列輸入線的電平值。將74LS374的某輸出置0,則對應的LED陰極端被置低。如圖22-2示,本實驗模塊使用74LS273來控制行輸入線,并通過9013提供電流驅動。將74LS273的某輸出置1,則對應的LED陽極端被置高。每次系統重新開啟或總清后,74LS273輸出為全0,LED顯示被關閉。

      通過編程控制各顯示點對應LED陽極和陰極端的電平,就可以有效的控制各顯示點的亮滅。

      Fig22-1LED模塊及列掃描電路

      Fig22-2行掃描電路

      Fig22-3地址譯碼電路

      本實驗模塊使用4塊WTD3088組成16×16點陣,以滿足漢字顯示的要求。為了方便的控制四個單元,使用了一片74LS139譯碼,產生四個地址片選信號:CLKR1=CSLED,CLKR2=CSLED 1,用于行控制的兩片74LS273;CLKC1=CSLED 2,CLKC2=CSLED 3,用于列控制的兩片74LS374。

      實驗接線:按示例程序,模塊的CSLED接51/96地址的8000H。

      四.實驗說明

      使用高亮度LED發光管構成點陣,通過編程控制可以顯示中英文字符、圖形及視頻動態圖形。LED顯示以其組構方式靈活、亮度高、技術成熟、成本低廉等特點在證券、運動場館及各種室內/外顯示場合得到廣泛的應用。

      所顯示字符的點陣數據可以自行編寫(即直接點陣畫圖),也可從標準字庫(如ASC16、HZ16)中提取。后者需要正確掌握字庫的編碼方法和字符定位的計算。

      實驗盤片中“字符轉換”子目錄下提供的Basc16.exe,BHz16.exe可方便的將單個字符的碼表從標準字庫Asc16,Hzk16中提取出來。具體使用方法是運行上述可執行程序,根據提示輸入所需字符(如是漢字還需要先啟動dos下的漢字環境,如ucdos,pdos95等)。程序將該字符的碼表提取出來,存放在該字符ASC或區位碼為文件名稱的.dat文件中。用戶只需將該文件中內容拷貝、粘貼到自己的程序中即可。但需要注意字節排列順序、字節中每一位與具體顯示點的一一對應關系,必要時還要對碼表稍作修改。同一目錄下還提供了上述可執行程序的源文件,使用BC3.1編寫,供用戶參考。

      五.實驗程序框圖

      用戶應留心其中行掃描的實現及碼表的處理。

      六.實驗程序:

      (一)提供LEDA51演示Asc16字符的簡單點陣顯示。

      ;________*LED點陣顯示示例程序______________________*

      ;__該程序顯示Asc16字符__

      ;__為了簡單起見,程序只顯示一個字符__

      ;__該程序針對T598實驗機的模塊14__

      ;____________________________________________________

      CSLEDEQU8000H

      CSR1EQUCSLED;行1273

      CSR2EQUCSLED 1H;行2273

      CSC1EQUCSLED 2H;列1374

      CSC2EQUCSLED 3H;列2374

      ORG0000H

      MOVSP,#60H

      INIT:MOVA,#0H;關閉行

      MOVDPTR,#CSR1

      MOVX@DPTR,A

      MOVDPTR,#CSR2

      MOVX@DPTR,A

      MOVA,#0FFH;關閉列

      MOVDPTR,#CSC1

      MOVX@DPTR,A

      MOVDPTR,#CSC2

      MOVX@DPTR,A

      D:MOVR5,#00H

      MOVR4,#01H;每次為單行掃描

      DISP:

      MOVA,R5

      MOVDPTR,#ASCE;此處設定所要顯示的字符

      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

      ;________延時子程序,協調字符顯示速度____________*

      DELAY:MOVR7,#1H

      DL1:MOVR6,#00H

      DL2:DJNZR6,DL2

      DJNZR7,DL1

      RET

      ;________字符點陣字庫______________*

      ;ASC16字符編碼排列

      ;0

      ;1

      ;|

      ;|

      ;14

      ;15

      ;高位D7--D0

      ;請注意編碼的排列次序和實際顯示點陣分布的關系

      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字符的簡單點陣顯示。

      ;________*LED點陣顯示示例程序______________________*

      ;__該程序顯示hz16字符__

      ;__為了簡單起見,程序只顯示一個字符__

      ;__該程序針對T598實驗機的模塊14__

      ;____________________________________________________

      CSLEDEQU8000H

      CSR1EQUCSLED;行1273

      CSR2EQUCSLED 1H;行2273

      CSC1EQUCSLED 2H;列1374

      CSC2EQUCSLED 3H;列2374ORG0000H

      MOVSP,#60H

      INIT:MOVA,#0H;關閉LED顯示

      MOVDPTR,#CSR1

      MOVX@DPTR,A

      MOVDPTR,#CSR2

      MOVX@DPTR,A

      MOVA,#0FFH;關閉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

      ;________延時子程序,協調字符顯示速度____________*

      DELAY:MOVR7,#1H

      DL1:MOVR6,#00H

      DL2:DJNZR6,DL2

      DJNZR7,DL1

      RET

      ;________字符點陣字庫______________*

      ;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的計算機可鎖定加密鍵盤設計

      摘要:介紹PC鍵盤和鍵盤接口的PS/2通信協議,以及用89C51實現可鎖定鍵盤的軟件和硬件設計方法。具有安全可靠、容錯能力強、可以直接采用標準鍵盤進行改裝、便于實現等優點,并保留標準鍵盤的全部功能。

      關鍵詞:PS/289C51C51鍵盤

      引言

      在智能儀器、自動控制等領域,已大量使用嵌入式PC,如Advantech公司的PC/104、AMD公司的DIMM-PC等。為適應開放式、模塊化的要求,嵌入式PC具有標準的PC接口,如VGA顯示器控制接口、以太網接口、RS232接口、PC/AT鍵盤接口等。所以,可以用標準的PC鍵盤對嵌入式PC進行操作與控制。鍵盤在輸入指令之后,可能很長一段時間不用。為計算機安全和防止誤觸發,需要將鍵盤鎖定,還要對某些鍵采取屏蔽措施,但是PC標準鍵盤不能滿足這些要求。本文介紹一種用89C51設計實現的可鎖定加密PC/AT鍵盤。

      1鍵盤功能及工作原理

      PC鍵盤功能主要有按鍵識別、去抖、重鍵處理、發送掃描碼、自動重發、接收鍵盤命令、處理命令等。鍵盤有編碼鍵盤和非編碼鍵盤。編碼鍵盤程序設計簡單,但硬件電路復雜,價格較高;非編碼鍵盤用軟件來實現識別鍵、編碼轉換、去抖等功能,硬件電路簡單,價格便宜。現代微機系統中廣泛采用非編碼鍵盤。PC鍵盤多采用18行×8列的二維矩陣行列結構。采用行掃描法識別按下的按鍵。

      2PS/2協議

      PS/2協議是外設與主機之間通信的一種同步雙向串行協議。在該協議中主機擁有較高的優先級,在一定條件下可以終止外設正在進行的發送過程。PS/2協議采用的傳送數據幀的格式為:1位起始位(0)、8位數據位、1位奇偶校驗位、1位停止位(1)。數據發送時低位在前,高位在后。外設每收到主機發來的1幀數據,都要緊隨該幀的停止位發送一個握手位ACK(0)應答主機。然后,外設還要發1幀應答數據(0xF0),表示外設已經完整地接收到了主機的命令;而主機則不需發送握手位,也不需要發送應答幀。

      2.1鍵盤到PC鍵盤接口的通信

      當時鐘線和數據線均為高電平時,允許鍵盤發送數據,系統將接收數據;當時鐘線被拉為低電平時,表明系統禁止數據傳輸。圖1給出了發送時序,包含1個低電平觸發的起始位、8位數據位、1個奇校驗位和1個高電平的結束位。

      2.2PC系統到鍵盤的通信協議

      若時鐘線出現高電平,數據線出現低電平,表明系統請求發送,鍵盤準備產生同步時鐘脈沖串,并接收數據。包含了1個低電平觸發的起始位、8位數據位、1個奇校驗位、1個應答位、1個高電平的結束位。圖2為時序圖。

      (1)鍵盤命令及執行過程

      ①FFH:復位鍵盤。系統通過此軟件復位命令使鍵盤進入程序復位和內部自測試,稱為基本保證測試(BAT)。復位鍵盤的過程如下:

      a.鍵盤收到FFH后立即回送ACK(FAH)作答;

      b.鍵盤接口收到ACK后,將鍵盤時鐘和數據線置為高電平;

      c.鍵盤檢測到此狀態后開始BAT操作;

      d.如果BAT正確完成,鍵盤發送AAH以表示結束,

      否則以FDH(或其它任何值)表示診斷有誤。

      ②FEH:重新發送。當系統檢測

      到從鍵盤送來的任何傳輸錯誤時,它便向鍵盤發送FEH命令。鍵盤接收到此命令后,將重新送出原來的內容。③FDH~F7H:空操作(保留未用)。

      ④F6H:設置缺省值。此命令使鍵盤所有條件復位到電源接通時的缺省狀態,鍵盤繼續掃描。

      ⑤F5H:設置缺省值和停止鍵盤。此命令使鍵盤所有條件復位到電源接通時的缺省狀態,并停止鍵盤掃描,等待下一個鍵盤命令。

      ⑥F4H:啟動鍵盤。鍵盤接收到此命令后,用ACK(FAH)作答,清除輸出緩沖器,并啟動鍵盤開始掃描。

      ⑦F3H:設置拍發速率和延時參數。每當按下任一鍵時,鍵盤以拍發速率連續送出鍵的接通碼,直到鍵被釋放為止。延時參數是指按下一鍵后,鍵盤輸出的響應時間。

      系統缺省設置:拍發速率=10個/s±20,延時=500ms±20。

      當要改變設置時可以使用F3H命令,并后跟一個字節的參數。參數定義如表1所列。

      表1

      D7

      D6D5

      D4D3

      D2D1D0

      C

      B

      A

      計算拍發速率和響應延時的公式如下:

      拍發速率=1/[(8 A)×2B×0.00417](1/s)

      響應延時=(1 C)×250(ms)

      注:缺省的延時參數值為2CH。

      此命令的執行過程如下:

      a.鍵盤收到F3H命令后,用FAH予以響應,并停止

      掃描和等待隨后的參數;

      b.鍵盤若收到隨后的設置參數,用另一個ACK響

      應,并按其參數設置新的拍發速率和響應延時,

      之后重新開始掃描(若鍵盤原來是開放的);

      c.鍵盤若收到FAH命令,但無隨后的設置參數,則

      鍵盤結束命令設置,并保持原來的拍發速率和響

      應延時,停止掃描。

      ⑧F2H,F1,EFH:保留未用。

      ⑨F0H:設置鍵盤掃描碼命令。此命令用于設置鍵盤的掃描碼,后跟參數指定三種掃描碼的哪一種。鍵盤復位時,默認掃描碼是第二種。

      ⑩EEH:回送命令。此命令用于輔助診斷,要求鍵盤接收到EEH時也要回送EEH予以響應。若鍵盤原來是開放的,則繼續掃描。

      EDH:置位/復位LED指示器。鍵盤右上角有三個LED指示器,分別反映Caps、Num和Scroll三個鍵的鎖定情況。參數字節如表2所列。

      表2

      D7D3

      D2

      D1

      D0

      保留

      1=激勵CapsLED

      1=激勵NumLED

      1=激勵ScrollLED

      此命令執行過程與F3H相似。若命令后跟參數,則按參數設定LED狀態并繼續掃描。若僅有命令無參數,則不改變LED原狀態,并停止掃描。

      (2)鍵盤響應

      鍵盤在下列四種情況下都會向鍵盤接口發送數據。

      ①按下任一鍵,鍵盤以拍發速率向接口發送鍵盤接通掃描碼。

      ②釋放所按下的鍵,鍵盤發送斷開掃描碼。

      ③系統向鍵盤發送鍵盤命令后,鍵盤回送應答。

      ④當用戶按鍵速度超出鍵盤所能容納的最大鍵個數時,鍵盤做出響應。

      后三種情況稱為鍵盤響應。響應字節有7個,定義如下。

      ①FEH:重新發送響應。當鍵盤收到一個無效的鍵盤命令,或者檢測到奇偶錯的鍵盤命令時,鍵盤回送響應字節為FEH,要求系統重發鍵盤命令。

      ②FAH:正常應答。對任何一個有效的鍵盤命令,鍵盤回送FAH予以響應。

      ③00H:超限應答。當用戶按鍵速度超出鍵盤所能容納的最大鍵符個數時(16個字節的緩沖器),鍵盤發送00H。

      ④FDH:診斷故障應答。鍵盤接受軟件復位命令,執行自測試過程中。若檢測到故障,則以FDH應答。此時,鍵盤停止掃描并等待下一個鍵盤命令。

      ⑤AAH:診斷正常應答。鍵盤在軟件復位過程中,正常完成BAT測試,以AAH應答。

      ⑥FEH:回響命令的應答,對鍵盤FEH命令的應答。

      ⑦F0H:斷開掃描碼前綴,鍵盤對鍵符按下后釋放的應答,第一個字節為F0H,第二個字節為接通掃描碼(有幾個鍵例外)。

      3硬件設計

      PC系列鍵盤采用18行×8列的矩陣行列結構。89C51單片機有4個8位I/O端口,因此可以采用P0、P2口再加上P3口的2個(P3.6和P3.7)作為行掃描線。P1口作為列輸入線(如果用P0口作列輸入線,必須加上拉電阻)。采用P3.0、P3.1作為數據線和時鐘線與PC系統進行通信,用P3.2、P3.4、P3.5控制鍵盤上的3個指示燈。硬件原理如圖3所示。

      鍵盤與計算機通過一個五芯(PS/2接口為六芯)插座相接,4個有效引腳的定義分別是電源(VCC)、地(GND)、串行時鐘線(SCK)、串行數據線(SIO)。

      4軟件設計

      ①消抖及重鍵處理:通過軟件上延時程序來消除抖動;采用后按鍵優先處理,即多鍵同時按下時,只重復發送最后按下鍵的掃描碼。

      ②程序包括鍵盤掃描子程序、發送鍵碼子程序、發送數據子程序、接收命令子程序、定時器1中斷服務程序、主程序等。鍵盤掃描子程序用于掃描鍵狀態,將被按鍵的位置號存入緩沖器中;發送鍵碼子程序用于將緩沖區鍵的接通碼或斷開碼發送給計算機鍵盤接口或者存在鍵盤密碼緩沖區中;發送數據子程序用于將數據發給計算機鍵盤接口;接收命令子程序用于接收計算機鍵盤接口發來的鍵盤命令;定時器1中斷服務子程序用于給程序中的延時提供標準時鐘,并具有軟件看門狗功能,防止軟件出現死機現象;主程序用于系統初始化,子程序調度,鎖定狀態的顯示等。

      圖6發送緩沖區鍵碼子程序流程圖

      圖4~6是主要軟件模塊的流程圖。單片機源程序見本刊網絡補充版(.com)。

      5結論

      本文介紹的PC/AT鍵盤具有結構簡單、設計靈活、安全可靠的特點,可用于標準PC和嵌入式PC。本鍵盤可以在標準的鍵盤基礎上進行改造,只需換掉原來的控制芯片即可,可節省設計成本。

      單片機C51編程幾個有用的模塊(1)

      KeilC51常用功能模塊使用說明

      說明

      本文檔包括單片機系統中常用到的時鐘中斷、通訊及鍵盤掃描等模塊(見所附源程序)的說明。這些模塊使用前后臺系統模型。為達到最大的靈活性,需要在用戶工程中定義config.h文件,在其中定義各模塊可選參數的設置,而不是直接更改源代碼。

      這些可選內容大部分為宏定義,如果不定義宏相應的功能在編譯時被屏蔽,不會增加代碼長度。具體可選內容見各模塊中的說明。

      在Config.h文件中還要包含一個單片機硬件的資源頭文件。

      各模塊使用了定義在Common.h中的一些數據類型。如:BIT(bit)BYTE(unsignedchar)等,具體請參見源程序。

      時鐘模塊

      在單片機軟件設計中,時鐘是重要資源,為了充分利用時鐘資源,故設計本時鐘模塊。本模塊使用定時器0,在完成用戶指定功能的同時,還能夠自動處理一些其它模塊中與時鐘相關的信息。

      時鐘模塊由聲明文件Timer.h以及實現文件Timer.c組成。

      用戶應該在Config.h中定義宏TIMER_RELOAD來設定定時器0的重裝載初值。推薦的定時器0的中斷時間大于1毫秒。

      在程序的初始化階段調用時鐘模塊的初始化函數InitTimerModule()之后,就可以使用時鐘模塊所以支持的各種功能。具體描述如下:

      延時:當用戶需要進行一定時間的延時時,可以通過調用Delay()來進行,參數為時鐘中斷的次數。如時鐘中斷周期為1ms,想進行100ms的延時,則可以調用Delay(100)。

      注意:

      如果延時的絕對時間小于時鐘中斷的周期,則不能夠用本方法做到延時。

      定時:當程序中需要使用定時功能時,如等待某外部事件,如果在一定時間內發生則繼續執行,如果在這段時間內發生,則認為出現錯誤,轉向錯誤處理機制。

      在此推薦一種編程模式,但用戶可以用自己認為更合理的方式處理此類問題。

      這里簡單說明一下關于阻塞式函數及非阻塞式函數。簡單說,阻塞式函數就是當檢測完成條件,如

      果不能夠完成則等待,如:

      voidCheckSomething()

      {

      //gbitSuccessFlagisaglobalvariable

      while(gbitSuccessFlag==FALSE)

      {

      //donothingbutwaiting

      }

      }

      可以看到,當bitSuccessFlag沒有被設置為TRUE時,函數保持等待狀態不返回,這樣就是阻塞式的函數。

      另外一種情況:

      BITCheckSomething()

      {

      if(gbitSuccessFlag==TRUE)

      {

      //…

      returnTRUE;

      }

      returnFALSE;

      }

      在這里,如果所檢測的事件有沒有完成,函數進行檢測之后,立刻返回,通過返回值報告完成情況,如果沒有完成,則等待調用者分配再次執行的機會。這樣的函數就是非阻塞函數。

      在應用定時功能時,首先要將檢測函數定義成非阻塞函數。如上面的第二個版本的CheckSomething。

      然后下面模式:

      BITbitDone=FALSE;

      ResetClock();//cleartimerinterrupttimescounter

      while(GetClock()

      {

      if(CheckSomething()==TRUE)

      {

      bitDone=TRUE;

      break;

      }

      }

      if(bitDone==FALSE)

      {

      //processtimeout

      }或者簡單寫成:

      BITbitDone=FALSE;

      ResetClock();

      while(GetClock()=(z))

      當然,用戶也可以將IsPackageHeader和IsPackageTailer定義成為函數,通過BIT類型的返回值來向調用者提供與相應宏相同的信息。

      另一種辦法需要在Config.h文件中定義宏SCOMM_ComplexPackageFormat。(需要注意的是,不能夠同時定義SCOMM_SimplePackageFormat和SCOMM_ComplexPackageFormat宏,否則會造成嚴重的不可預見性錯誤。

      這時需要提供回調函數QueryPackageFormat,原形如下:

      BYTEQueryPackageFormat(BYTEbyData,BYTEbyCount,BYTEbyParam);

      函數中三個參數的含義與使用簡單數據包格式時判斷數據包尾的宏的參數相同。

      函數通過返回值來通知作為調用者的接收函數對接收到的數據如何處理,但目前這種方法僅為需要處理復雜數據包格式時的一種可選方法,但不推薦。用戶如果想使用這種方法可以自己更改接收函數中相應的

      #ifdefSCOM_ComplexPackageFormat

      #endif//SCOMM_ComplexPackageFormat

      預編譯指令之間的內容。

      例如指定QueryPackageFormat的返回值的含義:

      0:繼續找數據包頭或繼續找數據包尾。

      1:找到數據包頭。

      2:找到數據包尾。

      3:數據包出錯,需要拋棄。

      然后更改源代碼來實現上面的協議。

      注意:當用戶需要使用字符串的時候,可以利用簡單的包裝函數將字符串轉換為字節數組。所以沒有必要提供專用的字符串處理函數。

      鍵盤掃描模塊

      鍵盤掃描模塊有兩種工作方式,一種為自動的由時鐘模塊調用,另一種是由程序員自行調用。

      1)由時鐘模塊自動調用的方式

      將時鐘模塊實現文件(Timer.h)及鍵盤掃描模塊的實現文件(KBScan。c)包含進工程,在Config.h文件中添加TIMER_KBSCANDELAY宏。時鐘模塊自動對時鐘中斷進行計數,當達到TIMER_KBSCANDELAY宏所定義的值后,自動調用鍵盤掃描模塊中的函數KBScanProcess()進行鍵盤掃描,也就是說,這個宏的值可以決定按鍵消抖動的時間。

      用戶應該提供兩個回調函數OnKBScan()及OnKeysPressed()。在函數OnKBScan中進行鍵盤掃描,并返回掃描碼。掃描碼的類型缺省為BYTE,當鍵盤規模較大時,BYTE不能夠完全包含鍵盤信息時,可在Config.h文件中重定義宏KBvalue,如下:

      #defineKBvalueWORD

      這樣,就可以使用16位的鍵盤掃描碼,如果此時還達不到要求,可以將鍵盤掃描碼定義成一個結構,但這樣做將會增加代碼量及消耗更多的RAM資源,故不推薦。

      掃描模塊調用OnKBScan取得掃描碼,并調用用戶可以重定義的宏IsNoKeyPressed來判斷是否有鍵按下,缺省的IsNoKeyPressed實現如下:

      #defineIsNoKeyPressed(x)((x)==0x00)

      即認為OnKBScan返回0掃描碼時為沒有鍵按下,如果掃描函數返回其它非零掃描碼做為無鍵按下的掃描碼時,可以在Config.h文件中重定義IsNoKeyPressed宏的實現。

      8位鍵盤掃描碼(缺省值)時,相應的掃描函數為:

      BYTEOnKBScan()

      當掃描模塊經過軟件消抖動之后,發現有鍵按下,就會調用另一個回調函數OnKeysPressed。函數的聲明應該如下:

      voidOnKeyPressed(BYTEbyKBvalue,BYTEbyState)

      其中中的參數byKBvalue的類型為BYTE,此為缺省值,如果使用其它類型的掃描碼,就將此參數變為相應類型。這個值由OnKBScan返回。另一個參數byState在通常情況下為零。但當用戶在Config.h中定義宏KBSCAN_BRUSTCOUNT,同時鍵盤上的某鍵被按住不放時,掃描模塊對它自己的調用(注意這里和TIMER_KBSCANDELAY宏不同,TIMER_KBSCANDELAY是時鐘中斷足夠的次數后調用掃描模塊,而KBSCAN_BRUSHCOUNT為掃描模塊自身的被調用次數)進行計數,當達到KBSCAN_BRUSTCOUNT時,掃描模塊調用OnKeysPressed,此時第一個參數的含義不變,而byState變成1,同時計數器復位,又經過一段時間后,用值為3的byState調用OnKeysPressed。這樣就可以很方便的實現多功能鍵或者檢測某鍵的長時間被按下。

      2)由用戶自行調用

      由用戶自行在程序中調用掃描模塊,而不是由時鐘中斷自行調用。其它與方式1相同。

      注意:

      1)函數KBScanProcess為非阻塞函數,它將在很快的時間內返回,等待再次分配給它執行的機會。

      2)函數KBScanProcess是在時鐘中斷外部運行的,它的過程可以被任何中斷打斷,但不影響系統運行。

      3)byState的最大值為250,之后被復位為零。

      應用舉例

      現在來舉例說明上述幾個模塊的使用方法。

      硬件環境描述:

      為了控制一盞燈,需要單片機提供一個做控制功能的開關量,這里不描述外部接口電路,只說明當單片機的P10腳為高電平時,燈滅,當P10腳為低電平時,燈亮。

      可以通過計算機由串口發送命令來控制,或通過一個按鍵(pus

      hbutton不是自鎖式的按鍵)來手動控制(按鍵接在P11腳上,當鍵沒有按下時,P11電平為高,鍵按下時,引腳電平被接低),當使用按鍵手動控制的時候,需要給計算機發送通知。

      設定串口通訊指令如下:

      數據包由0xff做包頭,4個字節長,第二個字節為命令代碼,第三個字節為數據,最后一個字節為校驗位。

      命令和數據代碼有如下組合:

      (計算機發給單片機)

      0x100x01:計算機控制燈亮。(數據位是非零值即可)

      0x100x00:計算機控制燈滅。

      (單片機發給計算機)

      0x110x01:單片機正常執行控制指令,返回。(數據位是非零值即可)

      0x110x00:單片機不能夠正常執行控制指令,或控制指令錯(不明含義的數據包或校驗錯等)。

      0x120x01:手動控制燈亮。(數據位是非零值即可)

      0x120x00:手動控制燈滅。建立工程:

      在硬盤上建立文件夾Projects,在Projects下建立Common文件夾及Example文件夾。將各模塊的頭文件及實現文件拷貝到Common文件夾下(推薦使用這樣的文件組織結構,其它工程也可以建立在Projects下,各工程共享Common文件夾中的代碼)。

      啟動KeilC的IDE,在Example下建立新工程,將各模塊的實現文件包含進工程。

      在Example文件夾下建立Output文件夾,更改工程設置,將Output作為輸出文件和List文件的輸出文件夾(推薦使用這樣的結構,當保存工程文件時,可以簡單的刪除Output文件夾中的內容而不會誤刪有用的工程文件)。

      建立工程配置頭文件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”//使用自定義的數據類型

      #defineTIMER_RELOAD922//11.0592MHz晶振,1ms中斷周期

      #defineTIMER_KBSCANDELAY40//40ms重檢測按鍵狀態,即40ms消抖

      #defineSCOMM_AsyncInterface//使用異步通訊服務

      #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;//燈的狀態,缺省為off

      staticvoidInitialize()

      {

      InitTimerModule();//初始化時鐘模塊

      InitSCommModule(0xfd,TRUE);//初始化通訊模塊,11.0592MHz晶振,

      //波特率為19200

      EA=1;//開中斷

      }

      voidmain()

      {

      Initialize();//初始化

      while(TRUE)//主循環

      {

      ImpTimerService();//實現時鐘中斷服務,如鍵盤掃描

      AsyncRecePackage(4);//接收4個字節長的數據包

      }

      }

      //在中斷外部響應時鐘中斷事件

      voidOnTimerEvent()

      {

      //donothing

      }

      //控制外部燈

      staticvoidTriggerLamp(BITbEnable)

      {

      P10=~bEnable;//需要反相控制

      }

      //鍵掃描回調函數

      BYTEKBScan()

      {

      BITb;

      P11=1;//讀之前拉高引腳電平

      b=P11;//讀入引腳狀態

      return~b;//數據反相做掃描碼

      }

      //計算校驗和

      staticBYTECalcCheckSum(BYTE*pbyBuf,BYTEbyLen)

      {

      BYTEby,bySum=0;

      for(by=0;by

      return0–bySum;

      }

      //接收到鍵盤消息回調函數

      voidOnKeyPressed(BYTEbyvalue,BYTEbyState)

      {

      BYTEby[4];

      if(byState==0)

      {

      switch(byvalue)

      {

      case0x01:

      gbitLampState=~gbitLampState;//燈狀態取反

      TriggerLamp(gbitLampState);//執行控制

      by[0]=0xff;//構造數據包

      by[1]=0x12;

      by[2]=(BYTE)gbitLampState;

      by[3]=CalcCheckSum(by,3);//求校驗和

      SendPackage(by,4);//發送數據包

      break;

      //處理其它掃描碼

      default:

      break;

      }

      }

      //接收到數據包回調函數

      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);//處理長度或校驗和不正確

      }

      switch(pbyBuf[1])

      {

      case0x10:

      gbitLampState=(BIT)pbyBuf[2];

      TriggerLamp(gbitLampState);

      by[2]=1;

      by[3]=CalcCheckSum(by,3);

      SendPackage(by,4);//發送成功執行通知

      break;

      default://不知道的命令

      by[2]=0;

      by[3]=CalcCheckSum(by,3);

      SendPackage(by,4);//發送沒有成功執行通知

      break;

      }

      }

      4.課程設計單獨計算成績,考評方法見其大綱。

      三、理論考試說明

      1.單片機技術及應用理論考試,采用閉卷筆試形式,考試時間120分鐘。

      2.期末考試試題根據教學大綱,其范圍和難度按照本方案中制訂的考試考核內容和要求確定。考試命題覆蓋考試大綱要求范圍。

      3.期末考試試題類型有以下幾種:

      ①填空題;

      ②選擇題;

      ③判斷題;

      ④簡答題⑤綜合應用題。

      四、考試考核要求層次

      按照教學大綱的要求,理論考試要求分為掌握、理解和了解三個層次。

      掌握:

      對于本課程的重點內容要求學生達到掌握的程度。即能夠全面、深入理解和熟練掌握所學內容,并能夠用其分析、初步設計和解答與應用相關的問題,能夠舉一反三。要求學生掌握的內容也就是考試的主要內容,在考試中所占比例約70。

      理解:

      對于本課程的一般內容要求學生能夠理解。即要求學生能夠較好地理解所學內容,并且對所涉及的內容能夠進行簡單分析和判斷。要求學生理解的內容也是考試的內容,在考試中所占比例約25。

      了解:

      對于本課程的次要內容要求學生能夠了解。要求學生了解的內容,一般是指在眼下不必進一步深入和擴展,有些也許需要學生自己今后在工作中進行深入研究。對要求了解的內容,在考試中占較小比例,不超過5。實驗五:按鍵電路、顯示電路實驗一、實驗目的:1.掌握獨立式按鍵電路與矩陣式按鍵電路的設計方法。2.掌握數碼管顯示電路的工作原理3.掌握源程序編輯軟件UltraEdit,編譯軟件KeilC51、仿真軟件Proteus的使用方法4.掌握硬件仿真器ME-52A的使用方法二、實驗器材:1.單片機實驗板2.單片機硬件仿真器ME-51A3.計算機4.電源三、實驗要求:1.電路如圖5所示,用單片機的P3口所接的四個獨立式按鍵控制p1口流水燈花樣的方法;具體表現為:p3.0、P3.1、P3.2、P3.3四個小按鍵分別實現了四個控制:(1)跑燈:即P1.0---1.7亮點流動:(2)流水燈:即P1.0-1.7依次點亮(3)交叉閃爍:即P0.0,P0.2,P0.4,P0.6和P0.1,P0.3,P0.5,P0.7輪流點亮(4)停止;在任何狀態下按此鍵程序停止運行.2.電路如圖6所示,用P2口所接的4×4矩陣式鍵盤作為輸入,在P1口所接的數碼管上顯示出每個按鍵的0~F序號,鍵盤的布局如下表所示:FEDCBA9876543210四、實驗原理:1.獨立式按鍵電路顯示如圖5所示,從圖中可看出,判斷有無鍵按下,只要檢測P3.0~P3.3相應端口的高低電平即可,若檢測有某一端口為低電平,表明該端口有按鍵按下,經延時消抖后轉去執行相應的功能子程序。若為高電平,表明無鍵按1.獨立式按鍵電路如圖5所示,下,繼續檢測。示例程序如下:ORG000HLJMPSTAR1ORG0030HSTAR1:MOVP3,#0FFH;置P3口為輸入態JNBP3.0,FUN0;判別P3.0是否有鍵按下,是,則轉FUN0JNBP3.1,FUN1;判別P3.1是否有鍵按下,是,則轉FUN1JNBP3.2,FUN2;判別P3.2是否有鍵按下,是,則轉FUN2JNBP3.3,FUN3;判別P3.3是否有鍵按下,是,則轉FUN3JNBF0,STAR1;曾經有鍵按下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;關顯示LJMPSTAR1FUN00:MOVA,#0FEH;跑燈子程序FUN000:MOVP1,ALCALLDL05SJNBACC.7,OUTRLAAJMPFUN000OUT:RETFUN11:MOVA,#0FEH;流水燈子程序FUN111:MOVP1,ALCALLDL05SJZOUTRLAANLA,P1AJMPFUN111FUN22:MOVA,#0AAH;交叉點亮子程序MOVP1,ALCALLDL30SCPLAMOVP1,ALCALLDL30SRET;____________;;延時程序;;____________;DL512:MOVR2,#0FFHLOOP1:DJNZR2,LOOP1RETDL10MS:MOVR3,#14HLOOP2:LCALLDL512DJNZR3,LOOP2RETDL05S:MOVR4,#0AHLOOP3:LCALLDL10MSDJNZR4,LOOP3RETDL30S:MOVR5,#03HLOOP4:LCALLDL05SDJNZR5,LOOP4RETEND2.矩陣式按鍵電路顯示如圖6所示。采用掃描方式進行按鍵的識別檢測,并將對應按鍵的鍵號用查表指令將對應的代碼顯示在數碼管上。圖6參考程序如下:ORG0000HLJMPSTARTORG0030HSTART:MOVSP,#60H;設置堆棧指針SCAN:MOVR3,#0F7H;置行掃描初值MOVR1,#00H;到TABLE表中取碼的指針SCAN1:MOVA,R3MOVP2,A;掃描輸出MOVA,P2;重讀P2口狀態MOVR4,A;暫存于R4呂中SETBC;C=1MOVR5,#03H;掃描4列初值L1:RLCA;A中內容循環左移JNCKEYIN;C=0,有鍵按下,轉消抖INCR1;取碼指針加1DJNZR5,L1;無鍵按下,繼續檢測MOVA,R3;掃描下一行SETBCRRCAMOVR3,AJCSCAN1;4行是否掃描完,未完,繼續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五、實驗步驟:1.運行UltraEdit-32源程序編輯軟件,輸入、編輯匯編語言源程序。2.運行KeiluVision2源程序編譯軟件,對源程序進行編譯,得到目標代碼文件。3.運行Proteus模擬仿真軟件,打開已繪制好的仿真電路原理圖,進行模擬 仿真。4.把硬件仿真器ME-52A與單片實驗板連接好,再用硬件仿真器進行仿真驗證。六、實驗分析與總結1.用仿真系統調試簡單程序結構、分支程序結構、循環程序結構、子程序結構和中斷結構的關鍵在于,如何將對程序的分析理解和開發系統提供的基本功能有機地結合起來,其前提條件是必須對源程序的作用、結構特點、運行過程與結果有較全面的認識,并能根據程序運行過程中出現的現象和結果分析并判斷產生各種故障現象的原因,再運用排除法逐一檢驗各種判斷是否準確。2.掌握程序結構特點的基礎上,合理選擇觀測點,通過觀察在觀測點處參數及路徑的變化檢驗程序運行的結果。3.高調試程序的效率,應對單片機開發系統所提供的幾種程序運行調試方式有足夠的了解并能熟練地運用。例如,在調試過程中,若要觀察最終結果,則可選擇全速運行調試;若要觀察相關指令的運行結果或運行路徑的變化過程,則可選擇單步運行;若要檢查子程序的運行過程,則可選擇跟蹤運行調試;若要檢查循環程序或中斷服務程序,則可選擇斷點運行調試;若要定點檢查程序運行到某處的結果時,則可選擇快速運行到光標處調試。但實際中究竟選用哪種方法更適宜或哪幾種方法結合使用更快捷,將隨著分析能力與操作的熟練程度逐步提高。4.程序運行結果是否正確時,應運用單片機開發系統所提供的交互界面,將程序運行過程中程序計數器PC(地址)的變化、各單元(內部RAM和外部RAM)內容的變化、特殊功能寄存器內容的變化、堆棧指針SP內容的變化與程序的理論分析結果相對照。5.程序和調試程序時,需要多次反復的過程,并非一次就能排除全部故障,特別是單片機應用系統的硬件電路和匯編程序相結合的綜合調試就更加復雜,因此,必須通過反復調試,不斷修改硬件和軟件,直到最終符合設計要求為止。如果在調試中能夠根據實驗現象預先對產生故障的原因加以判斷和分析,并制定出相應的調試方法和步驟,可縮小排除故障的范圍,提高調試效率。七、思考與練習填空題

      1、設X=5AH,Y=36H,則X與Y“或”運算為__7EH_______,X與Y的“異或”運算為___6CH_____。

      2、若機器的字長為8位,X=17,Y=35,則X+Y=__110100_____,X-Y=_11101110______(要求結果寫出二進制形式)。

      3、單片機的復位操作是____高電平______(高電平/低電平),單片機復位后,堆棧指針SP的值是___07h_____。

      4、單片機中,常用作地址鎖存器的芯片是__74HC373____________,常用作地址譯碼器芯片是_____74HC138____________。

      5、若選擇內部程序存儲器,應該設置為_____高_______(高電平/低電平),那么,PSEN信號的處理方式為___不用__________________。

      6、單片機程序的入口地址是____0000H__________,外部中斷1的入口地址是______0013H_________。

      7、若采用6MHz的晶體振蕩器,則MCS-51單片機的振蕩周期為__0.5us_______,機器周期為_____2us__________。

      8、擴展芯片的選擇方法有兩種,它們分別是___線選法_______________和_____譯碼法__________。

      9、單片機的內部RAM區中,可以位尋址的地址范圍是____20H~2FH______________,特殊功能寄存器中,可位尋址的地址是___是能被8整除的地址_________________。

      10、子程序返回指令是___ret______,中斷子程序返回指令是__reti。

      11、8051單片機的存儲器的最大特點是內部RAM與外部RAM分開編址。

      12、8051最多可以有32個并行輸入輸出口,最少也可以有8個并行口。

      13、函數是C語言的基本單位。

      14、串行口方式2接收到的第9位數據送SCON寄存器的RB8位中保存。

      15、MCS-51內部提供3個可編程的16位定時/計數器,定時器有4種工作方式。

      16、一個函數由兩部分組成,即說明部分和語句部分。

      17、串行口方式3發送的第9位數據要事先寫入SCON寄存器的TB8位。

      18、利用8155H可以擴展3個并行口,256個RAM單元。

      19、C語言中輸入和輸出操作是由庫函數scanf和printf等函數來完成。

      二、選擇題

      1、C語言中最簡單的數據類型包括(B)。

      A、整型、實型、邏輯型B、整型、實型、字符型

      C、整型、字符型、邏輯型D、整型、實型、邏輯型、字符型

      2、當MCS-51單片機接有外部存儲器,P2口可作為(C)。

      A、數據輸入口B、數據的輸出口

      C、準雙向輸入/輸出口D、輸出高8位地址

      3、下列描述中正確的是(D)。

      A、程序就是軟件B、軟件開發不受計算機系統的限制

      C、軟件既是邏輯實體,又是物理實體D、軟件是程序、數據與相關文檔的集合

      4、下列計算機語言中,CPU能直接識別的是(D)。

      A、自然語言B、高級語言C、匯編語言D、機器語言

      5、MCS-5l單片機的堆棧區是設置在(C)中。

      A、片內ROM區B、片外ROM區C、片內RAM區D、片外RAM區

      6、以下敘述中正確的是(C)。

      A、用C語言實現的算法必須要有輸入和輸出操作

      B、用C語言實現的算法可以沒有輸出但必須要有輸入

      C、用C程序實現的算法可以沒有輸入但必須要有輸出

      D、用C程序實現的算法可以既沒有輸入也沒有輸出

      7、定時器/計數器工作方式1是(D)。

      A、8位計數器結構B、2個8位計數器結構

      C、13位計數結構D、16位計數結構

      8、C語言提供的合法的數據類型關鍵字是(B)。

      A、DoubleB、shortC、integerD、Char

      9、片內RAM的20H~2FH為位尋址區,所包含的位地址是(B)。

      A、00H~20HB、00H~7FHC、20H~2FHD、00H~FFH

      10、以下能正確定義一維數組的選項是(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、數據的存儲結構是指(D)。

      A、存儲在外存中的數據B、數據所占的存儲空間量

      C、數據在計算機中的順序存儲方式D、數據的邏輯結構在計算機中的表示

      12、下列關于棧的描述中錯誤的是(C)。

      A、棧是先進后出的先性表B、棧只能順序存儲

      C、棧具有記憶作用D、對棧的插入和刪除操作中,不需要改變棧底指針

      13、在寄存器間接尋址方式中,間址寄存器中存放的數據是(B)。

      A、參與操作的數據B、操作數的地址值

      C、程序的轉換地址D、指令的操作碼

      14、MCS-51單片機的復位信號是(A)有效。

      A、高電平B、低電平C、脈沖D、下降沿

      15、為了使模塊盡可能獨立,要求(B)。

      A、模塊的內聚程度要盡量高,且各模塊間的耦合程度要盡量強

      B、模塊的內聚程度要盡量高,且各模塊間的耦合程度要盡量弱

      C、模塊的內聚程度要盡量低,且各模塊間的耦合程度要盡量弱

      D、模塊的內聚程度要盡量低,且各模塊間的耦合程度要盡量強

      16、若MCS-51單片機使用晶振頻率為6MHz時,其復位持續時間應該超過(B)。

      A、2μsB、4μsC、8μsD、1ms

      17、以下選項中可作為C語言合法常量的是(A)

      A、-80B、-080C、-8e1.0D、-80.0e

      18、能夠用紫外光擦除ROM中程序的只讀存儲器稱為(C)。

      A、掩膜ROMB、PROMC、EPROMD、EEPROM

      19、以下不能定義為用戶標識符是(D)。

      A、MainB、_0C、_intD、sizeof

      20、下選項中,不能作為合法常量的是(B)。//冪不能為小數

      A、1.234e04B、1.234e0.4C、1.234e 4D、1.234e0

      21、以下敘述中錯誤的是(C)

      A、對于double類型數組,不可以直接用數組名對數組進行整體輸入或輸出

      B、數組名代表的是數組所占存儲區的首地址,其值不可改變

      C、當程序執行中,數組元素的下標超出所定義的下標范圍時,系統將給出“下標越界”的出錯信息

      D、可以通過賦初值的方式確定數組元素的個數

      22、以下與函數fseek(fp,0L,SEEK_SET)有相同作用的是(D)

      A、feof(fp)B、ftell(fp)C、fgetc(fp)D、rewind(fp)

      23、存儲16×16點陣的一個漢字信息,需要的字節數為(A)

      A、32B、64C、128D、256

      24、已知1只共陰極LED顯示器,其中a筆段為字形代碼的最低位,若需顯示數字1,則它的字形代碼應為(B)。

      A、06HB、F9HC、30HD、CFH

      25、在C語言中,合法的長整型常數是(A)

      A、OLB、4962710C、324562&D、216D

      26、以下選項中合法的字符常量是(B)

      A、"B"B、’\010’C、68D、D

      27、若PSW.4=0,PSW.3=1,要想把寄存器R0的內容入棧,應使用(D)指令。

      A、PUSHR0B、PUSH@R0C、PUSH00HD、PUSH08H

      28、在片外擴展一片2764程序存儲器芯片要(B)地址線。

      A、8根B、13根C、16根D、20根

      29、設MCS-51單片機晶振頻率為12MHz,定時器作計數器使用時,其最高的輸入計數頻率應為(C)

      A、2MHzB、1MHzC、500kHzD、250kHz

      30、下列數據字定義的數表中,(A)是錯誤的。

      A、DW“AA”B、DW“A”C、DW“OABC”D、DWOABCH

      三、判斷題

      (√)1、在對某一函數進行多次調用時,系統會對相應的自動變量重新分配存儲單元。

      (×)2、在C語言的復合語句中,只能包含可執行語句。

      (√)3、自動變量屬于局部變量。

      (×)4、Continue和break都可用來實現循環體的中止。

      (√)5、字符常量的長度肯定為1。

      (×)6、在MCS-51系統中,一個機器周期等于1.5μs。

      (√)7、C語言允許在復合語句內定義自動變量。

      (√)8、若一個函數的返回類型為void,則表示其沒有返回值。

      (×)9、所有定義在主函數之前的函數無需進行聲明。

      (×)10、定時器與計數器的工作原理均是對輸入脈沖進行計數。

      (×)11、END表示指令執行到此結束。

      (√)12、ADC0809是8位逐次逼近式模/數轉換接口。

      (√)13、MCS-51的相對轉移指令最大負跳距是127B。

      (×)14、MCS-51的程序存儲器只是用來存放程序的。

      (√)15、TMOD中的GATE=1時,表示由兩個信號控制定時器的的啟停。

      (×)16、MCS-51的特殊功能寄存器分布在60H~80H地址范圍內。

      (×)17、MCS-51系統可以沒有復位電路。

      (×)18、片內RAM與外部設備統一編址時,需要專門的輸入/輸出指令。

      (√)19、鎖存器、三態緩沖寄存器等簡單芯片中沒有命令寄存和狀態寄存等功能。

      (√)20、使用8751且=1時,仍可外擴64KB的程序存儲器。

      四、簡答題

      1、在使用8051的定時器/計數器前,應對它進行初始化,其步驟是什么?

      答:(1)確定T/C的工作方式——編程TMOD寄存器;

      (2)計算T/C中的計數初值,并裝載到TH和TL;

      (3)T/C在中斷方式工作時,須開CPU中斷和源中斷——編程IE寄存器;

      (4)啟動定時器/計數器——編程TCON中TR1或TR0位。

      2、什么是重入函數?重入函數一般什么情況下使用,使用時有哪些需要注意的地方?

      答:多個函數可以同時使用的函數,稱為重入函數。

      通常情況下,C51函數不能被遞歸調用,也不能應用導致遞歸調用的結構。有此限制是由于函數參數和局部變量是存儲在固定的地址單元中。重入函數特性允許你聲明一個重入函數。即可以被遞歸調用的函數。

      重入函數可以被遞歸調用,也可以同時被兩個或更多的進程調用。重入函數在實時應用中及中斷服務程序代碼和非中斷程序代碼必須共用一個函數的場合中經常用到。

      3、8051引腳有多少I/O線?他們和單片機對外的地址總線和數據總線有什么關系?地址總線和數據總線各是幾位?

      答:8051引腳共有40個引腳,8051的地址總線由P2和P0口提供,P2口是地址總線的高8位,P0口是地址總線的低8位;數據總線由P0口提供;P0口的地址總線和數據總線是分時進行的,P0口的地址總線需要外接地址鎖存器完成地址鎖存。

      地址總線共16位,數據總線是8位。

      4、在有串行通信時,定時器/計數器1的作用是什么,怎樣確定串行口的波特率?

      答:在有串行通信時,定時器/計數器1的作用是串行口發生器。

      串行口的波特率根據串行口的工作方式具有不同的計算方式:

      方式0的波特率固定為晶體振蕩器的十二分之一;

      方式1的波特率=2SMOD.(定時器1的溢出率)/32;

      方式2波特率=2SMOD.(fosc/64);

      方式3波特率同方式1(定時器l作波特率發生器)。

      5、如何消除鍵盤的抖動?怎樣設置鍵盤中的復合鍵?

      答:由于按鍵是機械開關結構,所以當用手按下其中一個鍵時,往往會出現所按鍵在閉合位置和斷開位置之間發生跳幾下后才會穩定到閉合狀態的情況。在釋放一個鍵時,也會出現類似的情況,這就是鍵的抖動,抖動的持續時間不一,但通常不會大于10ms。

      若抖動問題不解決,就會引起對閉合鍵的多次讀入。對于鍵抖動最方便的解決方法就是當發現有鍵按下后,不是立即進行掃描,而是延時大約10ms后再進行。由于一個鍵按下的時間一般會持續上百毫秒,所以延遲10ms后再掃描處理并不遲。

      復合鍵可以仿照計算機復合鍵的處理方法,通常可以假設一個鍵具有復合功能,再與其它減的鍵值組合成復合鍵。1、矩陣式鍵盤的結構與工作原理

      在鍵盤中按鍵數量較多時,為了減少I/O口的占用,通常將按鍵排列成矩陣形式,如圖1所示。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接。這樣,一個端口(如P1口)就可以構成4*4=16個按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數越多,區別越明顯,比如再多加一條線就可以構成20鍵的鍵盤,而直接用端口線則只能多出一鍵(9鍵)。由此可見,在需要的鍵數比較多時,采用矩陣法來做鍵盤是合理的。

      矩陣式結構的鍵盤顯然比直接法要復雜一些,識別也要復雜一些,上圖中,列線通過電阻接正電源,并將行線所接的單片機的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當按鍵沒有按下時,所有的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態就可得知是否有鍵按下了。具體的識別及編程方法如下所述。

      2、矩陣式鍵盤的按鍵識別方法

      確定矩陣式鍵盤上何鍵被按下介紹一種“行掃描法”。

      行掃描法行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識別方法,如上圖所示鍵盤,介紹過程如下。

      1、判斷鍵盤中有無鍵按下將全部行線Y0-Y3置低電平,然后檢測列線的狀態。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。

      2、判斷閉合鍵所在的位置在確認有鍵按下后,即可進入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為 高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。

      下面給出一個具體的例子:

      圖仍如上所示。8031單片機的P1口用作鍵盤I/O口,鍵盤的列線接到P1口的低4位,鍵盤的行線接到P1口的高4位。列線P1.0-P1.3分別接有4個上拉電阻到正電源 5V,并把列線P1.0-P1.3設置為輸入線,行線P1.4-P.17設置為輸出線。4根行線和4根列線形成16個相交點。

      1、檢測當前是否有鍵被按下。檢測的方法是P1.4-P1.7輸出全“0”,讀取P1.0-P1.3的狀態,若P1.0-P1.3為全“1”,則無鍵閉合,否則有鍵閉合。

      2、去除鍵抖動。當檢測到有鍵按下后,延時一段時間再做下一步的檢測判斷。

      3、若有鍵被按下,應識別出是哪一個鍵閉合。方法是對鍵盤的行線進行掃描。P1.4-P1.7按下述4種組合依次輸出:

      P1.71110

      P1.61101

      P1.51011

      P1.40111

      在每組行輸出時讀取P1.0-P1.3,若全為“1”,則表示為“0”這一行沒有鍵閉合,否則有鍵閉合。由此得到閉合鍵的行值和列值,然后可采用計算法或查表法將閉合鍵的行值和列值轉換成所定義的鍵值

      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

      鍵盤處理程序就作這么一個簡單的介紹,實際上,鍵盤、顯示處理是很復雜的,它往往占到一個應用程序的大部份代碼,可見其重要性,但說到,這種復雜并不來自于單片機的本身,而是來自于操作者的習慣等等問題,因此,在編寫鍵盤處理程序之前,最好先把它從邏輯上理清,然后用適當的算法表示出來,最后再去寫代碼,這樣,才能快速有效地寫好代碼。

      到本課為止,本站教程暫告一個段落!感謝大家的關心和支持!矩陣按鍵部分由16個輕觸按鍵按照4行4列排列,連接到JP50端口。將行線所接的單片機的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當按鍵沒有按下時,所有的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,這樣,通過讀入輸入線的狀態就可得知是否有鍵按下了。確定矩陣式鍵盤上何鍵被按下,介紹一種“行掃描法”。行掃描法行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識別方法.判斷鍵盤中有無鍵按下:將全部行線置低電平,然后檢測列線的狀態。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。判斷閉合鍵所在的位置:在確認有鍵按下后,即可進入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。下面給出一個具體的例子:電路圖路徑:G:\圖片\電路圖片\xl100097.jpg8031單片機的P1口用作鍵盤I/O口,鍵盤的列線接到P1口的低4位,鍵盤的行線接到P1口的高4位。列線P1.0-P1.3設置為輸入線,行線P1.4-P.17設置為輸出線。4根行線和4根列線形成16個相交點。1.檢測當前是否有鍵被按下。檢測的方法是P1.4-P1.7輸出全“0”,讀取P1.0-P1.3的狀態,若P1.0-P1.3為全“1”,則無鍵閉合,否則有鍵閉合。2.去除鍵抖動。當檢測到有鍵按下后,延時一段時間再做下一步的檢測判斷。3.若有鍵被按下,應識別出是哪一個鍵閉合。方法是對鍵盤的行線進行掃描。P1.4-P1.7按下述4種組合依次輸出:P1.71110P1.61101P1.51011P1.40111在每組行輸出時讀取P1.0-P1.3,若全為“1”,則表示為“0”這一行沒有鍵閉合,否則有鍵閉合。由此得到閉合鍵的行值和列值,然后可采用計算法或查表法將閉合鍵的行值和列值轉換成所定義的鍵值。4.為了保證鍵每閉合一次CPU僅作一次處理,必須去除鍵釋放時的抖動。實驗目的:通過XL1000的16位矩陣按鍵,在數碼管上分別顯示0---9,A,B,C,D,E,F。接線方法:1用一條8PIN數據排線,把矩陣按鍵部份的JP50,接到CPU部份的P1口JP44.2接8位數碼管的數據線。將數碼管部份的數據口JP5接到CPU部份的P0口JP51.3接8位數碼管的顯示位線。將數碼管部份的顯示位口JP8接到CPU部份的P2口JP52.參考程序:;本程序實現掃描按鍵顯示功能.;分別按16個鍵盤顯示分別顯示數字123A456B789C*0#D;鍵盤口P1,數碼管顯示第二位p21,數碼管段位p0口org0000hajmpmainorg0030hmain:movdptr,#tab;將表頭放入DPTRlcallkey;調用鍵盤掃描程序movca,@a dptr;查表后將鍵值送入ACCmovp0,a;將Acc值送入P0口CLRP2.1;開顯示ljmpmain;返回反復循環顯示KEY:LCALLKS;調用檢測按鍵子程序JNZK1;有鍵按下繼續LCALLDELAY2;無鍵按調用延時去抖AJMPKEY;返回繼續檢測按鍵K1:LCALLDELAY2LCALLDELAY2;有鍵按下延時去抖動LCALLKS;再調用檢測按鍵程序JNZK2;確認有按下進行下一步AJMPKEY;無鍵按下返回繼續檢測K2:MOVR2,#0EFH;將掃描值送入R2暫存MOVR4,#00H;將第一列值送入R4暫存K3:MOVP1,R2;將R2的值送入P1口L6:JBP1.0,L1;P1.0等于1跳轉到L1MOVA,#00H;將第一行值送入ACCAJMPLK;跳轉到鍵值處理程序L1:JBP1.1,L2;P1.1等于1跳轉到L2MOVA,#04H;將第二行的行值送入ACCAJMPLK;跳轉到鍵值理程序進行鍵值處理L2:JBP1.2,L3;P1.2等于1跳轉到L3MOVA,#08H;將第三行的行值送入ACCAJMPLK;跳轉到鍵值處理程序L3:JBP1.3,NEXT;P1.3等于1跳轉到NEXT處MOVA,#0cH;將第四行的行值送入ACCLK:ADDA,R4;行值與列值相加后的鍵值送入APUSHACC;將A中的值送入堆棧暫存K4:LCALLDELAY2;調用延時去抖動程序LCALL KS;調用按鍵檢測程序JNZK4;按鍵沒有松開繼續返回檢測POPACC;將堆棧的值送入ACCRETNEXT:INCR4;將列值加一MOVA,R2;將R2的值送入AJNBACC.7,KEY;掃描完至KEY處進行下一掃描RLA;掃描未完將A中的值右移一位進行下一列的掃描MOVR2,A;將ACC的值送入R2暫存AJMPK3;跳轉到K3繼續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輪流顯示鍵盤因為無法表達*#就用H表示,B用8表示end這是我做成功的4X4鍵盤掃描源程序,P1.0-P1.3做四根列線,P1.4-P1.7做四根行線。

      數碼管的字型表是按照標準接法做的,按對應的按鍵數碼管顯示對應的數字。

      以下是源程序:

      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數據采集控制

      ;P2.6P2.7個位十位顯示轉換控制

      ;P1口接8個開關模擬數據

      ;P1.0-P1.3為個位開關量輸入

      ;P1.4-P1.7為十位開關量輸入

      ;此程序僅供參考

      ;功能P1口接8個開關輸入量4個一組,分別為個位,十位輸入

      ;P0口接一個數碼管,依次顯示輸入量。P3.1控制是否讀入

      ;開關量。P2.6P2.7控制是否顯示個位或十位

      ORG100h

      LJMPSTAR

      STAR:MOVP1,#0FFH

      SETBP3.1數據讀入標志

      MOVR0,#100,循環工作次數

      LOOP:JBP3.1,$P3.1低電平時,采集P1口數據開關量處理顯示階段不再應答P3.1

      MOVA,P1

      PUSHACC

      ANLA,#0FH取個位數值

      MOVR1,A個位數值保存到R1

      POPACC

      ANLA,#0F0H

      SWAPA高4位轉成字節信息

      MOVR2,A十位數值保存到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.實驗任務在8X8 LED點陣上顯示柱形,讓其先從左到右平滑移動三次,其次從右到左平滑移動三次,再次從上到下平滑移動三次,最后從下到上平滑移動三次,如此循環下去。2.電路原理圖圖4.24.13.硬件電路連線(1).把“單片機系統”區域中的P1端口用8芯排芯連接到“點陣模塊”區域中的“DR1-DR8”端口上;(2).把“單片機系統”區域中的P3端口用8芯排芯連接到“點陣模塊”區域中的“DC1-DC8”端口上;4.程序設計內容(1).8X8 點陣LED工作原理說明8X8點陣LED結構如下圖所示圖4.24.2從圖4.24.2中可以看出,8X8點陣共需要64個發光二極管組成,且每個發光二極管是放置在行線和列線的交叉點上,當對應的某一列置1電平,某一行置0電平,則相應的二極管就亮;因此要實現一根柱形的亮法,如圖49所示,對應的一列為一根豎柱,或者對應的一行為一根橫柱,因此實現柱的亮的方法如下所述:一根豎柱:對應的列置1,而行則采用掃描的方法來實現。一根橫柱:對應的行置0,而列則采用掃描的方法來實現。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點陣顯示實驗一.實驗要求

      編程實現中英文字符的顯示。

      二.實驗目的

      1.了解LED點陣顯示的基本原理和實現方法。

      2.掌握點陣漢字庫的編碼和從標準字庫中提取漢字編碼的方法。

      三.實驗電路及連線

      點陣顯示模塊WTD3088的(紅色)列輸入線接至內部LED的陰極端,行輸入線接至內部LED的陽極端(若陽極端輸入為高電平,陰極端輸入低電平,則該LED點亮)。發光點的分布如圖22-0所示。

      Fig22-0WTD3088LED分布

      如圖22-1示,本實驗模塊使用74LS374來控制列輸入線的電平值。將74LS374的某輸出置0,則對應的LED陰極端被置低。如圖22-2示,本實驗模塊使用74LS273來控制行輸入線,并通過9013提供電流驅動。將74LS273的某輸出置1,則對應的LED陽極端被置高。每次系統重新開啟或總清后,74LS273輸出為全0,LED顯示被關閉。

      通過編程控制各顯示點對應LED陽極和陰極端的電平,就可以有效的控制各顯示點的亮滅。

      Fig22-1LED模塊及列掃描電路Fig22-2行掃描電路

      Fig22-3地址譯碼電路

      本實驗模塊使用4塊WTD3088組成16×16點陣,以滿足漢字顯示的要求。為了方便的控制四個單元,使用了一片74LS139譯碼,產生四個地址片選信號:CLKR1=CSLED,CLKR2=CSLED 1,用于行控制的兩片74LS273;CLKC1=CSLED 2,CLKC2=CSLED 3,用于列控制的兩片74LS374。

      實驗接線:按示例程序,模塊的CSLED接51/96地址的8000H。

      四.實驗說明

      使用高亮度LED發光管構成點陣,通過編程控制可以顯示中英文字符、圖形及視頻動態圖形。LED顯示以其組構方式靈活、亮度高、技術成熟、成本低廉等特點在證券、運動場館及各種室內/外顯示場合得到廣泛的應用。

      所顯示字符的點陣數據可以自行編寫(即直接點陣畫圖),也可從標準字庫(如ASC16、HZ16)中提取。后者需要正確掌握字庫的編碼方法和字符定位的計算。

      實驗盤片中“字符轉換”子目錄下提供的Basc16.exe,BHz16.exe可方便的將單個字符的碼表從標準字庫Asc16,Hzk16中提取出來。具體使用方法是運行上述可執行程序,根據提示輸入所需字符(如是漢字還需要先啟動dos下的漢字環境,如ucdos,pdos95等)。程序將該字符的碼表提取出來,存放在該字符ASC或區位碼為文件名稱的.dat文件中。用戶只需將該文件中內容拷貝、粘貼到自己的程序中即可。但需要注意字節排列順序、字節中每一位與具體顯示點的一一對應關系,必要時還要對碼表稍作修改。同一目錄下還提供了上述可執行程序的源文件,使用BC3.1編寫,供用戶參考。

      五.實驗程序框圖

      用戶應留心其中行掃描的實現及碼表的處理。

      六.實驗程序:(一)提供LEDA51演示Asc16字符的簡單點陣顯示。

      ;________*LED點陣顯示示例程序______________________*

      ;__該程序顯示Asc16字符__

      ;__為了簡單起見,程序只顯示一個字符__

      ;__該程序針對T598實驗機的模塊14__

      ;____________________________________________________

      CSLEDEQU8000H

      CSR1EQUCSLED;行1273

      CSR2EQUCSLED 1H;行2273

      CSC1EQUCSLED 2H;列1374

      CSC2EQUCSLED 3H;列2374

      ORG0000H

      MOVSP,#60H

      INIT:MOVA,#0H;關閉行

      MOVDPTR,#CSR1

      MOVX@DPTR,A

      MOVDPTR,#CSR2

      MOVX@DPTR,A

      MOVA,#0FFH;關閉列

      MOVDPTR,#CSC1

      MOVX@DPTR,A

      MOVDPTR,#CSC2

      MOVX@DPTR,A

      D:MOVR5,#00H

      MOVR4,#01H;每次為單行掃描

      DISP:

      MOVA,R5

      MOVDPTR,#ASCE;此處設定所要顯示的字符

      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

      ;________延時子程序,協調字符顯示速度____________*

      DELAY:MOVR7,#1H

      DL1:MOVR6,#00H

      DL2:DJNZR6,DL2

      DJNZR7,DL1

      RET

      ;________字符點陣字庫______________*

      ;ASC16字符編碼排列

      ;0

      ;1

      ;|

      ;|

      ;14

      ;15

      ;高位D7--D0

      ;請注意編碼的排列次序和實際顯示點陣分布的關系

      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字符的簡單點陣顯示。

      ;________*LED點陣顯示示例程序______________________*

      ;__該程序顯示hz16字符__

      ;__為了簡單起見,程序只顯示一個字符__

      ;__該程序針對T598實驗機的模塊14__

      ;____________________________________________________

      CSLEDEQU8000H

      CSR1EQUCSLED;行1273

      CSR2EQUCSLED 1H;行2273

      CSC1EQU CSLED 2H;列1374

      CSC2EQUCSLED 3H;列2374

      ORG0000H

      MOVSP,#60H

      INIT:MOVA,#0H;關閉LED顯示

      MOVDPTR,#CSR1

      MOVX@DPTR,A

      MOVDPTR,#CSR2

      MOVX@DPTR,A

      MOVA,#0FFH;關閉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

      ;________延時子程序,協調字符顯示速度____________*

      DELAY:MOVR7,#1H

      DL1:MOVR6,#00H

      DL2:DJNZR6,DL2

      DJNZR7,DL1

      RET

      ;________字符點陣字庫______________*

      ;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的計算機可鎖定加密鍵盤設計摘要:介紹PC鍵盤和鍵盤接口的PS/2通信協議,以及用89C51實現可鎖定鍵盤的軟件和硬件設計方法。具有安全可靠、容錯能力強、可以直接采用標準鍵盤進行改裝、便于實現等優點,并保留標準鍵盤的全部功能。關鍵詞:PS/289C51C51鍵盤引言

      在智能儀器、自動控制等領域,已大量使用嵌入式PC,如Advantech公司的PC/104、AMD公司的DIMM-PC等。為適應開放式、模塊化的要求,嵌入式PC具有標準的PC接口,如VGA顯示器控制接口、以太網接口、RS232接口、PC/AT鍵盤接口等。所以,可以用標準的PC鍵盤對嵌入式PC進行操作與控制。鍵盤在輸入指令之后,可能很長一段時間不用。為計算機安全和防止誤觸發,需要將鍵盤鎖定,還要對某些鍵采取屏蔽措施,但是PC標準鍵盤不能滿足這些要求。本文介紹一種用89C51設計實現的可鎖定加密PC/AT鍵盤。

      1鍵盤功能及工作原理

      PC鍵盤功能主要有按鍵識別、去抖、重鍵處理、發送掃描碼、自動重發、接收鍵盤命令、處理命令等。鍵盤有編碼鍵盤和非編碼鍵盤。編碼鍵盤程序設計簡單,但硬件電路復雜,價格較高;非編碼鍵盤用軟件來實現識別鍵、編碼轉換、去抖等功能,硬件電路簡單,價格便宜。現代微機系統中廣泛采用非編碼鍵盤。PC鍵盤多采用18行×8列的二維矩陣行列結構。采用行掃描法識別按下的按鍵。2PS/2協議

      PS/2協議是外設與主機之間通信的一種同步雙向串行協議。在該協議中主機擁有較高的優先級,在一定條件下可以終止外設正在進行的發送過程。PS/2協議采用的傳送數據幀的格式為:1位起始位(0)、8位數據位、1位奇偶校驗位、1位停止位(1)。數據發送時低位在前,高位在后。外設每收到主機發來的1幀數據,都要緊隨該幀的停止位發送一個握手位ACK(0)應答主機。然后,外設還要發1幀應答數據(0xF0),表示外設已經完整地接收到了主機的命令;而主機則不需發送握手位,也不需要發送應答幀。

      2.1鍵盤到PC鍵盤接口的通信

      當時鐘線和數據線均為高電平時,允許鍵盤發送數據,系統將接收數據;當時鐘線被拉為低電平時,表明系統禁止數據傳輸。圖1給出了發送時序,包含1個低電平觸發的起始位、8位數據位、1個奇校驗位和1個高電平的結束位。2.2PC系統到鍵盤的通信協議

      若時鐘線出現高電平,數據線出現低電平,表明系統請求發送,鍵盤準備產生同步時鐘脈沖串,并接收數據。包含了1個低電平觸發的起始位、8位數據位、1個奇校驗位、1個應答位、1個高電平的結束位。圖2為時序圖。(1)鍵盤命令及執行過程①FFH:復位鍵盤。系統通過此軟件復位命令使鍵盤進入程序復位和內部自測試,稱為基本保證測試(BAT)。復位鍵盤的過程如下:a.鍵盤收到FFH后立即回送ACK(FAH)作答;b.鍵盤接口收到ACK后,將鍵盤時鐘和數據線置為高電平;c.鍵盤檢測到此狀態后開始BAT操作;d.如果BAT正確完成,鍵盤發送AAH以表示結束,

      否則以FDH(或其它任何值)表示診斷有誤。②FEH:重新發送。當系統檢測到從鍵盤送來的任何傳輸錯誤時,它便向鍵盤發送FEH命令。鍵盤接收到此命令后,將重新送出原來的內容。③FDH~F7H:空操作(保留未用)。④F6H:設置缺省值。此命令使鍵盤所有條件復位到電源接通時的缺省狀態,鍵盤繼續掃描。⑤F5H:設置缺省值和停止鍵盤。此命令使鍵盤所有條件復位到電源接通時的缺省狀態,并停止鍵盤掃描,等待下一個鍵盤命令。⑥F4H:啟動鍵盤。鍵盤接收到此命令后,用ACK(FAH)作答,清除輸出緩沖器,并啟動鍵盤開始掃描。⑦F3H:設置拍發速率和延時參數。每當按下任 一鍵時,鍵盤以拍發速率連續送出鍵的接通碼,直到鍵被釋放為止。延時參數是指按下一鍵后,鍵盤輸出的響應時間。

      系統缺省設置:拍發速率=10個/s±20,延時=500ms±20。

      當要改變設置時可以使用F3H命令,并后跟一個字節的參數。參數定義如表1所列。

      表1D7D6D5D4D3D2D1D00CBA

      計算拍發速率和響應延時的公式如下:

      拍發速率=1/[(8 A)×2B×0.00417](1/s)

      響應延時=(1 C)×250(ms)注:缺省的延時參數值為2CH。此命令的執行過程如下:a.鍵盤收到F3H命令后,用FAH予以響應,并停止掃描和等待隨后的參數;b.鍵盤若收到隨后的設置參數,用另一個ACK響應,并按其參數設置新的拍發速率和響應延時,之后重新開始掃描(若鍵盤原來是開放的);c.鍵盤若收到FAH命令,但無隨后的設置參數,則鍵盤結束命令設置,并保持原來的拍發速率和響應延時,停止掃描。⑧F2H,F1,EFH:保留未用。⑨F0H:設置鍵盤掃描碼命令。此命令用于設置鍵盤的掃描碼,后跟參數指定三種掃描碼的哪一種。鍵盤復位時,默認掃描碼是第二種。⑩EEH:回送命令。此命令用于輔助診斷,要求鍵盤接收到EEH時也要回送EEH予以響應。若鍵盤原來是開放的,則繼續掃描。EDH:置位/復位LED指示器。鍵盤右上角有三個LED指示器,分別反映Caps、Num和Scroll三個鍵的鎖定情況。參數字節如表2所列。

      表2D7D3D2D1D0保留1=激勵CapsLED1=激勵NumLED1=激勵ScrollLED

      此命令執行過程與F3H相似。若命令后跟參數,則按參數設定LED狀態并繼續掃描。若僅有命令無參數,則不改變LED原狀態,并停止掃描。(2)鍵盤響應鍵盤在下列四種情況下都會向鍵盤接口發送數據。①按下任一鍵,鍵盤以拍發速率向接口發送鍵盤接通掃描碼。②釋放所按下的鍵,鍵盤發送斷開掃描碼。③系統向鍵盤發送鍵盤命令后,鍵盤回送應答。④當用戶按鍵速度超出鍵盤所能容納的最大鍵個數時,鍵盤做出響應。后三種情況稱為鍵盤響應。響應字節有7個,定義如下。

      ①FEH:重新發送響應。當鍵盤收到一個無效的鍵盤命令,或者檢測到奇偶錯的鍵盤命令時,鍵盤回送響應字節為FEH,要求系統重發鍵盤命令。②FAH:正常應答。對任何一個有效的鍵盤命令,鍵盤回送FAH予以響應。③00H:超限應答。當用戶按鍵速度超出鍵盤所能容納的最大鍵符個數時(16個字節的緩沖器),鍵盤發送00H。④FDH:診斷故障應答。鍵盤接受軟件復位命令,執行自測試過程中。若檢測到故障,則以FDH應答。此時,鍵盤停止掃描并等待下一個鍵盤命令。⑤AAH:診斷正常應答。鍵盤在軟件復位過程中,正常完成BAT測試,以AAH應答。⑥FEH:回響命令的應答,對鍵盤FEH命令的應答。⑦F0H:斷開掃描碼前綴,鍵盤對鍵符按下后釋放的應答,第一個字節為F0H,第二個字節為接通掃描碼(有幾個鍵例外)。3硬件設計

      PC系列鍵盤采用18行×8列的矩陣行列結構。89C51單片機有4個8位I/O端口,因此可以采用P0、P2口再加上P3口的2個(P3.6和P3.7)作為行掃描線。P1口作為列輸入線(如果用P0口作列輸入線,必須加上拉電阻)。采用P3.0、P3.1作為數據線和時鐘線與PC系統進行通信,用P3.2、P3.4、P3.5控制鍵盤上的3個指示燈。硬件原理如圖3所示。

      鍵盤與計算機通過一個五芯(PS/2接口為六芯)插座相接,4個有效引腳的定義分別是電源(VCC)、地(GND)、串行時鐘線(SCK)、串行數據線(SIO)。

      4軟件設計①消抖及重鍵處理:通過軟件上延時程序來消除抖動;采用后按鍵優先處理,即多鍵同時按下時,只重復發送最后按下鍵的掃描碼。②程序包括鍵盤掃描子程序、發送鍵碼子程序、發送數據子程序、接收命令子程序、定時器1中斷服務程序、主程序等。鍵盤掃描子程序用于掃描鍵狀態,將被按鍵的位置號存入緩沖器中;發送鍵碼子程序用于將緩沖區鍵的接通碼或斷開碼發送給計算機鍵盤接口或者存在鍵盤密碼緩沖區中;發送數據子程序用于將數據發給計算機鍵盤接口;接收命令子程序用于接收計算機鍵盤接口發來的鍵盤命令;定時器1中斷服務子程序用于給程序中的延時提供標準時鐘,并具有軟件看門狗功能,防止軟件出現死機現象;主程序用于系統初始化,子程序調度,鎖定狀態的顯示等。

      圖6發送緩沖區鍵碼子程序流程圖

      圖4~6是主要軟件模塊的流程圖。單片機源程序見本刊網絡補充版(.com)。

      5結論

      本文介紹的PC/AT鍵盤具有結構簡單、設計靈活、安全可靠的特點,可用于標準PC和嵌入式PC。本鍵盤可以在標準的鍵盤基礎上進行改造,只需換掉原來的控制芯片即可,可節省設計成本。單片機C51編程幾個有用的模塊(1)KeilC51常用功能模塊使用說明

      說明

      本文檔包括單片機系統中常用到的時鐘中斷、通訊及鍵盤掃描等模塊(見所附源程序)的說明。這些模塊使用前后臺系統模型。為達到最大的靈活性,需要在用戶工程中定義config.h文件,在其中定義各模塊可選參數的設置,而不是直接更改源代碼。

      這些可選內容大部分為宏定義,如果不定義宏相應的功能在編譯時被屏蔽,不會增加代碼長度。具體可選內容見各模塊中的說明。

      在Config.h文件中還要包含一個單片機硬件的資源頭文件。

      各模塊使用了定義在Common.h中的一些數據類型。如:BIT(bit)BYTE(unsignedchar)等,具體請參見源程序。

      時鐘模塊

      在單片機軟件設計中,時鐘是重要資源,為了充分利用時鐘資源,故設計本時鐘模塊。本模塊使用定時器0,在完成用戶指定功能的同時,還能夠自動處理一些其它模塊中與時鐘相關的信息。

      時鐘模塊由聲明文件Timer.h以及實現文件Timer.c組成。

      用戶應該在Config.h中定義宏TIMER_RELOAD來設定定時器0的重裝載初值。推薦的定時器0的中斷時間大于1毫秒。

      在程序的初始化階段調用時鐘模塊的初始化函數InitTimerModule()之后,就可以使用時鐘模塊所以支持的各種功能。具體描述如下:

      延時:當用戶需要進行一定時間的延時時,可以通過調用Delay()來進行,參數為時鐘中斷的次數。如時鐘中斷周期為1ms,想進行100ms的延時,則可以調用Delay(100)。

      注意:

      如果延時的絕對時間小于時鐘中斷的周期,則不能夠用本方法做到延時。

      定時:當程序中需要使用定時功能時,如等待某外部事件,如果在一定時間內發生則繼續執行,如果在這段時間內發生,則認為出現錯誤,轉向錯誤處理機制。

      在此推薦一種編程模式,但用戶可以用自己認為更合理的方式處理此類問題。

      這里簡單說明一下關于阻塞式函數及非阻塞式函數。簡單說,阻塞式函數就是當檢測完成條件,如果不能夠完成則等待,如:

      voidCheckSomething()

      {

      //gbitSuccessFlagisaglobalvariable

      while(gbitSuccessFlag==FALSE)

      {

      //donothingbutwaiting

      }

      }

      可以看到,當bitSuccessFlag沒有被設置為TRUE時,函數保持等待狀態不返回,這樣就是阻塞式的函數。

      另外一種情況:

      BITCheckSomething()

      {

      if(gbitSuccessFlag==TRUE)

      {

      //…

      returnTRUE;

      }

      returnFALSE;

      }

      在這里,如果所檢測的事件有沒有完成,函數進行檢測之后,立刻返回, 通過返回值報告完成情況,如果沒有完成,則等待調用者分配再次執行的機會。這樣的函數就是非阻塞函數。

      在應用定時功能時,首先要將檢測函數定義成非阻塞函數。如上面的第二個版本的CheckSomething。

      然后下面模式:

      BITbitDone=FALSE;

      ResetClock();//cleartimerinterrupttimescounter

      while(GetClock()

      {

      if(CheckSomething()==TRUE)

      {

      bitDone=TRUE;

      break;

      }

      }

      if(bitDone==FALSE)

      {

      //processtimeout

      }

      或者簡單寫成:

      BITbitDone=FALSE;

      ResetClock();

      while(GetClock()=(z))

      當然,用戶也可以將IsPackageHeader和IsPackageTailer定義成為函數,通過BIT類型的返回值來向調用者提供與相應宏相同的信息。

      另一種辦法需要在Config.h文件中定義宏SCOMM_ComplexPackageFormat。(需要注意的是,不能夠同時定義SCOMM_SimplePackageFormat和SCOMM_ComplexPackageFormat宏,否則會造成嚴重的不可預見性錯誤。

      這時需要提供回調函數QueryPackageFormat,原形如下:

      BYTEQueryPackageFormat(BYTEbyData,BYTEbyCount,BYTEbyParam);

      函數中三個參數的含義與使用簡單數據包格式時判斷數據包尾的宏的參數相同。

      函數通過返回值來通知作為調用者的接收函數對接收到的數據如何處理,但目前這種方法僅為需要處理復雜數據包格式時的一種可選方法,但不推薦。用戶如果想使用這種方法可以自己更改接收函數中相應的

      #ifdefSCOM_ComplexPackageFormat

      #endif//SCOMM_ComplexPackageFormat

      預編譯指令之間的內容。

      例如指定QueryPackageFormat的返回值的含義:

      0:繼續找數據包頭或繼續找數據包尾。

      1:找到數據包頭。

      2:找到數據包尾。

      3:數據包出錯,需要拋棄。

      然后更改源代碼來實現上面的協議。

      注意:當用戶需要使用字符串的時候,可以利用簡單的包裝函數將字符串轉換為字節數組。所以沒有必要提供專用的字符串處理函數。

      鍵盤掃描模塊

      鍵盤掃描模塊有兩種工作方式,一種為自動的由時鐘模塊調用,另一種是由程序員自行調用。

      1)由時鐘模塊自動調用的方式

      將時鐘模塊實現文件(Timer.h)及鍵盤掃描模塊的實現文件(KBScan。c)包含進工程,在Config.h文件中添加TIMER_KBSCANDELAY宏。時鐘模塊自動對時鐘中斷進行計數,當達到TIMER_KBSCANDELAY宏所定義的值后,自動調用鍵盤掃描模塊中的函數KBScanProcess()進行鍵盤掃描,也就是說,這個宏的值可以決定按鍵消抖動的時間。

      用戶應該提供兩個回調函數OnKBScan()及OnKeysPressed()。在函數OnKBScan中進行鍵盤掃描,并返回掃描碼。掃描碼的類型缺省為BYTE,當鍵盤規模較大時,BYTE不能夠完全包含鍵盤信息時,可在Config.h文件中重定義宏KBvalue,如下:

      #defineKBvalueWORD

      這樣,就可以使用16位的鍵盤掃描碼,如果此時還達不到要求,可以將鍵盤掃描碼定義成一個結構,但這樣做將會增加代碼量及消耗更多的RAM資源,故不推薦。

      掃描模塊調用OnKBScan取得掃描碼,并調用用戶可以重定義的宏IsNoKeyPressed來判斷是否有鍵按下,缺省的IsNoKeyPressed實現如下:

      #defineIsNoKeyPressed(x)((x)==0x00)

      即認為OnKBScan返回0掃描碼時為沒有鍵按下,如果掃描函數返回其它非零掃描碼做為無鍵按下的掃描碼時,可以在Config.h文件中重定義IsNoKeyPressed宏的實現。

      8位鍵盤掃描碼(缺省值)時,相應的掃描函數為:

      BYTEOnKBScan()

      當掃描模塊經過軟件消抖動之后,發現有鍵按下,就會調用另一個回調函數OnKeysPressed。函數的聲明應該如下:

      voidOnKeyPressed(BYTEbyKBvalue,BYTEbyState)

      其中中的參數byKBvalue的類型為BYTE,此為缺省值,如果使用其它類型的掃描碼,就將此參數變為相應類型。這個值由OnKBScan返回。另一個參數byState在通常情況下為零。但當用戶在Config.h中定義宏KBSCAN_BRUSTCOUNT,同時鍵盤上的某鍵被按住不放時,掃描模塊對它自己的調用(注意這里和TIMER_KBSCANDELAY宏不同,TIMER_KBSCANDELAY是時鐘中斷足夠的次數后調用掃描模塊,而KBSCAN_BRUSHCOUNT為掃描模塊自身的被調用次數)進行計數,當達到KBSCAN_BRUSTCOUNT時,掃描模塊調用OnKeysPressed,此時第一個參數的含義不變,而byState變成1,同時計數器復位,又經過一段時間后,用值為3的byState調用OnKeysPressed。這樣就可以很方便的實現多功能鍵或者檢測某鍵的長時間被按下。

      2)由用戶自行調用

      由用戶自行在程序中調用掃描模塊,而不是由時鐘中斷自行調用。其它與方式1相同。

      注意:

      1)函數KBScanProcess為非阻塞函數,它將在很快的時間內返回,等待再次分配給它執行的機會。

      2)函數KBScanProcess是在時鐘中斷外部運行的,它的過程可以被任何中斷打斷,但不影響系統運行。

      3)byState的最大值為250,之后被復位為零。應用舉例

      現在來舉例說明上述幾個模塊的使用方法。

      硬件環境描述:

      為了控制一盞燈,需要單片機提供一個做控制功能的開關量,這里不描述外部接口電路,只說明當單片機的P10腳為高電平時,燈滅,當P10腳為低電平時,燈亮。

      可以通過計算機由串口發送命令來控制,或通過一個按鍵(pushbutton不是自鎖式的按鍵)來手動控制(按鍵接在P11腳上,當鍵沒有按下時,P11電平為高,鍵按下時,引腳電平被接低),當使用按鍵手動控制的時候,需要給計算機發送通知。

      設定串口通訊指令如下:

      數據包由0xff做包頭,4個字節長,第二個字節為命令代碼,第三個字節為數據,最后一個字節為校驗位。

      命令和數據代碼有如下組合:

      (計算機發給單片機)

      0x100x01:計算機控制燈亮。(數據位是非零值即可)

      0x100x00:計算機控制燈滅。

      (單片機發給計算機)

      0x110x01:單片機正常執行控制指令,返回。(數據位是非零值即可)

      0x110x00:單片機不能夠正常執行控制指令,或控制指令錯(不明含義的數據包或校驗錯等)。

      0x120x01:手動控制燈亮。(數據位是非零值即可)

      0x120x00:手動控制燈滅。

      建立工程:

      在硬盤上建立文件夾Projects,在Projects下建立Common文件夾及Example文件夾。將各模塊的頭文件及實現文件拷貝到Common文件夾下(推薦使用這樣的文件組織結構,其它工程也可以建立在Projects下,各工程共享Common文件夾中的代碼)。

      啟動KeilC的IDE,在Example下建立新工程,將各模塊的實現文件包含進工程。

      在Example文件夾下建立Output文件夾,更改工程設置,將Output作為輸出文件和List文件的輸出文件夾(推薦使用這樣的結構, 當保存工程文件時,可以簡單的刪除Output文件夾中的內容而不會誤刪有用的工程文件)。

      建立工程配置頭文件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”//使用自定義的數據類型

      #defineTIMER_RELOAD922//11.0592MHz晶振,1ms中斷周期

      #defineTIMER_KBSCANDELAY40//40ms重檢測按鍵狀態,即40ms消抖

      #defineSCOMM_AsyncInterface//使用異步通訊服務

      #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;//燈的狀態,缺省為off

      staticvoidInitialize()

      {

      InitTimerModule();//初始化時鐘模塊

      InitSCommModule(0xfd,TRUE);//初始化通訊模塊,11.0592MHz晶振,

      //波特率為19200

      EA=1;//開中斷

      }

      voidmain()

      {

      Initialize();//初始化

      while(TRUE)//主循環

      {

      ImpTimerService();//實現時鐘中斷服務,如鍵盤掃描

      AsyncRecePackage(4);//接收4個字節長的數據包

      }

      }

      //在中斷外部響應時鐘中斷事件

      voidOnTimerEvent()

      {

      //donothing

      }

      //控制外部燈

      staticvoidTriggerLamp(BITbEnable)

      {

      P10=~bEnable;//需要反相控制

      }

      //鍵掃描回調函數

      BYTEKBScan()

      {

      BITb;

      P11=1;//讀之前拉高引腳電平

      b=P11;//讀入引腳狀態

      return~b;//數據反相做掃描碼

      }

      //計算校驗和

      staticBYTECalcCheckSum(BYTE*pbyBuf,BYTEbyLen)

      {

      BYTEby,bySum=0;

      for(by=0;by

      return0–bySum;

      }

      //接收到鍵盤消息回調函數

      voidOnKeyPressed(BYTEbyvalue,BYTEbyState)

      {

      BYTEby[4];

      if(byState==0)

      {

      switch(byvalue)

      {

      case0x01:

      gbitLampState=~gbitLampState;//燈狀態取反

      TriggerLamp(gbitLampState);//執行控制

      by[0]=0xff;//構造數據包

      by[1]=0x12;

      by[2]=(BYTE)gbitLampState;

      by[3]=CalcCheckSum(by,3);//求校驗和

      SendPackage(by,4);//發送數據包

      break;

      //處理其它掃描碼

      default:

      break;

      }

      }

      //接收到數據包回調函數

      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);//處理長度或校驗和不正確

      }

      switch(pbyBuf[1])

      {

      case0x10:

      gbitLampState=(BIT)pbyBuf[2];

      TriggerLamp(gbitLampState);

      by[2]=1;

      by[3]=CalcCheckSum(by,3);

      SendPackage(by,4);//發送成功執行通知

      break;

      default://不知道的命令

      by[2]=0;

      by[3]=CalcCheckSum(by,3);

      SendPackage(by,4);//發送沒有成功執行通知

      break;

      單片機原理范文第5篇

      關鍵詞:單片機 教學改革 培養能力

      一、引言

      單片機在現代電子系統智能化中扮演著至關重要的角色。無論是現代工業、農業及生活領域,還是尖端科技等諸多領域,都離不開單片機,其應用率和普及率是其他類型的計算機不能比擬的。單片機技術被廣泛地應用在智能儀器儀表、機電一體化產品、實時工業控制、分布系統的前端模塊、家用電器、醫療和軍事等領域。所以單片機原理與應用是電子、自動化等專業的一門必修課。單片機原理與應用是電氣信息類、自動化類、機電設備類、計算機類及儀器儀表類等專業的專業基礎課或專業課。單片機教學的改革就是使學生將學到的單片機理論知識轉化為適應就業和工作需要的實際能力。

      二、改革單片機原理及應用教學的意義

      (一)單片機原理及應用教學存在的問題

      傳統的理論教學是按教材編寫的順序,先講單片機的硬件基礎知識,然后講指令系統、匯編語言編程,接著是講接口技術,教學形式和手段單一、方法簡單呆板。在教學中,學生普遍反映單片機概念多、太抽象、難入門、指令太難記。學生感到枯燥乏味,學習難度很大,課堂教學效果不夠理想。

      傳統實訓課則以教師為中心,基本都是教師先進行講解、示范,然后學生開始實操訓練,學生模仿教師按實訓步驟操作實訓項目。在這個過程中,教師巡回查看輔導學生。實訓考核則是操作一個操作過的題目,教師要據學生實訓項目完成的結果和所用的時間給出學生實訓實操考核成績。用一個模式,完全按照指導書上規定的步驟做相同的實訓。學生感到學習內容枯燥無味,沒有興趣。學生的學習積極性和教師的授課積極性都受到極大的挫傷。

      (二)改革單片機原理及應用教學的意義

      針對單片機原理應用教學存在的問題,要對單片機原理及應用教學進行改革,培養學生學習單片機原理及應用課程的興趣,著重培養學生的學習能力、綜合運用知識的能力、動手能力和創新能力,培養高技能人才。

      三、單片機原理及應用理論教學改革

      (一)單片機原理及應用理論課中,引入案例教學

      本著“理論夠用”就可以的原則,把夠用的理論優化整合到一個個案例中,案例中包含的理論由簡到難,符合理論掌握的邏輯順序,使“死”的大量的理論內容分散活化到每一個實際案例中。在應用中學習理論,理論因運用的具體而不再抽象,每個案例中學到的理論數量適中、遷移和內化的程度高,解決了單片機概念多、太抽象、難入門、指令太難記憶等問題。

      案例教學有利于培養學生學習單片機原理及應用的興趣,一個個案例生動具體,給學生展示單片機應用的廣闊前景,使學生對學習單片機原理及應用產生濃厚興趣。學生在學習抽象內容之前,教師可以通過案例給學生介紹單片機無比優越的性價比,并且應用大量的事例說明單片機的應用無所不在。將抽象的教學內容與這些生動的現實應用實例相結合,給學生一個能看到、能聽到、能摸著的學習目標,提高了學生學習單片機原理及應用的興趣。

      案例教學有利于培養學生學習單片機原理應用的積極性。案例教學過程中,可以滲透就業熱點介紹,使學生認識到單片機從低端應用到高端應用都有廣闊前景。學好單片機原理及應用既能為低端應用打好基礎,又能為高端處理器的學習做好準備。如此,使學生把學習單片機原理及應用與自己的就業前景結合起來,學生學習積極性得到調動。

      單片機原理及應用理論課教學中,使用案例教學,能縮短理論與實踐的距離,培養學生綜合運用知識、解決實際問題的能力。不少學生都反映,在理論課上學到的理論知識,到實踐中不知道怎么使用,怎么入手。其原因就是沒有把理論與實際相結合好,使用案例進行理論教學,使學生接觸到了與實際應用相近的案例,可以縮短學生學習時間。比如,以一個完整的項目開發為案例,介紹交通信號燈控制系統,這樣增強了趣味性,學生也很容易接受,而且可以促進學生思維發展,實現分析、反思、體驗和感悟。當其領悟后,就能模仿,也會舉一反三。

      (二)單片機原理及應用理論課中,豐富教學手段

      學生覺得單片機原理及應用難學抽象,很大一部分原因,是傳統教學的講授加板書,無法為學生展示單片機內部數據動態流動的過程和圖景。學生腦海中形不成單片機內部數據動態流動的過程和圖景,產生了極大的困惑。制作生動形象的多媒體課件可以解決這個問題,利用多媒體課件把單片機中難懂的尋址方式指令舉例和有代表性的指令,做成動畫準確生動呈現出其數據流動的完整過程,學生瞬間就理解了尋址方式和典型指令,并且迅速發展了學生的形象思維能力、抽象思維能力和舉一反三的能力。

      單片機原理及應用課程信息量大,要求授課容量大,制作生動形象的多媒體課件可以滿足這一要求,利用多媒體課件授課,節省了板書和大量的畫圖時間,可以在有限的課時內講深、講透課程內容;利用多媒體課件演示,可以隨機重復,前后可以隨意翻看的特點,便于突出重點、突破難點。實踐表明,將傳統教學的講授加板書與計算機輔助教學手段相結合,豐富了教學手段,提高了教學效率,激發了學生學習的積極性和主動性,收到了良好的教學效果。

      四、單片機原理及應用實踐教學改革

      (一)單片機原理及應用實訓課中,多開發趣味實訓項目

      利用單片機編程可以實現許多電子電路,這是非常有趣的。例如,利用位操作指令可以實現各種門電路和組合邏輯電路;利用循環或定時器能實現軟延時;利用定時器可以實現各種矩形脈沖發生器,這些都可以從示波器上觀察到有趣的結果。這些實訓項目可以激發學生的學習興趣,調動學生的學習積極性和主動性。

      (二)單片機原理及應用實訓課中,引入模塊化教學

      把實踐教學內容優化整合成若干個模塊,每個模塊中包含的知識點和技能又可分解到若干個實訓題目中,例如燈光控制模塊,包含了閃燈控制、排燈控制、轉燈控制、流水燈控制、交通信號燈控制。每個模塊的教學又可分成三個層次,對學生來說就是三個層面的學習,即模仿學習、舉一反三和創新。就拿燈光控制模塊來說,直接按照實訓指導書上的程序進行實訓就是模仿學習,在此基礎上對指導書上的程序進行改編實現延時和燈光花樣的變化是舉一反三,最后編制一個全新的燈光控制程序實現創新設計。這樣的學習符合學生的思維發展規律,使其發揮主觀能動性及創造性思維,有效培養了學生的學習能力,綜合運用知識解決實際問題的能力和創新能力。

      五、小結

      單片機原理及應用理論教學和實踐教學手段和方法很多,這里從個人教學改革心得出發探討了幾個做法。在今后的教學改革中只要不斷改進教學方法, 使用各種教學手段,激發學生的學習興趣,注重學習能力的培養和綜合運用知識解決實際問題的能力的培養,就能獲得良好的教學效果。但要深入教學改革,還需要不斷努力和探索。

      參考文獻:

      [1]周紹平.單片機教學改革的實踐與思考.揚州職業大學學報,2004,8(2):60~62

      [2]廖平.單片機實驗教學的改革.實驗室研究與探索,2004(7):36~38

      [3]陳 亮.單片機課程的教學改革.實驗室研究與探索,2008(9):121~123

      [4]徐海黎,劉明.單片機課程教學的改革.南通大學學報(教育科學版),2005(4):96~97

      少妇亚洲免费精品| 久久精品a亚洲国产v高清不卡| 亚洲精品一品区二品区三品区| 国产亚洲福利在线视频| 亚洲午夜国产精品| 亚洲免费观看在线视频| 91在线亚洲精品专区| 亚洲AV无码精品色午夜果冻不卡 | 亚洲一区免费视频| 亚洲精品在线观看视频| 久久精品亚洲综合| 亚洲国产人成在线观看69网站| 国产AV无码专区亚洲AVJULIA| 国产亚洲一区二区精品| 亚洲AV无码成人精品区在线观看 | 亚洲欧美综合精品成人导航| 亚洲色图激情文学| 亚洲另类无码专区首页| 成人精品国产亚洲欧洲| 亚洲精品视频久久久| 亚洲色WWW成人永久网址| 亚洲精品亚洲人成人网| 久久精品国产精品亚洲艾| 亚洲色图在线播放| 亚洲日韩中文字幕| 久久综合久久综合亚洲| 亚洲高清毛片一区二区| 久久水蜜桃亚洲AV无码精品| 亚洲国产精品自在拍在线播放 | 亚洲高清国产拍精品青青草原| 亚洲精品第一国产综合境外资源| 亚洲黄黄黄网站在线观看| 不卡一卡二卡三亚洲| 亚洲va久久久噜噜噜久久| 精品日韩亚洲AV无码一区二区三区| 亚洲综合视频在线| 亚洲嫩草影院在线观看| 亚洲色大情网站www| 国产亚洲精品第一综合| 亚洲乱码国产一区三区| 亚洲国产成人久久综合一|