畢業(yè)設(shè)計---基于單片機(jī)的led顯示屏設(shè)計 (2)_第1頁
已閱讀1頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  1 緒論</b></p><p>  隨著人們生活環(huán)境的不斷改善和美化,在許多場合可以看到LED燈。在大型商場車站,地鐵站以及各類辦事窗口等越來越多的場所需要用LED點陣顯示漢字或者圖像。LED行業(yè)已成為一個快速發(fā)展的新興產(chǎn)業(yè),市場空間巨大,前景廣闊。LED顯示屏是利用發(fā)光二極管點陣模型或者像素單元組成平面的顯示屏幕。不但擁有色彩豐富,組態(tài)靈活,能夠適應(yīng)室內(nèi)外

2、各種環(huán)境的特點,還具有發(fā)光效率高,使用壽命長的優(yōu)勢。LED顯示屏經(jīng)歷了初期的不可更換顯示內(nèi)容,單色,雙色的圖文顯示到如今的可隨時更換顯示內(nèi)容,全彩色的視頻顯示,歷經(jīng)發(fā)展,LED顯示屏得到了廣泛的應(yīng)用和發(fā)展。</p><p>  LED點陣顯示屏概述</p><p>  目前,國內(nèi)的LED點陣顯示屏大部分是單顯示,其顯示的內(nèi)容相對較少,顯示花樣較單一。一般在產(chǎn)品出廠時,顯示內(nèi)容就已經(jīng)寫入顯示

3、屏控制系統(tǒng)中的EPROM芯片中,當(dāng)需要更換顯示內(nèi)容時就非常困難,這樣使該類型的顯示屏使用范圍受到了限制。國內(nèi)還有另一種LED顯示屏——可編程序型LED顯示屏,雖然增加了顯示屏系統(tǒng)的編程能力,顯示內(nèi)容和顯示花樣都有所增加,但也存在著更換顯示內(nèi)容不便的缺點。隨著社會經(jīng)濟(jì)的迅速發(fā)展,如今的廣告牌都存在著顯示內(nèi)容豐富,信息量大,信息更換速度快的特點。因此傳統(tǒng)的LED顯示屏控制系統(tǒng)已經(jīng)越來越不能滿足現(xiàn)代社會的需要。而利用PC機(jī)通信技術(shù)控制LED顯

4、示屏,則具有顯示內(nèi)容豐富,信息更換更靈活等優(yōu)點。LED點陣顯示屏是通過PC機(jī)將要顯示的漢字字模提取出來,并發(fā)送給單片機(jī),然后顯示在點陣屏上。單片機(jī)具有優(yōu)異的性價比、體積小、可靠性高、控制功能強(qiáng),廣泛應(yīng)用在智能儀表、機(jī)電一體化、實時過程控制、機(jī)器人、家用電器、模糊控制、通信系統(tǒng)等領(lǐng)域。</p><p>  1.2 LED顯示屏控制技術(shù)狀況</p><p>  LED漢字顯示的控制系統(tǒng)主

5、要有輸入接口電路、信號控制、轉(zhuǎn)換和數(shù)字化處理電路及其輸出接口電路等,雖然包括的相關(guān)技術(shù)比較多,但關(guān)鍵技術(shù)是串行傳輸與并行傳輸技術(shù)、動態(tài)掃描和靜態(tài)鎖存技術(shù)等。</p><p>  1.2.1 串行傳輸與并行傳輸技術(shù)</p><p>  LED漢字顯示屏的數(shù)據(jù)傳輸方式有串行和并行兩種。,目前主要采用的是串行控制技術(shù),即顯示屏每個單元內(nèi)部的不同驅(qū)動電路和各級聯(lián)動單元之間,每個時鐘只傳送一位數(shù)據(jù)

6、,此方式可有效減少顯示單元的數(shù)據(jù)傳輸驅(qū)動元件,從而提高整個系統(tǒng)的可靠性和性價比。</p><p>  1.2.2 動態(tài)掃描與靜態(tài)鎖存技術(shù)</p><p>  LED漢字顯示屏實現(xiàn)顯示信息的刷新技術(shù)有動態(tài)掃描和靜態(tài)鎖存兩種方式。安裝在室內(nèi)的顯示屏一般宜采用動態(tài)掃描技術(shù),也即是一行放光二極管共用一行驅(qū)動寄存器,根據(jù)共用一行驅(qū)動寄存器的發(fā)光二極管像素數(shù)目,可以分為1/4,1/16掃描等等。而安

7、裝在室外的顯示屏大多使用靜態(tài)鎖存技術(shù),也就是每一個發(fā)光一級管都對應(yīng)一個驅(qū)動寄存器,這樣就不需要分時工作,保證了每一個發(fā)光一級管的亮度占空比為100%。因為動態(tài)掃描法可以有效減少控制器的I/O口,應(yīng)用廣發(fā),本畢業(yè)設(shè)計也采用動態(tài)掃描。</p><p>  1.2.3 自動檢測與遠(yuǎn)程控制控制技術(shù)</p><p>  LED漢字顯示屏的構(gòu)成復(fù)雜,安裝位置,供電、周圍亮度、環(huán)境溫度等條件都直接影響

8、著顯示屏的正常工作與否。所以,在LED漢字顯示屏的控制系統(tǒng)中,不但需要對以上條件進(jìn)行自動檢測控制,還要實現(xiàn)能夠遠(yuǎn)程對顯示屏的亮度,色度,垂直位置,顯示內(nèi)容和工作方式的轉(zhuǎn)換的控制。</p><p>  2 總體方案論證及設(shè)計</p><p>  本畢業(yè)設(shè)計要求利用單片機(jī)設(shè)計出LED漢字顯示屏的控制系統(tǒng),本設(shè)計由四個部分構(gòu)成:LED點陣顯示條屏(LED驅(qū)動模塊)、譯碼驅(qū)動電路和移位寄存系

9、統(tǒng)(數(shù)據(jù)存儲模塊)、單片機(jī)控制系統(tǒng)(PC機(jī)通信模塊)。下面對各個模塊的設(shè)計逐一進(jìn)行論證比較。</p><p>  2.1 LED驅(qū)動模塊</p><p>  方案一:采用靜態(tài)鎖存方式,每一個LED發(fā)光管的一端接至單片機(jī)的一個I/O口,另一端通過電阻連接到電源。此方案可以直接驅(qū)動LED,原理簡單,驅(qū)動能力很強(qiáng),LED的亮度也可以通過限流電阻進(jìn)行適當(dāng)?shù)恼{(diào)節(jié),非常方便,但此方案過于浪費單片機(jī)

10、的I/O口,只適合適用于較小的系統(tǒng)。</p><p>  方案二:采用動態(tài)掃描方式,通過三極管驅(qū)動并聯(lián)在一起的LED發(fā)光管的一端(共陰或者共2端),LED發(fā)光管的另一腳連接通用I/O口,來控制LED亮滅。這種方法能同時驅(qū)動較多的LED,方式靈活,可以節(jié)省單片機(jī)的I/O口資源。</p><p>  比較兩種方案,本設(shè)計采用方案二。</p><p>  2.2 數(shù)據(jù)

11、存儲模塊</p><p>  方案一:采用靜態(tài)RAM存儲需要顯示的內(nèi)容,盡管靜態(tài)存儲器具有存儲內(nèi)容大,傳輸速度快的優(yōu)點,但是斷電后,其存儲的數(shù)據(jù)就會消失,所以不適合用于存儲固定或者長時間不變的數(shù)據(jù)。</p><p>  方案二:采用ROM存儲需要顯示的內(nèi)容,ROM可以長時間的存儲信息,并且掉電后數(shù)據(jù)不丟失,此種方案適合存儲不變的數(shù)據(jù)。</p><p>  方案三:采

12、用串行EEPROM存儲需要顯示的內(nèi)容。串行EEPROM技術(shù)幾乎擁有了所有類型存儲器的優(yōu)點:不易丟失、可更新、高性價比、低功耗。普遍適合應(yīng)用于各類工業(yè)測控系統(tǒng)。在速度要求不是很高的情況下,串行EEPROM(暫定使用24C256)是比較理想的選擇。</p><p>  以上方案,第三種方案有明顯的優(yōu)點,所以選擇方案三。</p><p>  2.3 本設(shè)計任務(wù)</p><

13、p>  綜合以上技術(shù)選擇的論述和LED的發(fā)展趨勢,本設(shè)計將以AT89C51單片機(jī)為核心,采用串行傳輸、動態(tài)掃描技術(shù)、制作一款擁有PC機(jī)通信功能的,模塊化LED多功能漢字顯示屏。</p><p>  2.4 總體硬件組成框圖</p><p>  3 系統(tǒng)硬件設(shè)計</p><p>  為使該模塊化LED顯示屏顯示屏控制系統(tǒng)具有更加方便的實用性和靈活性,需

14、要對系統(tǒng)的各個硬件進(jìn)行精心設(shè)計。其中硬件電路包括LED點陣顯示條屏、譯碼驅(qū)動電路、移位寄存系統(tǒng)、單片機(jī)控制系統(tǒng)等。</p><p>  3.1 LED點陣顯示條屏的硬件設(shè)計</p><p>  LED驅(qū)動模塊是LED顯示屏設(shè)計的關(guān)鍵部分,其驅(qū)動電路的設(shè)計合理與否直接關(guān)系到LED顯示屏的亮度、穩(wěn)定的重要指標(biāo)。本設(shè)計中LED的驅(qū)動采用三極管和74LS154實現(xiàn)的。</p>&

15、lt;p>  3.1.1 74LS154的簡單介紹</p><p>  74LS154是一個4—16譯碼器,主要電特性的典型值如下:</p><p>  當(dāng)選通端(G1、G2)均為低電平時,可將地址端(ABCD)的二進(jìn)制編碼在一個對應(yīng)的輸出端,以低電平譯出。</p><p>  若將 G1 和G2 中的一個作為數(shù)據(jù)輸入端,由ABCD 對輸出尋址,54/741

16、54 還可作1 線-16 線數(shù)據(jù)分配器</p><p><b>  真值表如下:</b></p><p>  74LS154的真值表</p><p>  3.1.2 驅(qū)動電路的設(shè)計</p><p>  該系統(tǒng)的驅(qū)動電路由74LS154與三極管共同組成的,原理圖如下:</p><p>  如上圖所

17、示,首先采用AT89C51為本系統(tǒng)的單片機(jī)型號。其中,AT89C51是一種帶4 kb閃爍可編程可擦除只讀存儲器(Falsh Programmable and Erasabl Read OnlyMemory FPEROM)的低電壓、高性能CMOS型8位微處理器,俗稱單片機(jī)。器件采用ATMEL高密度非易失存儲器制造技術(shù)制造,與工業(yè)標(biāo)準(zhǔn)的MCS-51指令集、輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,能夠進(jìn)行1000次

18、寫/擦循環(huán),數(shù)據(jù)保留時間為10年。</p><p>  時鐘電路由AT89C51的18,19腳的時鐘端(XTALl及XTAL2)以及12 MHz晶振X1,電容C2,C3組成,采用片內(nèi)振蕩方式。</p><p>  復(fù)位電路采用簡易的上電復(fù)位電路,主要由電阻R1,R2,電容C1,開關(guān)K1組成,分別接至AT89C51的RST復(fù)位輸入端。</p><p>  LED的行掃

19、描端接到單片機(jī)P0口,而列掃描接到三極管的發(fā)射極。其中列掃描端(B1—B8)用于LED的數(shù)據(jù)掃描,憑借74LS154的譯碼和三極管的驅(qū)動,使得LED能發(fā)光。(A1—A8)通過P0口提供給LED的顯示數(shù)據(jù)。考慮到P0口必須設(shè)置上拉電阻,本設(shè)計采用4.7kΩ排電阻作為單片機(jī)的上拉電阻。</p><p>  下圖為AT89C51的引腳圖:</p><p>  3.2 數(shù)據(jù)存儲電路的設(shè)計<

20、;/p><p>  本設(shè)計由串行的ROM 24C256組成數(shù)據(jù)存儲電路。其中,24C256是一款1—256K位的支持I2C總線數(shù)據(jù)傳送協(xié)議,可以用電擦拭,可編程自定時寫周期的串行CMOS EEPROM。此芯片有兩種寫入方式,一種是字節(jié)寫入方式,另一種是頁寫入方式。此芯片允許在一個寫周期內(nèi)進(jìn)行對一個字節(jié)到一頁的若干個字節(jié)的編程寫入。</p><p>  24C256的引腳排列和各個引腳的功能如下

21、圖和下表:</p><p>  數(shù)據(jù)存儲器24C256的接口設(shè)計原理圖如下圖所示:</p><p>  該存儲電路只由24C256芯片組成,SCL為串行時鐘引腳,用來產(chǎn)生器件所有數(shù)據(jù)發(fā)送或接受的時鐘。SDA是串行數(shù)據(jù)/地址,這是一個雙向的傳輸端,功能是接收或者發(fā)送所有的數(shù)據(jù)以及傳送地址。LED顯示器的控制系統(tǒng)工作時,單片機(jī)89C51依靠SDA引腳與SCL引腳讀取24C256中存儲的內(nèi)容,并

22、在LED顯示屏上顯示出來。當(dāng)然也可以通過PC機(jī)(上位機(jī))將已經(jīng)編輯好的數(shù)據(jù)內(nèi)容下載到24C256的芯片內(nèi)。</p><p>  3.3 PC機(jī)(上位機(jī))通信模塊的設(shè)計</p><p>  LED顯示屏和電腦的通訊方式采用了標(biāo)準(zhǔn)RS232接口,電路原理圖如下圖所示:</p><p>  通訊方式為10位的異步通訊。RS232接口實際上是一種串行通信標(biāo)準(zhǔn),是由美國

23、EIA(電子工業(yè)聯(lián)合會)和BELL 公司一起開發(fā)的通訊協(xié)議,它對信號線的功能、電氣特性、連接器等都有明確的規(guī)定。由于RS-232接口的EIA是用正負(fù)電平表示邏輯關(guān)系的(-3V—-15V為1、+3V—+15V為0)。與TTL以高低電平表示邏輯關(guān)系不同,因此,為了能夠和計算機(jī)接口通信,必須在EIA電平和TTL電平之間進(jìn)行電平轉(zhuǎn)換。MAX232芯片可完成TTL-EIA電平轉(zhuǎn)換,且只用單一+5V電源,因此得到廣泛應(yīng)用。由于采用的是標(biāo)準(zhǔn)RS232

24、接口,所以傳輸距離不能很遠(yuǎn),當(dāng)傳輸距離超過15M,就要采用422或485接口,則只要加上一塊RS232轉(zhuǎn)422/485電路模塊就可以了。</p><p>  3.4 LED顯示屏的選擇</p><p>  LED顯示屏模塊技術(shù)指標(biāo)參數(shù)表如下表所示:</p><p><b>  系統(tǒng)的軟件設(shè)計</b></p><p>

25、;  軟件也是LED漢字顯示屏控制系統(tǒng)的重要組成部分。在系統(tǒng)的軟件設(shè)計中,我同樣采用模塊化的設(shè)計,將系統(tǒng)的各個部分編寫出子模塊的形式,通過這樣的方式,可以增加系統(tǒng)軟件的可移植性和可讀性。</p><p>  4.1 下位機(jī)軟件流程</p><p>  本系統(tǒng)的下位機(jī)(單片機(jī)89C51)主要作用是用來實現(xiàn)LED漢字顯示屏上字樣的移位、顯示和數(shù)據(jù)的讀取等等功能。所以主程序的流程圖如下:&l

26、t;/p><p>  4.2 上位機(jī)軟件</p><p>  本系統(tǒng)的上位機(jī)軟件主要是編輯LED顯示屏顯示的內(nèi)容,在設(shè)計中采用Visual Basic語言LED顯示屏控制系統(tǒng)的內(nèi)容下載軟件。</p><p>  4.2.1 Visual Basic 中串口通訊的應(yīng)用</p><p>  現(xiàn)在大量的智能儀器或數(shù)據(jù)采集模塊都采用了RS—232或

27、485通訊接口,通過相應(yīng)的通訊協(xié)議,將測試、采集的數(shù)據(jù)傳輸給上位機(jī),以滿足各種形式的數(shù)據(jù)處理的要。VisualBasic6.0(以下簡VB)是許多工程技術(shù)人員熟悉和常用的應(yīng)用程序開發(fā)軟件,VB以其簡單易學(xué)、32位面向?qū)ο蟮某绦蛟O(shè)計等特點,倍受廣大計算機(jī)開發(fā)者的青睞,已廣泛地應(yīng)用于各個領(lǐng)域;如何用VB編寫數(shù)據(jù)通訊程序,并進(jìn)行數(shù)據(jù)處理,意義重大。 用VB開發(fā)串口通訊一般有兩種方法:一是采用VB自身的標(biāo)準(zhǔn)控件Mscomm來實現(xiàn);另一種是利用w

28、indows的通訊API函數(shù)。</p><p>  4.2.2 通訊基礎(chǔ)知識</p><p>  一般來說,計算機(jī)都有一個或多個串行端口,它們依次為com1、com2、…,這些串口還提供了外部設(shè)備與PC進(jìn)行數(shù)據(jù)傳輸和通信的通道。這些串口在CPU和外設(shè)之間充當(dāng)解釋器的角色。當(dāng)字符數(shù)據(jù)從CPU發(fā)送給外設(shè)時,這些字符數(shù)據(jù)將被轉(zhuǎn)換成串行比特流數(shù)據(jù);當(dāng)接收數(shù)據(jù)時,比特流數(shù)據(jù)被轉(zhuǎn)換為字符數(shù)據(jù)傳遞給C

29、PU,再進(jìn)一步說,在操作系統(tǒng)方面,Windows用通信驅(qū)動程序(COMM.DRV)調(diào)用API函數(shù)發(fā)送和接收數(shù)據(jù),當(dāng)用通信控件或聲明調(diào)用API函數(shù)時,他們由COMM. DRV解釋并傳遞給設(shè)備驅(qū)動程序,作為一個VB程序員,要編寫通信程序.只需知道通信控件提供給Windows通信API函數(shù)的接口即可.換句話說,只需設(shè)定和監(jiān)視通信控件的屬性和事件即可。</p><p>  4.2.3 數(shù)據(jù)的發(fā)送</p>

30、<p>  VB發(fā)送數(shù)據(jù)有兩種:一、發(fā)送字符數(shù)據(jù);二、發(fā)送二進(jìn)制數(shù)據(jù)。 </p><p><b>  1.發(fā)送字符數(shù)據(jù) </b></p><p>  在通訊中以單字符方式逐個發(fā)送數(shù)據(jù)時,每一個數(shù)據(jù)范圍是:0—128。如發(fā)送58給單片機(jī)則可以這樣表示: </p><p>  Mscomm1.Output=Chr(50) ‘發(fā)送數(shù)據(jù)(1

31、6進(jìn)制) </p><p>  在通訊中以多字符方式發(fā)送數(shù)據(jù)時,發(fā)送的是Ascii碼值。如發(fā)送“LED顯</p><p>  示屏”則可以這樣表示: </p><p>  Dim data as String ‘定義發(fā)送數(shù)據(jù)變量 </p><p>  data=” LED顯示屏” ‘給變量賦值 </p><p>  M

32、scomm1.Output=data ‘發(fā)送數(shù)據(jù) </p><p>  2.發(fā)送二進(jìn)制數(shù)據(jù) </p><p>  以發(fā)送字符方式時,發(fā)送的數(shù)據(jù)范圍只能是:0—128,而單片機(jī)經(jīng)常處理的數(shù)據(jù)范圍是0—255,那么怎么樣發(fā)送大于128的數(shù)據(jù)呢?方法是采用二進(jìn)制方式發(fā)送數(shù)據(jù)。首先定義一個二進(jìn)制類型的數(shù)組,然后把要發(fā)送的數(shù)值賦給二進(jìn)制數(shù)組,再通過Mscomm發(fā)送。如發(fā)送數(shù)值220的具體過程如下:

33、</p><p>  Dim data(0) as byte ‘定義發(fā)送數(shù)據(jù)數(shù)組 </p><p>  Data(0)=220 ‘給數(shù)組賦值 </p><p>  Mscomm1.output=data(0) ‘發(fā)送數(shù)據(jù) </p><p>  4.2.4 數(shù)據(jù)的接收 </p><p>  接收數(shù)據(jù)有兩種方式,一、以

34、文本方式接收(InputMode=0);二、以二進(jìn)制</p><p>  方式接收(InputMode=1)。 </p><p>  1.以文本方式接收數(shù)據(jù) </p><p>  在InputMode=0的模式下,是以文本方式接收數(shù)據(jù),在接收數(shù)據(jù)之前,我們</p><p>  必須先定義一個字符串變量,用以接收數(shù)據(jù)緩沖區(qū)里的數(shù)據(jù),具體過程如下

35、: </p><p>  Dim receive As String * 1 ‘定義接收數(shù)據(jù)變量 </p><p>  Select Case MSComm1.CommEvent ‘判斷事件類型 </p><p>  Case comEvReceive ‘事件類型為接收數(shù)據(jù) </p><p>  receive = MSComm1.Input

36、 ‘接收數(shù)據(jù) </p><p>  End Select </p><p>  2.以二進(jìn)制方式接收數(shù)據(jù) </p><p>  在InputMode=1的模式下,是以二進(jìn)制方式接收數(shù)據(jù),在接收數(shù)據(jù)之前,我們必須先義一個二進(jìn)制類型的數(shù)組,用以接收數(shù)據(jù)緩沖區(qū)里的數(shù)據(jù),過程如下: </p><p>  Dim receive(n) As Byte

37、‘定義接收數(shù)據(jù)變量 </p><p>  Select Case MSComm1.CommEvent ‘判斷事件類型 </p><p>  Case comEvReceive ‘事件類型為接收數(shù)據(jù) </p><p>  Mscomm1.InputMode=1 ‘接收方式為二進(jìn)制方式 </p><p>  For k=0 to n </p

38、><p>  Receive(k) = MSComm1.Input ‘接收數(shù)據(jù) </p><p><b>  Next k </b></p><p>  End Select</p><p>  4.3 編程思想</p><p>  要實現(xiàn)LED漢字顯示屏的動態(tài)滾動顯示效果,其實就是以固定的合適周

39、期,顯示一幅幅不同內(nèi)容的屏幕畫面。所以在軟件設(shè)計上,只需按照一定的時間間隔改變存儲于顯示緩沖區(qū)的信息內(nèi)容。比如左移的動態(tài)效果,就是讓顯示緩沖區(qū)的點陣數(shù)據(jù)向左移動一列,由于顯示緩沖區(qū)的所有數(shù)據(jù)左移一列需要一定的時間,不可能在兩次中斷間隔時間內(nèi)實現(xiàn)這一處理過程,鑒于此,就需要設(shè)置兩個顯示緩沖區(qū),一個用于保存當(dāng)前屏幕正在顯示的信息數(shù)據(jù),另一個則用來對當(dāng)前的信息數(shù)據(jù)進(jìn)行處理。在到達(dá)換屏?xí)r間間隔后,切換當(dāng)前顯示緩沖區(qū)到數(shù)據(jù)已經(jīng)處理的顯示緩沖區(qū),然

40、后再對另一顯示緩沖區(qū)進(jìn)行數(shù)據(jù)處理,以此循環(huán)下去。要保證動態(tài)顯示的正常,符合人們的視覺習(xí)慣,最根本的問題是如何分配刷新顯示屏的定時時間與兩個顯示緩沖區(qū)數(shù)據(jù)顯示、處理的替換。為了二者的處理時間不相互沖突,本設(shè)計采用的方法是使顯示緩沖區(qū)的數(shù)據(jù)處理在多次多次定時中斷程序執(zhí)行之間的時間間隔內(nèi)進(jìn)行并完成。</p><p>  數(shù)據(jù)處理時間=(定時中斷時間-傳輸數(shù)據(jù)時間)×中斷次數(shù)</p><p&

41、gt;  這樣,只要合理的設(shè)定中斷次數(shù)就能保證刷新屏幕間隔時間內(nèi)顯示緩沖區(qū)有足夠的時間處理數(shù)據(jù)。</p><p>  4.4 字模處理</p><p>  從字節(jié)長度看,漢字占兩個字節(jié)(Byte),數(shù)字只占一個字節(jié),那么:漢字字模為16*16個點),ASCII碼字符的字模為8*16個點。這樣字模的長度不同,處理起來就會有困難。為此,本設(shè)計采用這種字模處理方法:把漢字拆成兩半,這樣就與英

42、文字母和阿拉伯?dāng)?shù)字的字模統(tǒng)一起來。字模的存儲是按順次存儲在數(shù)據(jù)存儲區(qū)里,如‘蘇’字的字模在數(shù)據(jù)存儲區(qū)里是這樣存放的:</p><p>  uchar code tab[32]={ 08H,20H,08H,24H,0FFH,0FEH,08H,20H</p><p>  0AH,20H,02H,10H,3FH,0F8H,02H,10H</p><p>  02H,10H

43、,22H,18H,24H,16H,44H,12H</p><p>  08H,10H,10H,10H,20H,50H,40H,20H }</p><p>  但是僅僅依靠人工方法獲取漢字代碼是會很繁瑣。所以,我檢索了互聯(lián)網(wǎng),找到了一款功能十分強(qiáng)大的漢字字庫提取程序,軟件打開后,在指定地方輸入漢字,點“生成”,十六進(jìn)制數(shù)據(jù)的漢字代碼即可自動生成。甚至可以輸入多個漢字以及選擇動態(tài)顯示方式,截

44、圖如下:</p><p>  4.5 動態(tài)效果的實現(xiàn)</p><p>  本文設(shè)計的LED點陣顯示屏可以實現(xiàn)左移、掉下、上升三種顯示方式。其中只有左移方式可以實現(xiàn)多于一屏內(nèi)容的顯示,其它的顯示方式只能顯示一屏的內(nèi)容。顯示方式設(shè)置由微機(jī)控制,微機(jī)在傳送點陣字模數(shù)據(jù)時,先顯示方式,再傳送點陣數(shù)據(jù)。顯示過程由單片機(jī)定時中斷程序控制,每定時中斷一次點亮一行,定時中斷時間為0.8ms,每中斷16

45、次,即可對整個顯示屏掃描一次,完成一屏信息的刷新,每秒顯示畫面數(shù)達(dá)78屏,可保證畫面無閃爍感。編程采用的是C言語,應(yīng)用C51編程具有以下優(yōu)點: </p><p> ?、?C51管理內(nèi)部寄存器和存儲器的分配,編程時,無需考慮不同存儲器的</p><p>  尋址和數(shù)據(jù)類型等細(xì)節(jié)問題。 </p><p> ?、?程序由若干函數(shù)組成,具有良好的模塊結(jié)構(gòu)。 </p&g

46、t;<p>  ③ 有豐富的子程序庫可直接引用,從而大大減少用戶編程的工作量。 </p><p> ?、?C言語和匯編言語可以交叉使用,匯編言語程序代碼短、運(yùn)行速度快,但復(fù)雜運(yùn)算編耗時。用匯編言語編寫與硬件有關(guān)的部分,用C言語編寫與硬件無關(guān)的運(yùn)算部分程序,充分發(fā)揮兩種言語的長處,提高開發(fā)效率。</p><p>  4.5.1 左移效果</p><p&g

47、t;  在顯示條屏較小的情況下,為了顯示更多的信息內(nèi)容,普遍采用的方法是移位顯示,按照人們的日常習(xí)慣,本設(shè)計選擇左移的動態(tài)效果,它的特點是不僅僅局限于顯示屏幕的大小、顯示效果好,編程簡單。下面,用16*64的條型顯示屏的左移方式為例,說明左移動態(tài)效果的實現(xiàn)方法:</p><p>  屏幕的數(shù)據(jù)大小為128個字節(jié),所以要先在數(shù)據(jù)存儲區(qū)里開辟一個256個字節(jié)的顯示緩沖區(qū)(分為兩個顯存),其中一個用以保存當(dāng)前需要顯示的

48、信息內(nèi)容,而另一個用來處理數(shù)據(jù)。要實現(xiàn)左移的動態(tài)效果,原理很簡單,其實就是每隔一段時間,向顯示緩沖區(qū)里加入一列數(shù)據(jù)。具體做法是:第一個字節(jié)左移一位,保存于變量A中,第二個字節(jié)右移7位(一個字節(jié)是8位),保存于變量B中,A和B邏輯或運(yùn)算,結(jié)果保存于A中,這樣就完成了第一個字節(jié)的數(shù)據(jù)處理。一行有8個字節(jié)的數(shù)據(jù)需要處理,所以要設(shè)8此循環(huán),如此循環(huán)8次后,便完成了一行的數(shù)據(jù)處理。同時,每個字有16行,因此我們需要在8次循環(huán)里再設(shè)計一個16次的外

49、循環(huán),至此,整個屏幕的數(shù)據(jù)就都處理完了。再啟動更新信號,交換顯示存儲區(qū),顯示程序就顯示剛才處理好了的內(nèi)容,接著,單片機(jī)再對另一顯示存儲區(qū)的數(shù)據(jù)進(jìn)行處理,處理完成后再交換顯示。如此這樣,就能實現(xiàn)左移的動態(tài)效果。程序流程圖如下圖所示:</p><p><b>  具體源程序如下:</b></p><p>  void rtol(void) </p><

50、p><b>  { </b></p><p>  uchar a,b,i,k,u,n; </p><p><b>  while(1) </b></p><p><b>  { </b></p><p>  //--------- //判斷內(nèi)容改變沒有? </p&g

51、t;<p>  if(change==1)break; </p><p>  //--------- </p><p>  for(n=0;n<leng;n++) //一共有l(wèi)ength個字(8*16) </p><p><b>  { </b></p><p>  //--------- //判斷內(nèi)

52、容改變沒有? </p><p>  if(change==1)break; </p><p>  //--------- </p><p>  for(i=0;i<8;i++) //一邊字有8位,要移8次 </p><p><b>  { </b></p><p>  //---------

53、 //判斷內(nèi)容改變沒有? </p><p>  if(change==1)break; </p><p>  //--------- </p><p>  if(choose==1) //處理顯存1區(qū) </p><p><b>  { </b></p><p><b>  addr2=0

54、; </b></p><p><b>  } </b></p><p>  else //處理顯存2區(qū) </p><p><b>  { </b></p><p>  addr2=256; </p><p><b>  } </b></

55、p><p>  //--------- </p><p>  for(k=0;k<16;k++) //一屏要處理16個字(8*16) </p><p><b>  { </b></p><p>  for(u=0;u<16;u++) //一個字要處理16個字節(jié) </p><p><b

56、>  { </b></p><p>  num=512+u+k*16+n*16; </p><p>  a=*num<<i; </p><p>  num=512+u+k*16+16+n*16; </p><p>  b=*num>>8-i; </p><p><b>

57、;  a|=b; </b></p><p>  dispd=addr2+u+k*16; </p><p>  *dispd=a; //保存數(shù)據(jù) </p><p><b>  } </b></p><p><b>  } </b></p><p>  while(j

58、h==0); </p><p>  jh=0; //關(guān)交換信號 </p><p>  choose=~choose; </p><p><b>  } </b></p><p><b>  } </b></p><p><b>  } </b></

59、p><p><b>  } </b></p><p>  4.5.2 上升效果編程</p><p>  本系統(tǒng)實現(xiàn)的上升效果具體是:內(nèi)容從顯示屏底部緩慢地上升,整行字出現(xiàn)后,會定格一段時間,讓人們看清楚顯示的內(nèi)容,接著閃爍三下,提醒正在顯示的內(nèi)容即將退出,然后內(nèi)容開始上移,直到消失,這樣,就完成了一次完整顯示過程。</p><

60、;p>  具體實現(xiàn)的方法是:設(shè)定一個16次循環(huán),在第一次循環(huán)中,顯存只取顯示內(nèi)容的第一行數(shù)據(jù),放到顯存的末行,即第16行。在第二次循環(huán)中,顯存讀取顯示內(nèi)容的第一和第二行數(shù)據(jù),同時,第一行數(shù)據(jù)放入顯存的第15行,第二行數(shù)據(jù)放入顯存的第16行,如此循環(huán)16次,直到全部顯示內(nèi)容顯示出來。設(shè)定程序,顯示內(nèi)容閃爍三次。接著退出的方法差不多。區(qū)別僅是每次取的行數(shù)不一樣。程序流程圖如下:</p><p><b>

61、;  具體源程序如下:</b></p><p>  void rise(void) </p><p><b>  { </b></p><p><b>  uchar i; </b></p><p>  uint k,g,t,m; </p><p>  //---

62、----------- </p><p>  deal(); //顯示前把數(shù)據(jù)重新排列 </p><p>  //-------------- </p><p><b>  while(1) </b></p><p><b>  { </b></p><p>  //----

63、----- //判斷內(nèi)容改變沒有? </p><p>  if(change==1)break; </p><p>  //--------- </p><p>  for(t=0;t<2;t++) //入、出共兩次 </p><p><b>  { </b></p><p>  //---

64、------ //判斷內(nèi)容改變沒有? </p><p>  if(change==1)break; </p><p>  //--------- </p><p>  if(t==0)g=1024; //入的首地址 </p><p>  if(t==1)g=1280; //出的首地址 </p><p>  //----

65、----------- </p><p>  for(i=0;i<=16;i++) //出完有16行 </p><p><b>  { </b></p><p>  //--------- //判斷內(nèi)容改變沒有? </p><p>  if(change==1)break; </p><p>

66、;  //--------- </p><p>  if(choose==1) //處理顯存1區(qū) </p><p><b>  { </b></p><p><b>  addr2=0; </b></p><p><b>  } </b></p><p>

67、;  else //處理顯存2區(qū) </p><p><b>  { </b></p><p>  addr2=256; </p><p><b>  } </b></p><p>  //--------- </p><p>  for(k=0;k<256;k++) /

68、/一屏有256個字節(jié) </p><p><b>  { </b></p><p>  dispd=addr2+k; </p><p><b>  num=g+k; </b></p><p>  *dispd=*num; </p><p><b>  } </b

69、></p><p>  g+=16; //指向上一行數(shù)據(jù) </p><p>  while(jh==0); </p><p>  jh=0; //關(guān)交換信號 </p><p>  choose=~choose; </p><p><b>  } </b></p><p&g

70、t;  //---------------------- 定一會 </p><p>  for(i=0;i<25;i++) </p><p><b>  { </b></p><p>  //--------- //判斷內(nèi)容改變沒有? </p><p>  if(change==1)break; </p>

71、;<p>  //--------- </p><p>  while(jh==0); </p><p><b>  jh=0; </b></p><p><b>  } </b></p><p><b>  if(t==0) </b></p>&l

72、t;p><b>  { </b></p><p>  //--------- //判斷內(nèi)容改變沒有? </p><p>  if(change==1)break; </p><p>  //---------------------- 閃3下 </p><p><b>  TR0=0; </b>

73、;</p><p><b>  p34=1; </b></p><p><b>  p35=1; </b></p><p>  for(m=0;m<34000;m++); </p><p><b>  TR0=1; </b></p><p>  /

74、/--------- //判斷內(nèi)容改變沒有? </p><p>  if(change==1)break; </p><p>  //--------- </p><p>  for(m=0;m<35000;m++); </p><p><b>  TR0=0; </b></p><p>&

75、lt;b>  p34=1; </b></p><p><b>  p35=1; </b></p><p>  //--------- //判斷內(nèi)容改變沒有? </p><p>  if(change==1)break; </p><p>  //--------- </p><p&g

76、t;  for(m=0;m<34000;m++); </p><p><b>  TR0=1; </b></p><p>  //--------- //判斷內(nèi)容改變沒有? </p><p>  if(change==1)break; </p><p>  //--------- </p><p

77、>  for(m=0;m<35000;m++); </p><p><b>  TR0=0; </b></p><p><b>  p34=1; </b></p><p><b>  p35=1; </b></p><p>  //--------- //判斷內(nèi)容改

78、變沒有? </p><p>  if(change==1)break; </p><p>  //--------- </p><p>  for(m=0;m<34000;m++); </p><p><b>  TR0=1; </b></p><p>  //--------- //判斷內(nèi)

79、容改變沒有? </p><p>  if(change==1)break; </p><p>  //--------- </p><p>  for(m=0;m<35000;m++); </p><p><b>  } </b></p><p><b>  } </b>

80、;</p><p>  4.5.3 掉下效果編程</p><p>  掉下的動態(tài)效果的實現(xiàn)與上升的編程思想差不多,也是設(shè)定一個16次的循環(huán),在第一次的循環(huán)中,只讀取顯示內(nèi)容的最后一行數(shù)據(jù),放到顯存的第一行里。在第二次循環(huán)中,讀取顯示內(nèi)容的第15和第16行數(shù)據(jù),并依次放入顯存的第1和第2行。如此循環(huán)16次,整屏幕的數(shù)據(jù)都顯示出來。退出同理。不再復(fù)述。程序流程圖如下:</p>

81、<p><b>  具體源程序如下:</b></p><p>  void drop(void) </p><p><b>  { </b></p><p><b>  uchar i; </b></p><p>  uint k,g,t,m; </p>

82、<p>  //-------------- </p><p>  deal(); //顯示前把數(shù)據(jù)重新排列 </p><p>  //-------------- </p><p><b>  while(1) </b></p><p><b>  { </b></p>

83、<p>  //--------- //判斷內(nèi)容改變沒有? </p><p>  if(change==1)break; </p><p>  //--------- </p><p>  for(t=0;t<2;t++) //入、出共兩次 </p><p><b>  { </b></p>

84、<p>  //--------- //判斷內(nèi)容改變沒有? </p><p>  if(change==1)break; </p><p>  //--------- </p><p>  if(t==0)g=1536; //入的首地址 </p><p>  if(t==1)g=1280; //出的首地址 </p>

85、<p>  //--------------- </p><p>  for(i=0;i<=16;i++) //出完有16行 </p><p><b>  { </b></p><p>  //--------- //判斷內(nèi)容改變沒有? </p><p>  if(change==1)break; &l

86、t;/p><p>  //--------- </p><p>  if(choose==1) //處理顯存1區(qū) </p><p><b>  { </b></p><p><b>  addr2=0; </b></p><p><b>  } </b>&l

87、t;/p><p>  else //處理顯存2區(qū) </p><p><b>  { </b></p><p>  addr2=256; </p><p><b>  } </b></p><p>  //--------- </p><p>  for(k

88、=0;k<256;k++) //一屏有256個字節(jié) </p><p><b>  { </b></p><p>  dispd=addr2+k; </p><p><b>  num=g+k; </b></p><p>  *dispd=*num; </p><p>&

89、lt;b>  } </b></p><p>  g-=16; //指向上一行數(shù)據(jù) </p><p>  while(jh==0); </p><p>  jh=0; //關(guān)交換信號 </p><p>  choose=~choose; </p><p><b>  } </b>&

90、lt;/p><p>  //---------------------- 定一陣 </p><p>  for(i=0;i<25;i++) </p><p><b>  { </b></p><p>  //--------- //判斷內(nèi)容改變沒有? </p><p>  if(change==

91、1)break; </p><p>  //--------- </p><p>  while(jh==0); </p><p><b>  jh=0; </b></p><p><b>  } </b></p><p><b>  if(t==0) </b

92、></p><p><b>  { </b></p><p>  //--------- //判斷內(nèi)容改變沒有? </p><p>  if(change==1)break; </p><p>  //---------------------- 閃3下 </p><p><b>

93、  TR0=0; </b></p><p><b>  p34=1; </b></p><p><b>  p35=1; </b></p><p>  for(m=0;m<34000;m++); </p><p><b>  TR0=1; </b></p

94、><p>  //--------- //判斷內(nèi)容改變沒有? </p><p>  if(change==1)break; </p><p>  //--------- </p><p>  for(m=0;m<35000;m++); </p><p><b>  TR0=0; </b><

95、/p><p><b>  p34=1; </b></p><p><b>  p35=1; </b></p><p>  //--------- //判斷內(nèi)容改變沒有? </p><p>  if(change==1)break; </p><p>  //--------- &

96、lt;/p><p>  for(m=0;m<34000;m++); </p><p><b>  TR0=1; </b></p><p>  //--------- //判斷內(nèi)容改變沒有? </p><p>  if(change==1)break; </p><p>  //---------

97、 </p><p>  for(m=0;m<35000;m++); </p><p><b>  TR0=0; </b></p><p><b>  p34=1; </b></p><p><b>  p35=1; </b></p><p>  /

98、/--------- //判斷內(nèi)容改變沒有? </p><p>  if(change==1)break; </p><p>  //--------- </p><p>  for(m=0;m<34000;m++); </p><p><b>  TR0=1; </b></p><p> 

99、 //--------- //判斷內(nèi)容改變沒有? </p><p>  if(change==1)break; </p><p>  //--------- </p><p>  for(m=0;m<35000;m++); </p><p><b>  } </b></p><p><

100、b>  } </b></p><p><b>  }</b></p><p>  4.6 上位機(jī)串口通信軟件</p><p>  4.6.1 界面設(shè)計</p><p>  新建一個窗體From1,添加以下主要控件: </p><p>  1、ProgressBar1 &l

101、t;/p><p>  2、Commad1、Commad2 </p><p><b>  3、Frame1 </b></p><p><b>  4、Combo1</b></p><p><b>  5、Text1</b></p><p><b> 

102、 軟件界面如下圖:</b></p><p>  4.6.2 程序編寫</p><p>  首先對8051串口進(jìn)行初始化,與上位機(jī)通訊接收數(shù)據(jù),判斷數(shù)據(jù)是否接收完,如果沒有繼續(xù)接收,如果接收完則計算地址偏移量然后從字庫中取字,最后固定顯示并移動。傳輸函數(shù)編程流程圖如下圖所示</p><p><b>  源程序如下:</b>&l

103、t;/p><p>  Public Sub port(contton As String, msg As Byte, way As Integer) </p><p>  '------------------------- </p><p>  Dim counter As Integer '進(jìn)度條 </p&g

104、t;<p>  Dim x As Long '保存字的位置 </p><p>  Dim num As Integer '計算字的個數(shù) </p><p>  Dim data As String * 4 '接收數(shù)據(jù) &l

105、t;/p><p>  Dim se(0) As Byte </p><p>  If contton = "" Then </p><p>  MsgBox "沒有輸入要顯示的內(nèi)容,請輸入!" </p><p><b>  Exit Sub </b></p><p&

106、gt;<b>  Else </b></p><p>  num = Len(contton) </p><p>  '-------------------------- 校對有沒有字庫里沒有的字符? </p><p>  For k = 1 To num </p><p>  x

107、= Asc(Mid(contton, k, 1)) </p><p>  If (x < -24158) Or (x > -23617 And x < -20319) Or (x > -2050 And x < 32) Or (x > </p><p>  126) Then </p><p>  If x <> 9

108、Then '判斷是不是Tab鍵? </p><p>  none = Mid(contton, k, 1) </p><p>  MsgBox "字庫中沒有輸入的字' " & none & " '字符的字模.", vbCritical, "Wron

109、g" </p><p><b>  Exit Sub </b></p><p><b>  End If </b></p><p><b>  End If </b></p><p>  '--------------------------

110、 計算中文的個數(shù) </p><p>  If (x >= -20319 And x <= -2050) Or (x >= -24158 And x <= -23617) Or (x = 9) Then </p><p>  cal = cal + 1 </p><p><b>  End If </b><

111、;/p><p><b>  Next k </b></p><p>  num = num + cal </p><p>  '*********************************************** 進(jìn)度條 </p><p>  counter = num * 16 </p>&

112、lt;p>  send.ProgressBar1.min = 0 </p><p>  send.ProgressBar1.Max = counter </p><p>  send.ProgressBar1.Value = 0 </p><p>  counter = 0 </p><p>  On Error GoTo closed

113、 '處理串口沒有打開的情況 </p><p>  '---------------- 發(fā)送校對符 </p><p>  main.MSComm1.Output = Chr(6) </p><p>  For tim = 0 To 2000000

114、 '延時 </p><p><b>  Next tim </b></p><p>  If main.MSComm1.InBufferCount <> 0 Then </p><p>  If Asc(main.MSComm1.Input) <> 16 Then </p>

115、<p>  main.MSComm1.InBufferCount = 0 '清空接收區(qū) </p><p>  MsgBox "傳輸錯誤,請檢查各硬件是否正常?", vbOKOnly, "傳輸錯誤" </p><p><b>  Exit Sub </b></p><

116、;p><b>  End If </b></p><p><b>  Else </b></p><p>  MsgBox "傳輸錯誤,請檢查各硬件是否正常?", vbOKOnly, "傳輸錯誤" </p><p><b>  Exit Sub </b>&

117、lt;/p><p><b>  End If </b></p><p>  '-------------------------- 發(fā)送啟動符5(任定,作為地址信號) </p><p>  main.MSComm1.Output = Chr(5) </p><p>  '----------

118、---------------- 延時 </p><p>  For tim = 0 To 1000000 </p><p><b>  Next tim </b></p><p>  '-------------------------- 發(fā)送顯示方式 </p>&

119、lt;p>  main.MSComm1.Output = Chr(way) </p><p>  '-------------------------- 發(fā)送字符串的長度 </p><p>  If num < 256 Then '0~255 </p><p>  se(0) = num </p>

120、<p>  main.MSComm1.Output = se </p><p>  main.MSComm1.Output = Chr(0) </p><p>  Else '256~500 </p><p>  se(0) = num - 255 </p><p>  main.MSComm1.Output = se &

121、lt;/p><p>  main.MSComm1.Output = Chr(1) </p><p><b>  End If </b></p><p>  Open "c:\HanselLED.fon" For Random As #1 Len = 4 '打開字庫 </p><p>  '

122、-------------------------- 處理傳輸中出錯的情況 </p><p>  On Error GoTo wrong </p><p>  '-------------------------- 傳輸 </p><p>  num = num - cal </p><

123、p>  For k = 1 To num </p><p>  x = Asc(Mid(contton, k, 1)) </p><p>  If x = 9 Then 'Tab鍵占一個格 </p><p>  For a = 0 To 31 </p><p>  main.MSComm1.Output = Chr(0) <

124、;/p><p>  '*************************************** 進(jìn)度條 </p><p>  send.ProgressBar1.Value = counter </p><p>  counter = counter + 1 </p><p><b>  Next a </b>

125、</p><p>  ElseIf -20319 <= x And x <= -2050 Then '中文字符 </p><p>  If x = -20319 Then </p><p><b>  x = 3169 </b></p><p><b>  Else </b>&

126、lt;/p><p>  f = (x + 20318) / 255 </p><p>  c = Int(f) </p><p>  d = (x + 20318) Mod 255 </p><p>  x = 32 * (c * 93 + d + 100) + 1 </p><p><b>  End If &

127、lt;/b></p><p>  'x = 32 * (x + 20418) + 1 '漢字的位置從第100位開始存儲 </p><p>  '--------------------------- 取字模 </p><p><b>  ofe = 0 </b>&

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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

提交評論