AVR單片機595驅動8位數碼管的顯示的電路實現_第1頁
AVR單片機595驅動8位數碼管的顯示的電路實現_第2頁
AVR單片機595驅動8位數碼管的顯示的電路實現_第3頁
AVR單片機595驅動8位數碼管的顯示的電路實現_第4頁
AVR單片機595驅動8位數碼管的顯示的電路實現_第5頁
已閱讀5頁,還剩2頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

-.z.AVR單片機595驅動數碼管顯示一、電路實現8位數碼管的電路如下圖所示數碼管是一種半導體發光器件,其基本單元是發光二極管。數碼管按段數分為七段數碼管和八段數碼管(還有一種“米”字型的數碼管,其段數更多),八段數碼管比七段數碼管多一個發光二極管單元(多一個小數點顯示),其基本原理是:將所有LED的一端(正極、負極均可)連在一起作為一個公共端,然后通過分別控制這組LED的另一個端口來使部分LED點亮,從而達到顯示一定字形的目的。數碼管的分類:按能顯示多少個“8”可分為1位、2位、4位等等數碼管;按發光二極管單元連接方式分為共陽極數碼管和共陰極數碼管。共陽數碼管是指將所有發光二極管的陽極接到一起形成公共陽極()的數碼管。共陽數碼管在應用時應將公共極接到+5V,當*一字段發光二極管的陰極為低電平時,相應字段就點亮。當*一字段的陰極為高電平時,相應字段就不亮。。共陰數碼管是指將所有發光二極管的陰極接到一起形成公共陰極()的數碼管。共陰數碼管在應用時應將公共極接到地線GND上,當*一字段發光二極管的陽極為高電平時,相應字段就點亮。當*一字段的陽極為低電平時,相應字段就不亮。我們在實際使用中一定要搞清楚數碼管是共陰極的還是共陽極的。數碼管段、位引腳的確定(以4位8段數碼管為例),我們在實際應用中購買的數碼管不像電阻、電容、集成等元件那樣有數據手冊或者直接在元件上標明管腳序號和用途,并且市場上數碼管的管腳排列順序并不是一致的,所以我們購買回來的數碼管一般都要親自測量一下各個引腳的用途,怎么測量呢?數碼管引腳測量分三步:極性判斷(共陽極還是共陰極)、公共端判斷(位選端口)、段碼端判斷(段選端口)。首先要確定數碼管是共陰極還是共陽極的:找一個3到5V的直流電源,準備幾個1K或者幾百歐姆的電阻。將電源的正極串接一個電阻后連在數碼管的任意一個腳上,然后將電源的負極逐個接到數碼管的其余引腳上,觀察數碼管的*一段是否會點亮,如果全部引腳試過都沒有亮的,則將電源正極(串電阻)換一個引腳再試,直到有一個LED發光,這時固定電源負極不動,電源正極(串電阻)逐個接到數碼管的其余引腳上,如果有8段LED都亮,說明該數碼管是共陰極的。相反,按住電源正極不動,電源負極逐個接到數碼管的其余引腳上,如果有8個數碼管全亮,則該數碼管是共陽極的。確定了數碼管的極性后,下面該確定數碼管的位選端口了。仍舊按照第一步的測量方法,如果測量過程中發現當一個引腳固定后,逐個連接到其余端口上的時候,會有一個數碼管的所有段都被點亮了,則這個固定端就是一個位選端。依照這種方法依次找出其余的3個位選端即可。最后確定段選端口,根據數碼管的極性將電源正極(串電阻)或負極固定在一個位選端上,然后將電源的另一端逐個連接數碼管的位選端口以外的引腳,當接到一個引腳上數碼管的哪一段點亮,就能夠確定該引腳對應那一段了,依次量出全部8段分別對應那個引腳。經過上面的步驟后,我們就完成了數碼管引腳的確定,其實在實際使用過程中,操作熟練的話是不必經過這么繁瑣的步驟來確定數碼管的引腳的。數碼管的驅動方式:數碼管要正常顯示,就要用驅動電路來驅動數碼管的各個段碼,從而顯示出我們要的數字,根據數碼管的驅動方式的不同,可以分為靜態式和動態式兩類。①靜態顯示驅動:靜態驅動也稱直流驅動。靜態驅動是指將公共端接到電源正極或者電源地上,每個數碼管的每一個段碼都由一個單片機的I/O端口進行驅動,或者使用如BCD碼二-十進制譯碼器譯碼進行驅動。靜態驅動的優點是編程簡單,顯示亮度高,缺點是占用I/O端口多,如驅動5個數碼管靜態顯示則需要5×8=40根I/O端口來驅動,要知道一個89S51單片機可用的I/O端口才32個呢:),實際應用時必須增加譯碼驅動器進行驅動,增加了硬件電路的復雜性。②動態顯示驅動:數碼管動態顯示接口是單片機中應用最為廣泛的一種顯示方式之一,動態驅動是將所有數碼管的8個顯示筆劃"a,b,c,d,e,f,g,dp"的同名端連在一起,另外為每個數碼管的公共極增加位選通控制電路,位選通由各自獨立的I/O線控制,當單片機輸出字形碼時,所有數碼管都接收到相同的字形碼,但究竟是那個數碼管會顯示出字形,取決于單片機對位選通端電路的控制,所以我們只要將需要顯示的數碼管的選通控制打開,該位就顯示出字形,沒有選通的數碼管就不會亮。通過分時輪流控制各個數碼管的的端,就使各個數碼管輪流受控顯示,這就是動態驅動。在輪流顯示過程中,每位數碼管的點亮時間為1~2ms,由于人的視覺暫留現象及發光二極管的余輝效應,盡管實際上各位數碼管并非同時點亮,但只要掃描的速度足夠快,給人的印象就是一組穩定的顯示數據,不會有閃爍感,動態顯示的效果和靜態顯示是一樣的,能夠節省大量的I/O端口,而且功耗更低。在實際使用中,通常都是采用動態顯示驅動的方法。在本實例中我們就是采用的動態驅動的方法。數碼管的性能參數:電流:靜態時,推薦使用10-15mA;動態時,16/1動態掃描時,平均電流為4-5mA,峰值電流50-60mA。電壓:查引腳排布圖,看一下每段的芯片數量是多少?當紅色時,使用1.9V乘以每段的芯片串聯的個數;當數碼管的LED為綠色時,使用2.1V乘以每段的芯片串聯的個數。74HC595功能描述在本實例中我們使用了一片74HC595來驅動8位數碼管的位選端口,下面就簡單介紹一下74HC595的功能。74HC595是帶鎖存功能的三態輸出的8位串行輸入/并行輸出的移位寄存器。由于它自帶鎖存器,所以其數據在移位寄存器中的移位與鎖存器的輸出是獨立的,當數據移位時,可以保持鎖存器輸出的數據不改變,等所有8位數據全部串入完成移位操作后,一次性的將數據打入鎖存器中,從而實現了并行輸出的同步改變。另外該芯片可以進行級聯,能夠實現8*n個并口擴展。下圖是74HC595的邏輯功能表74HC595管腳描述:QA--QH:八位并行輸出端,可以直接控制數碼管的8個段。QH':級聯輸出端。我將它接下一個595的SI端。SI:串行數據輸入端。74595的控制端說明:/SCLR(10腳):復位引腳,低電平時將移位寄存器的數據清零。一般情況下接Vcc。SCK(11腳):時鐘引腳,上升沿時數據寄存器的數據移位。QA-->QB-->QC-->...-->QH;下降沿移位寄存器數據不變。(脈沖寬度:5V時,大于幾十納秒就行了。RCK(12腳):鎖存引腳,上升沿時移位寄存器的數據進入數據存儲寄存器,下降沿時存儲寄存器數據不變。通常將RCK置為低電平,當移位結束后,在RCK端產生一個正脈沖(5V時,大于幾十納秒就行了),更新顯示數據。/G(13腳):使能引腳。高電平時禁止輸出(高阻態)。如果單片機的引腳不緊,用一個引腳控制它,可以方便地產生閃爍和熄滅效果。比通過數據端移位控制要省時省力,通常可以直接接地GND。A(14腳):數據串入引腳。74595的主要優點是具有數據存儲寄存器,在移位的過程中,輸出端的數據可以保持不變。這在串行速度慢的場合很有用處,數碼管沒有閃爍感。74HC595還具有SPI功能,但在本例中我們先不使用,我們直接用單片機的普通I/O口模擬74HC595的時序來實現數據的串入并出功能。從74HC595的邏輯功能表中我們可以分析出74HC595的工作過程:數據的串入和部數據移位的操作由SCLK控制。SCLK的上升沿將移位寄存器中的數據由Qa向Qh依次移動一位,同時將數據線上的電平打入Qa,而最高位的數據Qh從SQh端移出。如果把SQh與另一片74HC595的數據端連接,則SQh的串行輸出就是第2片74HC595的串行數據輸入,從而實現級聯。74HC595在移位的過程中并不影響其鎖存器的輸出,移位寄存器中的數據是通過鎖存端的上升沿打入到鎖存器中的。正是由于74HC595具備了鎖存功能,因而可以保證并行輸出數據的穩定和數據同步改變的功能。經過以上分析我們可以得出74HC595控制數據輸入輸出的實現步驟:1、在SCLK上升沿期間將數據端串入的數據經過發送到移位寄存器中,如果需要發送8位的數據,則需要8個SCLK上升沿才能將8位數據全部輸入到移位寄存器中。2、使鎖存端產生一個上升沿,從而將移位寄存器中的數據打入到鎖存器中并輸出。本實例中8位數碼管顯示電路的工作原理:8位數碼管的8個段選端口全部并聯接到單片機的PB口上。74HC595控制8位數碼管的8個位選端,當*位選通后,點亮該位的數碼管,使它顯示相應的數字。今天就講到這里吧,下一節我們再介紹8位數碼管顯示的程序實現。我們接著來完成8位數碼管的顯示實驗。現在我們開始動手編寫程序;根據前面的介紹,我們應該已經能夠知道編寫一個AVR單片機的C語言程序的基本步驟和方法了。下面給出這個程序的主程序文件,在這個程序中我們應該能夠知道這個程序都包含了那幾塊,具體來說我們應該能夠在這個程序中把以下幾個部分找出來:預編譯語句、全局變量的定義、函數的聲明、主函數、函數定義。如果你還不能夠準確找出這幾部分,則需要把前面的容再詳細閱讀一下。主程序代碼*include<avr/io.h>//io端口寄存器配置文件,必須包含*include<util/delay.h>//GCC中的延時函數頭文件*include"hc595.h"http://unsignedcharLed_Disbuf[10]={0*3F,0*06,0*5B,0*4F,0*66,0*6D,0*7D,0*07,0*7F,0*6F};//共陰極unsignedcharLed_Disbuf[10]={0*C0,0*F9,0*A4,0*B0,0*99,0*92,0*82,0*F8,0*80,0*90};//共陽極unsignedcharBuf[8]={0*01,0*02,0*04,0*08,0*10,0*20,0*40,0*80};//函數聲明e*ternvoidDelayus(unsignedintlus);//us延時函數e*ternvoidDelayms(unsignedintlms);//ms延時函數intmain(void)//GCC中main文件必須為返回整形值的函數,沒有參數{unsignedchari;PORTB=0*ff;//PORTB輸出低電平,使LED熄滅DDRB=0*FF;//配置端口PB全部為輸出口HC595_port_init();while(1){for(i=0;i<8;i++){PORTB=Led_Disbuf[i];//送段碼HC595_Send_Data(Buf[i]);//選通位選端口Delayus(70);//延時HC595_Send_Data(0*00);//位選通關閉}}}//us級別的延時函數voidDelayus(unsignedintlus){while(lus--){_delay_loop_2(4);//_delay_loop_2(1)是延時4個時鐘周期,參數為4則延時16//個時鐘周期,本實驗用16M晶體,則16個時鐘周期為16/16=1us}}//ms級別的延時函數voidDelayms(unsignedintlms){while(lms--){Delayus(1000);//延時1ms}}在這個主程序文件中有人可能會注意到有一些我們前面沒有介紹過的容,比如e*tern這個單詞,它在這里起什么作用?這就牽涉到C語言的關鍵字了,關于C語言的關鍵字,我們可以到相關的C語言教材中去做詳細了解,在這里我們只針對e*tern這個關鍵字作出解釋,我們注意到e*tern用在一個函數聲明的地方,它的作用就是把這個函數聲明為外部函數,這樣我們在整個項目的所有文件中就都可以調用這個函數了。同理e*tern也可以用來聲明一個變量為外部變量。我們可能還會有一個疑惑:*include"hc595.h"這個頭文件包含語句中的hc595.h有什么作用,它是GCC提供的還是我們自己編寫的?這里我們就要學習C語言中的一個重要的概念:模塊化程序設計。何為模塊化程序設計?它實現什么功能?如果要鋪開來講的話,可能需要一本書的容。我們耗不起這個時間和精力。其實我們只需要知道,模塊化程序設計是為了簡化程序容量而采取的一種將一個程序分成不同的模塊,然后通過特定的方法將這些模塊組合起來共同完成同一個目標。通俗的說就是化整為零。在我們剛開始學習單片機的時候,我們編寫的程序都很簡單,程序量也不大,所以往往涉及不到模塊化程序設計,但是這是一種很好的編程思路,我們有必要掌握。本實例就是采用的這種方法。模塊化程序設計的思路是:將實現相同功能的程序單獨編寫,然后實現一個綜合的功能,舉個例子,我們想實現一個液晶顯示的溫度測量程序,則我們可以把液晶顯示相關的程序放在一個文件中,把溫度測量的程序放在另一個文件中,最后在主程序中調用這兩個文件來實現整體的功能。通常我們在進行模塊化程序設計的時候,常常將變量定義,端口設置,函數聲明等部分保存在一個.h文件中,而將函數定義部分放在一個.c文件中,在編寫主程序文件的時候,用預處理命令*include將.h文件包含起來,而在編譯的時候將所有用到的.c文件一起編譯。這樣就實現了模塊化文件的整合。在本實例中,我們將74HC595相關的變量定義,端口定義,函數聲明放在74HC595.h文件中,而主程序中的*include"hc595.h"這句話實現了將這個文件包含到主程序中的功能。下面是本實例中模塊化程序設計的.h文件/*****************************74hc595.h***********************************//*74hc595與單片機的引腳連接/MR(10腳)VCC低點平時將移位寄存器的數據清零。通常將它接Vcc/OE(13腳)PG4高電平時禁止輸出(高阻態)。如果單片機的引腳不緊,用一個引腳控制它,可以方便地產生閃爍和熄滅效果。比通過數據端移位控制要省時省力。ST_CP(12腳)PG1上升沿時移位寄存器的數據進入數據存儲寄存器,下降沿時存儲寄存器數據不變。通常將RCK置為低電平,當移位結束后,在RCK端產生一個正脈沖(5V時,大于幾十納秒就行了。通常都選微秒級),更新顯示數據。SH_CP(11腳)PG0上升沿時數據寄存器的數據移位。QA-->QB-->QC-->...-->QH;下降沿移位寄存器數據不變。(脈沖寬度:5V時,大于幾十納秒就行了。通常都選微秒級)DS(14)PG2串行數據輸入端。*/*ifndef__HC595_H__*define__HC595_H__*include<avr/io.h>//io端口寄存器配置文件,必須包含*include<util/delay.h>//GCC中的延時函數頭文件*defineHC595_latch(1<<PG1)//上升沿數據打入8位鎖存器,下降沿鎖存器數據不變*defineHC595_sclk(1<<PG0)//上升沿數據移位,下降沿數據不變*defineHC595_oe(1<<PG4)//低電平,8位數據鎖存器輸出,高電平輸出高組態*defineHC595_data(1<<PG2)//串行數據輸入端*defineSET_HC595_latch(PORTG|=(1<<PG1))*defineCLR_HC595_latch(PORTG&=~(1<<PG1))*defineSET_HC595_sclk(PORTG|=(1<<PG0))*defineCLR_HC595_sclk(PORTG&=~(1<<PG0))*defineSET_HC595_data(PORTG|=(1<<PG2))*defineCLR_HC595_data(PORTG&=~(1<<PG2))*defineSET_HC595_oe(PORTG|=(1<<PG4))*defineCLR_HC595_oe(PORTG&=~(1<<PG4))voidHC595_port_init(void);//595端口初始化voidHC595_Send_Data(unsignedcharbyte);//發送一個字節voidHC595_Output_Data(unsignedchardata);//發送字符串*endif同時我們將與74HC595相關的函數定義部分放在74HC595.c文件中,如下/********************************74hc595.c**************************************/*include"hc595.h"http://595端口初始化voidHC595_port_init(void){PORTG=0*00;DDRG|=(1<<PG0)|(1<<PG1)|(1<<PG2)|(1<<P

溫馨提示

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

評論

0/150

提交評論