版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
實(shí)驗(yàn)一軟硬件環(huán)境一、硬件環(huán)境本開發(fā)板提供USB2.0和串口兩種通信方式,USB實(shí)現(xiàn)供電、編程、仿真、通信多種功能,另外還提供了Atmel單片機(jī)的ISP接口。此板兼容STC、SST、Atmel、Philips等51家族的所有單片機(jī)。板載資源:單片機(jī)采用STC89c522.1寸彩色液晶屏超聲波接口1602液晶屏接口12864液晶屏接口溫度傳感器DS18B20EEPROM24C02存儲器8位動態(tài)數(shù)碼管AD/DA轉(zhuǎn)換XPT2046DS1302實(shí)時時鐘4*4矩陣鍵盤4個獨(dú)立鍵盤2*8路led燈USB接口,實(shí)現(xiàn)下載,供電,串行通信。通過USB轉(zhuǎn)串口芯片CH340T轉(zhuǎn)換IR紅外接收頭,紅外數(shù)據(jù)傳輸板載繼電器蜂鳴器步進(jìn)電機(jī)ULN2003達(dá)林頓管驅(qū)動二、軟件環(huán)境1、USB轉(zhuǎn)串口驅(qū)動的安裝雙擊USB驅(qū)動SERIAL程序的Setup安裝成功后,會出現(xiàn)一下提示畫面點(diǎn)“確定”即可以結(jié)束安裝過程。安裝完驅(qū)動程序成功后,把開發(fā)板與電腦連接可以看到設(shè)備管理器中的COM口。在圖標(biāo)“我的電腦”右鍵,→屬性,→硬件,→設(shè)備管理器(這是XP系統(tǒng),WIN系統(tǒng)與其相似找到設(shè)備管理器)顯示成功的COM口安裝不成功解決辦法如果發(fā)現(xiàn)是下圖感嘆號,則沒有安裝成功或者沒有安裝、右鍵點(diǎn)擊更新驅(qū)動程序選擇“從列表或指定位置安裝(推薦)”出現(xiàn)此對話框,選擇不要搜索,自己選擇安裝點(diǎn)“下一步”點(diǎn)擊"下一步"出現(xiàn)此對話框、點(diǎn)擊“從磁盤安裝”點(diǎn)擊“瀏覽”到USB驅(qū)動文件夾找到安裝文件打開點(diǎn)擊“確定”和“下一步”點(diǎn)擊"完成"安裝結(jié)束KEIL軟件安裝我們用現(xiàn)在新版本的uVision4KEIL開發(fā)環(huán)境,使用的版本是破解版,僅供大家學(xué)習(xí)使用。如做商業(yè)開發(fā),請購買正版,可以獲得更多keil軟件原廠技術(shù)支持。即將安裝軟件如下,一個keil安裝程序,一個注冊機(jī)(右側(cè))。打開C51V901.EXE安裝程序點(diǎn)擊Next>>Iagreeallthetemsof……選中點(diǎn)擊Next>>設(shè)置安裝目錄,根據(jù)自己的情況選中安裝目錄,重新設(shè)置點(diǎn)擊Browse,這里默認(rèn)C盤,設(shè)置好安裝目錄后點(diǎn)擊Next>>輸入相關(guān)信息(隨便輸入),輸入完畢后點(diǎn)擊Next>>開始安裝,安裝過程中……..等待安裝完成安裝完成,點(diǎn)擊Finish即可。接下來破解軟件。打開注冊機(jī)軟件Target:選擇C51Target:選擇C51打開剛剛安裝好的keil軟件點(diǎn)擊File菜單選擇LicenseManagement。復(fù)制CID碼到注冊機(jī)中現(xiàn)在沒有破解復(fù)制CID碼到注冊機(jī)中復(fù)制CID碼,之后點(diǎn)擊Generate生成注冊碼復(fù)制生成的注冊碼到keil從KEIL復(fù)制的CID碼粘貼到這里復(fù)制生成的注冊碼到keil從KEIL復(fù)制的CID碼粘貼到這里復(fù)制到這里復(fù)制到這里復(fù)制完注冊碼后,點(diǎn)擊右側(cè)的,即可完成破解。提示如下:以上軟件安裝完畢。接下來看程序了。三、程序下載我們可以通過USB接口方式下載對我們開發(fā)板的單片機(jī)下載程序。下載軟件為STC官方軟件官方軟件官方軟件接下來我們打開官方STC下載軟件下載43214321選擇開發(fā)板上單片機(jī)型號,我們選STC89C5選擇串口,可通過設(shè)備管理器查看打開需要下載到單片機(jī)的程序點(diǎn)擊下載點(diǎn)擊下載按鈕后會有這樣的信息:這時需要手動按開關(guān)鍵,關(guān)閉開關(guān),打開開關(guān)這樣一個過程,主要是給單片機(jī)冷啟動。重新上電后,會出現(xiàn)開始下載程序,下載完成。上圖表示下載成功。實(shí)驗(yàn)二KEIL軟件使用及l(fā)ed流水燈單片機(jī)開發(fā)中除必要的硬件外,同樣離不開軟件,我們寫的匯編語言源程序要變?yōu)镃PU可以執(zhí)行的機(jī)器碼有兩種方法,一種是手工匯編,另一種是機(jī)器匯編,目前已極少使用手工匯編的方法了。機(jī)器匯編是通過匯編軟件將源程序變?yōu)闄C(jī)器碼,用于MCS-51單片機(jī)的匯編軟件有早期的A51,隨著單片機(jī)開發(fā)技術(shù)的不斷發(fā)展,從普遍使用匯編語言到逐漸使用高級語言開發(fā),單片機(jī)的開發(fā)軟件也在不斷發(fā)展,Keil軟件是目前最流行開發(fā)MCS-51系列單片機(jī)的軟件,這從近年來各仿真機(jī)廠商紛紛宣布全面支持Keil即可看出。Keil提供了包括C編譯器、宏匯編、連接器、庫管理和一個功能強(qiáng)大的仿真調(diào)試器等在內(nèi)的完整開發(fā)方案,通過一個集成開發(fā)環(huán)境(uVision)將這些部份組合在一起。運(yùn)行Keil軟件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空閑的硬盤空間、WIN98、NT、WIN2000、WINXP等操作系統(tǒng)。掌握這一軟件的使用對于使用51系列單片機(jī)的愛好者來說是十分必要的,如果你使用C語言編程,那么Keil幾乎就是你的不二之選(目前在國內(nèi)你只能買到該軟件、而你買的仿真機(jī)也很可能只支持該軟件),即使不使用C語言而僅用匯編語言編程,其方便易用的集成環(huán)境、強(qiáng)大的軟件仿真調(diào)試工具也會令你事半功倍。我們將通過一些實(shí)例來學(xué)習(xí)Keil軟件的使用,在這一部份我們將學(xué)習(xí)如何輸入源程序,建立工程、對工程進(jìn)行詳細(xì)的設(shè)置,以及如何將源程序變?yōu)槟繕?biāo)代碼。打開keil軟件,版本μVision2,μvision3,μvision4都一樣,在這里用μvision4版本演示,打開之后如下圖,有的時候會默認(rèn)打開上次使用的工程,單擊Project菜單,選擇CloseProject關(guān)閉了默認(rèn)打開的工程,顯示下圖界面:我們要建立新的工程,選擇Project→newμvisionprojiect…選擇工程要保存的路徑,輸入工程文件名,如圖 點(diǎn)擊保存后會彈出一個對話框,要求用戶選擇單片機(jī)型號,可以根據(jù)用戶使用的單片機(jī)來選擇,我們使用的STC90單片機(jī)是兼容51內(nèi)核的,KeilC51幾乎支持所有的51內(nèi)核單片機(jī),51內(nèi)核具有通用型,如果程序用的資源不是太復(fù)雜,我們可以選擇任意一款51單片機(jī)內(nèi)核就行。在稍后我們會繼續(xù)講解怎么將STC單片機(jī)官方的頭文件添加進(jìn)來,在這暫不多介紹。Keil軟件的關(guān)鍵是程序代碼的編寫,而非是用戶選擇什么硬件。例程以添加Atmel的AT89C51來說明。如圖,然后,單擊確定(OK)。功能描述功能描述如果出現(xiàn)下面的界面:單擊是就可以,意思是將單片機(jī)的啟動代碼添加到工程,我們不用修改。(沒有的手動增加,在C51的LIB目錄內(nèi))到目前我們還沒建立一個完整的工程,只是有工程的名字,框架,工程中還沒有任何文件代碼,(除了啟動代碼,有的keil版本不顯示啟動代碼),接下來我們添加文件及代碼。單擊菜單File→New選項(xiàng),或者單擊界面上的快捷圖標(biāo),新建文件串口如下。界面顯示的Text1就是我們剛剛加入的文件,但是這個文件與我們的工程還沒有直接聯(lián)系起來,單擊圖標(biāo),保存我們當(dāng)前的text1文件,輸入要保存的文件名,同時要輸入文件擴(kuò)展名,擴(kuò)展名很關(guān)鍵,用C語言編寫的程序,則必須為**.c,匯編語言必須為**.asm(**為文件名),文件名是用戶自己取的。填好文件名后單擊保存?;氐骄庉嫿缑?,單擊Target1前面的“+”號,然后在SourceGroup1上右鍵單擊,選擇AddFilestoGroupSourceGroup1,選中我們剛才建立的.c文件,這里是ledtest.c,單擊add,只需單擊一次。之后單擊Close就可以。回到主界面后,單擊SourceGroup1前的“+”號,剛剛添加的文件顯示在里面。通過以上步驟我們就建立好了一個工程。接下來就可以寫代碼了。在寫代碼之前介紹介個常用的按鈕:按鈕:用來編譯我們正在操作的文件。按鈕:用來編譯修改過的文件,并生成應(yīng)用程序共單片機(jī)下載。按鈕:用來重新編譯當(dāng)前工程中所有的文件,并生成應(yīng)用程序共單片機(jī)下載。因?yàn)楹芏喙こ滩恢褂幸粋€文件,當(dāng)有多個文件時,用它進(jìn)行編譯。按鈕:用來打開“OptionforTarget”對話框,對當(dāng)前工程進(jìn)行設(shè)置。工程的各個參數(shù)都可以在這里設(shè)置,具體的設(shè)置方法用到的時候,再和大家詳細(xì)講述。以上幾個按鈕是常用的,其他按鈕在使用的時候再介紹。編寫程序我們以一個程序?yàn)槔齺砭毩?xí)編寫:led閃爍。這個程序大家一定要弄懂,也算是一個基礎(chǔ),懂了這個程序,也算是進(jìn)入單片機(jī)的領(lǐng)域了接下來我會詳細(xì)講解這個例程。另外需要注意的是單片機(jī)寫程序的時候,一定是英文狀態(tài)下的字符,尤其注意“;”,往往就因?yàn)檫@個分號,程序出現(xiàn)問題,所以輸入時一定要注意是在英文狀態(tài)下的。我們在編輯框中輸入以下程序:/********************************************************************* LED閃爍的簡單試驗(yàn) *********************************************************************/#include<reg51.h> //此文件中定義了51的一些特殊功能寄存器voiddelay(unsignedinti);//聲明延時函數(shù)voidmain(){ while(1) { P2=0x00;//置P2口為低電平 delay(600);//調(diào)用延時程序 P2=0xff;//置P2口為高電平 delay(600);//調(diào)用延時程序 }}/*******延時函數(shù)*************/voiddelay(unsignedinti){ unsignedcharj; for(i;i>0;i--)//循環(huán)600*255次 for(j=255;j>0;j--);}我們先編譯一下:第一次編譯我們點(diǎn)擊,看一下結(jié)果結(jié)果的意思:編譯led2.c…鏈接…data=9.0--占用內(nèi)部RAM9個字節(jié),xdata=0:外部RAM0字節(jié),Code=56代碼長度為56字節(jié)生成單片機(jī)可下載的HEX(十六進(jìn)制)文件。沒有錯誤,沒有警告。在這里說明一點(diǎn):生成HEX文件是我們自己設(shè)置的,默認(rèn)的情況下不會生成HEX文件。單擊進(jìn)行設(shè)置,如下圖,選擇Output,勾選Creathex,后單擊確定。接下來我們分析上面的程序:/**/作用,它是用來注釋一段內(nèi)容的,編譯器不對其進(jìn)行編譯,只要在/**/直接的內(nèi)容都被注釋掉。//是用來注釋其后面的內(nèi)容,只能注釋一行。#include<reg51.h>//這句告訴我們包涵51的頭文件,那這個頭文件里面放的是什么東西呢?放的是51單片機(jī)對應(yīng)的操作的寄存器地址,如我們直接用來操作的P1口就是代表0x90地址,我們可以將光標(biāo)低位在<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系列單片機(jī)的所有功能寄存器,我們直接使用其代號就可以,P0,P1等。如:sfrP0=0x80,意思是把單片機(jī)內(nèi)部地址0x80處的寄存器重新起名字叫P0,以后我們在程序中直接操作P0,就相當(dāng)于對單片機(jī)內(nèi)部0x80地址處的寄存器進(jìn)行操作。通俗的講,也就是說,通過sfr這個關(guān)鍵字,讓Keil編譯器在單片機(jī)與人之間搭建一個橋梁,我們操作P0口,單片機(jī)對應(yīng)就去操作內(nèi)部0x80的地址。所以我們寫程序要在開始處直接包涵單片機(jī)的頭文件。sbitSM0=0x9F;是定義位操作地址0x9F的,這個地址只代表一個位。我們操作SM0,對應(yīng)單片機(jī)就是操作位地址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)在控制單片機(jī)了,告訴單片機(jī)把你的P2口都輸出0,如果你不操作P2口了,那么P2口一直保持這個狀態(tài),直到你去改變它。delay(1000);//調(diào)用延時程序調(diào)用子函數(shù)delay(),告訴單片機(jī)去執(zhí)行delay那個函數(shù),那么P2口一直保持0這狀態(tài)。P2=0xff;//置P0口為高電平這時告訴P2口全部輸出1,(0xff=11111111).狀態(tài)從0變成1了,對應(yīng)的燈的輸出也由低電平變成高電平了delay(1000);//調(diào)用延時程序,再進(jìn)行延時,}這個程序里執(zhí)行完了一次又干什么呢,Keil編譯器會編譯成一直重復(fù)執(zhí)行main()函數(shù)里面的代碼,整個代碼的效果就是:P2輸出低電平延時一段時間,目的是P2輸出的低電平保持一段時間P2輸出高電平延時一段時間,目的是P2輸出的高電平保持一段時間重復(fù)①到④的過程實(shí)際效果就是led一閃一閃通過更改delay(延時時間i),參數(shù)i,可以改變閃爍頻率。實(shí)際操作:打開軟件(提前裝好驅(qū)動),點(diǎn)擊打開文件,打開我們剛剛編譯的led.hex文件,下載程序,就會看到led閃爍。我們在看一個例程,就是單片機(jī)最經(jīng)典的流水燈例程:以下是我們的硬件電路,led一段接單片機(jī)P2口的8個引腳,另外一邊接排阻RP12和RP13,然后接到電源基礎(chǔ)知識介紹:排阻:一般在排阻上都標(biāo)有阻值號,其公共端附近也有明顯標(biāo)記。如下下圖表示為472,表示47*2=4700歐姆,還有的標(biāo)號如3R0,表示阻值為3歐姆,4K7表示阻值為4.7kΩ,R002表示阻值為0.002歐姆。(2)發(fā)光二極管。它具有單向?qū)щ娦?,通過5mA左右電流即可發(fā)光,電流越大,其亮度越強(qiáng),但若電流過大,會燒毀二極管,一般我們控制在3mA-20mA之間。在這里,給發(fā)光二極管串聯(lián)一個電阻的目的就是為了限制通過發(fā)光二極管的電流不要太大,因此這個電阻又稱為“限流電阻”。當(dāng)發(fā)光二極管發(fā)光時,測量它兩端電壓約為1.7V,這個電壓又叫做發(fā)光二極管的“導(dǎo)通壓降”。圖2.2.9和圖2.2.10分別為直插式發(fā)光二極管和貼片式發(fā)光二極管實(shí)物圖。發(fā)光二極管正極又稱陽極,負(fù)極又稱陰極,電流只能從陽極流向陰極。直插式發(fā)光二極管長腳為陽極,短腳為陰極。仔細(xì)觀察貼片式發(fā)光二極管正面的一端有彩色標(biāo)記,通常有標(biāo)記的一端為陰極。圖2.2.9圖2.2.10關(guān)于排阻大小的選擇:歐姆定律想必大家都清楚,U=IR,當(dāng)發(fā)光二極管正常導(dǎo)通時,其兩端電壓約為1.7V,發(fā)光管的陰極為低電平,即0V,陽極串接一電阻,電阻的另一端為Vcc,為5V,因此加在電阻兩端的電壓為5V-1.7V=3.3V,計(jì)算穿過電阻的電流,3.3V/1000Ω=3.3mA。即穿過發(fā)光管的電流也為3.3mA,若想讓發(fā)光管再亮一些,我們可以適當(dāng)減小該電阻??次覀兊脑韴D,可以知道:LED的正極接在VCC上,只要給了低電平,那么LED就會亮,低電平對應(yīng)到單片機(jī)的邏輯就是0,只要單片機(jī)的某一個管腳輸出0,那么對應(yīng)的發(fā)光二極管就會亮。我們看一下源碼:/*******************************************************************************實(shí)驗(yàn)名 :左右流水燈實(shí)驗(yàn)*使用的IO :P2*實(shí)驗(yàn)效果:點(diǎn)亮的LED從右邊往左邊移動,到達(dá)左邊再往右邊移動,依此循環(huán)。* 注意 :******************************************************************************/#include<reg51.h>#include<intrins.h> //因?yàn)橐玫阶笥乙坪瘮?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次,這樣子就會到達(dá)最左邊 { GPIO_LED=_crol_(GPIO_LED,1);//將GPIO_LED左移一位 Delay10ms(50); //延時 } for(n=0;n<7;n++) //右移7次,這樣子就會到達(dá)最右邊 { 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)點(diǎn)亮一盞LED之后左右移動。講解:移位操作‘<<’‘>>’左移。C51中操作符為“<<”,每執(zhí)行一次左移指令,被操作的數(shù)將最高位移入單片機(jī)PSW寄存器的CY位,CY位中原來的數(shù)丟棄,最低位補(bǔ)0,其他位依次向左移動一位,如下圖所示:右移。C51中操作符為“>>’’,每執(zhí)行一次右移指令,被操作的數(shù)將最低位移入單片機(jī)PSW寄存器的CY位,CY位中原來的數(shù)丟棄,最高位補(bǔ)0,其他位依次向右移動一位,如下圖所示。循環(huán)左移。最高位移入最低位,其他位依次向左移一位。C語言中沒有專門的指令,通過移位指令與簡單邏輯運(yùn)算可以實(shí)現(xiàn)循環(huán)左移,或直接利用C51庫中自帶的函數(shù)_crol_實(shí)現(xiàn),如下圖所示。_crol_函數(shù)所在的頭文件是<intrins.h>循環(huán)右移。最低位移入最高位,其他位依次向右移一位。C語言中沒有專門的指令,通過移位指令與簡單邏輯運(yùn)算可以實(shí)現(xiàn)循環(huán)右移,或直接利用C51庫中自帶的函數(shù)-cror實(shí)現(xiàn),如下圖所示。_cror_函數(shù)所在的頭文件是<intrins.h>講解:PSW寄存器PSW(ProgramStatusWord)全稱為程序狀態(tài)字標(biāo)志寄存器,是一個8位寄存器,位于單片機(jī)片內(nèi)的特殊功能寄存器區(qū),字節(jié)地址DOH,用來存放運(yùn)算結(jié)果的一些特征,如有無進(jìn)位、借位等,使用匯編編程時PSW寄存器很有用,但在利用C語言編程時,編譯器會自動控制該寄存器,很少人為操作它,大家只需做簡單了解即可.其每位的具體含義如下圖所示.CY一進(jìn)位標(biāo)志位,它表示運(yùn)算是否有進(jìn)位(或借位).如果操作結(jié)果在最高位有進(jìn)位(加法)或者借位(減法),則該位為1,否則為0.AC一輔助進(jìn)位標(biāo)志,又稱半進(jìn)位標(biāo)志,它指兩個8位數(shù)運(yùn)算低四位是否有半進(jìn)位,即低四位相加(或相減)是否進(jìn)位(或借位),如有AC為1,否則為0eFO一由用戶使用的一個狀態(tài)標(biāo)志位,可用軟件來使它置1或清0,也可由軟件來測試它,以控制程序的流向.RS1,RSO-4組工作寄存器區(qū)選擇控制位,在匯編語言中這兩位用來選擇4組工作寄存器區(qū)中的哪一組為當(dāng)前工作寄存區(qū).OV一溢出標(biāo)志位,反映帶符號數(shù)的運(yùn)算結(jié)果是否有溢出.有溢出時,此位為1,否則為0.P一奇偶標(biāo)志位,反映累加器ACC內(nèi)容的奇偶性,如果ACC中的運(yùn)算結(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ù)里面。實(shí)驗(yàn)三&四按鍵輸入及中斷一、按鍵概述及編程應(yīng)用按鍵是什么東西,我想這個就不必由我向各位闡述了。嗯,如你所見,按鍵種類繁多,功能有簡有繁,極大的充斥著我們的生活。但是無論如何,所有的按鍵其實(shí)都有一個原型,來源于同一種原理,所有的按鍵無論多復(fù)雜,多華麗,都是從這樣一個原型發(fā)展而成的。我們平日所見到的絕大部分的按鍵,其實(shí)都可以歸類為一種,叫“接觸式按鍵”。下圖為一個典型的接觸式按鍵(又稱輕觸開關(guān))。需要特別說明的是,這里說的“接觸”,是指機(jī)械層面上的接觸,而不是感光或者某些特殊涂層(比如觸摸屏)一類的接觸。所以,按鍵的工作特性其實(shí)是一種機(jī)械特性,下文會詳細(xì)說明。,如上圖,請對照圖一想象,1、2、3、4分別對應(yīng)按鍵的四個引腳,其中藍(lán)色的線表示按鍵未被按下之時的狀態(tài),我成為初始狀態(tài),它是不導(dǎo)通的;而綠色的線是卻永久導(dǎo)通的。各位明白了么,其實(shí)是兩個相同的結(jié)構(gòu)連在一起了。我們只要將需要按鍵開關(guān)作用的線路分別接在1、3和2、4的任意取一組合,概括起來就是(1,2)、(1,4)、(3,2)、(3,4)四種組合,都可以起到我們預(yù)期的開關(guān)作用。相信以上說明使大家對按鍵的工作原理有了個比較清晰的認(rèn)識了,現(xiàn)在來說說一個小知識。先看下圖(圖4):首先說明的是,上圖的連法是不允許的,因?yàn)楫?dāng)按鍵按下之后,電源和地短接,會將導(dǎo)線直接燒毀。但是此處用作特例,假設(shè)導(dǎo)線不會燒毀?,F(xiàn)在來提出一個問題,當(dāng)按鍵按下以后,請問如果這時用萬用表測量導(dǎo)線上任何一處的電壓,得到的結(jié)果是VCC還是GND的電壓?答案是:GND,即表示測出的電壓為0V。為什么呢,因?yàn)閷?dǎo)線上,對于兩端的電平是一種類似于程序語言邏輯運(yùn)算里面的“與”,即對于導(dǎo)線兩端:有零即為零,只有全為一是才為一。理解了這點(diǎn),按鍵的工作前提就有了。鍵盤分為編碼鍵盤和非編碼鍵盤。鍵盤上閉合鍵的識別由專用的硬件編碼器實(shí)現(xiàn),并產(chǎn)生鍵編碼號或鍵值的稱為編碼鍵盤,如計(jì)算機(jī)鍵盤。而靠軟件編程來識別的鍵盤稱為非編碼鍵盤,在單片機(jī)組成的各種系統(tǒng)中,用的較多的是非編碼鍵盤。非編碼鍵盤又分為獨(dú)立鍵盤和行列式鍵盤(常說的矩陣鍵盤)。在這一講中我們介紹一下單片機(jī)中鍵盤使用。單片機(jī)的IO口既可作為輸出也可作為輸入使用,當(dāng)檢測按鍵時用的是它的輸入功能,我們把按鍵的一端接地,另一端與單片機(jī)的某個I/O口相連,開始時先給該IO口賦一高電平,然后讓單片機(jī)不斷地檢測該I/O口是杏變?yōu)榈碗娖?,?dāng)按鍵閉合時,即相當(dāng)于該I/O口通過按鍵與地相連,變成低電平,程序一旦檢測到I/O口變?yōu)榈碗娖絼t說明按鍵被按下,然后執(zhí)行相應(yīng)的指令。我們先來說一下,按鍵常常遇到的問題——抖動問題。還以圖四為例,按鍵未按下之前,圖四按鍵左端的導(dǎo)線因?yàn)檫B在VCC上而顯示高電平,右端顯示低電平,按鍵按下后,按鍵閉合,整個導(dǎo)線都顯示低電平,然后按鍵松開,又回到按鍵按下之前的點(diǎn)評狀態(tài)。如果只考察按鍵左端的電平變化,應(yīng)該是上圖中所顯示的一個負(fù)脈沖波形。但是,實(shí)際上,正確的波形應(yīng)該是下圖。相比于上圖,大家都看到了在高低電平直接有一段鋸齒一樣的波形,這就是所謂的按鍵抖動。為什么會有按鍵抖動呢,原因很簡單,接觸式按鍵是靠機(jī)械的接觸來實(shí)現(xiàn)開關(guān)作用的。這種接觸方式就注定了它要經(jīng)歷一個“接觸不穩(wěn)定——正在穩(wěn)定中——徹底穩(wěn)定”的一種過程。就好比你用手抓緊一顆石頭,即使你一開始就很用力的握緊,也不可能馬上就達(dá)到最緊的狀態(tài),也要經(jīng)歷一個從握住到最緊握的過程。那么在這個過程里,接觸式按鍵就處于一種徘徊在“閉合”與“斷開”兩者之間的狀態(tài)。體現(xiàn)在電路中,就是在一小段時間內(nèi)有非常多的“按下——抬起”動作。而這段抖動的時間,大概是10~20毫秒,依不同的環(huán)境條件而定。解決這個問題常見的方法有軟件去抖動和硬件去抖動。我們解釋一下抖動:關(guān)于按鍵去抖動的解釋,我們在手動按鍵的時候,由于機(jī)械抖動或是其它一些非人為的因素很有可能會造成誤識別,一般手動按下一次鍵然后接著釋放,按鍵兩片金屬膜接觸的時間大約為50ms左右,在按下瞬間到穩(wěn)定的時間為5-10ms,在松開的瞬間到穩(wěn)定的時間也為5-10ms,如果我們再首次檢測到鍵被按下后延時10ms左右再去檢測,這時如果是干擾信號將不會被檢測到,如果確實(shí)是有鍵被按下,則可確認(rèn),以上為按鍵識別去抖動的原理。1.1、實(shí)驗(yàn)?zāi)康?、掌握單片機(jī)P3口、P2口的輸入輸出使用。2、學(xué)習(xí)延時程序的編寫和使用。1.2、實(shí)驗(yàn)內(nèi)容1、原理(1)P3.0-P3.3口做輸入口,外接獨(dú)立按鍵。(2)P2口做輸出口,編寫程序,使P2口接的8個發(fā)光二極管D3…D16按下述指定方式點(diǎn)亮發(fā)光二極管。按下K1鍵,滅掉LED;按下K2鍵,打開所有的LED;按下K3鍵,LED左移一位;按下K4鍵,LED右移一位。2、原理圖LED燈原理圖如下:獨(dú)立按鍵電路圖如下:3、按鍵去抖獨(dú)立按鍵一共4個,分別連接在單片機(jī)的P3.0到P3.3口。去抖動的方式,我們采用軟件延時的方法。過程如下:(1)先設(shè)置IO口為高電平(一般上電默認(rèn)就為高)(2)讀取IO口電平確認(rèn)是否有按鍵按下(3)如有IO電平為低電平后,延時幾個ms(4)再讀取該IO電平,如果任然為低電平,說明對應(yīng)按鍵按下(5)執(zhí)行相應(yīng)按鍵的程序4、實(shí)驗(yàn)程序/***************************************************************************實(shí)驗(yàn)名 :獨(dú)立按鍵實(shí)驗(yàn)*使用的IO :LED使用P2,鍵盤使用P3.0、P3.1、P3.2、P3.3*實(shí)驗(yàn)效果:按下K1鍵,滅掉LED,按下K2鍵,打開所有的LED,按下K3鍵,LED左移一位,按下K4鍵,LED右移一位。* 注意 :由于P3.2口跟紅外線共用,所以做按鍵實(shí)驗(yàn)時為了不讓紅外線影響實(shí)驗(yàn)*效果,最好把紅外線先取下來。**************************************************************************/#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)是全亮的或者全滅的,就點(diǎn)亮他的第一盞燈 { 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--);}下載獨(dú)立按鍵控制led燈.hex,觀察實(shí)驗(yàn)結(jié)果。實(shí)驗(yàn)效果是:按下K1鍵,滅掉LED,按下K2鍵,打開所有的LED,按下K3鍵,LED左移一位,按下K4鍵,LED右移一位。二、中斷中斷是為使單片機(jī)具有對外部或內(nèi)部隨機(jī)發(fā)生的事件實(shí)時處理而設(shè)置的,中斷功能的存在,很大程度上提高了單片機(jī)處理外部或內(nèi)部事件的能力。它也是單片機(jī)最重要的功能之一,是我們學(xué)習(xí)單片機(jī)必須要掌握的。很多初學(xué)者被困在中斷中,學(xué)了很久仍然不知道中斷究竟是個什么東西,大家千萬不要認(rèn)為它有多難,其實(shí)只要掌握正確的學(xué)習(xí)方法,沒有哪個知識點(diǎn)是學(xué)不會的。為了能讓大家更容易理解中斷概念,我們先來舉一個生活事例:你打開火,燒上一壺水。然后去洗衣服,在洗衣服的過程中,突然聽到水壺發(fā)出水開的報警聲,這時,你停止洗衣服動作,立即去關(guān)掉火,然后將開水灌入暖水瓶中,灌完開水后,你又回去繼續(xù)洗衣服。這個過程中實(shí)際上就發(fā)生了一次中斷。對于單片機(jī)來講,中斷是指CPU在處理某一事件A時,發(fā)生了另一事件B,請求CPU迅速去處理(中斷發(fā)生);CPU暫時停止當(dāng)前的工作(中斷響應(yīng)),轉(zhuǎn)去處理事件B(中斷服務(wù));待CPU將事件I.,處理完畢后,再回到原來事件A被中斷的地方繼續(xù)處理事件A(中斷返回),這一過程稱為中斷。生活中的實(shí)例單片機(jī)處理中斷的過程再回來看前面講的生活事例,與單片機(jī)中斷結(jié)合分析,你的主任務(wù)是洗衣服,水開報警這是一個中斷請求,這一時刻相當(dāng)于斷點(diǎn)處,你響應(yīng)中斷去關(guān)火,然后將開水灌入暖水瓶中,這一動作實(shí)際上就是處理中斷程序,灌完開水后再回去繼續(xù)洗衣服,相當(dāng)于處理完中斷程序后再返回主程序繼續(xù)執(zhí)行主程序。這里需要注意的是,水開是隨時都有可能的,但是無論什么時候開,只要一開你將立即去處理它,處理完后再回來繼續(xù)接著洗剛才那件衣服。單片機(jī)在執(zhí)行程序時,中斷也隨時有可能發(fā)生,但無論何時發(fā)生,只要一旦發(fā)生,單片機(jī)將立即暫停當(dāng)前程序,趕去處理中斷程序,處理完中斷程序后再返回剛才暫停處接著執(zhí)行原來的程序。單片機(jī)在執(zhí)行程序時其程序流程圖。引起CPU中斷的根源,稱為中斷源,中斷源向CPU提出中斷請求,CPU暫時中斷原來的事務(wù)A,轉(zhuǎn)去處理事件B,對事件B處理完畢后,再回到原來被中斷的地方(即斷點(diǎn)),稱為中斷返回。實(shí)現(xiàn)上述中斷功能的部件稱為中斷系統(tǒng)(中斷機(jī)構(gòu))。中斷的開啟與關(guān)閉、設(shè)置啟用哪一個中斷等都是由單片機(jī)內(nèi)部的一些特殊功能寄存器來決定的,在以前的學(xué)習(xí)中我們僅對單片機(jī)內(nèi)部的特殊功能寄存器IO口寄存器設(shè)置過,從下節(jié)起我們將會設(shè)置單片機(jī)內(nèi)部更多的特殊功能寄存器。當(dāng)中央處理機(jī)CPU正在處理某件事的時候外界發(fā)生了緊急事件請求,要求CPU暫停當(dāng)前的工作,轉(zhuǎn)而去處理這個緊急事件,處理完以后,再回到原來被中斷的地方,繼續(xù)原來的工作,這樣的過程稱為中斷。實(shí)現(xiàn)這種功能的部件稱為中斷系統(tǒng),請示CPU中斷的請求源稱為中斷源。微型機(jī)的中斷系統(tǒng)一般允許多個中斷源,當(dāng)兒個中斷源同時向CPU請求中斷,要求為它服務(wù)的時候,這就存在CPU優(yōu)先響應(yīng)哪一個中斷源請求的問題。通常根據(jù)中斷源的輕重緩急排隊(duì),優(yōu)先處理最緊急事件的中斷請求源,即規(guī)定每一個中斷源有一個優(yōu)先級別。CPU總是先響應(yīng)優(yōu)先級別最高的中斷請求。當(dāng)CPU正在處理一個中斷源請求的時候(執(zhí)行相應(yīng)的中斷服務(wù)程序),發(fā)生了另外一個優(yōu)先級比它還高的中斷源請求。如果CPU能夠暫停對原來中斷源的服務(wù)程序,轉(zhuǎn)而去處理優(yōu)先級更高的中斷請求源,處理完以后,再回到原低級中斷服務(wù)程序,這樣的過程稱為中斷嵌套。這樣的中斷系統(tǒng)稱為多級中斷系統(tǒng),沒有中斷嵌套功能的中斷系統(tǒng)稱為單級中斷系統(tǒng)。STC90C51RC/RD+系列單片機(jī)提供了8個中斷請求源,它們分別是:外部中斷O(INTO),定時器。中斷、外部中斷1(INT1)、定時器1中斷、定時器2中斷、串口(UART)中斷、外部中斷2(INT2)、外部中斷3(INT3)。所有的中斷都具有4個中斷優(yōu)先級。用戶可以用關(guān)總中斷允許位(EA/IE.7)或相應(yīng)中斷的允許位來屏蔽所有的中斷請求,也可以用打開相應(yīng)的中斷允許位來使CPU響應(yīng)相應(yīng)的中斷申請;、每二個中斷源可以用軟件獨(dú)立地控制為開中斷或關(guān)中斷狀態(tài);每一個中斷的優(yōu)先級別均可用軟件設(shè)置。高優(yōu)先級的中斷請求可以打斷低優(yōu)先級的中斷,反之,低優(yōu)先級的中斷請求不可以打斷高優(yōu)先級及同優(yōu)先級的中斷。當(dāng)兩個相同優(yōu)先級的中斷同時產(chǎn)生時,將由查詢次序來決定系統(tǒng)先響應(yīng)哪個中斷。STC90C51RC/RD+系列單片機(jī)的各個中斷查詢次序表如下圖所示。通過設(shè)置新增加的特殊功能寄存器IPH中的相應(yīng)位,可將中斷優(yōu)先級設(shè)為四級,如果只設(shè)置IP或XICON,那么中斷優(yōu)先級就只有兩級,與傳統(tǒng)8051單片機(jī)兩級中斷優(yōu)先級完全兼容。如果使用C語言編程,,中斷查詢次序號就是中斷號,例如:voidInto_Routine(void)interrupt0;voidTimerO_Rountine(void)interrupt1;voidIntl_Routine(void)interrupt2;voidTimer1_Rountine(void)interrupt3;voidUART_Routine(void)interrupt4;voidTimer2_Routine(void)interrupt5;voidInt2_Routine(void)interrupt6;voidInt3_Routine(void)interrupt7;中斷觸發(fā)表如下圖所示打開下面看一個程序:/********************************************************************************實(shí)驗(yàn)名 :動態(tài)顯示數(shù)碼管實(shí)驗(yàn)*使用的IO :數(shù)碼管使用P0,P2.2,P2.3,P2.4鍵盤使用P1*實(shí)驗(yàn)效果:按矩陣鍵盤分別顯示在數(shù)碼管上面顯示十六進(jìn)制的0到F。*注意 :*******************************************************************************/#include<reg51.h>//#include<intrins.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ù)的值unsignedcharNum;//用來存放中斷的時候顯示的第位數(shù)值voidDelay50us();//延時50usvoidKeyDown(); //檢測按鍵函數(shù)voidDigDisplay();//動態(tài)顯示函數(shù)voidTimerConfiguration();//定時器初始化設(shè)置/********************************************************************************函數(shù)名:main*函數(shù)功能 :主函數(shù)*輸入:無*輸出:無*******************************************************************************/voidmain(void){ TimerConfiguration(); KeyState=0; //初始化按鍵狀態(tài) 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ù)名:TimerConfiguration*函數(shù)功能 :定時器初始化*輸入:無*輸出:無*******************************************************************************/voidTimerConfiguration(){ TMOD=0X02;//選擇為定時器0模式,工作方式2,僅用TRX打開啟動。 TH0=0X9C; //給定時器賦初值,定時100us TL0=0X9C; ET0=1;//打開定時器0中斷允許 EA=1;//打開總中斷 TR0=1;//打開定時器 }/********************************************************************************函數(shù)名:DigDisplay*函數(shù)功能 :使用數(shù)碼管顯示*輸入:無*輸出:無*******************************************************************************/voidDigDisplay(){ unsignedchari,j;// for(i=0;i<8;i++)// { GPIO_DIG=0x00;//消隱 switch(i) //位選,選擇點(diǎn)亮的數(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]; i++; if(i>7) i=0;// j=10; //掃描間隔時間設(shè)定// while(j--)// Delay50us(); // GPIO_DIG=0x00;//消隱// }}/********************************************************************************函數(shù)名:KeyDown*函數(shù)功能 :檢測有按鍵按下并讀取鍵值*輸入:無*輸出:無*******************************************************************************/voidKeyDown(void){ unsignedinta=0; GPIO_KEY=0x0f; if(GPIO_KEY!=0x0f){ Delay50us(); a++; a=0; if(GPIO_KEY!=0x0f) { ET0=0;//關(guān)定時器中斷 KeyState=1;//有按鍵按下 //測試列 GPIO_KEY=0X0F;// Delay50us(); 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; Delay50us(); 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; } ET0=1;//開定時器中斷 while((a<5000)&&(GPIO_KEY!=0xf0)) //檢測按鍵松手檢測 { Delay50us(); a++; } a=0; } }}/********************************************************************************函數(shù)名:Delay50us*函數(shù)功能 :延時函數(shù),延時50us*輸入:無*輸出:無*******************************************************************************/voidDelay50us(void)//延時50us誤差0us{unsignedchara,b;for(b=1;b>0;b--)for(a=22;a>0;a--);}/********************************************************************************函數(shù)名:Delay50us*函數(shù)功能 :延時函數(shù),延時50us*輸入:無*輸出:無*******************************************************************************/voidTimer()interrupt1{ DigDisplay(); }實(shí)驗(yàn)五PROTEUS仿真軟件的使用一、實(shí)驗(yàn)?zāi)康?/p>
1.了解proteus的特點(diǎn),熟悉其安裝
2.
熟悉proteus在電子線路設(shè)計(jì)中的仿真過程
3.
掌握proteus的基本操作
4、掌握發(fā)光二極管的控制方法二、實(shí)驗(yàn)工具
計(jì)算機(jī)
、
proteus7.5三、實(shí)驗(yàn)學(xué)時:2五、實(shí)驗(yàn)?zāi)康?1、熟悉PROTEUS單片機(jī)仿真軟件的使用方法。2、掌握利用PROTEUS軟件進(jìn)行單片機(jī)系統(tǒng)設(shè)計(jì)與仿真的過程。六、預(yù)備知識1、PROTEUS簡介PROTEUS是英國LabcenterElectronics公司研發(fā)的多功能EDA軟件。它不僅是模擬電路、數(shù)字電路、模/數(shù)混合電路的設(shè)計(jì)與仿真平臺,更是目前世界上最先進(jìn)的單片機(jī)和嵌入式系統(tǒng)的設(shè)計(jì)與仿真平臺。它真正實(shí)現(xiàn)了在計(jì)算機(jī)上完成從原理圖與電路設(shè)計(jì)、電路分析與仿真、單片機(jī)代碼級調(diào)試與仿真、系統(tǒng)測試與功能驗(yàn)證到形成PCB的完整的電子設(shè)計(jì)、研發(fā)過程。在目標(biāo)板還沒投產(chǎn)前,就可以對設(shè)計(jì)的硬件系統(tǒng)的功能、合理性和性能指標(biāo)進(jìn)行充分調(diào)整,并可以在沒有目標(biāo)板的情況下,進(jìn)行相應(yīng)軟件的開發(fā)和調(diào)試,進(jìn)行完全的虛擬開發(fā),明顯提高企業(yè)的開發(fā)效率,降低開發(fā)風(fēng)險。2、ISIS窗口3、單片機(jī)系統(tǒng)的PROTEUS設(shè)計(jì)與仿真的開發(fā)過程(1)、在ISIS平臺上進(jìn)行單片機(jī)系統(tǒng)電路設(shè)計(jì)、選擇元器件、接插件、連接電路和電氣檢測等。(電路設(shè)計(jì))(2)、在WAVE或KEIL平臺上進(jìn)行單片機(jī)系統(tǒng)的程序設(shè)計(jì)、編輯、編譯、調(diào)試,最后生成目標(biāo)代碼(.HEX)。(軟件設(shè)計(jì),實(shí)際上也可以在ISIS平臺上進(jìn)行此項(xiàng)工作)(3)、在ISIS平臺上將目標(biāo)代碼文件加載到單片機(jī)系統(tǒng)中,并實(shí)現(xiàn)單片機(jī)系統(tǒng)的實(shí)時交互、協(xié)同仿真。它在相當(dāng)程度上反映了實(shí)際單片機(jī)系統(tǒng)的運(yùn)行情況。(仿真)PROTEUS電路設(shè)計(jì)流程和PROTEUS設(shè)計(jì)與仿真流程分別如圖1-1(a)、圖1-1(b)所示。新建設(shè)計(jì)文件新建設(shè)計(jì)文件選擇元器件放置元器件、電源和地電路布線元器件屬性設(shè)置電氣檢測PROTEUS電路設(shè)計(jì)PROTEUS仿真源程序設(shè)計(jì)、編輯生成目標(biāo)代碼文件加載目標(biāo)代碼設(shè)置時鐘頻率圖1-1(a)PROTEUS電路設(shè)計(jì)流程圖1-1(b)PROTEUS設(shè)計(jì)與仿真流程4、鼠標(biāo)操作特點(diǎn)(1)、放置對象:單擊鼠標(biāo)左鍵(簡稱單擊),放置元器件、連線。(2)、選中對象:單擊鼠標(biāo)右鍵(簡稱右擊),選擇元器件、連線和其他對象,此時選中的操作對象以高亮紅色(默認(rèn)色)顯示。(3)、刪除對象:雙擊鼠標(biāo)右鍵(簡稱右雙擊),刪除元器件、連線等。(4)、塊選擇:按住鼠標(biāo)右鍵拖出方框,選中方框中的多個元器件及其連線。(5)、編輯對象:先單擊鼠標(biāo)右鍵后單擊鼠標(biāo)左鍵,編輯元器件屬性。(6)、移動對象:先右單擊選中對象,按住鼠標(biāo)左鍵移動,拖動元器件、連線。(7)、縮放對象:按住鼠標(biāo)中鍵滾動,以鼠標(biāo)停留點(diǎn)為中心,縮放電路。七、實(shí)驗(yàn)內(nèi)容:1、如圖1-2所示,LED發(fā)光二極管的初始狀態(tài)為亮,用PROTEUS仿真實(shí)現(xiàn):按一下接鍵,LED滅,再按一下,LED亮,按此規(guī)律LED亮滅交替。要求在PROTEUS中畫出電原理圖,加載給出的程序目標(biāo)文件(.HEX)后,仿真實(shí)現(xiàn)題目。圖1圖1-2實(shí)驗(yàn)原理圖實(shí)驗(yàn)具體步驟如下:(1)、啟動ISIS環(huán)境:開始—程序—Proteus7professional—ISIS7professional。(2)、新建設(shè)計(jì)文件單擊“文件---新建文件”,出現(xiàn)選擇模板窗口,選中模板“DETAULT”,再單擊“OK”。(3)、設(shè)定繪圖紙大小當(dāng)前的用戶圖紙大小默認(rèn)A4,可以通過“系統(tǒng)---設(shè)置圖紙尺寸”來更改圖紙的大小。(4)、選取元器件并添加到對象選擇器中單擊圖1-3(a)中的“P” 按鈕,彈出如圖1-3(b)所示的選取元器件對話框,在“Keywords(關(guān)鍵字)”一欄中輸入元器件名稱“AT89C51”,則出現(xiàn)與關(guān)鍵字匹配的元器件列表。選中(單擊)AT89C51所在的行后,再單擊“OK”按鈕,便將器件AT89C51加入到ISIS對象選擇器中。同時將相關(guān)的元器件都添入,如圖1-圖1-圖1-3(a)單擊“P”按鈕圖1-3(b)元器件列表圖1-3(c)元器件都添入
(5)、網(wǎng)格單位網(wǎng)格單位默認(rèn)是100th,這也是移運(yùn)元器件的步長單位,可以根據(jù)需要更改這一單位。方法是單擊“查看”再單擊所要的網(wǎng)格單位即可。(6)、放置、移動、旋轉(zhuǎn)元器件單擊ISIS對象選擇器中的元器件名,藍(lán)色條出現(xiàn)在該元器件名上。把鼠標(biāo)移至編輯區(qū)某位置后,單擊就可放置元器件于該位置,每單擊一次就放一個元器件。要選中編輯區(qū)中的某一元器件,只要單擊該器件即可。要移動元器件可選中該器件后,再按住鼠標(biāo)左鍵拖動到目的位置即可。旋轉(zhuǎn)元器件可先右擊元器件,再根據(jù)需要選擇菜單進(jìn)行操作。(7)、放置電源、地(終端)單擊模式選擇工具欄中的終端按鈕,則ISIS對象選擇器如圖1-4(a)所示。根據(jù)需要選擇即可。(8)、電路圖布線系統(tǒng)默認(rèn)自動布線有效,即按鈕被按下。在這種方式下,只要相繼單擊元器件引腳間、線間等要連線的兩處(起點(diǎn)和終點(diǎn)),系統(tǒng)會自動生成連線。(9)、設(shè)置、修改元器件的屬性右擊放置在編輯區(qū)中的元器件(呈高亮度)后,再單擊它即可打開其屬性窗口,這時可在屬性窗口中設(shè)置、修改元器件的屬性。如圖1-4(b)所示。圖1-圖1-4(a)終端符號圖1-4(b)設(shè)置、修改元器件的屬性(10)、電氣檢測(有時可先不做)設(shè)計(jì)電路完成后,單擊電氣檢查按鈕,會出現(xiàn)檢查結(jié)果窗口,前面是一些文本信息,接著是檢查結(jié)果列表,若有錯,會有詳細(xì)的說明。(11)、源程序的設(shè)計(jì)、編輯和目標(biāo)代碼的生成源程序的設(shè)計(jì)、編輯和目標(biāo)代碼(.HEX)的生成,可以通過WAVE軟件來實(shí)現(xiàn)的,PROTEUS只要用.HEX文件。(12)、加載目標(biāo)代碼和設(shè)置時鐘頻率先右擊ISIS編輯區(qū)中的AT89C51單片機(jī),然后再單擊它即可打開它的屬性窗口,直接雙擊單片機(jī)也可打開它的屬性窗口,在窗口中的“programefile”右側(cè)框中輸入或找到.HEX文件所在的路徑。如圖1-4所示。同理在屬性窗口的“clockfrequency”中輸入或更改單片機(jī)的工作頻率。如圖1-5所示。由于仿真時是以該時鐘頻率為準(zhǔn)的,所以在編輯區(qū)設(shè)計(jì)時可以略去單片機(jī)振蕩電路,另外,對MCS-51系列單片機(jī)而言,復(fù)位電路也可以略去,EA控制引腳也可懸空。但要注意若要進(jìn)行電路電氣檢測,則這些不可略去。圖1-圖1-5加載目標(biāo)代碼和設(shè)置時鐘頻率(13)、單片機(jī)系統(tǒng)的PROTEUS交互仿真為與仿真相關(guān)的控制按鈕,單擊第一個仿真按鈕則處于全帶仿真狀態(tài),些時LED亮,可用鼠標(biāo)單擊ISIS編輯區(qū)中的按鈕,實(shí)現(xiàn)交互仿真。單擊一次按鈕LED暗,再次單擊,LED亮,如些循環(huán),LED亮滅交替。若單擊最后一個仿真按鈕,則終止仿真。(14)、若達(dá)不到要求應(yīng)檢查電路和編程是否正確。2、在PROTEUS中畫出開關(guān)控制數(shù)碼管實(shí)驗(yàn)的電路原理圖,如圖1-6所示。加載給出的程序目標(biāo)文件(.HEX)后,仿真實(shí)現(xiàn)將4位開關(guān)狀態(tài)輸出到數(shù)碼管顯示。實(shí)驗(yàn)用元器件清單提示:(1)、AT89C51---單片機(jī)(2)、RES、RESPACK-8---電阻、帶公共端的8排阻(RX8---8排阻)(3)、7SEG-COM-AN-GRN---帶公共端的共陽七段綠色數(shù)碼管(4)、SW-SPST---帶鎖存的單刀單擲開關(guān)(5)、CAP、CAP-ELEC---電容、電解電容(6)、CRYSTAL---晶振八、寫出實(shí)驗(yàn)小結(jié),內(nèi)容包括實(shí)驗(yàn)心得(收獲)、不足之處和今后應(yīng)注意的問題。圖1-圖1-6開關(guān)控制數(shù)碼管實(shí)驗(yàn)電原理圖實(shí)驗(yàn)六-1定時器定時器的原理加1計(jì)數(shù)器輸入的計(jì)數(shù)脈沖有兩個來源,一個是由系統(tǒng)的時鐘振蕩器輸出脈沖經(jīng)12分頻后送來;一個是T0或T1引腳輸入的外部脈沖源。每來一個脈沖計(jì)數(shù)器加1,當(dāng)加到計(jì)數(shù)器為全1時,再輸入一個脈沖就使計(jì)數(shù)器回零,且計(jì)數(shù)器的溢出使TCON中TF0或TF1置1,向CPU發(fā)出中斷請求(定時/計(jì)數(shù)器中斷允許時)。如果定時/計(jì)數(shù)器工作于定時模式,則表示定時時間已到;如果工作于計(jì)數(shù)模式,則表示計(jì)數(shù)值已滿??梢?,由溢出時計(jì)數(shù)器的值減去計(jì)數(shù)初值才是加1計(jì)數(shù)器的計(jì)數(shù)值。51定時器 80c51單片機(jī)內(nèi)有兩個可編程的定時/計(jì)數(shù)器T0、T1。定時/計(jì)數(shù)器的實(shí)質(zhì)是加1計(jì)數(shù)器(16位),由高8位和低8位兩個寄存器組成。TMOD是定時/計(jì)數(shù)器的工作方式寄存器,確定工作方式和功能;TCON是控制寄存器,控制T0、T1的啟動和停止及設(shè)置溢出標(biāo)志。工作方式0方式0為13位計(jì)數(shù),由TL0的低5位(高3位未用)和TH0的8位組成。TL0的低5位溢出時向TH0進(jìn)位,TH0溢出時,置位TCON中的TF0標(biāo)志,向CPU發(fā)出中斷請求。工作方式1方式1的計(jì)數(shù)位數(shù)是16位,由TL0作為低8位、TH0作為高8位,組成了16位加1計(jì)數(shù)器。工作方式2方式2為自動重裝初值的8位計(jì)數(shù)方式。工作方式2特別適合于用作較精確的脈沖信號發(fā)生器。工作方式3方式3只適用于定時/計(jì)數(shù)器T0,定時器T1處于方式3時相當(dāng)于TR1=0,停止計(jì)數(shù)。工作方式3將T0分成為兩個獨(dú)立的8位計(jì)數(shù)器TL0和TH0。/********************************************************************************實(shí)驗(yàn)名 :定時器實(shí)驗(yàn)*使用的IO :*實(shí)驗(yàn)效果** 注意 :*******************************************************************************/#include<reg51.h> #include"lcd.h"sbitK1=P3^0;sbitK2=P3^1;sbitK3=P3^2;sbitK4=P3^3;unsignedcharTime;//用來計(jì)時間的值voidDelay1ms(unsignedintc);voidTimerConfiguration();voidInt0Configuration();/********************************************************************************函數(shù)名:main*函數(shù)功能 :主函數(shù)*輸入:無*輸出:無*******************************************************************************/voidmain(void){ unsignedcharhour,minit,second; unsignedinti; TimerConfiguration(); Int0Configuration();}/********************************************************************************函數(shù)名:TimerConfiguration()*函數(shù)功能 :配置定時器值*輸入:無*輸出:無*******************************************************************************/ voidTimerConfiguration(){TMOD=0x01;//選擇工作方式1TH0=0x3C; //設(shè)置初始值TL0=0x0B0;EA=1; //打開總中斷ET0=1; //打開定時器0中斷TR0=1; //啟動定時器0While(1){}}/********************************************************************************函數(shù)名:Timer0()*函數(shù)功能 :定時器0中斷函數(shù)*輸入:無*輸出:無*******************************************************************************/ voidTimer0()interrupt1{ TH0=0x3C; //設(shè)置初始值TL0=0x0B0; ;}/********************************************************************************函數(shù)名:Int0Configuration()*函數(shù)功能 :配置外部中斷0*輸入:無*輸出:無*******************************************************************************/ voidInt0Configuration(){ //設(shè)置INT0 IT0=1;//跳變沿出發(fā)方式(下降沿) EX0=1;//打開INT0的中斷允許。 EA=1;//打開總中斷 }/********************************************************************************函數(shù)名:Int0()interrupt0*函數(shù)功能 :外部中斷0的中斷函數(shù)*輸入:無*輸出:無*******************************************************************************/ voidInt0()interrupt0 { Delay1ms(10); if(K3==0) { TR0=~TR0; SetPlace=0; }}實(shí)驗(yàn)六-2串口通信隨著單片機(jī)系統(tǒng)的廣泛應(yīng)用和計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)的普及,單片機(jī)的通信功能愈來愈顯得重要。單片機(jī)通信是指單片機(jī)與計(jì)算機(jī)或單片機(jī)與單片機(jī)之間的信息交換,通常單片機(jī)與計(jì)算機(jī)之間的通信我們用的較多。通信有并行和串行兩種方式。在單片機(jī)系統(tǒng)以及現(xiàn)代單片機(jī)測控系統(tǒng)中,信息的交換多采用串行通信方式。串行通信方式串行通信是將數(shù)據(jù)字節(jié)分成一位一位的形式在一條傳輸線上逐個地傳送,此時只需要一條數(shù)據(jù)線,外加一條公共信號地線和若干控制信號線。因?yàn)橐淮沃荒軅魉鸵晃唬詫τ谝粋€字節(jié)的數(shù)據(jù),至少要分S位才能傳送完畢。串行通信的必要過程是:發(fā)送時,要把并行數(shù)據(jù)變成串行數(shù)據(jù)發(fā)送到線路上去,接收時,要把串行信號再變成并行數(shù)據(jù),這樣才能被計(jì)算機(jī)及其他設(shè)備處理。串行通信傳輸線少,長距離傳送時成本低,且可以利用電話網(wǎng)等現(xiàn)成的設(shè)備,但數(shù)據(jù)的傳送控制比并行通信復(fù)雜。串行通信又有兩種方式:異步串行通信和同步串行通信。異步串行通信方式異步串行通信是指通信的發(fā)送與接收設(shè)備使用各自的時鐘控制數(shù)據(jù)的發(fā)送和接收過程。為使雙方收、發(fā)協(xié)調(diào),要求發(fā)送和接收設(shè)備的時鐘盡可能一致,異步通信是以字符(構(gòu)成的幀)為單位進(jìn)行傳輸,字符與字符之間的間隙(時間間隔)是任意的,但侮個字符中的各位是以固定的時間傳送的,即字符之間不一定有“位間隔”的整數(shù)倍關(guān)系,但同一字符內(nèi)的各位之間的距離均為“位間隔”的整數(shù)倍。異步通信一幀字符信息由4部分組成:起始位、數(shù)據(jù)位、奇偶校驗(yàn)位和停止位,如下圖所示。有的字符信息也有帶空閑位形式,即在字符之間有空閑字符。異步通信的特點(diǎn):不要求收發(fā)雙方時鐘的嚴(yán)格一致,實(shí)現(xiàn)容易,設(shè)備開銷較小,但每個字符要附加2-3位,用于起止位、校驗(yàn)位和停止位,各幀之間還有間隔,因此傳輸效率不高。在單片機(jī)與單片機(jī)之間,單片機(jī)與計(jì)算機(jī)之間通信時,通常采用異步串行通信方式。同步串行通信方式同步通信時要建立發(fā)送方時鐘對接收方時鐘的直接控制,使雙方達(dá)到完全同步。此時,傳輸數(shù)據(jù)的位之間的距離均為“位間隔”的整數(shù)倍,同時傳送的字符間不留間隙,即保持位同步關(guān)系,也保持字符同步關(guān)系。發(fā)送方對接收方的同步可以通過外同步和自同步兩種方法實(shí)現(xiàn)。串行通信的制式(1)單工。單工是指數(shù)據(jù)傳輸僅能沿一個方向,不能實(shí)現(xiàn)反向傳輸。(2)半雙工。半雙工是指數(shù)據(jù)傳輸可以沿兩個方向,但需要分時進(jìn)行。(3)全雙工。全雙工是指數(shù)據(jù)可以同時進(jìn)行雙向傳輸。串行通信的錯誤校驗(yàn)(1)奇偶校驗(yàn)在發(fā)送數(shù)據(jù)時,數(shù)據(jù)位
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 針對外來承包商培訓(xùn)課件
- 肱骨骨折患者康復(fù)期康復(fù)心理支持
- 肱骨骨折患者康復(fù)期并發(fā)癥預(yù)防
- 六下總復(fù)習(xí)《數(shù)的運(yùn)算》教學(xué)設(shè)計(jì)
- 車間培訓(xùn)課件計(jì)劃表格
- 藥理學(xué)入門:時間依賴性抗菌藥課件
- 整體理論在盆底障礙性疾病診治中的應(yīng)用
- 胃腸減壓的護(hù)理應(yīng)急預(yù)案
- 2025-2030中國球衣市場銷售渠道與發(fā)展前景趨勢預(yù)測分析研究報告
- 公司租賃個人車輛使用制度
- 團(tuán)隊(duì)建設(shè)與協(xié)作能力提升工作坊指南
- 2025成人腸造口護(hù)理指南課件
- 電焊工安全宣講課件
- 水泵基礎(chǔ)知識培訓(xùn)課件教學(xué)
- 內(nèi)鏡院感培訓(xùn)課件
- 2026中征(北京)征信有限責(zé)任公司招聘13人考試題庫附答案
- 期末重點(diǎn)易錯知識點(diǎn)復(fù)習(xí)(課件)-2025-2026學(xué)年一年級上冊數(shù)學(xué)北師大版
- 醫(yī)療資源合理分配
- 2026年楊凌職業(yè)技術(shù)學(xué)院單招職業(yè)技能考試題庫含答案詳解
- 2025云南昆明元朔建設(shè)發(fā)展有限公司第二批收費(fèi)員招聘9人筆試考試參考題庫及答案解析
- 國開本科《國際法》期末真題及答案2025年
評論
0/150
提交評論