七天學(xué)會單片機(jī).doc_第1頁
七天學(xué)會單片機(jī).doc_第2頁
七天學(xué)會單片機(jī).doc_第3頁
七天學(xué)會單片機(jī).doc_第4頁
七天學(xué)會單片機(jī).doc_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第一天 認(rèn)識單片機(jī)一、什么是單片機(jī) 什么是單片機(jī)?按照比較正規(guī)的定義,所謂單片機(jī),就是把中央處理器、存儲器、定時器、I/O接口等一些計算機(jī)功能部件集成在一塊電路芯片上的微型計算機(jī)。什么又是中央處理器、存儲器、定時器和I/O接口呢?簡單來說,中央處理器就是所謂的CPU,就相當(dāng)于人的大腦。存儲器顧名思義就是一種能存儲數(shù)據(jù)的元件,比如我們寫的程序就可以存放在這里面。I/O接口就是輸入/輸出端口,數(shù)據(jù)可以通過這樣的端口輸入或輸出CPU。我們把這些東西整合到一塊很小的芯片上,就成為了單片機(jī)。二、單片機(jī)可以做什么單片機(jī)用來干什么呢?用最通俗的話講,它的作用就是實(shí)現(xiàn)智能控制。什么是智能控制呢?舉個簡單的例子,讓單片機(jī)按照我自己的想法來控制一個發(fā)光二極管的亮滅就是智能控制,那么我如何來做到呢?我將發(fā)光二極管的正極分別連在單片機(jī)一個引腳上,當(dāng)連正極的引腳輸出高電平(可以暫時理解為高電壓),連負(fù)極的引腳輸出低電平(同上,低電壓)時,由于二極管兩端電壓差,因此二極管點(diǎn)亮,當(dāng)兩個引腳都是相同電壓,發(fā)光二極管熄滅。單片機(jī)如何知道我希望二極管什么時候點(diǎn)亮,亮多久呢?這就需要我們將自己的意愿通過編寫程序下載進(jìn)入單片機(jī)中進(jìn)行執(zhí)行,讓它按照我們的意愿在引腳輸出高低電平,從而控制發(fā)光二極管的亮滅。三、單片機(jī)結(jié)構(gòu)單片機(jī)長什么樣?如圖所示就是一個單片機(jī)的外形,我們可以看到,單片機(jī)不過就是一塊有很多腳的芯片,我們稱這些“腳”叫做“引腳”。單片機(jī)就是通過這些引腳對外界進(jìn)行智能控制的。圖1- 1我們學(xué)習(xí)單片機(jī),首先要知道這些引腳的作用是什么,如圖所示,讓我們一起來認(rèn)識這些引腳。1、區(qū)分芯片引腳序號我們可以在單片機(jī)表面上找到一個凹進(jìn)去的小圓坑,這個小圓坑所對應(yīng)的引腳就是第1引腳,然后按逆時針方向數(shù)下去,一直到最后一個引腳。如圖所示一共有40個引腳。2、 電源引腳和時鐘引腳圖中第20腳GND和第40腳Vcc為電源引腳,給單片機(jī)供電。第18腳和19腳為時鐘引腳,大家可以暫時不用了解。3、I/O口引腳圖1- 2 四、學(xué)習(xí)單片機(jī)必備基礎(chǔ)知識1、電平的概念什么是電平?“電平”就是指電路中兩點(diǎn)在相同阻抗(“阻抗”可以理解為電阻)下電量的相對比值。舉個例子,人們在初學(xué)“電”的時候,往往把往往把抽象的電學(xué)概念用水的具體現(xiàn)象進(jìn)行比喻。如水流比電流、水壓似電壓。解釋“電平”不妨如法炮制。我們用“水平”來比喻“電平”如人們常說到張某工作很有水平、李某辦事水平很差。這樣的話都知其含義所在。即指“張某”與“李某”相比而言。電平就是指電路中兩點(diǎn)電量(“電量”可理解為電壓)的比較。學(xué)習(xí)單片機(jī)只需了解兩種電平:高電平和低電平,我們定義單片機(jī)輸入與輸出的為TTL電平,其中高電平為+5V,低電平為0V。什么是TTL電平?TTL電平采用二進(jìn)制規(guī)定,+5V等價于邏輯“1”,0V等價于邏輯“0”。這樣一來,我們在編寫程序中如果對某個引腳賦值為“1”那個引腳就輸出高電平,同理,若我們賦值為“0”,對應(yīng)的引腳就輸出低電平。2、二進(jìn)制與十六進(jìn)制 邏輯運(yùn)算大家都知道,十進(jìn)制的特點(diǎn)是“逢十進(jìn)一,借一當(dāng)十”。同理,二進(jìn)制的特點(diǎn)就是“逢二進(jìn)一,借一當(dāng)二”。在二進(jìn)制中只有“0”和“1”,比如1110 0101B(“B”為二進(jìn)制后綴)就是二進(jìn)制。那么,二進(jìn)制和十進(jìn)制如何轉(zhuǎn)化呢?舉個例子,二進(jìn)制11010011B轉(zhuǎn)化為十進(jìn)制就是 十六進(jìn)制與二進(jìn)制大同小異,十六進(jìn)制為“逢十六進(jìn)一,借一當(dāng)十六”。十進(jìn)制中0-15用十六進(jìn)制表示為0-9,A,B,C,D,E,F,即十進(jìn)制中10對應(yīng)十六進(jìn)制A,11對應(yīng)B當(dāng)我們寫的是十六進(jìn)制時,要在前面加上0x(注意0是“零”不是字母O),舉個例子,十六進(jìn)制0x7f換算成二進(jìn)制為“0111 1111”換算成十進(jìn)制為715十進(jìn)制二進(jìn)制十六進(jìn)制十進(jìn)制二進(jìn)制十六進(jìn)制0008100081119100192102101010A3113111011B41004121100C51015131101D61106141110E71117151111F表1- 1邏輯運(yùn)算“與”運(yùn)算是實(shí)現(xiàn)“必須都有,否則就沒有”這種邏輯關(guān)系的運(yùn)算,其運(yùn)算符為“&”,運(yùn)算規(guī)則為:0&0=0,0&1=1&0=0,1&1=1. “或”運(yùn)算是實(shí)現(xiàn)“只要其中之一有就有”這種邏輯關(guān)系的運(yùn)算,其運(yùn)算符為“|”,運(yùn)算規(guī)則為:0|0=0,0|1=1|0=1,1|1=1 “非”運(yùn)算是實(shí)現(xiàn)“求反”這種邏輯關(guān)系的運(yùn)算,其運(yùn)算符為“!”,運(yùn)算規(guī)則為:!0=1,!1=03、單片機(jī)最小系統(tǒng)很多初學(xué)者容易把單片機(jī)開發(fā)板誤認(rèn)作單片機(jī),實(shí)際上這是不對的,單片機(jī)只是一塊小小的集成芯片,但如果只是一塊芯片無法實(shí)現(xiàn)其功能, 我們要想要單片機(jī)運(yùn)行起來,至少應(yīng)該給它提供一個電源吧?下面所講的單片機(jī)最小基本電路就是一個單片機(jī)能運(yùn)行的最基本條件。我們平時所使用的單片機(jī)開發(fā)板,無非就是把這個基本電路和一些其他電路整合在一塊電路板上,有了這些基本電路,你們自己都可以設(shè)計制作出單片機(jī)開發(fā)板。圖1- 3在上圖中,除了單片機(jī)外實(shí)際上只有三個電路,分別是電源電路、晶振電路和復(fù)位電路,下面簡單介紹這三個電路,大家只需要知道其作用就行了。1) 電源電路電源電路非常簡單,就是給單片機(jī)提供電源。2) 晶振電路晶振電路的作用就是為系統(tǒng)系統(tǒng)提供基本的時鐘信號,形象的說,晶振電路就像單片機(jī)的心臟一樣,如果沒有晶振,單片機(jī)就停滯在那里不能一步步執(zhí)行程序。3) 復(fù)位電路復(fù)位電路就是讓單片機(jī)能夠進(jìn)行清零復(fù)位,讓單片機(jī)重新開始從頭開始執(zhí)行程序(從頭工作),它分為上電復(fù)位和按鍵復(fù)位兩種,也就是說,當(dāng)你剛剛給單片機(jī)通電時,它就進(jìn)行了一次復(fù)位,當(dāng)有電時你按下復(fù)位鍵,它也能進(jìn)行復(fù)位。第二天 I/O口介紹及其應(yīng)用一、什么是I/O口我們的單片機(jī)能接收到外部的輸入信號(包括數(shù)據(jù)、指令等),并能對其進(jìn)行處理,再輸出信號,控制其外圍連接電路,以實(shí)現(xiàn)我們想要實(shí)現(xiàn)的功能。但單片機(jī)怎樣與外圍電路進(jìn)行通訊呢?這就需要用到I/O。什么又是I/O口呢?它的中文全稱叫作輸入與輸出端口,也就是說我們的數(shù)據(jù)是通過I/O口傳輸?shù)?。單片機(jī)包括四個I/O口,分別是P0,P1,P2,P3,每個口有8個引腳。什么又是引腳呢?所謂單片機(jī)的引腳,就是連接單片機(jī)內(nèi)部電路和外部電路的橋梁,就像電阻的兩支管腳。但單片機(jī)的引腳不止2個,我們較常用的AT89C51型號的單片機(jī)就有40個引腳(如圖2.1)。圖2- 1 AT89C51單片機(jī)的引腳以AT89C51型號的單片機(jī)為例(較常用的都是40支引腳的51單片機(jī),但也有20,28,32,44等不同引腳數(shù)的51單片機(jī),這些大家在以后的學(xué)習(xí)過程中也要了解,不要只見了40引腳的芯片才認(rèn)為它是51單片機(jī))。四個I/O口,共32支引腳。其余8支引腳有著其他的功能,如電源引腳(VCC,GND)、時鐘引腳(XTAL1、XTAL2)等。在這兒,我們主要了解I/O口引腳。二、I/O口的工作原理 I/O口它們是怎樣工作的呢? 單片機(jī)是一種數(shù)字集成芯片,而數(shù)字電路只認(rèn)兩種電平:高電平(二進(jìn)制代碼為1)、低電平(二進(jìn)制代碼為0)。我們就是通過給I/O口賦高低電平來控制外圍電路。舉個點(diǎn)亮發(fā)光二極管的簡單例子來說明I/O口的工作原理。大家都知道二極管具有單向?qū)щ娦?,只有?dāng)二極管正極電壓高于負(fù)極電壓,發(fā)光二極管才能發(fā)光。如圖:圖2- 2 單片機(jī)控制發(fā)光二極管電路二極管的正極連在電源上,負(fù)極接在單片機(jī)的P2.0引腳上,若此時P2.0為低電平(0V),則二極管導(dǎo)通,二極管發(fā)光。若P2.0為高電平(+5V),二極管不能導(dǎo)通,則不能發(fā)光。從點(diǎn)亮一個發(fā)光二極管的例子,我們了解到,通過給單片機(jī)的一個I/O口的引腳賦高、低電平這種控制手段,我們可以使單片機(jī)控制一個簡單的外圍電路(發(fā)光二極管電路)。但我們怎么來控制復(fù)雜的外圍電路呢?上面的例子怎么才用到32支I/O口引腳中的一支呢?4個I/O口共32個引腳,試想,一個引腳控制一個簡單的外圍電路,一個外圍電路不外乎就兩種情況,引腳為高電平或低電平。4個I/O口(32個引腳)同時用上,用排列組合的知識就可以算出,這4個I/O口控制的結(jié)果將會是多少種情況,控制的電路將會是多么的復(fù)雜,由此我們也可以看出單片機(jī)的功能是多么的強(qiáng)大。上面說了這么多,我們可以將其歸根到一點(diǎn),就是:我們是通過給I/O口賦值(賦1或0),使I/O口輸出高、低電平,從而控制外圍電路。三、怎樣使用I/O口上面我們介紹了什么是I/O口及其工作原理,下面我們就來實(shí)踐演練一下。1、先來看點(diǎn)亮一個發(fā)光二極管的實(shí)例,硬件連接如圖圖2- 3 LED連接圖分析:二極管負(fù)極連在P1.0上,我們只需給P1.0一個低電平即可點(diǎn)亮它。程序如下:#include /52系列單片機(jī)頭文件sbit led1=P10; /聲明單片機(jī)P1口的第一位void main() /主函數(shù) Led1=0; /*點(diǎn)亮發(fā)光二極管*/也許大家看到這個簡單的C程序,也是一頭霧水。它為什么要聲明單片機(jī)P1口的第一位P1.0呢?(注:P1.0口在C程序中是用P10來表示的)。為什么不直接使P10=0呢?這是因?yàn)槲覀內(nèi)粢刂颇硞€發(fā)光二極管(上圖是D1),也就是要控制單片機(jī)I/O口的某一位(上圖是P1.0),必定要聲明這一位,否則單片機(jī)不知道我們要操作的是什么東西,所以我們在程序中聲明了單片機(jī)P1口的第一位(sbit是一個聲明位的操作,相當(dāng)于C程序中要用到整型時,用int來聲明)。比如,我們想給P1.0一個高電平,我們直接給led1賦值1就行了。由于LED正常發(fā)光時其兩端的電壓約為1.7V,如果不接限流電阻,LED兩端的電壓要么為5V,要么為0V,當(dāng)5V時很可能燒壞LED,所以我們還得給它加上一個限流電阻R(一般為1K)。2、點(diǎn)亮多個LED如圖,我們要控制第1, 3, 5,7個亮,第2,4,6,8個滅該怎么辦呢?當(dāng)然,我們可以以上面的方法(單獨(dú)控制一個引腳)來實(shí)現(xiàn),下面我們介紹一種更為簡單的方法(同時控制一個I/O口的8個引腳)。圖2- 4 單片機(jī)控制流水的電路圖P1口共8個引腳,每個引腳對應(yīng)一個二進(jìn)制位。8個引腳即八個二進(jìn)制位。P1.0對應(yīng)最低位,P1.7對應(yīng)第8位。如我們對P1口賦值1011 1110,則P1口的第一引腳和第七引腳為低電平,其它引腳為高電平。上面的電路圖我們只畫了控制外圍電路部分,而單片機(jī)自身的電源電路等都沒畫出來,但不等于沒有,因?yàn)樗残枰娫唇o其供電才能正常工作。如上圖所示, 8個LED正極端已于+5V的直流電源相連(我們稱之為共陽極接法),都獲得了一個高電平,它們的負(fù)極端又分別與P1端口的8個引腳相連,只要我們控制P1端口八個引腳的電平輸入,我們就能分別控制8個LED的亮與滅。程序如下:#include /52系列單片機(jī)頭文件void main() /主函數(shù) P1=0xaa; /*對P1口的8個引腳進(jìn)行位操作*/ 注意區(qū)別上一個C程序,這里不再對P1口的某一位進(jìn)行聲明,而是在主函數(shù)中直接對單片機(jī)P1口的8個引腳進(jìn)行操作,“0x”表示十六進(jìn)制數(shù),轉(zhuǎn)換成二進(jìn)制是10101010,那么對應(yīng)的發(fā)光二極管負(fù)極端獲得的高低電平如表1.4。 LEDD1D2D3D4D5D6D7D8負(fù)極端電平01010101表2- 1這就實(shí)現(xiàn)了1, 3, 5,7亮,2,4,6,8滅。我們將0xaa轉(zhuǎn)換成十進(jìn)制后為170,也可以直接對P1口進(jìn)行十進(jìn)制數(shù)的賦值,如“P1=170;”,其效果是一樣的,只是麻煩了許多。因?yàn)闊o論是幾進(jìn)制的數(shù),在單片機(jī)內(nèi)部都是以二進(jìn)制數(shù)形式存在的,只要是同一個數(shù)值的數(shù),其在單片機(jī)內(nèi)部都是用二進(jìn)制的同一種形態(tài)來表示。上面介紹了如何點(diǎn)亮一個發(fā)光二極管,如何控制流水燈的亮與滅。如果你能控制流水燈,使它們能按你的意愿亮與滅,可以這么說,你對單片機(jī)已經(jīng)入門了。第三天 按鍵原理及其應(yīng)用一、什么是按鍵提到按鍵大家都不會陌生,如圖所示為51單片機(jī)開發(fā)板上的按鍵實(shí)物圖和電路圖,它可以通過跳帽(就是一根短接線)切換成獨(dú)立按鍵或矩陣鍵盤兩種模式,J11是由三根插針(圖中標(biāo)號1、2、3)組成。當(dāng)我們使用獨(dú)立按鍵時,應(yīng)該把跳帽跳到左端(相當(dāng)于讓1、2短接),當(dāng)我們使用矩陣鍵盤時,應(yīng)該把跳帽跳到右端(相當(dāng)于讓2、3短接)。圖3- 1 按鍵實(shí)物圖圖3- 2 按鍵電路圖大家可能會問,什么又是獨(dú)立按鍵和矩陣按鍵呢?當(dāng)我們使用獨(dú)立按鍵時,只有S1、S2、S3、S4四個按鍵能夠工作,其他按鍵是不工作的。當(dāng)我們需要多于四個按鍵的時候,我們可以使用矩陣鍵盤,也就是一共4*4=16個按鍵可以工作。當(dāng)然,矩陣鍵盤的程序要復(fù)雜的多。二、按鍵是如何工作的按鍵原理非常簡單,當(dāng)你用手按下時開關(guān)閉合,線路導(dǎo)通,松手時開關(guān)斷開,線路斷開。它是如何與單片機(jī)聯(lián)系起來,達(dá)到控制的目的呢?這里我們就需要按鍵檢測程序,我們知道,I/O口既可以做輸入口又可以做輸出口,在這里我們就要用到其輸入功能,我們可以把按鍵的一端接地,另一端與單片機(jī)某個I/O口相連,開始時先給該I/O口賦一高電平(實(shí)際上如果沒有對I/O口賦值,I/O口都默認(rèn)為高電平),然后讓單片機(jī)不斷檢測該I/O口是否變?yōu)榈碗娖剑?dāng)按鍵閉合時,即相當(dāng)于該I/O口通過按鍵與地相連,變?yōu)榈碗娖?,一旦程序檢測到I/O口變?yōu)榈碗娖絼t說明按鍵被按下,然后執(zhí)行相應(yīng)的指令。 按鍵連接方法很簡單,如圖所示,按鍵一端接地,另一端接與單片機(jī)任一I/O口相連,按鍵在被按下時,其觸電電壓變化過程如圖圖3- 3 從圖中可以看出,在實(shí)際情況下,我們在按下和釋放按鍵的瞬間都會有抖動現(xiàn)象,抖動時間一般在5-10ms。在抖動的這段時間里電壓是不穩(wěn)定的,因此單片機(jī)在檢測鍵盤是否按下時都要加上去抖動操作,也就是把抖動時間給排除掉,一般我們用軟件延時的方法就能解決這個問題。在編寫按鍵程序時,需要在檢測按下時加入去抖動的延時函數(shù)。三、如何編寫按鍵檢測程序 如圖所示為按鍵檢測流程圖開始延時檢測是否有鍵按下檢測是否有鍵按下執(zhí)行相應(yīng)程序YYNN四、按鍵檢測實(shí)例程序圖3- 4 按鍵控制LED電路圖如圖3-4所示是一個用S1、S2兩個按鍵控制LED亮滅的電路仿真圖,它實(shí)現(xiàn)的功能是:按下S1,LED亮,按下S2,LED滅。我們結(jié)合這個電路的程序,讓大家對按鍵有一個基本的認(rèn)識。程序如下:#include /包含頭文件,一般情況不需要改動,寫在程序最前面sbit S1=P10; /定義按鍵S1位置,將S1與P1.0口相連sbit S2=P11; /定義按鍵S2位置,將S2與P1.1口相連sbit LED1=P20; /定義LED1位置,將其與P2.0相連/*- 延時子程序-*/void delay(unsigned int i) while(i-); /循環(huán)i次,當(dāng)i減小到0時跳出循環(huán)/*- 主函數(shù)-*/main() while(1) if(S1=0) /如果S1等于0,說明按鍵1被按下 delay(1000); /進(jìn)行去抖動處理 if(S1=0) LED1=0; /檢測按鍵確實(shí)按下,點(diǎn)亮LED1 if(S2=0) /如果S2等于0,說明按鍵2被按下 delay(1000); /去抖動處理 if(S2=0) LED1=1; /檢測按鍵確實(shí)按下,熄滅LED1 程序分析:主程序進(jìn)來就一個while(1)死循環(huán),循環(huán)中檢測是S1還是S2按下,如果第一個按鍵S1按下,則S1等于0,然后延時一段時間再檢測S1是否還等于0,即去抖處理,如果S1還等于0,說明S1確實(shí)按下,就點(diǎn)亮LED1。如果第二個按鍵S2按下,則S2等于0,r然后延時一段時間再檢測S2是否還等于0,即去抖處理,如果S2還等于0,說明S2確實(shí)按下,就熄滅LED1。延時函數(shù)的原理就是,當(dāng)單片機(jī)執(zhí)行一個while(i-)循環(huán)語句時,就消耗了一部分時間,時間的多少有i的初始值決定。第四天 數(shù)碼管介紹及其應(yīng)用一、什么是數(shù)碼管圖4- 1 數(shù)碼管實(shí)物圖 數(shù)碼管是單片機(jī)系統(tǒng)中常用的顯示器件,每個數(shù)碼管由8段LED構(gòu)成,組合起來可以顯示0,1,2,3,4,5,6,7,8,9和部分英文字母。二、數(shù)碼管的硬件結(jié)構(gòu)共陽極共陰極 圖(a)是數(shù)碼管外觀圖,一位數(shù)碼管含有10個引腳,a,b,c,d,e,f,g,dp,和兩個GND,兩個GND是連在一起的。圖(b)是數(shù)碼管的內(nèi)部結(jié)構(gòu)圖。 圖(b)中又有兩種接法,一種是將8段LED的陰極(負(fù)極)一起連在接地端,稱為共陰極接法,一種是將8段LED的陽極(正極)一起連在+5V的電源上,稱為共陽極接法。三、數(shù)碼管的顯示原理使用LED顯示器時,要注意區(qū)分這兩種不同的接法。下面我們以共陽極數(shù)碼管為例介紹數(shù)碼管的編碼原理。假設(shè)我們要數(shù)碼管顯示2,那么就是要讓a,b,d,e,g亮,其它的不亮。若顯示8,那么就讓a,b,c,d,e,f,g亮,dp不亮。為了顯示數(shù)字或字符,必須對數(shù)字或字符進(jìn)行編碼。七段數(shù)碼管加上一個小數(shù)點(diǎn),共計8段。因此為LED顯示器提供的編碼正好是一個字節(jié)(8位)。每一位控制一段LED,對應(yīng)關(guān)系如下表:D8D7D6D5D4D3D2D1dpgfedcba表4- 1其中,D1表示8位二進(jìn)制位的第一位,D2表示8位二進(jìn)制位的第二位,以此類推。如果我們要數(shù)碼管顯示2,即a,b,d,e,g亮,其它的不亮。因?yàn)閿?shù)碼管是共陰的,所以給a,b,d,e,g賦0才亮,即1010 0100,即0xa4。 如果顯示8,即a,b,c,d,e,f,g亮,dp不亮。編碼1000 0000,即0x80。以下是共陽極編碼列表:顯示的數(shù)0123456789編碼0xc00xf90xa40xb00x990x920x820xf80x800x90表4- 2會編共陽的,就會編共陰的, 共陰極編碼列表如下:顯示的數(shù)0123456789編碼0x3f0x060x5b0x4f0x660x6d0x7d0x070x7f0x6f表4- 3四、程序示例 讓數(shù)碼管重復(fù)顯示0,1,28,9。數(shù)碼管(共陽)接在P2口上。硬件示意圖如下:圖4- 2 數(shù)碼管硬件電路圖分析:我們控制數(shù)碼管的顯示,數(shù)碼管的八個引腳是連在P2口的,所以就是對P2口賦值的過程。程序如下:#include void delay(int x) /延時函數(shù) while(x-); main() while(1) P2=0x c0; /顯示0delay(8000); /延時P2=0xf9; /顯示1delay(8000); /延時P2=0xa4; /顯示2delay(8000); /延時P2=0xb0; /顯示3delay(8000); /延時P2=0x99; /顯示4delay(8000); /延時P2=0x92; /顯示5delay(8000); /延時P2=0x82; /顯示6delay(8000); /延時P2=0xf8; /顯示7delay(8000); /延時P2=0x80; /顯示8delay(8000); /延時P2=0x90; /顯示9 delay(8000); /延時 程序分析:主程序中就一個大循環(huán),循環(huán)為P2口賦值,從而顯示0到9。每兩個數(shù)之間有個延時,為什么要延時呢? 是因?yàn)槲覀兊膯纹瑱C(jī)處理速度是非??斓?,不延時我們根本沒法看清數(shù)碼管顯示的是什么,所以必須要有延時。五、數(shù)碼管的動態(tài)掃描上面我們只講到了用一個I/O口控制1位數(shù)碼管的顯示,若是要控制兩個數(shù)碼管的顯示呢?很多人說用兩個I/O口,這個是可以實(shí)現(xiàn)的,但我們要控制8個數(shù)碼管呢,豈不是要8個I/O口嗎?51單片機(jī)只有4個I/O口,那不是不能控制8個數(shù)碼管了?所以為了節(jié)約51單片機(jī)的引腳資源,我們引入了數(shù)碼管的動態(tài)掃描。1、什么是動態(tài)掃描數(shù)碼管的動態(tài)掃描就是先讓第一位數(shù)碼管顯示,然后第一位滅,再讓第二位顯示,然后第二位滅,第n位數(shù)碼管顯示,然后第八位滅。然后重復(fù)上述狀態(tài),當(dāng)顯示速度非??斓臅r候,我們看到的就是n位數(shù)碼管同時顯示。2、怎么實(shí)現(xiàn)動態(tài)掃描下面我們以四個數(shù)碼管(共陽極)的顯示為例講述動態(tài)掃描的使用方法四個數(shù)碼管的引腳連接圖如下:圖4- 3 四位數(shù)碼管電路圖四個數(shù)碼管的a腳連在一起,b腳連在一起,dp腳連在一起,每個數(shù)碼管的公共引腳(com)獨(dú)立,com腳接在一個三極管(Q3)上,大家先不用管三極管是怎么用的,你只需知道掃描信號有高電平時,掃描信號的那個端子就與(com)連通了,如掃描信號的A端為高電平,那么A端就與第四個數(shù)碼管的(com)接通了。如果我們要第一個數(shù)碼管顯示1,第一個數(shù)碼管顯示2,第一個數(shù)碼管顯示3,第一個數(shù)碼管顯示4。我們該怎么做?用動態(tài)掃描的方法第一步:先讓第一個數(shù)碼管顯示1,其它的關(guān)閉。給a,b,c,d,e,f,g,dp賦值,即0xf9,再給D端一個高電平(打開第一個數(shù)碼管),給ABC端低電平(關(guān)閉其它3個數(shù)碼管)。 第二步:先讓第二個數(shù)碼管顯示2,其它的關(guān)閉。給a,b,c,d,e,f,g,dp賦值,即0xa4,再給C端一個高電平(打開第二個數(shù)碼管),給ABD端低電平(關(guān)閉其它3個數(shù)碼管)。 第三步:先讓第三個數(shù)碼管顯示3,其它的關(guān)閉。給a,b,c,d,e,f,g,dp賦值,即0xb0,再給B端一個高電平(打開第三個數(shù)碼管),給ACD端低電平(關(guān)閉其它3個數(shù)碼管)。 第四步:先讓第四個數(shù)碼管顯示4,其它的關(guān)閉。給a,b,c,d,e,f,g,dp賦值,即0x99,再給A端一個高電平(打開第四個數(shù)碼管),給BCD端低電平(關(guān)閉其它3個數(shù)碼管)。重復(fù)上面四步,這就實(shí)現(xiàn)了動態(tài)掃描。3、應(yīng)用實(shí)例假設(shè)a,b,c,d,e,f,g,dp接在P2口,信號端ABCD分別接在P3.0,P3.1,P3.2,P3.3上,硬件連接如圖所示:圖4- 4 四位數(shù)碼管仿真電路圖實(shí)現(xiàn)動態(tài)掃描的源程序如下:#includemain() int i; int dat=0xf9,0xa4,0xb0,0x99; /數(shù)組定義顯示數(shù)據(jù)1,2,3,4的編碼 int wei=0x01,0x02,0x04,0x08; /數(shù)碼管位數(shù)的編碼 for(i=0;i4;i+) P3=weii; /只打開第i個數(shù)碼管 P2=dati; /給數(shù)碼管顯示i的編碼 if(i= =4) i=0; /當(dāng)i等于4時,讓i=0,從而不讓程序跳出for循環(huán) 程序分析: 主函數(shù)進(jìn)來定義了兩個數(shù)組,dat用來顯示數(shù)據(jù),wei用來控制顯示哪個數(shù)碼管。dat0表示數(shù)組中第一個數(shù)據(jù),即0xf9, dat1表示數(shù)組中第二個數(shù)據(jù),即0xa4, dat2表示數(shù)組中第三個數(shù)據(jù),即0xb0, dat3表示數(shù)組中第四個數(shù)據(jù),即0x99, 對于wei也是同樣的道理。 然后有個for循環(huán),i等于0時,第一個數(shù)碼管顯示1,i等于1時,即第二個數(shù)碼管顯示2,i等于2時,即第三個數(shù)碼管顯示3,i等于3時,即第一個數(shù)碼管顯示4,當(dāng)i等于4時,給i賦值,讓i等于0,繼續(xù)下一次循環(huán)。因?yàn)閱纹瑱C(jī)運(yùn)算速度非???,如此循環(huán)下去,我們看到的就是四個數(shù)碼管同時顯示1234。第五天 中斷系統(tǒng)一、什么是中斷 單片機(jī)CPU在處理某一事件A時,發(fā)生了另一事件B請求CPU迅速去處理(中斷發(fā)生);CPU暫時中斷當(dāng)前的工作,轉(zhuǎn)去處理事件B(中斷響應(yīng)和中斷服務(wù));待CPU將事件B處理完畢后,再回到原來事件A被中斷的地方繼續(xù)處理事件A(中斷返回),這一過程稱為中斷。 例如:當(dāng)你正在洗衣時,突然手機(jī)響了(中斷發(fā)生),你暫時中斷洗衣的工作,轉(zhuǎn)去接電話(中斷響應(yīng)和中斷服務(wù)),待你接完后,再回來繼續(xù)洗衣(中斷返回),這一過程就是中斷。二、中斷系統(tǒng)中斷系統(tǒng)結(jié)構(gòu)圖如下:圖5- 1 中斷示意引起單片機(jī)的CPU中斷的根源,稱為中斷源。中斷源向CPU提出的中斷請求。CPU暫時中斷原來的事務(wù)A,轉(zhuǎn)去處理事件B,對事件B處理完畢后,再回到原來被中斷的地方(即斷點(diǎn)),稱為中斷返回。實(shí)現(xiàn)上述中斷功能的部件稱為中斷系統(tǒng)(中斷機(jī)構(gòu))。80C51的中斷系統(tǒng)有5個中斷源,也就是說有5種情況發(fā)生時,會使單片機(jī)停下來去處理中斷程序,5種中斷源分別為外部中斷0(INT0),外部中斷1(INT1),定時器中斷0(T0),定時器中斷1(T1)和串行口中斷。三、中斷的優(yōu)先級但兩個中斷同時發(fā)生時,我們的CPU會先響應(yīng)哪個中斷呢?這就涉及到中斷優(yōu)先級的問題。默認(rèn)狀態(tài)下,CPU會優(yōu)先響應(yīng)中斷優(yōu)先級別高的中斷,當(dāng)把優(yōu)先級高的中斷執(zhí)行完后,在回來執(zhí)行優(yōu)先級級別低的中斷。圖5- 2 中斷優(yōu)先級次示意圖51單片機(jī)的中斷級別如下:中斷源中斷優(yōu)先級級別中斷序號INT0(外部中斷0)最高0T0(定時器中斷0)第21INT1(外部中斷1)第32T1(定時器中斷1)第43TI/RI(串行口中斷)最低4表5- 180C51單片機(jī)的中斷優(yōu)先級有三條原則: CPU同時接收到幾個中斷時,首先響應(yīng)優(yōu)先級別最高的中斷請求。 正在進(jìn)行的中斷過程不能被新的同級或低優(yōu)先級的中斷請求所中斷。 正在進(jìn)行的低優(yōu)先級中斷服務(wù),能被高優(yōu)先級中斷請求所中斷。四、中斷的優(yōu)點(diǎn)對于單片機(jī)初學(xué)者會問到個問題:“中斷就是處理一事件(中斷子程序),用戶自定義一個子函數(shù)也可以處理呀,這中斷不就和子函數(shù)沒區(qū)別嗎?那還有什么用呢?”其實(shí)中斷的功能遠(yuǎn)遠(yuǎn)強(qiáng)于普通的子函數(shù),下面我們來看看中斷的優(yōu)點(diǎn) 分時操作:CPU可以分時為多個I/O設(shè)備服務(wù),提高了計算機(jī)的利用率 實(shí)時響應(yīng):CPU能夠及時處理應(yīng)用系統(tǒng)的隨機(jī)事件,系統(tǒng)的實(shí)時性大大增強(qiáng); 可靠性高:CPU具有處理設(shè)備故障及掉電等突發(fā)性事件能力,從而使系統(tǒng)可靠性提高。五、中斷響應(yīng)條件 中斷源有中斷請求 此中斷源的中斷允許位為1 CPU開中斷(即EA=1)以上三條同時滿足時,CPU才有可能響應(yīng)中斷。六、怎么使用中斷要使用中斷,首先要學(xué)會使用中斷允許寄存器,首先解釋一下什么叫寄存器。寄存器: 在單片機(jī)中,寄存器是個高頻詞,很多初學(xué)者不理解它,寄存器實(shí)質(zhì)是一個存儲單元,51單片機(jī)的寄存器是8位的,可以存0000 00001111 1111,但寄存器的功能又比普通的存儲單元的功能強(qiáng),向寄存器寫如不同的數(shù),就能完成不同的動作,讓單片機(jī)實(shí)現(xiàn)不同的功能,這是普通存儲器所不能做到的。中斷允許寄存器如下:位序號76543210位符號EAET2ESET1EX1ET0EX0中斷允許位名稱總中斷無效位Timer2中斷串行口中斷Timer0中斷外部中斷0Timer0中斷外部中斷0表5- 2中斷寄存器共8位,每一位表示控制不同的子中斷。我們要開哪個中斷,就將該中斷的允許位賦1,要關(guān)哪個中斷,就將該中斷允許位賦0。如我們開串行口中斷,首先開總中斷,即EA=1;再開串行口中斷,即ES=1。這樣我們就完成了開串行口中斷的動作。大家很可能會問到:當(dāng)中斷發(fā)生時,CPU怎么處理呢?這就涉及到中斷子程序了,中斷發(fā)生時CPU就立即停下當(dāng)前動作,立刻跳至中斷子程序中。中斷子程序就是中斷時CPU要做的動作。下面介紹中斷子程序的寫法 void 函數(shù)名() interrupt 中斷號 中斷服務(wù)程序的內(nèi)容 說明:中斷函數(shù)無返回值,所以最前面用void,中斷函數(shù)無任何參數(shù),所以()中無任何內(nèi)容,interrupt為中斷的英文名,中斷號是指單片機(jī)中幾種中斷源的序號。中斷的具體運(yùn)用(定時器中斷)我們將在下一章介紹。第六天 定時器/計數(shù)器一、什么是定時器/計數(shù)器定時器/計數(shù)器是集成在單片機(jī)內(nèi)部,能夠?qū)崿F(xiàn)定時和計數(shù)的硬件結(jié)構(gòu)(8051有兩個定時器Timer0和Timer1)。與軟件定時相比,增大了定時精確度,提高了CPU的利用率。二、定時器是怎么定時的定時器的實(shí)質(zhì)是一個加1計數(shù)器(16位),加1計數(shù)器每個機(jī)器周期完成加1的動作,它由高8位和低8位兩個寄存器組成,最多能裝1111 1111 1111 1111。計數(shù)器從初始值開始不斷的加1,加到溢出值(上限值),定時時間就到了,此過程經(jīng)歷的時間就是我們所定的時間。 說明:1個機(jī)器周期等于12個振蕩周期,振蕩周期即晶振振蕩的周期,也就是1/晶振頻率。 1、 計數(shù)原理 加1計數(shù)器(16位)每隔一個機(jī)器周期就加1,當(dāng)加到計數(shù)器為全1時,即1111 1111 1111 1111。再過一個機(jī)器周期(再加1)就使計數(shù)器就溢出(溢出就是計數(shù)已經(jīng)滿了,再加1就計數(shù)器容納不下了,這就是溢出), 如果定時/計數(shù)器工作于定時模式,則表示定時時間已到;如果工作于計數(shù)模式,則表示計數(shù)值已滿。可見,由溢出時計數(shù)器的值減去計數(shù)初值才是加1計數(shù)器的計數(shù)值。說明: 讀者可能有疑問,上面不是說了寄存器是8位的嗎,這計數(shù)器為什么就16位呢?這其實(shí)是兩個寄存器(TLX和THX)組成一個16位的計數(shù)器。TLX計數(shù)器的低8位(16位二進(jìn)制位的后8位),THX計數(shù)器的高8位(16位二進(jìn)制位的前8位)說明:X可以是0或1,若計數(shù)器是Timer0,則X為0;若計數(shù)器是Timer1,則X為12、 定時原理設(shè)置為定時器模式時,加1計數(shù)器是對內(nèi)部機(jī)器周期計數(shù)。計數(shù)值N乘以機(jī)器周期Tcy就是定時時間t 。例 利用定時/計數(shù)器T1的方式1,產(chǎn)生10ms的定時,設(shè)晶振頻率為12 MHz,計算計數(shù)初值X解:由于晶振為12 MHz,所以機(jī)器周期Tcy為1 ms。工作方式1,查表4-1知計數(shù)上限值為65536。所以:計數(shù)值Nt/ Tcy 10000/110000X計數(shù)上限值N=655361000055536三、 怎么使用定時器/計數(shù)器1、8051有兩個定時器Timer0和Timer1,每個定時器有四種工作模式。不同模式的計數(shù)范圍不同,其它區(qū)別大家現(xiàn)在不用關(guān)心。模式位數(shù)計數(shù)范圍Mode0130213(8191)Mode1160216(65536)Mode28028(255)Mode38028(255)表6- 1從上一章中斷的使用中,大家知道控制中斷就是向中斷允許寄存器寫數(shù),那么同理可知,控制定時器就是向定時器控制寄存器(TCON)中寫數(shù)。我們可以單獨(dú)取一位處理寫,也可對T CON整體賦值。 定時器控制寄存器如下位序號76543210控制位名稱TR1TR0表6- 2TR1(TCON.6):T1(定時器1)運(yùn)行控制位。TR1置1時,T1開始工作;TR1置0時,T1停止工作。TR1由軟件置1或清0。所以,用軟件可控制定時/計數(shù)器的啟動與停止。TR0(TCON.4):T0(定時器0)運(yùn)行控制位,其功能與TR1類同。 我們只需掌握這兩位就夠了。2 、定時器是使用步驟:1) 設(shè)置定時器的工作方式。2) 計算初值,并將其寫入計數(shù)器。3) 開中斷。4) 開定時器。在此我們只介紹Timer0的工作模式1的使用,這個會了其它的也都會了,因?yàn)槭褂梅椒愃啤?四、程序?qū)嵗嚎刂芁ED每間隔50ms閃爍一次,即亮50ms滅50ms。LED連在P1.0上。用Timer0的工作方式1控制,晶振頻率12MHz。程序流程如如下:開始定時器初始化(開定時器)定時時間是否到 ?while(1)等待中斷中斷子程序(LED取反)YN首先,要計算定時器的計算初值,由于晶振為12 MHz,所以機(jī)器周期Tcy為1 ms。工作方式1,查表5-3知計數(shù)上限值為65536。所以:計數(shù)值Nt/ Tcy 50ms/1us50000X計數(shù)上限值N=655365000015536=0x3CB0將高8位賦給TH0,即TH0=0x3C,將低8位賦給TL0,即TL0=0xB0。程序如下:#include /包含頭文件,一般情況不需要改動。sbit LED=P10; /定義LED端口/*- 定時器初始化子程序-*/void Init_Timer0(void) TMOD = 0x01; /設(shè)定定時器為工作方式1,TMOD是設(shè)置定時器工作方式的寄存器,設(shè)置定時器方式的過程就是給TMOD賦值的過程。 TH0=0x3C; /將計數(shù)初值寫入計數(shù)器,這里使用定時器從15536開始計數(shù)一直到65535溢出 TL0=0xB0; EA=1; /打開總中斷,EA是總中斷的允許位,給EA賦1,就完成了開總中斷的動作 ET0=1; /打開定時器0中斷,E是中斷英文的首字母,T0是Timer0.組合以來就是ET0,ET0是定時器0中斷的一個允許位,給它賦1,就打開定時器0中斷 TR0=1; /打開定時器,同上,TR0是定時器0的允許位,給它賦1,打開定時器0 /* 注意,此初始化函數(shù)寫法完全符合上面說的定時器的使用步驟*/main() Init_Timer0(); /定時器初始化,利用函數(shù)調(diào)用的知識 while(1); /等待定時器中斷/*- 定時器中斷子程序-*/void Timer0_isr(void) interrupt 1 TH0=0x3C; /重新賦值,高8位為0x3C,即0011 1100 TL0=0xB0; / 低8位為0xB0,即1011 0000 LED=LED; /指示燈反相,可以看到閃爍程序解釋:main()主函數(shù)進(jìn)來首先執(zhí)行Init_Timer0()定時器初始化子函數(shù),即初始化定時器,什么是初始化定時器呢,就是設(shè)置好定時器的初始狀態(tài)。我們來看看Init_Timer0()是怎樣初始化的,首先,我們定義了Init_Timer0(),在定時器初始化子程序中,第一行TMOD = 0x01用于設(shè)定定時器工作模式為工作模式1,即16位計數(shù)器。TH0=0x3C定時器計數(shù)初值的高8位為0011 1100,TL0=0xB0定時器計數(shù)初值的低8位為1011 0000,TH0和TL0組合起來就16位,即計數(shù)器初值為0011 1100 1011 0000, 從0開始計數(shù)一直到1111 1111 1111 1111,即65535溢出。我們用到了定時器中斷,所以要開中斷,開中斷的順序是先開總中斷,即EA=1,再開定時器中斷,即ET0=1;最后打開定時器,讓定時器開始計時,即TR0=1.主函數(shù)第二條語句,while(1);是一個死循環(huán),一直執(zhí)行;即一直執(zhí)行空語句,什么也不做。既然什么都不做,那還要什么用呢,用處當(dāng)然大了,它的作用是讓程序停止這里一直等待定時器中斷,即等到時間到后去執(zhí)行定時器中斷子程序。那么有人會問,時間到了干什么呢?這就要說到我們中斷子程序的作用了,定時時間一到,程序就不管while(1)這個死循環(huán)了,而是馬上跳到中斷子程序void Timer0_isr(void) interrupt 1中,跳進(jìn)去后執(zhí)行TH0=0x3C;TL0=0xB0; 為計數(shù)器重新賦值,時間到后是1111 1111 1111 1111,我們要它重新計時,當(dāng)然要重新賦初值0011 1100 1011 0000。重賦初值后LED=LED;是取反運(yùn)算符,若起始狀態(tài)LED為1,取反后則為0,即實(shí)現(xiàn)了由亮到滅或由滅到亮的翻轉(zhuǎn)。執(zhí)行完LED=LED后跳出中斷等待下一次中斷的到來,從而實(shí)現(xiàn)了燈間隔1s閃爍的功能。第七天 串行口一、什么是串行口串行口(也叫串口)就是51單片機(jī)用于與其他外部設(shè)備通訊的一個接口,所以它的作用就是向外部發(fā)送數(shù)據(jù)和接收外部設(shè)備發(fā)來的數(shù)據(jù)。二、串行口是怎么工作的51單片機(jī)的串行口的基本工作原理是:通過數(shù)據(jù)發(fā)送引腳(TXD)將數(shù)據(jù)發(fā)送出去,通過數(shù)據(jù)接收引腳(RXD)接收外部數(shù)據(jù)。串行口的TXD(或RXD)只是一個引腳,是一位的,所以收發(fā)數(shù)據(jù)只能一位一位的進(jìn)行。這就好比火車進(jìn)隧道一樣,隧道的進(jìn)口相當(dāng)于RXD,最先進(jìn)隧道的是火車頭(起始位),然后進(jìn)去的是第一節(jié)車廂,第二節(jié)車廂第八節(jié)車廂,最后一節(jié)車廂(停止位),這樣一個過程就是接收數(shù)據(jù)的過程。隧道的出口相當(dāng)于TXD,最先出隧道的是火車頭(起始位),然后出去的是第一節(jié)車廂,第二節(jié)車廂第八節(jié)車廂,最后一節(jié)車廂(停止位),這樣一個過程就是發(fā)送數(shù)據(jù)的過程。三、串行口的工作方式51單片機(jī)的串行口的工作方式有四種,方式0、方式1、方式2和方式3。最常用的是方式1,所以我們只介紹方式1的應(yīng)用,實(shí)際方式1也完全夠用了。方式1是10位數(shù)據(jù)的異步通信口(就是說單片機(jī)每次只能接受或者發(fā)送10位數(shù)據(jù))。10位數(shù)據(jù)中有1位起始位,8位數(shù)據(jù)位(實(shí)際傳送的數(shù)據(jù)),1位停止位。傳送一幀數(shù)據(jù)(一次發(fā)送的數(shù)據(jù)叫一幀)的格式如圖所示。 圖7- 1 數(shù)據(jù)傳送示意圖 說明:串行口實(shí)際傳輸?shù)臄?shù)據(jù)是中間8位(D0D7),數(shù)據(jù)位前面一位(D0前一位)是起始位,表明這幀數(shù)據(jù)的開始,數(shù)據(jù)位后面一位(D7后一位)是停止位,表明數(shù)據(jù)傳送的結(jié)束??臻e的地方表示沒有數(shù)據(jù)的傳輸。方式1的數(shù)據(jù)輸出時序圖圖7- 2 方式1的數(shù)據(jù)輸出時序圖單片機(jī)要發(fā)送數(shù)據(jù)出去,必須先把要發(fā)送的數(shù)據(jù)寫入發(fā)送緩沖器(SBUF)中,再由SBUF將數(shù)據(jù)傳到TXD引腳上,最后把數(shù)據(jù)發(fā)送出去。如圖,首先看圖的最上面,寫入SBUF,左邊有個突起的部分,這表示我們把數(shù)據(jù)寫入SBUF中了,然后看圖的中間部分TXD,寫入數(shù)據(jù)到SBUF后,TXD開始發(fā)一幀數(shù)據(jù)的起始位,然后發(fā)D0、D1、D2D7、停止位。最后看圖的最下方TI,當(dāng)數(shù)據(jù)發(fā)送到停止位時TI的圖像就有個上升的變化,其實(shí)是TI置1,TI起初是

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論