




已閱讀5頁,還剩34頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第一天 認識單片機一、什么是單片機 什么是單片機?按照比較正規(guī)的定義,所謂單片機,就是把中央處理器、存儲器、定時器、I/O接口等一些計算機功能部件集成在一塊電路芯片上的微型計算機。什么又是中央處理器、存儲器、定時器和I/O接口呢?簡單來說,中央處理器就是所謂的CPU,就相當于人的大腦。存儲器顧名思義就是一種能存儲數據的元件,比如我們寫的程序就可以存放在這里面。I/O接口就是輸入/輸出端口,數據可以通過這樣的端口輸入或輸出CPU。我們把這些東西整合到一塊很小的芯片上,就成為了單片機。二、單片機可以做什么單片機用來干什么呢?用最通俗的話講,它的作用就是實現智能控制。什么是智能控制呢?舉個簡單的例子,讓單片機按照我自己的想法來控制一個發(fā)光二極管的亮滅就是智能控制,那么我如何來做到呢?我將發(fā)光二極管的正極分別連在單片機一個引腳上,當連正極的引腳輸出高電平(可以暫時理解為高電壓),連負極的引腳輸出低電平(同上,低電壓)時,由于二極管兩端電壓差,因此二極管點亮,當兩個引腳都是相同電壓,發(fā)光二極管熄滅。單片機如何知道我希望二極管什么時候點亮,亮多久呢?這就需要我們將自己的意愿通過編寫程序下載進入單片機中進行執(zhí)行,讓它按照我們的意愿在引腳輸出高低電平,從而控制發(fā)光二極管的亮滅。三、單片機結構單片機長什么樣?如圖所示就是一個單片機的外形,我們可以看到,單片機不過就是一塊有很多腳的芯片,我們稱這些“腳”叫做“引腳”。單片機就是通過這些引腳對外界進行智能控制的。圖1- 1我們學習單片機,首先要知道這些引腳的作用是什么,如圖所示,讓我們一起來認識這些引腳。1、區(qū)分芯片引腳序號我們可以在單片機表面上找到一個凹進去的小圓坑,這個小圓坑所對應的引腳就是第1引腳,然后按逆時針方向數下去,一直到最后一個引腳。如圖所示一共有40個引腳。2、 電源引腳和時鐘引腳圖中第20腳GND和第40腳Vcc為電源引腳,給單片機供電。第18腳和19腳為時鐘引腳,大家可以暫時不用了解。3、I/O口引腳圖1- 2 四、學習單片機必備基礎知識1、電平的概念什么是電平?“電平”就是指電路中兩點在相同阻抗(“阻抗”可以理解為電阻)下電量的相對比值。舉個例子,人們在初學“電”的時候,往往把往往把抽象的電學概念用水的具體現象進行比喻。如水流比電流、水壓似電壓。解釋“電平”不妨如法炮制。我們用“水平”來比喻“電平”如人們常說到張某工作很有水平、李某辦事水平很差。這樣的話都知其含義所在。即指“張某”與“李某”相比而言。電平就是指電路中兩點電量(“電量”可理解為電壓)的比較。學習單片機只需了解兩種電平:高電平和低電平,我們定義單片機輸入與輸出的為TTL電平,其中高電平為+5V,低電平為0V。什么是TTL電平?TTL電平采用二進制規(guī)定,+5V等價于邏輯“1”,0V等價于邏輯“0”。這樣一來,我們在編寫程序中如果對某個引腳賦值為“1”那個引腳就輸出高電平,同理,若我們賦值為“0”,對應的引腳就輸出低電平。2、二進制與十六進制 邏輯運算大家都知道,十進制的特點是“逢十進一,借一當十”。同理,二進制的特點就是“逢二進一,借一當二”。在二進制中只有“0”和“1”,比如1110 0101B(“B”為二進制后綴)就是二進制。那么,二進制和十進制如何轉化呢?舉個例子,二進制11010011B轉化為十進制就是 十六進制與二進制大同小異,十六進制為“逢十六進一,借一當十六”。十進制中0-15用十六進制表示為0-9,A,B,C,D,E,F,即十進制中10對應十六進制A,11對應B當我們寫的是十六進制時,要在前面加上0x(注意0是“零”不是字母O),舉個例子,十六進制0x7f換算成二進制為“0111 1111”換算成十進制為715十進制二進制十六進制十進制二進制十六進制0008100081119100192102101010A3113111011B41004121100C51015131101D61106141110E71117151111F表1- 1邏輯運算“與”運算是實現“必須都有,否則就沒有”這種邏輯關系的運算,其運算符為“&”,運算規(guī)則為:0&0=0,0&1=1&0=0,1&1=1. “或”運算是實現“只要其中之一有就有”這種邏輯關系的運算,其運算符為“|”,運算規(guī)則為:0|0=0,0|1=1|0=1,1|1=1 “非”運算是實現“求反”這種邏輯關系的運算,其運算符為“!”,運算規(guī)則為:!0=1,!1=03、單片機最小系統(tǒng)很多初學者容易把單片機開發(fā)板誤認作單片機,實際上這是不對的,單片機只是一塊小小的集成芯片,但如果只是一塊芯片無法實現其功能, 我們要想要單片機運行起來,至少應該給它提供一個電源吧?下面所講的單片機最小基本電路就是一個單片機能運行的最基本條件。我們平時所使用的單片機開發(fā)板,無非就是把這個基本電路和一些其他電路整合在一塊電路板上,有了這些基本電路,你們自己都可以設計制作出單片機開發(fā)板。圖1- 3在上圖中,除了單片機外實際上只有三個電路,分別是電源電路、晶振電路和復位電路,下面簡單介紹這三個電路,大家只需要知道其作用就行了。1) 電源電路電源電路非常簡單,就是給單片機提供電源。2) 晶振電路晶振電路的作用就是為系統(tǒng)系統(tǒng)提供基本的時鐘信號,形象的說,晶振電路就像單片機的心臟一樣,如果沒有晶振,單片機就停滯在那里不能一步步執(zhí)行程序。3) 復位電路復位電路就是讓單片機能夠進行清零復位,讓單片機重新開始從頭開始執(zhí)行程序(從頭工作),它分為上電復位和按鍵復位兩種,也就是說,當你剛剛給單片機通電時,它就進行了一次復位,當有電時你按下復位鍵,它也能進行復位。第二天 I/O口介紹及其應用一、什么是I/O口我們的單片機能接收到外部的輸入信號(包括數據、指令等),并能對其進行處理,再輸出信號,控制其外圍連接電路,以實現我們想要實現的功能。但單片機怎樣與外圍電路進行通訊呢?這就需要用到I/O。什么又是I/O口呢?它的中文全稱叫作輸入與輸出端口,也就是說我們的數據是通過I/O口傳輸的。單片機包括四個I/O口,分別是P0,P1,P2,P3,每個口有8個引腳。什么又是引腳呢?所謂單片機的引腳,就是連接單片機內部電路和外部電路的橋梁,就像電阻的兩支管腳。但單片機的引腳不止2個,我們較常用的AT89C51型號的單片機就有40個引腳(如圖2.1)。圖2- 1 AT89C51單片機的引腳以AT89C51型號的單片機為例(較常用的都是40支引腳的51單片機,但也有20,28,32,44等不同引腳數的51單片機,這些大家在以后的學習過程中也要了解,不要只見了40引腳的芯片才認為它是51單片機)。四個I/O口,共32支引腳。其余8支引腳有著其他的功能,如電源引腳(VCC,GND)、時鐘引腳(XTAL1、XTAL2)等。在這兒,我們主要了解I/O口引腳。二、I/O口的工作原理 I/O口它們是怎樣工作的呢? 單片機是一種數字集成芯片,而數字電路只認兩種電平:高電平(二進制代碼為1)、低電平(二進制代碼為0)。我們就是通過給I/O口賦高低電平來控制外圍電路。舉個點亮發(fā)光二極管的簡單例子來說明I/O口的工作原理。大家都知道二極管具有單向導電性,只有當二極管正極電壓高于負極電壓,發(fā)光二極管才能發(fā)光。如圖:圖2- 2 單片機控制發(fā)光二極管電路二極管的正極連在電源上,負極接在單片機的P2.0引腳上,若此時P2.0為低電平(0V),則二極管導通,二極管發(fā)光。若P2.0為高電平(+5V),二極管不能導通,則不能發(fā)光。從點亮一個發(fā)光二極管的例子,我們了解到,通過給單片機的一個I/O口的引腳賦高、低電平這種控制手段,我們可以使單片機控制一個簡單的外圍電路(發(fā)光二極管電路)。但我們怎么來控制復雜的外圍電路呢?上面的例子怎么才用到32支I/O口引腳中的一支呢?4個I/O口共32個引腳,試想,一個引腳控制一個簡單的外圍電路,一個外圍電路不外乎就兩種情況,引腳為高電平或低電平。4個I/O口(32個引腳)同時用上,用排列組合的知識就可以算出,這4個I/O口控制的結果將會是多少種情況,控制的電路將會是多么的復雜,由此我們也可以看出單片機的功能是多么的強大。上面說了這么多,我們可以將其歸根到一點,就是:我們是通過給I/O口賦值(賦1或0),使I/O口輸出高、低電平,從而控制外圍電路。三、怎樣使用I/O口上面我們介紹了什么是I/O口及其工作原理,下面我們就來實踐演練一下。1、先來看點亮一個發(fā)光二極管的實例,硬件連接如圖圖2- 3 LED連接圖分析:二極管負極連在P1.0上,我們只需給P1.0一個低電平即可點亮它。程序如下:#include /52系列單片機頭文件sbit led1=P10; /聲明單片機P1口的第一位void main() /主函數 Led1=0; /*點亮發(fā)光二極管*/也許大家看到這個簡單的C程序,也是一頭霧水。它為什么要聲明單片機P1口的第一位P1.0呢?(注:P1.0口在C程序中是用P10來表示的)。為什么不直接使P10=0呢?這是因為我們若要控制某個發(fā)光二極管(上圖是D1),也就是要控制單片機I/O口的某一位(上圖是P1.0),必定要聲明這一位,否則單片機不知道我們要操作的是什么東西,所以我們在程序中聲明了單片機P1口的第一位(sbit是一個聲明位的操作,相當于C程序中要用到整型時,用int來聲明)。比如,我們想給P1.0一個高電平,我們直接給led1賦值1就行了。由于LED正常發(fā)光時其兩端的電壓約為1.7V,如果不接限流電阻,LED兩端的電壓要么為5V,要么為0V,當5V時很可能燒壞LED,所以我們還得給它加上一個限流電阻R(一般為1K)。2、點亮多個LED如圖,我們要控制第1, 3, 5,7個亮,第2,4,6,8個滅該怎么辦呢?當然,我們可以以上面的方法(單獨控制一個引腳)來實現,下面我們介紹一種更為簡單的方法(同時控制一個I/O口的8個引腳)。圖2- 4 單片機控制流水的電路圖P1口共8個引腳,每個引腳對應一個二進制位。8個引腳即八個二進制位。P1.0對應最低位,P1.7對應第8位。如我們對P1口賦值1011 1110,則P1口的第一引腳和第七引腳為低電平,其它引腳為高電平。上面的電路圖我們只畫了控制外圍電路部分,而單片機自身的電源電路等都沒畫出來,但不等于沒有,因為它也需要電源給其供電才能正常工作。如上圖所示, 8個LED正極端已于+5V的直流電源相連(我們稱之為共陽極接法),都獲得了一個高電平,它們的負極端又分別與P1端口的8個引腳相連,只要我們控制P1端口八個引腳的電平輸入,我們就能分別控制8個LED的亮與滅。程序如下:#include /52系列單片機頭文件void main() /主函數 P1=0xaa; /*對P1口的8個引腳進行位操作*/ 注意區(qū)別上一個C程序,這里不再對P1口的某一位進行聲明,而是在主函數中直接對單片機P1口的8個引腳進行操作,“0x”表示十六進制數,轉換成二進制是10101010,那么對應的發(fā)光二極管負極端獲得的高低電平如表1.4。 LEDD1D2D3D4D5D6D7D8負極端電平01010101表2- 1這就實現了1, 3, 5,7亮,2,4,6,8滅。我們將0xaa轉換成十進制后為170,也可以直接對P1口進行十進制數的賦值,如“P1=170;”,其效果是一樣的,只是麻煩了許多。因為無論是幾進制的數,在單片機內部都是以二進制數形式存在的,只要是同一個數值的數,其在單片機內部都是用二進制的同一種形態(tài)來表示。上面介紹了如何點亮一個發(fā)光二極管,如何控制流水燈的亮與滅。如果你能控制流水燈,使它們能按你的意愿亮與滅,可以這么說,你對單片機已經入門了。第三天 按鍵原理及其應用一、什么是按鍵提到按鍵大家都不會陌生,如圖所示為51單片機開發(fā)板上的按鍵實物圖和電路圖,它可以通過跳帽(就是一根短接線)切換成獨立按鍵或矩陣鍵盤兩種模式,J11是由三根插針(圖中標號1、2、3)組成。當我們使用獨立按鍵時,應該把跳帽跳到左端(相當于讓1、2短接),當我們使用矩陣鍵盤時,應該把跳帽跳到右端(相當于讓2、3短接)。圖3- 1 按鍵實物圖圖3- 2 按鍵電路圖大家可能會問,什么又是獨立按鍵和矩陣按鍵呢?當我們使用獨立按鍵時,只有S1、S2、S3、S4四個按鍵能夠工作,其他按鍵是不工作的。當我們需要多于四個按鍵的時候,我們可以使用矩陣鍵盤,也就是一共4*4=16個按鍵可以工作。當然,矩陣鍵盤的程序要復雜的多。二、按鍵是如何工作的按鍵原理非常簡單,當你用手按下時開關閉合,線路導通,松手時開關斷開,線路斷開。它是如何與單片機聯(lián)系起來,達到控制的目的呢?這里我們就需要按鍵檢測程序,我們知道,I/O口既可以做輸入口又可以做輸出口,在這里我們就要用到其輸入功能,我們可以把按鍵的一端接地,另一端與單片機某個I/O口相連,開始時先給該I/O口賦一高電平(實際上如果沒有對I/O口賦值,I/O口都默認為高電平),然后讓單片機不斷檢測該I/O口是否變?yōu)榈碗娖剑敯存I閉合時,即相當于該I/O口通過按鍵與地相連,變?yōu)榈碗娖?,一旦程序檢測到I/O口變?yōu)榈碗娖絼t說明按鍵被按下,然后執(zhí)行相應的指令。 按鍵連接方法很簡單,如圖所示,按鍵一端接地,另一端接與單片機任一I/O口相連,按鍵在被按下時,其觸電電壓變化過程如圖圖3- 3 從圖中可以看出,在實際情況下,我們在按下和釋放按鍵的瞬間都會有抖動現象,抖動時間一般在5-10ms。在抖動的這段時間里電壓是不穩(wěn)定的,因此單片機在檢測鍵盤是否按下時都要加上去抖動操作,也就是把抖動時間給排除掉,一般我們用軟件延時的方法就能解決這個問題。在編寫按鍵程序時,需要在檢測按下時加入去抖動的延時函數。三、如何編寫按鍵檢測程序 如圖所示為按鍵檢測流程圖開始延時檢測是否有鍵按下檢測是否有鍵按下執(zhí)行相應程序YYNN四、按鍵檢測實例程序圖3- 4 按鍵控制LED電路圖如圖3-4所示是一個用S1、S2兩個按鍵控制LED亮滅的電路仿真圖,它實現的功能是:按下S1,LED亮,按下S2,LED滅。我們結合這個電路的程序,讓大家對按鍵有一個基本的認識。程序如下:#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次,當i減小到0時跳出循環(huán)/*- 主函數-*/main() while(1) if(S1=0) /如果S1等于0,說明按鍵1被按下 delay(1000); /進行去抖動處理 if(S1=0) LED1=0; /檢測按鍵確實按下,點亮LED1 if(S2=0) /如果S2等于0,說明按鍵2被按下 delay(1000); /去抖動處理 if(S2=0) LED1=1; /檢測按鍵確實按下,熄滅LED1 程序分析:主程序進來就一個while(1)死循環(huán),循環(huán)中檢測是S1還是S2按下,如果第一個按鍵S1按下,則S1等于0,然后延時一段時間再檢測S1是否還等于0,即去抖處理,如果S1還等于0,說明S1確實按下,就點亮LED1。如果第二個按鍵S2按下,則S2等于0,r然后延時一段時間再檢測S2是否還等于0,即去抖處理,如果S2還等于0,說明S2確實按下,就熄滅LED1。延時函數的原理就是,當單片機執(zhí)行一個while(i-)循環(huán)語句時,就消耗了一部分時間,時間的多少有i的初始值決定。第四天 數碼管介紹及其應用一、什么是數碼管圖4- 1 數碼管實物圖 數碼管是單片機系統(tǒng)中常用的顯示器件,每個數碼管由8段LED構成,組合起來可以顯示0,1,2,3,4,5,6,7,8,9和部分英文字母。二、數碼管的硬件結構共陽極共陰極 圖(a)是數碼管外觀圖,一位數碼管含有10個引腳,a,b,c,d,e,f,g,dp,和兩個GND,兩個GND是連在一起的。圖(b)是數碼管的內部結構圖。 圖(b)中又有兩種接法,一種是將8段LED的陰極(負極)一起連在接地端,稱為共陰極接法,一種是將8段LED的陽極(正極)一起連在+5V的電源上,稱為共陽極接法。三、數碼管的顯示原理使用LED顯示器時,要注意區(qū)分這兩種不同的接法。下面我們以共陽極數碼管為例介紹數碼管的編碼原理。假設我們要數碼管顯示2,那么就是要讓a,b,d,e,g亮,其它的不亮。若顯示8,那么就讓a,b,c,d,e,f,g亮,dp不亮。為了顯示數字或字符,必須對數字或字符進行編碼。七段數碼管加上一個小數點,共計8段。因此為LED顯示器提供的編碼正好是一個字節(jié)(8位)。每一位控制一段LED,對應關系如下表:D8D7D6D5D4D3D2D1dpgfedcba表4- 1其中,D1表示8位二進制位的第一位,D2表示8位二進制位的第二位,以此類推。如果我們要數碼管顯示2,即a,b,d,e,g亮,其它的不亮。因為數碼管是共陰的,所以給a,b,d,e,g賦0才亮,即1010 0100,即0xa4。 如果顯示8,即a,b,c,d,e,f,g亮,dp不亮。編碼1000 0000,即0x80。以下是共陽極編碼列表:顯示的數0123456789編碼0xc00xf90xa40xb00x990x920x820xf80x800x90表4- 2會編共陽的,就會編共陰的, 共陰極編碼列表如下:顯示的數0123456789編碼0x3f0x060x5b0x4f0x660x6d0x7d0x070x7f0x6f表4- 3四、程序示例 讓數碼管重復顯示0,1,28,9。數碼管(共陽)接在P2口上。硬件示意圖如下:圖4- 2 數碼管硬件電路圖分析:我們控制數碼管的顯示,數碼管的八個引腳是連在P2口的,所以就是對P2口賦值的過程。程序如下:#include void delay(int x) /延時函數 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。每兩個數之間有個延時,為什么要延時呢? 是因為我們的單片機處理速度是非常快的,不延時我們根本沒法看清數碼管顯示的是什么,所以必須要有延時。五、數碼管的動態(tài)掃描上面我們只講到了用一個I/O口控制1位數碼管的顯示,若是要控制兩個數碼管的顯示呢?很多人說用兩個I/O口,這個是可以實現的,但我們要控制8個數碼管呢,豈不是要8個I/O口嗎?51單片機只有4個I/O口,那不是不能控制8個數碼管了?所以為了節(jié)約51單片機的引腳資源,我們引入了數碼管的動態(tài)掃描。1、什么是動態(tài)掃描數碼管的動態(tài)掃描就是先讓第一位數碼管顯示,然后第一位滅,再讓第二位顯示,然后第二位滅,第n位數碼管顯示,然后第八位滅。然后重復上述狀態(tài),當顯示速度非常快的時候,我們看到的就是n位數碼管同時顯示。2、怎么實現動態(tài)掃描下面我們以四個數碼管(共陽極)的顯示為例講述動態(tài)掃描的使用方法四個數碼管的引腳連接圖如下:圖4- 3 四位數碼管電路圖四個數碼管的a腳連在一起,b腳連在一起,dp腳連在一起,每個數碼管的公共引腳(com)獨立,com腳接在一個三極管(Q3)上,大家先不用管三極管是怎么用的,你只需知道掃描信號有高電平時,掃描信號的那個端子就與(com)連通了,如掃描信號的A端為高電平,那么A端就與第四個數碼管的(com)接通了。如果我們要第一個數碼管顯示1,第一個數碼管顯示2,第一個數碼管顯示3,第一個數碼管顯示4。我們該怎么做?用動態(tài)掃描的方法第一步:先讓第一個數碼管顯示1,其它的關閉。給a,b,c,d,e,f,g,dp賦值,即0xf9,再給D端一個高電平(打開第一個數碼管),給ABC端低電平(關閉其它3個數碼管)。 第二步:先讓第二個數碼管顯示2,其它的關閉。給a,b,c,d,e,f,g,dp賦值,即0xa4,再給C端一個高電平(打開第二個數碼管),給ABD端低電平(關閉其它3個數碼管)。 第三步:先讓第三個數碼管顯示3,其它的關閉。給a,b,c,d,e,f,g,dp賦值,即0xb0,再給B端一個高電平(打開第三個數碼管),給ACD端低電平(關閉其它3個數碼管)。 第四步:先讓第四個數碼管顯示4,其它的關閉。給a,b,c,d,e,f,g,dp賦值,即0x99,再給A端一個高電平(打開第四個數碼管),給BCD端低電平(關閉其它3個數碼管)。重復上面四步,這就實現了動態(tài)掃描。3、應用實例假設a,b,c,d,e,f,g,dp接在P2口,信號端ABCD分別接在P3.0,P3.1,P3.2,P3.3上,硬件連接如圖所示:圖4- 4 四位數碼管仿真電路圖實現動態(tài)掃描的源程序如下:#includemain() int i; int dat=0xf9,0xa4,0xb0,0x99; /數組定義顯示數據1,2,3,4的編碼 int wei=0x01,0x02,0x04,0x08; /數碼管位數的編碼 for(i=0;i4;i+) P3=weii; /只打開第i個數碼管 P2=dati; /給數碼管顯示i的編碼 if(i= =4) i=0; /當i等于4時,讓i=0,從而不讓程序跳出for循環(huán) 程序分析: 主函數進來定義了兩個數組,dat用來顯示數據,wei用來控制顯示哪個數碼管。dat0表示數組中第一個數據,即0xf9, dat1表示數組中第二個數據,即0xa4, dat2表示數組中第三個數據,即0xb0, dat3表示數組中第四個數據,即0x99, 對于wei也是同樣的道理。 然后有個for循環(huán),i等于0時,第一個數碼管顯示1,i等于1時,即第二個數碼管顯示2,i等于2時,即第三個數碼管顯示3,i等于3時,即第一個數碼管顯示4,當i等于4時,給i賦值,讓i等于0,繼續(xù)下一次循環(huán)。因為單片機運算速度非???,如此循環(huán)下去,我們看到的就是四個數碼管同時顯示1234。第五天 中斷系統(tǒng)一、什么是中斷 單片機CPU在處理某一事件A時,發(fā)生了另一事件B請求CPU迅速去處理(中斷發(fā)生);CPU暫時中斷當前的工作,轉去處理事件B(中斷響應和中斷服務);待CPU將事件B處理完畢后,再回到原來事件A被中斷的地方繼續(xù)處理事件A(中斷返回),這一過程稱為中斷。 例如:當你正在洗衣時,突然手機響了(中斷發(fā)生),你暫時中斷洗衣的工作,轉去接電話(中斷響應和中斷服務),待你接完后,再回來繼續(xù)洗衣(中斷返回),這一過程就是中斷。二、中斷系統(tǒng)中斷系統(tǒng)結構圖如下:圖5- 1 中斷示意引起單片機的CPU中斷的根源,稱為中斷源。中斷源向CPU提出的中斷請求。CPU暫時中斷原來的事務A,轉去處理事件B,對事件B處理完畢后,再回到原來被中斷的地方(即斷點),稱為中斷返回。實現上述中斷功能的部件稱為中斷系統(tǒng)(中斷機構)。80C51的中斷系統(tǒng)有5個中斷源,也就是說有5種情況發(fā)生時,會使單片機停下來去處理中斷程序,5種中斷源分別為外部中斷0(INT0),外部中斷1(INT1),定時器中斷0(T0),定時器中斷1(T1)和串行口中斷。三、中斷的優(yōu)先級但兩個中斷同時發(fā)生時,我們的CPU會先響應哪個中斷呢?這就涉及到中斷優(yōu)先級的問題。默認狀態(tài)下,CPU會優(yōu)先響應中斷優(yōu)先級別高的中斷,當把優(yōu)先級高的中斷執(zhí)行完后,在回來執(zhí)行優(yōu)先級級別低的中斷。圖5- 2 中斷優(yōu)先級次示意圖51單片機的中斷級別如下:中斷源中斷優(yōu)先級級別中斷序號INT0(外部中斷0)最高0T0(定時器中斷0)第21INT1(外部中斷1)第32T1(定時器中斷1)第43TI/RI(串行口中斷)最低4表5- 180C51單片機的中斷優(yōu)先級有三條原則: CPU同時接收到幾個中斷時,首先響應優(yōu)先級別最高的中斷請求。 正在進行的中斷過程不能被新的同級或低優(yōu)先級的中斷請求所中斷。 正在進行的低優(yōu)先級中斷服務,能被高優(yōu)先級中斷請求所中斷。四、中斷的優(yōu)點對于單片機初學者會問到個問題:“中斷就是處理一事件(中斷子程序),用戶自定義一個子函數也可以處理呀,這中斷不就和子函數沒區(qū)別嗎?那還有什么用呢?”其實中斷的功能遠遠強于普通的子函數,下面我們來看看中斷的優(yōu)點 分時操作:CPU可以分時為多個I/O設備服務,提高了計算機的利用率 實時響應:CPU能夠及時處理應用系統(tǒng)的隨機事件,系統(tǒng)的實時性大大增強; 可靠性高:CPU具有處理設備故障及掉電等突發(fā)性事件能力,從而使系統(tǒng)可靠性提高。五、中斷響應條件 中斷源有中斷請求 此中斷源的中斷允許位為1 CPU開中斷(即EA=1)以上三條同時滿足時,CPU才有可能響應中斷。六、怎么使用中斷要使用中斷,首先要學會使用中斷允許寄存器,首先解釋一下什么叫寄存器。寄存器: 在單片機中,寄存器是個高頻詞,很多初學者不理解它,寄存器實質是一個存儲單元,51單片機的寄存器是8位的,可以存0000 00001111 1111,但寄存器的功能又比普通的存儲單元的功能強,向寄存器寫如不同的數,就能完成不同的動作,讓單片機實現不同的功能,這是普通存儲器所不能做到的。中斷允許寄存器如下:位序號76543210位符號EAET2ESET1EX1ET0EX0中斷允許位名稱總中斷無效位Timer2中斷串行口中斷Timer0中斷外部中斷0Timer0中斷外部中斷0表5- 2中斷寄存器共8位,每一位表示控制不同的子中斷。我們要開哪個中斷,就將該中斷的允許位賦1,要關哪個中斷,就將該中斷允許位賦0。如我們開串行口中斷,首先開總中斷,即EA=1;再開串行口中斷,即ES=1。這樣我們就完成了開串行口中斷的動作。大家很可能會問到:當中斷發(fā)生時,CPU怎么處理呢?這就涉及到中斷子程序了,中斷發(fā)生時CPU就立即停下當前動作,立刻跳至中斷子程序中。中斷子程序就是中斷時CPU要做的動作。下面介紹中斷子程序的寫法 void 函數名() interrupt 中斷號 中斷服務程序的內容 說明:中斷函數無返回值,所以最前面用void,中斷函數無任何參數,所以()中無任何內容,interrupt為中斷的英文名,中斷號是指單片機中幾種中斷源的序號。中斷的具體運用(定時器中斷)我們將在下一章介紹。第六天 定時器/計數器一、什么是定時器/計數器定時器/計數器是集成在單片機內部,能夠實現定時和計數的硬件結構(8051有兩個定時器Timer0和Timer1)。與軟件定時相比,增大了定時精確度,提高了CPU的利用率。二、定時器是怎么定時的定時器的實質是一個加1計數器(16位),加1計數器每個機器周期完成加1的動作,它由高8位和低8位兩個寄存器組成,最多能裝1111 1111 1111 1111。計數器從初始值開始不斷的加1,加到溢出值(上限值),定時時間就到了,此過程經歷的時間就是我們所定的時間。 說明:1個機器周期等于12個振蕩周期,振蕩周期即晶振振蕩的周期,也就是1/晶振頻率。 1、 計數原理 加1計數器(16位)每隔一個機器周期就加1,當加到計數器為全1時,即1111 1111 1111 1111。再過一個機器周期(再加1)就使計數器就溢出(溢出就是計數已經滿了,再加1就計數器容納不下了,這就是溢出), 如果定時/計數器工作于定時模式,則表示定時時間已到;如果工作于計數模式,則表示計數值已滿??梢?,由溢出時計數器的值減去計數初值才是加1計數器的計數值。說明: 讀者可能有疑問,上面不是說了寄存器是8位的嗎,這計數器為什么就16位呢?這其實是兩個寄存器(TLX和THX)組成一個16位的計數器。TLX計數器的低8位(16位二進制位的后8位),THX計數器的高8位(16位二進制位的前8位)說明:X可以是0或1,若計數器是Timer0,則X為0;若計數器是Timer1,則X為12、 定時原理設置為定時器模式時,加1計數器是對內部機器周期計數。計數值N乘以機器周期Tcy就是定時時間t 。例 利用定時/計數器T1的方式1,產生10ms的定時,設晶振頻率為12 MHz,計算計數初值X解:由于晶振為12 MHz,所以機器周期Tcy為1 ms。工作方式1,查表4-1知計數上限值為65536。所以:計數值Nt/ Tcy 10000/110000X計數上限值N=655361000055536三、 怎么使用定時器/計數器1、8051有兩個定時器Timer0和Timer1,每個定時器有四種工作模式。不同模式的計數范圍不同,其它區(qū)別大家現在不用關心。模式位數計數范圍Mode0130213(8191)Mode1160216(65536)Mode28028(255)Mode38028(255)表6- 1從上一章中斷的使用中,大家知道控制中斷就是向中斷允許寄存器寫數,那么同理可知,控制定時器就是向定時器控制寄存器(TCON)中寫數。我們可以單獨取一位處理寫,也可對T CON整體賦值。 定時器控制寄存器如下位序號76543210控制位名稱TR1TR0表6- 2TR1(TCON.6):T1(定時器1)運行控制位。TR1置1時,T1開始工作;TR1置0時,T1停止工作。TR1由軟件置1或清0。所以,用軟件可控制定時/計數器的啟動與停止。TR0(TCON.4):T0(定時器0)運行控制位,其功能與TR1類同。 我們只需掌握這兩位就夠了。2 、定時器是使用步驟:1) 設置定時器的工作方式。2) 計算初值,并將其寫入計數器。3) 開中斷。4) 開定時器。在此我們只介紹Timer0的工作模式1的使用,這個會了其它的也都會了,因為使用方法類似。 四、程序實例:控制LED每間隔50ms閃爍一次,即亮50ms滅50ms。LED連在P1.0上。用Timer0的工作方式1控制,晶振頻率12MHz。程序流程如如下:開始定時器初始化(開定時器)定時時間是否到 ?while(1)等待中斷中斷子程序(LED取反)YN首先,要計算定時器的計算初值,由于晶振為12 MHz,所以機器周期Tcy為1 ms。工作方式1,查表5-3知計數上限值為65536。所以:計數值Nt/ Tcy 50ms/1us50000X計數上限值N=655365000015536=0x3CB0將高8位賦給TH0,即TH0=0x3C,將低8位賦給TL0,即TL0=0xB0。程序如下:#include /包含頭文件,一般情況不需要改動。sbit LED=P10; /定義LED端口/*- 定時器初始化子程序-*/void Init_Timer0(void) TMOD = 0x01; /設定定時器為工作方式1,TMOD是設置定時器工作方式的寄存器,設置定時器方式的過程就是給TMOD賦值的過程。 TH0=0x3C; /將計數初值寫入計數器,這里使用定時器從15536開始計數一直到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 /* 注意,此初始化函數寫法完全符合上面說的定時器的使用步驟*/main() Init_Timer0(); /定時器初始化,利用函數調用的知識 while(1); /等待定時器中斷/*- 定時器中斷子程序-*/void Timer0_isr(void) interrupt 1 TH0=0x3C; /重新賦值,高8位為0x3C,即0011 1100 TL0=0xB0; / 低8位為0xB0,即1011 0000 LED=LED; /指示燈反相,可以看到閃爍程序解釋:main()主函數進來首先執(zhí)行Init_Timer0()定時器初始化子函數,即初始化定時器,什么是初始化定時器呢,就是設置好定時器的初始狀態(tài)。我們來看看Init_Timer0()是怎樣初始化的,首先,我們定義了Init_Timer0(),在定時器初始化子程序中,第一行TMOD = 0x01用于設定定時器工作模式為工作模式1,即16位計數器。TH0=0x3C定時器計數初值的高8位為0011 1100,TL0=0xB0定時器計數初值的低8位為1011 0000,TH0和TL0組合起來就16位,即計數器初值為0011 1100 1011 0000, 從0開始計數一直到1111 1111 1111 1111,即65535溢出。我們用到了定時器中斷,所以要開中斷,開中斷的順序是先開總中斷,即EA=1,再開定時器中斷,即ET0=1;最后打開定時器,讓定時器開始計時,即TR0=1.主函數第二條語句,while(1);是一個死循環(huán),一直執(zhí)行;即一直執(zhí)行空語句,什么也不做。既然什么都不做,那還要什么用呢,用處當然大了,它的作用是讓程序停止這里一直等待定時器中斷,即等到時間到后去執(zhí)行定時器中斷子程序。那么有人會問,時間到了干什么呢?這就要說到我們中斷子程序的作用了,定時時間一到,程序就不管while(1)這個死循環(huán)了,而是馬上跳到中斷子程序void Timer0_isr(void) interrupt 1中,跳進去后執(zhí)行TH0=0x3C;TL0=0xB0; 為計數器重新賦值,時間到后是1111 1111 1111 1111,我們要它重新計時,當然要重新賦初值0011 1100 1011 0000。重賦初值后LED=LED;是取反運算符,若起始狀態(tài)LED為1,取反后則為0,即實現了由亮到滅或由滅到亮的翻轉。執(zhí)行完LED=LED后跳出中斷等待下一次中斷的到來,從而實現了燈間隔1s閃爍的功能。第七天 串行口一、什么是串行口串行口(也叫串口)就是51單片機用于與其他外部設備通訊的一個接口,所以它的作用就是向外部發(fā)送數據和接收外部設備發(fā)來的數據。二、串行口是怎么工作的51單片機的串行口的基本工作原理是:通過數據發(fā)送引腳(TXD)將數據發(fā)送出去,通過數據接收引腳(RXD)接收外部數據。串行口的TXD(或RXD)只是一個引腳,是一位的,所以收發(fā)數據只能一位一位的進行。這就好比火車進隧道一樣,隧道的進口相當于RXD,最先進隧道的是火車頭(起始位),然后進去的是第一節(jié)車廂,第二節(jié)車廂第八節(jié)車廂,最后一節(jié)車廂(停止位),這樣一個過程就是接收數據的過程。隧道的出口相當于TXD,最先出隧道的是火車頭(起始位),然后出去的是第一節(jié)車廂,第二節(jié)車廂第八節(jié)車廂,最后一節(jié)車廂(停止位),這樣一個過程就是發(fā)送數據的過程。三、串行口的工作方式51單片機的串行口的工作方式有四種,方式0、方式1、方式2和方式3。最常用的是方式1,所以我們只介紹方式1的應用,實際方式1也完全夠用了。方式1是10位數據的異步通信口(就是說單片機每次只能接受或者發(fā)送10位數據)。10位數據中有1位起始位,8位數據位(實際傳送的數據),1位停止位。傳送一幀數據(一次發(fā)送的數據叫一幀)的格式如圖所示。 圖7- 1 數據傳送示意圖 說明:串行口實際傳輸的數據是中間8位(D0D7),數據位前面一位(D0前一位)是起始位,表明這幀數據的開始,數據位后面一位(D7后一位)是停止位,表明數據傳送的結束??臻e的地方表示沒有數據的傳輸。方式1的數據輸出時序圖圖7- 2 方式1的數據輸出時序圖單片機要發(fā)送數據出去,必須先把要發(fā)送的數據寫入發(fā)送緩沖器(SBUF)中,再由SBUF將數據傳到TXD引腳上,最后把數據發(fā)送出去。如圖,首先看圖的最上面,寫入SBUF,左邊有個突起的部分,這表示我們把數據寫入SBUF中了,然后看圖的中間部分TXD,寫入數據到SBUF后,TXD開始發(fā)一幀數據的起始位,然后發(fā)D0、D1、D2D7、停止位。最后看圖的最下方TI,當數據發(fā)送到停止位時TI的圖像就有個上升的變化,其實是TI置1,TI起初是
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030中國皮卡通行證行業(yè)深度研究及發(fā)展前景投資評估分析
- 2025至2030中國男性不育行業(yè)產業(yè)運行態(tài)勢及投資規(guī)劃深度研究報告
- 2025至2030中國電視媒體行業(yè)發(fā)展研究與產業(yè)戰(zhàn)略規(guī)劃分析評估報告
- 2025至2030中國電動調節(jié)儀表行業(yè)產業(yè)運行態(tài)勢及投資規(guī)劃深度研究報告
- 2025至2030中國生豬養(yǎng)殖行業(yè)市場發(fā)展分析及投資發(fā)展戰(zhàn)略前景預測報告
- 2025至2030中國牲豬飼料行業(yè)發(fā)展研究與產業(yè)戰(zhàn)略規(guī)劃分析評估報告
- 工廠秋季消防培訓
- 世界環(huán)保日培訓課件
- 從國家層面探討兒童的心理健康教育與疏導機制
- 基于心理測評的學生個性化教學方案設計
- UL4703標準中文版-2020光伏線UL中文版標準
- 勞務派遣服務投標文件(技術方案)
- 2024年變電設備檢修工(高級)技能鑒定理論考試題庫-上(選擇題)
- 酒店前臺案例分析
- 消防應急通信培訓
- 消防應急通信保障
- 中醫(yī)診所負責人合作協(xié)議書范文
- XX小學預防未成年人違法犯罪工作制度
- 火災自動報警系統(tǒng)查驗報告
- 四年級數學下冊 典型例題系列之第一單元:平移、旋轉和軸對稱的綜合作圖專項練習 帶解析(蘇教版)
- 科技助力鴨養(yǎng)殖提效
評論
0/150
提交評論