HC6800-ESV2.0實驗指導(dǎo)書模板_第1頁
HC6800-ESV2.0實驗指導(dǎo)書模板_第2頁
HC6800-ESV2.0實驗指導(dǎo)書模板_第3頁
HC6800-ESV2.0實驗指導(dǎo)書模板_第4頁
HC6800-ESV2.0實驗指導(dǎo)書模板_第5頁
已閱讀5頁,還剩218頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

..WORD.格式整理.../..WORD.格式整理..HC6800-ESV1.0單片機開發(fā)板學(xué)習(xí)指南普中科技目錄TOC\o"1-1"\h\z\u第一講開發(fā)板資源介紹1第二講軟件安裝3第三講程序下載16第四講KEIL軟件使用及入門led燈21第五講蜂鳴器31第六講獨立按鍵32第七講靜態(tài)數(shù)碼管37第八講矩陣鍵盤42第九講動態(tài)數(shù)碼管45第十講電機49第十一講中斷56第十二講1602液晶顯示60第十三講定時器68第十四講時鐘芯片DS130271第十五講串口通信83第十六講溫度傳感器18B2089第十七講EEPROM操作24C0299第十八講紅外遙控顯示110第十九講AD/DA模數(shù)/數(shù)模轉(zhuǎn)換116第二十講液晶屏顯示127附錄A單片機C語言介紹140附錄B電路板繪制軟件PROTEL介紹170..WORD.格式整理...第一講開發(fā)板資源介紹本開發(fā)板相對以往開發(fā)板的特點是綜合性比較高、把短路冒去掉了省去接線的麻煩更加方便了初學(xué)者、是一款性價比極高的產(chǎn)品,提供USB2.0和串口兩種通信方式,USB實現(xiàn)供電、編程、仿真、通信多種功能,另外還提供了Atmel單片機的ISP接口。此板兼容STC、SST、Atmel、Philips等51家族的所有單片機。如果使用ISP編程建議使用開發(fā)板自帶的單片機,因為每個廠燒錄程序的方式不一樣。HC6800S開發(fā)板有著豐富的外部資源,通過對該開發(fā)實驗儀的學(xué)習(xí),學(xué)員不僅可以輕松快速地掌握單片機軟件系統(tǒng)的開發(fā)〔C語言、匯編語言,而且還能快速掌握硬件電路的設(shè)計及嵌入系統(tǒng)開發(fā)流程。本套件配有豐富的實例源碼、原理圖等,特別適合單片機初學(xué)者,大中專院校師生,單片機開發(fā)工程師選用,也是畢業(yè)設(shè)計和電子競賽不可多得的參考板單片機采用STC90c5161280SRAM64KFlash2.1寸彩色液晶屏SD卡接口1602液晶屏接口12864液晶屏接口溫度傳感器DS18B20EEPROM24C02存儲器8位動態(tài)數(shù)碼管AD/DA轉(zhuǎn)換PCF8951DS1302實時時鐘4*4矩陣鍵盤4個獨立鍵盤2*8路led燈可更換晶振座USB接口,實現(xiàn)下載,供電,串行通信。通過USB轉(zhuǎn)串口芯片CH340T轉(zhuǎn)換IR紅外接收頭,紅外數(shù)據(jù)傳輸板載繼電器蜂鳴器步進電機ULN2003達林頓管驅(qū)動第二講軟件安裝1、USB轉(zhuǎn)串口驅(qū)動的安裝雙擊USB驅(qū)動SERIAL程序的Setup安裝成功后,會出現(xiàn)一下提示畫面點"確定"即可以結(jié)束安裝過程。安裝完驅(qū)動程序成功后,把開發(fā)板與電腦連接可以看到設(shè)備管理器中的COM口。在圖標"我的電腦"右鍵,→屬性,→硬件,→設(shè)備管理器〔這是XP系統(tǒng),WIN系統(tǒng)與其相似找到設(shè)備管理器顯示成功的COM口安裝不成功解決辦法如果發(fā)現(xiàn)是下圖感嘆號,則沒有安裝成功或者沒有安裝、右鍵點擊更新驅(qū)動程序選擇"從列表或指定位置安裝〔推薦"出現(xiàn)此對話框,選擇不要搜索,自己選擇安裝點"下一步"點擊"下一步"出現(xiàn)此對話框、點擊"從磁盤安裝"點擊"瀏覽"到USB驅(qū)動文件夾找到安裝文件打開點擊"確定"和"下一步"點擊"完成"安裝結(jié)束KEIL軟件安裝我們用現(xiàn)在新版本的uVision4KEIL開發(fā)環(huán)境,使用的版本是破解版,僅供大家學(xué)習(xí)使用。如做商業(yè)開發(fā),請購買正版,可以獲得更多keil軟件原廠技術(shù)支持。即將安裝軟件如下,一個keil安裝程序,一個注冊機〔右側(cè)。打開C51V901.EXE安裝程序點擊Next>>Iagreeallthetemsof……選中點擊Next>>設(shè)置安裝目錄,根據(jù)自己的情況選中安裝目錄,重新設(shè)置點擊Browse,這里默認C盤,設(shè)置好安裝目錄后點擊Next>>輸入相關(guān)信息〔隨便輸入,輸入完畢后點擊Next>>開始安裝,安裝過程中……..等待安裝完成安裝完成,點擊Finish即可。接下來破解軟件。打開注冊機軟件Target:選擇C51Target:選擇C51打開剛剛安裝好的keil軟件點擊File菜單選擇LicenseManagement。復(fù)制CID碼到注冊機中現(xiàn)在沒有破解復(fù)制CID碼到注冊機中復(fù)制CID碼,之后點擊Generate生成注冊碼復(fù)制生成的注冊碼到keil從KEIL復(fù)制的CID碼粘貼到這里復(fù)制生成的注冊碼到keil從KEIL復(fù)制的CID碼粘貼到這里復(fù)制到這里復(fù)制到這里復(fù)制完注冊碼后,點擊右側(cè)的,即可完成破解。提示如下:以上軟件安裝完畢。接下來看程序了。第三講程序下載我們可以通過幾種方式,對我們開發(fā)板的單片機下載程序。下載接口可以分為USB口和DB9串口。DB9串口USB接口DB9串口USB接口下載軟件又可分為STC官方軟件和普中科技自己開發(fā)的軟件官方軟件官方軟件普中普中軟件利用官方軟件下載程序需要手動重啟單片機,需要給單片機重新上電啟動。普中開發(fā)的下載軟件及所設(shè)計的開發(fā)板實現(xiàn)了全自動下載功能,省去了手動操作,極大方便了學(xué)習(xí)及開發(fā)人員。接下來就來講一下下載程序的方式。USB口,普中軟件我們插上USB口,打開開發(fā)板電源開關(guān)。然后打開普中ISP下載軟件,如下圖:串口號10串口號10在usb轉(zhuǎn)串口驅(qū)動安裝成功后,打開軟件應(yīng)該有串口號,如圖指示。芯片類型選擇STC90C5XX如下圖。加載我們要下載到單片機里的程序,單擊,選擇下載的后綴為.Hex的文件,打開后,會在文件名處有提示:文件路徑,還有代碼大小。代碼大小代碼大小4最后一步:點擊下載程序,下載成功如圖顯示。此時繼電器工作會有小的啪啪的響聲。下載成功!下載成功!接下來我們用官方STC下載軟件下載43214321選擇開發(fā)板上單片機型號,我們選STC90C516選擇串口,可通過設(shè)備管理器查看打開需要下載到單片機的程序點擊下載點擊下載按鈕后會有這樣的信息:這時需要手動按開關(guān)鍵,關(guān)閉開關(guān),打開開關(guān)這樣一個過程,主要是給單片機冷啟動。重新上電后,會出現(xiàn)開始下載程序,下載完成。上圖表示下載成功。現(xiàn)在用官方軟件下載幾乎都要手動重新給單片機上電過程。市面的開發(fā)板主要也都是采用這種下載方式。建議使用普中軟件自動下載。第四講KEIL軟件使用及入門led燈單片機開發(fā)中除必要的硬件外,同樣離不開軟件,我們寫的匯編語言源程序要變?yōu)镃PU可以執(zhí)行的機器碼有兩種方法,一種是手工匯編,另一種是機器匯編,目前已極少使用手工匯編的方法了。機器匯編是通過匯編軟件將源程序變?yōu)闄C器碼,用于MCS-51單片機的匯編軟件有早期的A51,隨著單片機開發(fā)技術(shù)的不斷發(fā)展,從普遍使用匯編語言到逐漸使用高級語言開發(fā),單片機的開發(fā)軟件也在不斷發(fā)展,Keil軟件是目前最流行開發(fā)MCS-51系列單片機的軟件,這從近年來各仿真機廠商紛紛宣布全面支持Keil即可看出。Keil提供了包括C編譯器、宏匯編、連接器、庫管理和一個功能強大的仿真調(diào)試器等在內(nèi)的完整開發(fā)方案,通過一個集成開發(fā)環(huán)境〔uVision將這些部份組合在一起。運行Keil軟件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空閑的硬盤空間、WIN98、NT、WIN2000、WINXP等操作系統(tǒng)。掌握這一軟件的使用對于使用51系列單片機的愛好者來說是十分必要的,如果你使用C語言編程,那么Keil幾乎就是你的不二之選〔目前在國內(nèi)你只能買到該軟件、而你買的仿真機也很可能只支持該軟件,即使不使用C語言而僅用匯編語言編程,其方便易用的集成環(huán)境、強大的軟件仿真調(diào)試工具也會令你事半功倍。我們將通過一些實例來學(xué)習(xí)Keil軟件的使用,在這一部份我們將學(xué)習(xí)如何輸入源程序,建立工程、對工程進行詳細的設(shè)置,以及如何將源程序變?yōu)槟繕舜a。在這里利用第二個例程,led閃爍實驗來建立keil工程。打開keil軟件,版本μVision2,μvision3,μvision4都一樣,在這里用μvision4版本演示,打開之后如下圖,有的時候會默認打開上次使用的工程,單擊Project菜單,選擇CloseProject關(guān)閉了默認打開的工程,顯示下圖界面:我們要建立新的工程,選擇Project→newμvisionprojiect…選擇工程要保存的路徑,輸入工程文件名,如圖點擊保存后會彈出一個對話框,要求用戶選擇單片機型號,可以根據(jù)用戶使用的單片機來選擇,我們使用的STC90單片機是兼容51內(nèi)核的,KeilC51幾乎支持所有的51內(nèi)核單片機,51內(nèi)核具有通用型,如果程序用的資源不是太復(fù)雜,我們可以選擇任意一款51單片機內(nèi)核就行。在稍后我們會繼續(xù)講解怎么將STC單片機官方的頭文件添加進來,在這暫不多介紹。Keil軟件的關(guān)鍵是程序代碼的編寫,而非是用戶選擇什么硬件。例程以添加Atmel的AT89C51來說明。如圖,然后,單擊確定〔OK。功能描述功能描述如果出現(xiàn)下面的界面:單擊是就可以,意思是將單片機的啟動代碼添加到工程,我們不用修改。到目前我們還沒建立一個完整的工程,只是有工程的名字,框架,工程中還沒有任何文件代碼,〔除了啟動代碼,有的keil版本不顯示啟動代碼,接下來我們添加文件及代碼。單擊菜單File→New選項,或者單擊界面上的快捷圖標,新建文件串口如下。界面顯示的Text1就是我們剛剛加入的文件,但是這個文件與我們的工程還沒有直接聯(lián)系起來,單擊圖標,保存我們當(dāng)前的text1文件,輸入要保存的文件名,同時要輸入文件擴展名,擴展名很關(guān)鍵,用C語言編寫的程序,則必須為**.c,匯編語言必須為**.asm〔**為文件名,文件名是用戶自己取的。填好文件名后單擊保存?;氐骄庉嫿缑?單擊Target1前面的"+"號,然后在SourceGroup1上右鍵單擊,選擇AddFilestoGroupSourceGroup1,選中我們剛才建立的.c文件,這里是ledtest.c,單擊add,只需單擊一次。之后單擊Close就可以?;氐街鹘缑婧?單擊SourceGroup1前的"+"號,剛剛添加的文件顯示在里面。通過以上步驟我們就建立好了一個工程。接下來就可以寫代碼了。在寫代碼之前介紹介個常用的按鈕:按鈕:用來編譯我們正在操作的文件。按鈕:用來編譯修改過的文件,并生成應(yīng)用程序共單片機下載。按鈕:用來重新編譯當(dāng)前工程中所有的文件,并生成應(yīng)用程序共單片機下載。因為很多工程不止有一個文件,當(dāng)有多個文件時,用它進行編譯。按鈕:用來打開"OptionforTarget"對話框,對當(dāng)前工程進行設(shè)置。工程的各個參數(shù)都可以在這里設(shè)置,具體的設(shè)置方法用到的時候,再和大家詳細講述。以上幾個按鈕是常用的,其他按鈕在使用的時候再介紹。編寫程序我們以一個程序為例來練習(xí)編寫:led閃爍。這個程序大家一定要弄懂,也算是一個基礎(chǔ),懂了這個程序,也算是進入單片機的領(lǐng)域了接下來我會詳細講解這個例程。另外需要注意的是單片機寫程序的時候,一定是英文狀態(tài)下的字符,尤其注意";",往往就因為這個分號,程序出現(xiàn)問題,所以輸入時一定要注意是在英文狀態(tài)下的。我們在編輯框中輸入以下程序:/********************************************************************* LED閃爍的簡單試驗 *********************************************************************/#include<reg51.h> //此文件中定義了51的一些特殊功能寄存器voiddelay<unsignedinti>;//聲明延時函數(shù)voidmain<>{ while<1> { P2=0x00;//置P0口為低電平 delay<600>;//調(diào)用延時程序 P2=0xff;//置P0口為高電平 delay<600>;//調(diào)用延時程序 }}/*******延時函數(shù)*************/voiddelay<unsignedinti>{ unsignedcharj; for<i;i>0;i-->//循環(huán)600*255次 for<j=255;j>0;j-->;}我們先編譯一下:第一次編譯我們點擊,看一下結(jié)果結(jié)果的意思:編譯led2.c…鏈接…data=9.0--占用內(nèi)部RAM9個字節(jié),xdata=0:外部RAM0字節(jié),Code=56代碼長度為56字節(jié)生成單片機可下載的HEX〔十六進制文件。沒有錯誤,沒有警告。在這里說明一點:生成HEX文件是我們自己設(shè)置的,默認的情況下不會生成HEX文件。單擊進行設(shè)置,如下圖,選擇Output,勾選Creathex,后單擊確定。接下來我們分析上面的程序:/**/作用,它是用來注釋一段內(nèi)容的,編譯器不對其進行編譯,只要在/**/直接的內(nèi)容都被注釋掉。//是用來注釋其后面的內(nèi)容,只能注釋一行。#include<reg51.h>//這句告訴我們包涵51的頭文件,那這個頭文件里面放的是什么東西呢?放的是51單片機對應(yīng)的操作的寄存器地址,如我們直接用來操作的P1口就是代表0x90地址,我們可以將光標低位在<reg51.h>上然后右鍵打開頭文件,#ifndef__REG51_H__#define__REG51_H__/*BYTERegister*/sfrP0=0x80;sfrP1=0x90;sfrP2=0xA0;sfrP3=0xB0;sfrPSW=0xD0;sfrACC=0xE0;……………/*SCON*/sbitSM0=0x9F;sbitSM1=0x9E;sbitSM2=0x9D;sbitREN=0x9C;sbitTB8=0x9B;sbitRB8=0x9A;sbitTI=0x99;sbitRI=0x98;#endif頭文件中定義了51系列單片機的所有功能寄存器,我們直接使用其代號就可以,P0,P1等。如:sfrP0=0x80,意思是把單片機內(nèi)部地址0x80處的寄存器重新起名字叫P0,以后我們在程序中直接操作P0,就相當(dāng)于對單片機內(nèi)部0x80地址處的寄存器進行操作。通俗的講,也就是說,通過sfr這個關(guān)鍵字,讓Keil編譯器在單片機與人之間搭建一個橋梁,我們操作P0口,單片機對應(yīng)就去操作內(nèi)部0x80的地址。所以我們寫程序要在開始處直接包涵單片機的頭文件。sbitSM0=0x9F;是定義位操作地址0x9F的,這個地址只代表一個位。我們操作SM0,對應(yīng)單片機就是操作位地址0x9F??偨Y(jié)起來sfr與sbit區(qū)別sfr是定義字節(jié)的8位sbit是定義位的1位我們在返回主程序:voiddelay<unsignedinti>{unsignedcharj;for<i;i>0;i-->for<j=100;j>0;j-->;}定義一個函數(shù)delay<>;與c語言一樣,要用一個函數(shù),先定義,我們可以叫它子函數(shù),可以調(diào)用的。voidmain<>//結(jié)構(gòu)同c語言一樣,main<>函數(shù)開始{//大括號。P2=0x00;//置P0口為低電平從這句開始,你現(xiàn)在控制單片機了,告訴單片機把你的P2口都輸出0,如果你不操作P2口了,那么P2口一直保持這個狀態(tài),直到你去改變它。delay<1000>;//調(diào)用延時程序調(diào)用子函數(shù)delay<>,告訴單片機去執(zhí)行delay那個函數(shù),那么P2口一直保持0這狀態(tài)。P2=0xff;//置P0口為高電平這時告訴P2口全部輸出1,<0xff=11111111>.狀態(tài)從0變成1了,對應(yīng)的燈的輸出也由低電平變成高電平了delay<1000>;//調(diào)用延時程序,再進行延時,}這個程序里執(zhí)行完了一次又干什么呢,Keil編譯器會編譯成一直重復(fù)執(zhí)行main<>函數(shù)里面的代碼,整個代碼的效果就是:P2輸出低電平延時一段時間,目的是P2輸出的低電平保持一段時間P2輸出高電平延時一段時間,目的是P2輸出的高電平保持一段時間重復(fù)①到④的過程實際效果就是led一閃一閃通過更改delay〔延時時間i,參數(shù)i,可以改變閃爍頻率。實際操作:打開軟件<提前裝好驅(qū)動>,點擊打開文件,打開我們剛剛編譯的led.hex文件,下載程序,就會看到led閃爍。我們在看一個例程,就是單片機最經(jīng)典的流水燈例程:以下是我們的硬件電路,led一段接單片機P2口的8個引腳,另外一邊接排阻RP12和RP13,然后接到電源基礎(chǔ)知識介紹:排阻:一般在排阻上都標有阻值號,其公共端附近也有明顯標記。如下下圖表示為472,表示47*2=4700歐姆,還有的標號如3R0,表示阻值為3歐姆,4K7表示阻值為4.7kΩ,R002表示阻值為0.002歐姆。<2>發(fā)光二極管。它具有單向?qū)щ娦?通過5mA左右電流即可發(fā)光,電流越大,其亮度越強,但若電流過大,會燒毀二極管,一般我們控制在3mA-20mA之間。在這里,給發(fā)光二極管串聯(lián)一個電阻的目的就是為了限制通過發(fā)光二極管的電流不要太大,因此這個電阻又稱為"限流電阻"。當(dāng)發(fā)光二極管發(fā)光時,測量它兩端電壓約為1.7V,這個電壓又叫做發(fā)光二極管的"導(dǎo)通壓降"。圖和圖2.2.10分別為直插式發(fā)光二極管和貼片式發(fā)光二極管實物圖。發(fā)光二極管正極又稱陽極,負極又稱陰極,電流只能從陽極流向陰極。直插式發(fā)光二極管長腳為陽極,短腳為陰極。仔細觀察貼片式發(fā)光二極管正面的一端有彩色標記,通常有標記的一端為陰極。圖關(guān)于排阻大小的選擇:歐姆定律想必大家都清楚,U=IR,當(dāng)發(fā)光二極管正常導(dǎo)通時,其兩端電壓約為1.7V,發(fā)光管的陰極為低電平,即0V,陽極串接一電阻,電阻的另一端為Vcc,為5V,因此加在電阻兩端的電壓為5V-1.7V=3.3V,計算穿過電阻的電流,3.3V/1000Ω=3.3mA。即穿過發(fā)光管的電流也為3.3mA,若想讓發(fā)光管再亮一些,我們可以適當(dāng)減小該電阻。看我們的原理圖,可以知道:LED的正極接在VCC上,只要給了低電平,那么LED就會亮,低電平對應(yīng)到單片機的邏輯就是0,只要單片機的某一個管腳輸出0,那么對應(yīng)的發(fā)光二極管就會亮。我們看一下源碼:/*******************************************************************************實驗名 :左右流水燈實驗*使用的IO :P2*實驗效果:點亮的LED從右邊往左邊移動,到達左邊再往右邊移動,依此循環(huán)。* 注意 :******************************************************************************/#include<reg51.h>#include<intrins.h> //因為要用到左右移函數(shù),所以加入這個頭文件 #defineGPIO_LEDP2 //將P2口另外取名為GPIO_LEDvoidDelay10ms<unsignedint>;//誤差0us/*******************************************************************************函數(shù)名:main*函數(shù)功能 :主函數(shù)*輸入:無*輸出 :無******************************************************************************/voidmain<void>{ unsignedcharn; GPIO_LED=0xfe; while<1> { for<n=0;n<7;n++> //左移7次,這樣子就會到達最左邊 { GPIO_LED=_crol_<GPIO_LED,1>;//將GPIO_LED左移一位 Delay10ms<50>; //延時 } for<n=0;n<7;n++> //右移7次,這樣子就會到達最右邊 { GPIO_LED=_cror_<GPIO_LED,1>; //將GPIO_LED右移一位 Delay10ms<50>; //延時 } } }/*******************************************************************************函數(shù)名:Delay10ms*函數(shù)功能 :延時函數(shù),延時10ms*輸入:無*輸出 :無******************************************************************************/voidDelay10ms<unsignedintc>//誤差0us{unsignedchara,b;for<;c>0;c-->for<b=38;b>0;b-->for<a=130;a>0;a-->;}以上程序?qū)崿F(xiàn)點亮一盞LED之后左右移動。講解:移位操作‘<<’‘>>’左移。C51中操作符為"<<",每執(zhí)行一次左移指令,被操作的數(shù)將最高位移入單片機PSW寄存器的CY位,CY位中原來的數(shù)丟棄,最低位補0,其他位依次向左移動一位,如下圖所示:右移。C51中操作符為">>’’,每執(zhí)行一次右移指令,被操作的數(shù)將最低位移入單片機PSW寄存器的CY位,CY位中原來的數(shù)丟棄,最高位補0,其他位依次向右移動一位,如下圖所示。循環(huán)左移。最高位移入最低位,其他位依次向左移一位。C語言中沒有專門的指令,通過移位指令與簡單邏輯運算可以實現(xiàn)循環(huán)左移,或直接利用C51庫中自帶的函數(shù)_crol_實現(xiàn),如下圖所示。_crol_函數(shù)所在的頭文件是<intrins.h>循環(huán)右移。最低位移入最高位,其他位依次向右移一位。C語言中沒有專門的指令,通過移位指令與簡單邏輯運算可以實現(xiàn)循環(huán)右移,或直接利用C51庫中自帶的函數(shù)-cror實現(xiàn),如下圖所示。_cror_函數(shù)所在的頭文件是<intrins.h>講解:PSW寄存器PSW<ProgramStatusWord>全稱為程序狀態(tài)字標志寄存器,是一個8位寄存器,位于單片機片內(nèi)的特殊功能寄存器區(qū),字節(jié)地址DOH,用來存放運算結(jié)果的一些特征,如有無進位、借位等,使用匯編編程時PSW寄存器很有用,但在利用C語言編程時,編譯器會自動控制該寄存器,很少人為操作它,大家只需做簡單了解即可.其每位的具體含義如下圖所示.CY一進位標志位,它表示運算是否有進位<或借位>.如果操作結(jié)果在最高位有進位<加法>或者借位<減法>,則該位為1,否則為0.AC一輔助進位標志,又稱半進位標志,它指兩個8位數(shù)運算低四位是否有半進位,即低四位相加<或相減>是否進位<或借位>,如有AC為1,否則為0eFO一由用戶使用的一個狀態(tài)標志位,可用軟件來使它置1或清0,也可由軟件來測試它,以控制程序的流向.RS1,RSO-4組工作寄存器區(qū)選擇控制位,在匯編語言中這兩位用來選擇4組工作寄存器區(qū)中的哪一組為當(dāng)前工作寄存區(qū).OV一溢出標志位,反映帶符號數(shù)的運算結(jié)果是否有溢出.有溢出時,此位為1,否則為0.P一奇偶標志位,反映累加器ACC內(nèi)容的奇偶性,如果ACC中的運算結(jié)果有偶數(shù)個I<如11001100B,其中有4個1>,則P為0,否則P為1._cror_〔;函數(shù)循環(huán)右移函數(shù),包含在intrins.h的庫函數(shù)里面。_crol_〔;函數(shù)循環(huán)左移移函數(shù),包含在intrins.h的庫函數(shù)里面。第五講蜂鳴器蜂鳴器是一種一體化結(jié)構(gòu)的電子訊響器,采用直流電壓供電,廣泛應(yīng)用于計算機、打印機、復(fù)印機、報警器、電子玩具、汽車電子設(shè)備、電話機、定時器等電子產(chǎn)品中作發(fā)聲器件。我們開發(fā)板上常用的蜂鳴器就是常常說的交流蜂鳴器或直流蜂鳴器〔自激式蜂鳴器。直流蜂鳴器是給一定的驅(qū)動直流電壓就會響。而交流蜂鳴器是需要給蜂鳴器一個脈沖才會響。常見的有PWM波控制蜂鳴器的頻率。脈沖就是高低電平的切換,如下圖:一個方波脈沖我們用單片機的IO口實現(xiàn)一種這樣高低電平的方波,驅(qū)動蜂鳴器發(fā)音。我們板子上配的就是交流蜂鳴器。接下來我們看一下蜂鳴器的硬件電路:蜂鳴器通過ULN2003驅(qū)動。這里ULN2003暫不多做介紹,詳細介紹可參考步進電機篇。我們看一下程序源碼:/********************************************************************************實驗名 :蜂鳴器實驗*使用的IO :P1^5*實驗效果:蜂鳴器響。* 注意 :*******************************************************************************/#include<reg51.h>sbitBeep=P1^5;voidDelay<unsignedinti>;/*******************************************************************************函數(shù)名:main*函數(shù)功能 :主函數(shù)*輸入:無*輸出 :無******************************************************************************/voidmain<>{ Beep=1; Delay<5>; Beep=0; Delay<5>;}/*******************************************************************************函數(shù)名:Delay<>*函數(shù)功能 :延時函數(shù)*輸入:無*輸出 :無******************************************************************************/voidDelay<unsignedinti>{ charj; for<i;i>0;i--> for<j=200;j>0;j-->;}下載生成的hex文件,就可聽到蜂鳴器發(fā)音。第六講獨立按鍵按鍵是什么東西,我想這個就不必由我向各位闡述了。嗯,如你所見,按鍵種類繁多,功能有簡有繁,極大的充斥著我們的生活。但是無論如何,所有的按鍵其實都有一個原型,來源于同一種原理,所有的按鍵無論多復(fù)雜,多華麗,都是從這樣一個原型發(fā)展而成的。好比你就算長的再帥,你也是只猩猩變來的,呵呵。我們平日所見到的絕大部分的按鍵,其實都可以歸類為一種,叫"接觸式按鍵"。下圖為一個典型的接觸式按鍵〔又稱輕觸開關(guān)。需要特別說明的是,這里說的"接觸",是指機械層面上的接觸,而不是感光或者某些特殊涂層〔比如觸摸屏一類的接觸。所以,按鍵的工作特性其實是一種機械特性,下文會詳細說明。,如上圖,請對照圖一想象,1、2、3、4分別對應(yīng)按鍵的四個引腳,其中藍色的線表示按鍵未被按下之時的狀態(tài),我成為初始狀態(tài),它是不導(dǎo)通的;而綠色的線是卻永久導(dǎo)通的。各位明白了么,其實是兩個相同的結(jié)構(gòu)連在一起了。我們只要將需要按鍵開關(guān)作用的線路分別接在1、3和2、4的任意取一組合,概括起來就是〔1,2、〔1,4、〔3,2、〔3,4四種組合,都可以起到我們預(yù)期的開關(guān)作用。相信以上說明使大家對按鍵的工作原理有了個比較清晰的認識了,現(xiàn)在來說說一個小知識。先看下圖〔圖4:首先說明的是,上圖的連法是不允許的,因為當(dāng)按鍵按下之后,電源和地短接,會將導(dǎo)線直接燒毀。但是此處用作特例,假設(shè)導(dǎo)線不會燒毀?,F(xiàn)在來提出一個問題,當(dāng)按鍵按下以后,請問如果這時用萬用表測量導(dǎo)線上任何一處的電壓,得到的結(jié)果是VCC還是GND的電壓?答案是:GND,即表示測出的電壓為0V。為什么呢,因為導(dǎo)線上,對于兩端的電平是一種類似于程序語言邏輯運算里面的"與",即對于導(dǎo)線兩端:有零即為零,只有全為一是才為一。理解了這點,按鍵的工作前提就有了。鍵盤分為編碼鍵盤和非編碼鍵盤。鍵盤上閉合鍵的識別由專用的硬件編碼器實現(xiàn),并產(chǎn)生鍵編碼號或鍵值的稱為編碼鍵盤,如計算機鍵盤。而靠軟件編程來識別的鍵盤稱為非編碼鍵盤,在單片機組成的各種系統(tǒng)中,用的較多的是非編碼鍵盤。非編碼鍵盤又分為獨立鍵盤和行列式鍵盤〔常說的矩陣鍵盤。在這一講中我們介紹一下單片機中鍵盤使用。單片機的IO口既可作為輸出也可作為輸入使用,當(dāng)檢測按鍵時用的是它的輸入功能,我們把按鍵的一端接地,另一端與單片機的某個I/O口相連,開始時先給該IO口賦一高電平,然后讓單片機不斷地檢測該I/O口是杏變?yōu)榈碗娖?當(dāng)按鍵閉合時,即相當(dāng)于該I/O口通過按鍵與地相連,變成低電平,程序一旦檢測到I/O口變?yōu)榈碗娖絼t說明按鍵被按下,然后執(zhí)行相應(yīng)的指令。我們先來說一下,按鍵常常遇到的問題—抖動問題。還以圖四為例,按鍵未按下之前,圖四按鍵左端的導(dǎo)線因為連在VCC上而顯示高電平,右端顯示低電平,按鍵按下后,按鍵閉合,整個導(dǎo)線都顯示低電平,然后按鍵松開,又回到按鍵按下之前的點評狀態(tài)。如果只考察按鍵左端的電平變化,應(yīng)該是上圖中所顯示的一個負脈沖波形。但是,實際上,正確的波形應(yīng)該是下圖。相比于上圖,大家都看到了在高低電平直接有一段鋸齒一樣的波形,這就是所謂的按鍵抖動。為什么會有按鍵抖動呢,原因很簡單,接觸式按鍵是靠機械的接觸來實現(xiàn)開關(guān)作用的。這種接觸方式就注定了它要經(jīng)歷一個"接觸不穩(wěn)定——正在穩(wěn)定中——徹底穩(wěn)定"的一種過程。就好比你用手抓緊一顆石頭,即使你一開始就很用力的握緊,也不可能馬上就達到最緊的狀態(tài),也要經(jīng)歷一個從握住到最緊握的過程。那么在這個過程里,接觸式按鍵就處于一種徘徊在"閉合"與"斷開"兩者之間的狀態(tài)。體現(xiàn)在電路中,就是在一小段時間內(nèi)有非常多的"按下——抬起"動作。而這段抖動的時間,大概是10~20毫秒,依不同的環(huán)境條件而定。解決這個問題常見的方法有軟件去抖動和硬件去抖動。我們解釋一下抖動:關(guān)于按鍵去抖動的解釋,我們在手動按鍵的時候,由于機械抖動或是其它一些非人為的因素很有可能會造成誤識別,一般手動按下一次鍵然后接著釋放,按鍵兩片金屬膜接觸的時間大約為50ms左右,在按下瞬間到穩(wěn)定的時間為5-10ms,在松開的瞬間到穩(wěn)定的時間也為5-10ms,如果我們再首次檢測到鍵被按下后延時10ms左右再去檢測,這時如果是干擾信號將不會被檢測到,如果確實是有鍵被按下,則可確認,以上為按鍵識別去抖動的原理。獨立按鍵:我們先將一下獨立按鍵的使用方法,開發(fā)板獨立按鍵電路圖如下:獨立按鍵一共5個,分別連接在單片機的P3.0到P3.4口。去抖動的方式,我們采用軟件延時的方法。過程如下:先設(shè)置IO口為高電平〔一般上電默認就為高讀取IO口電平確認是否有按鍵按下如有IO電平為低電平后,延時幾個ms再讀取該IO電平,如果任然為低電平,說明對應(yīng)按鍵按下執(zhí)行相應(yīng)按鍵的程序/***************************************************************************實驗名 :獨立按鍵實驗*使用的IO :LED使用P2,鍵盤使用P3.0、P3.1、P3.2、P3.3*實驗效果:按下K1鍵,滅掉LED,按下K2鍵,打開所有的LED,按下K3鍵,LED左移一位,按下K4鍵,LED右移一位。* 注意 :由于P3.2口跟紅外線共用,所以做按鍵實驗時為了不讓紅外線影響實驗*效果,最好把紅外線先取下來。**************************************************************************/#include<reg51.h>#include<intrins.h> #defineGPIO_LEDP2sbitK1=P3^0;sbitK2=P3^1;sbitK3=P3^2;sbitK4=P3^3;voidDelay10ms<>;//延時10ms/***************************************************************************函數(shù)名:main*函數(shù)功能 :主函數(shù)*輸入:無*輸出 :無**************************************************************************/voidmain<void>{ unsignedinti,j; while<1> { if<K1==0> //檢測按鍵K1是否按下 { Delay10ms<>; //消除抖動 if<K1==0>//再次檢測按鍵是否按下 j=0; while<<i<50>&&<K1==0>> //檢測按鍵松手檢測,如果不松手超過延時也會自動結(jié)束等待 { Delay10ms<>; i++; } i=0; } if<K2==0> //檢測按鍵K2是否按下 { Delay10ms<>; if<K2==0> j=0xff; while<<i<50>&&<K2==0>> { Delay10ms<>; i++; } i=0; } if<K3==0> //檢測按鍵K3是否按下 { Delay10ms<>; if<K3==0> { if<<j==0>||<j==0xff>> //如果當(dāng)前狀態(tài)是全亮的或者全滅的,就點亮他的第一盞燈 { j=0xfe; } else j=_crol_<j,1>; //左移一位 } while<<i<50>&&<K3==0>> { Delay10ms<>; i++; } i=0; } if<K4==0> //檢測按鍵K4是否按下 { Delay10ms<>; if<K4==0> { if<<j==0>||<j==0xff>> { j=0xfe; } else j=_cror_<j,1>; //右移一位 } while<<i<50>&&<K4==0>> { Delay10ms<>; i++; } i=0; } GPIO_LED=j; } }/**************************************************************************函數(shù)名:Delay10ms*函數(shù)功能 :延時函數(shù),延時10ms*輸入:無*輸出 :無**************************************************************************/voidDelay10ms<void>//誤差0us{unsignedchara,b,c;for<c=1;c>0;c-->for<b=38;b>0;b-->for<a=130;a>0;a-->;}下載獨立按鍵控制led燈.hex,觀察實驗結(jié)果。實驗效果是:按下K1鍵,滅掉LED,按下K2鍵,打開所有的LED,按下K3鍵,LED左移一位,按下K4鍵,LED右移一位。第七講靜態(tài)數(shù)碼管我們先看看什么是數(shù)碼管,上圖就是各種長相各種樣子的數(shù)碼管了,肯定很眼熟了吧。不管將幾位數(shù)碼管連在一起,數(shù)碼管的顯示原理都是一樣的,都是靠點亮內(nèi)部的發(fā)光二極管來發(fā)光,下面就來我們講解一個數(shù)碼管是如何亮起來的。數(shù)碼管內(nèi)部電路如下圖所示,從右圖可看出,一位數(shù)碼管的引腳是10個,顯示一個8字需要7個小段,另外還有一個小數(shù)點,所以其內(nèi)部一共有8個小的發(fā)光二極管,最后還有一個公共端,生產(chǎn)商為了封裝統(tǒng)一,單位數(shù)碼管都封裝10個引腳,其中第3和第8引腳是連接在一起的。而它們的公共端又可分為共陽極和共陰極,中間圖為共陰極內(nèi)部原理圖,右圖為共陽極內(nèi)部原理圖。上圖展出了常用的兩種數(shù)碼管的引腳排列和內(nèi)部結(jié)構(gòu)。總所周知,點亮發(fā)光二極管就是要給予它足夠大的正向壓降。所以點亮數(shù)碼管其實也就是給它內(nèi)部相應(yīng)的發(fā)光二極管正向壓降。如上圖左〔一共a、b、c、d、e、f、g、DP八段,如果要顯示"1"則要點亮b、c兩段LED;顯示"A"則點亮a、b、c、e、f、g這六段LED;我們還知道,既然LED加載的是正向壓降,它的兩端電壓必然會有高低之分:如果八段LED電壓高的一端為公共端,我們稱之為共陽極數(shù)碼管〔如上圖中;如果八段LED電壓低的一段為公共端,則稱之為共陰極數(shù)碼管〔上圖右。所以,要點亮共陽極數(shù)碼管,則要在公共端給予高于非公共端的電平;反之點亮共陰極數(shù)碼管,則要在非公共端給予較高電平。對共陰極數(shù)碼來說,其8個發(fā)光二極管的陰極在數(shù)碼管內(nèi)部全部連接在一起,所以稱"共陰",而它們的陽極是獨立的,通常在設(shè)計電路時一般把陰極接地。當(dāng)我們給數(shù)碼管的任意一個陽極加一個高電平時,對應(yīng)的這個發(fā)光二極管就點亮了。如果想要顯示出一個8字,并且把右下角的小數(shù)點也點亮的話,可以給8個陽極全部送高電平,如果想讓它顯示出一個0字,那么我們可以除了給第"g,dp"這兩位送低電平外,其余引腳全部都送高電平,這樣它就顯示出0字了。想讓它顯示幾,就給相對應(yīng)的發(fā)光二極管送高電平,因此我們在顯示數(shù)字的時候首先做的就是給0-9十個數(shù)字編碼,在要它亮什么數(shù)字的時候直接把這個編碼送到它的陽極就行了。共陽極數(shù)碼管其內(nèi)部8個發(fā)光二極管的所有陽極全部連接在一起,電路連接時,公共端接高電平,因此我們要點亮的那個發(fā)光管二極管就需要給陰極送低電平,此時顯示數(shù)字的編碼與共陽極編碼是相反的關(guān)系,數(shù)碼管內(nèi)部發(fā)光二極管點亮?xí)r,也需要5mA以上的電流,而且電流不可過大,否則會燒毀發(fā)光二極管。由于單片機的I/O口送不出如此大的電流,所以數(shù)碼管與單片機連接時需要加驅(qū)動電路,可以用上拉電阻的方法或使用專門的數(shù)碼管驅(qū)動芯片,本實驗板上使用的是74HC573鎖存器,其輸出電流較大,電路接口簡單,可借鑒使用。一般共陽極數(shù)碼管更為常用,為什么呢?這是因為數(shù)碼管的非公共端往往接在IC芯片的IO上,而IC芯片的驅(qū)動能力往往是比較小的,如果采用共陰極數(shù)碼管,它的驅(qū)動端在非公共端,就有可能受限于IC芯片輸出電流不夠而顯示昏暗〔比如51單片機,要外加上拉電阻或者是三極管加大驅(qū)動能力。所以使用共陽數(shù)碼管的好處是:將驅(qū)動數(shù)碼管的工作交到公共端〔一般接驅(qū)動電源,加大驅(qū)動電源的功率自然要比加大IC芯片IO口的驅(qū)動電流簡單許多。另一方面,這樣也能減輕MCU的負擔(dān)。當(dāng)多位一體時,它們內(nèi)部的公共端是獨立的,而負責(zé)顯示什么數(shù)字的段線全部是連接在一起的,獨立的公共端可以控制多位一體中的哪一位數(shù)碼管點亮,而連接在一起的段線可以控制這個能點亮數(shù)碼管亮什么數(shù)字,通常我們把公共端叫做"位選線",連接在一起的段線叫做"段選線",有了這兩個線后,通過單片機及外部驅(qū)動電路就可以控制任意的數(shù)碼管顯示任意的數(shù)字了。一般單位數(shù)碼管有10個引腳,二位數(shù)碼管也是10個引腳,四位數(shù)碼管是12個引腳,關(guān)于具體的引腳及段、位標號大家可以查詢相關(guān)資料,最簡單的辦法就是用數(shù)字萬用表測量,若沒有數(shù)字萬用表也可用5V直流電源串接1k電阻后測量,將測量結(jié)果記錄,通過統(tǒng)計便可繪制出引腳標號。知識點:如何用萬用表檢瀏數(shù)碼管的引腳排列對數(shù)字萬用表來說,紅色表筆連接表內(nèi)部電池正極,黑色表筆連接表內(nèi)部電池負極,當(dāng)把數(shù)字萬用表置于二極管檔時,其兩表筆間開路電壓約為1.5V,把兩表筆正確加在發(fā)光二極管兩端時,可以點亮發(fā)光二極管。如下圖所示,將數(shù)字萬用表置于二極管擋,紅表筆接在①腳,然后用黑表筆去接觸其他各引腳,假設(shè)只有當(dāng)接觸到⑨腳時,數(shù)碼管的a段發(fā)光,而接觸其余引腳時則不發(fā)光。由此可知,被測數(shù)碼管為共陰極結(jié)構(gòu)類型,⑨腳是公共陰極,①腳則是數(shù)碼管的a段.接下來再檢測各段引腳,仍使用數(shù)字萬用表二極管檔,將黑表筆固定接在⑨腳,用紅表筆依次接觸②、③、④、⑤、⑥、⑦、⑧、⑩引腳時,數(shù)碼管的其他段先后分別發(fā)光,據(jù)此便可繪出該數(shù)碼管的內(nèi)部結(jié)構(gòu)和引腳排列圖。檢測中,若被測數(shù)碼管為共陽極類型,則需將紅、黑表筆對調(diào)才能測出上述結(jié)果,在判別結(jié)構(gòu)類型時,操作時要靈活掌握,反復(fù)試驗,直到找出公共端為止,大家只要懂得了原理,檢測出各個引腳便不在是問題了。數(shù)碼管靜態(tài)顯示當(dāng)多位數(shù)碼管應(yīng)用于某一系統(tǒng)時,它們的"位選"是可獨立控制的,而"段選"是連接在一起的,我們可以通過位選信號控制哪幾個數(shù)碼管亮,而在同一時刻,位選選通的所有數(shù)碼管上顯示的數(shù)字始終都是一樣的,因為它們的段選是連接在一起的,所以送入所有數(shù)碼管的段選信號都是相同的,那么它們顯示的數(shù)字必定一樣,數(shù)碼管的這種顯示方法叫做靜態(tài)顯示。從電路圖可以看出,本開發(fā)板使用的是共陰極數(shù)碼管,在每段數(shù)碼管端加上一個限流電阻。下面我們來看一下程序/***************************************************************************實驗名 :靜態(tài)數(shù)碼管實驗*使用的IO :數(shù)碼管使用P0,鍵盤使用P3.0、P3.1、P3.2、P3.3*實驗效果:按下K1鍵,顯示1,按下K2鍵,顯示2,按下K3鍵,顯示3,按下K4鍵,顯示4。* 注意 :由于P3.2口跟紅外線共用,所以做按鍵實驗時為了不讓紅外線影響實驗*效果,最好把紅外線先取下來。**************************************************************************/#include<reg51.h>#include<intrins.h> #defineGPIO_DIGP0sbitLSA=P2^2;sbitLSB=P2^3;sbitLSC=P2^4;sbitK1=P3^0;sbitK2=P3^1;sbitK3=P3^2;sbitK4=P3^3;DIG_CODE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//顯示0~9的值voidDelay10ms<>;//延時10ms/***************************************************************************函數(shù)名:main*函數(shù)功能 :主函數(shù)*輸入:無*輸出 :無**************************************************************************/voidmain<void>{ unsignedinti,j; LSA=0; LSB=0; LSC=0; while<1> { if<K1==0> //檢測按鍵K1是否按下 { Delay10ms<>; //消除抖動 if<K1==0> { j=1; } while<<i<50>&&<K1==0>> //檢測按鍵是否松開 { Delay10ms<>; i++; } i=0; } if<K2==0> //檢測按鍵K2是否按下 { Delay10ms<>; if<K2==0> { j=2; } while<<i<50>&&<K2==0>> { Delay10ms<>; i++; } i=0; } if<K3==0> //檢測按鍵K3是否按下 { Delay10ms<>; if<K3==0> { j=3; } while<<i<50>&&<K3==0>> { Delay10ms<>; i++; } i=0; } if<K4==0> //檢測按鍵K4是否按下 { Delay10ms<>; if<K4==0> { j=4; } while<<i<50>&&<K4==0>> { Delay10ms<>; i++; } i=0; } GPIO_DIG=DIG_CODE[j]; } }/**************************************************************************函數(shù)名:Delay10ms*函數(shù)功能 :延時函數(shù),延時10ms*輸入:無*輸出 :無**************************************************************************/voidDelay10ms<void>//誤差0us{unsignedchara,b,c;for<c=1;c>0;c-->for<b=38;b>0;b-->for<a=130;a>0;a-->;}下載HEX文件,觀察實驗效果,實驗的效果是:按下K1鍵,顯示1,按下K2鍵,顯示2,按下K3鍵,顯示3,按下K4鍵,顯示4。第八講矩陣鍵盤獨立鍵盤與單片機連接時,每一個按鍵都需要單片機的一個I/O口若某單片機系統(tǒng)需較多按鍵,如果用獨立按鍵便會占用過多的I/O口資源。單片機系統(tǒng)中I/O口資源往往比較寶貴,當(dāng)用到多個按鍵時為了節(jié)省I/O口口線,我們引入矩陣鍵盤。我們以4X4矩陣鍵盤為例講解其工作原理和檢測方法。將16個按鍵排成4行4列,第一行將每個按鍵的一端連接在一起構(gòu)成行線,第一列將每個按鍵的另一端連接在一起構(gòu)成列線,這樣便一共有4行4列共8根線,我們將這8根線連接到單片機的8個I/O口上,通過程序掃描鍵盤就可檢測16個鍵。用這種方法我們也可實現(xiàn)3行3列9個鍵、5行5列25個鍵、6行6列36個鍵等。無論是獨立鍵盤還是矩陣鍵盤,單片機檢測其是否被按下的依據(jù)都是一樣的,也就是檢測與該鍵對應(yīng)的I/O口是否為低電平。獨立鍵盤有一端固定為低電平,單片機寫程序檢測時比較方便。而矩陣鍵盤兩端都與單片機I/O口相連,因此在檢測時需人為通過單片機I/O口送出低電平。檢測時,先送一列為低電平,其余幾列全為高電平<此時我們確定了列數(shù)>,然后立即輪流檢測一次各行是否有低電平,若檢測到某一行為低電平<這時我們又確定了行數(shù)>,則我們便可確認當(dāng)前被按下的鍵是哪一行哪一列的,用同樣方法輪流送各列一次低電平,再輪流檢測一次各行是否變?yōu)榈碗娖?這樣即可檢測完所有的按鍵,當(dāng)有鍵被按下時便可判斷出按下的鍵是哪一個鍵。當(dāng)然我們也可以將行線置低電平,掃描列是否有低電平。這就是矩陣鍵盤檢測的原理和方法。首先看一下電路圖1342876513428765上圖是一個4X4的矩陣鍵盤,一共是16個按鍵。我們照習(xí)慣稱橫為"行","豎"為列。那么5、6、7、8我們稱之為"行線",則1、2、3、4稱為"列線"。要正確記住各個行列線各自對應(yīng)的IO。注意看,每一個按鍵的兩端,都分別接在某一個列線和行線上,即:"行線和列線是通過某個按鍵的按下和抬起實現(xiàn)聯(lián)通和斷開的",和"導(dǎo)線兩端上的信號是經(jīng)過"與"的關(guān)系再體現(xiàn)到導(dǎo)線上的。"這兩句話便構(gòu)成了矩陣鍵盤掃描的全部。要理解好,理解不了就背下來?,F(xiàn)在詳細講述一下矩陣鍵盤掃描的原理和步驟:掃描矩陣鍵盤,即是把某一條〔只有一條行線置為低電平,而列線全部置為輸入方向,然后檢測列線,如果檢測到某一條列線是低電平,那么就表示位于這條列線與輸出低電平的行線的交點處的按鍵被按下了。要掃描16個按鍵,就依次以這樣的方法掃描16次,之后就可以確定哪一個按鍵被按下了。當(dāng)然這里也少不了延時消除按鍵抖動的環(huán)節(jié)。下面看一下程序/*******************************************************************************實驗名 :矩陣鍵盤實驗*使用的IO :數(shù)碼管使用P0,鍵盤使用P3.0、P3.1、P3.2、P3.3*實驗效果:按矩陣鍵盤分別顯示在數(shù)碼管上面顯示十六進制的0到F。* 注意 :******************************************************************************/#include<reg51.h>#defineGPIO_DIGP0#defineGPIO_KEYP1sbitLSA=P2^2;sbitLSB=P2^3;sbitLSC=P2^4;unsignedcharcodeDIG_CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的顯示碼unsignedcharKeyValue;//用來存放讀取到的鍵值voidDelay10ms<>;//延時10msvoidKeyDown<>; //檢測按鍵函數(shù)/******************************************************************************函數(shù)名:main*函數(shù)功能 :主函數(shù)*輸入:無*輸出 :無******************************************************************************/voidmain<void>{ LSA=0;//給一個數(shù)碼管提供位選 LSB=0; LSC=0; while<1> { KeyDown<>; GPIO_DIG=DIG_CODE[KeyValue]; } }/*******************************************************************************函數(shù)名:KeyDown*函數(shù)功能 :檢測有按鍵按下并讀取鍵值*輸入:無*輸出 :無******************************************************************************/voidKeyDown<void>{ chara; GPIO_KEY=0x0f; if<GPIO_KEY!=0x0f> { Delay10ms<>; if<GPIO_KEY!=0x0f> { //測試列 GPIO_KEY=0X0F; switch<GPIO_KEY> { case<0X07>: KeyValue=0;break; case<0X0b>: KeyValue=1;break; case<0X0d>:KeyValue=2;break; case<0X0e>: KeyValue=3;break;// default: KeyValue=17; //檢測出錯回復(fù)17意思是把數(shù)碼管全滅掉。 } //測試行 GPIO_KEY=0XF0; switch<GPIO_KEY> { case<0X70>: KeyValue=KeyValue;break; case<0Xb0>: KeyValue=KeyValue+4;break; case<0Xd0>:KeyValue=KeyValue+8;break; case<0Xe0>: KeyValue=KeyValue+12;break;// default: KeyValue=17; } while<<a<50>&&<GPIO_KEY!=0xf0>> //檢測按鍵松手檢測 { Delay10ms<>; a++; } a=0; } }}/*******************************************************************************函數(shù)名:Delay10ms*函數(shù)功能 :延時函數(shù),延時10ms*輸入:無*輸出 :無******************************************************************************/voidDelay10ms<void>//誤差0us{unsignedchara,b,c;for<c=1;c>0;c-->for<b=38;b>0;b-->for<a=130;a>0;a-->;}下載HEX文件,觀察實驗效果,實驗的效果是:按矩陣鍵盤分別顯示在數(shù)碼管上面顯示十六進制的0到F。第九講動態(tài)數(shù)碼管動態(tài)掃描的原理在實際的單片機系統(tǒng)中,往往需要多位顯示。動態(tài)顯示是一種最常見的多位顯示方法,應(yīng)用非常廣泛。所有數(shù)碼管段選都連接在一起的時候,怎么讓數(shù)碼管顯示不一樣的數(shù)字呢?動態(tài)顯示是多個數(shù)碼管,交替顯示,利用人的視覺暫停作用使人看到多個數(shù)碼管同時顯示的效果。首先我們來看一下開發(fā)板上的電路原理圖:本開發(fā)板上使用的是,通過P22、P23、P24控制3-8譯碼器來對數(shù)碼管進行位選,通過P0口經(jīng)過573的驅(qū)動控制數(shù)碼管的段選,通過P13控制573的使能端,為低電平時573才會有輸出。下面看一下程序:/***************************************************************************實驗名 :動態(tài)顯示數(shù)碼管實驗*使用的IO :數(shù)碼管使用P0,P2.2,P2.3,P2.4鍵盤使用P1*實驗效果:按矩陣鍵盤分別顯示在數(shù)碼管上面顯示十六進制的0到F。* 注意 :**************************************************************************/#include<reg51.h>#defineGPIO_DIGP0#defineGPIO_KEYP1sbitLSA=P2^2;sbitLSB=P2^3;sbitLSC=P2^4;unsignedcharcodeDIG_CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的顯示碼unsignedcharKeyValue;//用來存放讀取到的鍵值unsignedcharKeyState; //記錄按鍵的狀態(tài),0沒有,1有unsignedcharDisplayData[8];//用來存放要顯示的8位數(shù)的值voidDelay10ms<>;//延時10msvoidKeyDown<>; //檢測按鍵函數(shù)voidDigDisplay<>;//動態(tài)顯示函數(shù)/***************************************************************************函數(shù)名:main*函數(shù)功能 :主函數(shù)*輸入:無*輸出 :無**************************************************************************/voidmain<void>{ KeyState=0; while<1> { KeyDown<>; if<KeyState==1> { DisplayData[7]=DisplayData[6]; DisplayData[6]=DisplayData[5]; DisplayData[5]=DisplayData[4]; DisplayData[4]=DisplayData[3]; DisplayData[3]=DisplayData[2]; DisplayData[2]=DisplayData[1]; DisplayData[1]=DisplayData[0]; DisplayData[0]=DIG_CODE[KeyValue]; KeyState=0; } DigDisplay<>;//顯示 } }/***************************************************************************函數(shù)名:DigDisplay*函數(shù)功能 :使用數(shù)碼管顯示*輸入:無*輸出 :無**************************************************************************/voidDigDisplay<>{ unsignedchari,j; for<i=0;i<8;i++> { switch<i> //位選,選擇點亮的數(shù)碼管, { case<0>: LSA=0;LSB=0;LSC=0;break; case<1>: LSA=1;LSB=0;LSC=0;break; case<2>: LSA=0;LSB=1;LSC=0;break; case<3>: LSA=1;LSB=1;LSC=0;break; case<4>: LSA=0;LSB=0;LSC=1;break; case<5>: LSA=1;LSB=0;LSC=1;break; case<6>: LSA=0;LSB=1;LSC=1;break; case<7>: LSA=1;LSB=1;LSC=1;break; } GPIO_DIG=DisplayData[i]; j=10; //掃描間隔時間設(shè)定 while<j-->; GPIO_DIG=0x00;//消隱 }}/***************************************************************************函數(shù)名:KeyDown*函數(shù)功能 :檢測有按鍵按下并讀取鍵值*輸入:無*輸出 :無**************************************************************************/voidKeyDown<void>{ unsignedinta=0; GPIO_KEY=0x0f; if<GPIO_KEY!=0x0f>{ Delay10ms<>; a++; a=0; if<GPIO_KEY!=0x0f> { KeyState=1;//有按鍵按下 //測試列 GPIO_KEY=0X0F;// Delay10ms<>; switch<GPIO_KEY> { case<0X07>: KeyValue=0;break; case<0X0b>: KeyValue=1;break; case<0X0d>:KeyValue=2;break; case<0X0e>: KeyValue=3;break;// default: KeyValue=17; //檢測出錯回復(fù)17意思是把數(shù)碼管全滅

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論