找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5270|回復(fù): 0
收起左側(cè)

點陣電子顯示屏制作

[復(fù)制鏈接]
ID:155769 發(fā)表于 2016-12-18 23:26 | 顯示全部樓層 |閱讀模式
編號:A乙0301
點陣電子顯示屏制作
   
摘要………………………………………………………………………………2
前言 ……………………………………………………………………………4
一、設(shè)計要求……………………………………………………………………4
二、方案論證與比較……………………………………………………5
1、掃描方式的選擇 ………………………………………………………5
2、行列控制方式的方案論證與選擇 ………………………………………5
3、數(shù)字時鐘顯示模塊的設(shè)計方案論證與選擇 ……………………………6
三、系統(tǒng)硬件電路設(shè)計…………………………………………………………6
1、系統(tǒng)總體框圖………………………………………………………………6
2、各單元電路設(shè)計  …………………………………………………………6
2.1、LED點陣的選擇………………………………………………………6
2.2、行列控制和驅(qū)動電路設(shè)計 ……………………………………………7
2.3、實時時間控制電路的設(shè)計……………………………………………11
2.4、系統(tǒng)電源參數(shù)的核算…………………………………………………13
2.5、單片機與PC機通信單元設(shè)計………………………………………13
2.6、鍵盤控制電路設(shè)計 …………………………………………………14
三、 軟件設(shè)計……………………………………………………………………15
1、主程序設(shè)計…………………………………………………………………15
2、基于CPLD的行列控制邏輯電路的程序設(shè)計……………………………16
3. PC機串口通信子程序設(shè)計…………………………………………………16
四、 系統(tǒng)測試……………………………………………………………………16
五、設(shè)計總結(jié) ……………………………………………………………………17
六、參考文獻 ……………………………………………………………………17
點陣電子顯示屏制作
摘要:
本設(shè)計是以AT-89S52單片機為控制核心,基于CPLD獨立掃描的實用、高效的智能型LED大屏幕顯示屏系統(tǒng),該系統(tǒng)實現(xiàn)了按鍵切換、顯示屏亮度連續(xù)可調(diào)、信息上下左右滾屏顯示、預(yù)存信息定時循環(huán)顯示,利用DS1302實現(xiàn)實時時間顯示等功能,并能通過PC機串口直接對顯示信息進行控制更新,具有刷新速度快、亮度高、功耗低等特點。
關(guān)鍵字點陣LED  CPLD  MAX232  DS1302
AbstractThe Design of Graph Matrix Display Screen Based on MCS-51Microprocessor,consistsof Micro Control Unit (MCU) as its core, Base on CPLD carry out self-help scan, this system carry out follow function: using key-press shift the display content, adjust the time , continuum adjustthe lightness, roll screen display ,timing circle display the pre-storeinformation , using DS1302 carry out real timedisplay, etc.  utilize PC , via serialinterface , directly control the display content.  This Graph Matrix Display Screen display screen with quick refurbish,high luminance, and Low power consumption , and so on peculiarity.
Keywords: MCU, Graph MatrixDisplay ScreenCPLD,
MAX232,  DS1302
   
社會的信息化,促進了顯示技術(shù)的發(fā)展,LED大屏幕點陣顯示系統(tǒng)作為一項高科技產(chǎn)品已經(jīng)漸漸融入了人們的生活。與傳統(tǒng)的顯示媒體相比,由于其亮度高、動態(tài)影像顯示效果好、耗能少、使用壽命長、顯示內(nèi)容多樣、顯示方式靈活、性價比高等優(yōu)勢,已經(jīng)開始廣泛應(yīng)用于各行各業(yè)。采用單片機控制的LED點陣顯示屏顯示形式美觀大方,顯示內(nèi)容靈活可變,具有低功耗,結(jié)構(gòu)簡單,操作方便等優(yōu)點,已廣泛應(yīng)用于銀行,證券,影視,體育和公路交通等各個方面,顯示了其良好的市場前景。
一、    設(shè)計要求
1、 基本要求:設(shè)計并制作LED電子顯示屏和控制器。
(1)自制一臺簡易16行*32列點陣顯示的LED電子顯示屏;
(2)自制顯示屏控制器,擴展鍵盤和相應(yīng)的接口實現(xiàn)多功能顯示控制,顯示屏顯示數(shù)字和字母亮度適中,應(yīng)無閃爍。
(3)顯示屏通過按鍵切換顯示數(shù)字和字母;
(4)顯示屏能顯示4組特定數(shù)字或者英文字母組成的句子,通過按鍵切換顯示內(nèi)容;
(5)能顯示4組特定漢字組成的句子,通過按鍵切換顯示內(nèi)容。
2、 發(fā)揮部分
1)       自制一臺簡易16行*64列點陣顯示的LED電子顯示屏;
2)       LED顯示屏亮度連續(xù)可調(diào)。
3)       實現(xiàn)信息的左右滾屏顯示,預(yù)存信息的定時循環(huán)顯示;
4)       實現(xiàn)實時時間的顯示,顯示屏數(shù)字顯示: 時∶分∶秒(例如 18∶38∶59);
5)       增大到10組(每組漢字8個或16個數(shù)字和字符)預(yù)存信息,信息具有掉電保護;
6)       實現(xiàn)和PC機通訊,通過PC機串口直接對顯示信息進行更新(須做PC機客戶程序);
7)       其他發(fā)揮功能。
二、方案論證與比較
1、掃描方式的選擇
方案一:靜態(tài)顯示,所謂的靜態(tài)顯示就是對LED電子顯示屏中的每一像素點都通過硬件單獨控制,整個LED顯示屏所有的LED的同時顯示。此方式最大優(yōu)點是程序設(shè)計簡單,且畫面無閃爍。但這種設(shè)計存在致命的缺點:電路復(fù)雜,硬件利用率低,成本巨大。所以此方式一般不被采用。
方案二:采用動態(tài)掃描法并行輸出數(shù)據(jù),所謂的動態(tài)掃描法是利用人眼的視覺暫留特點而實現(xiàn)的一種顯示方法,即當(dāng)刷新速率足夠高時,人眼就察覺不出顯示屏畫面更迭的閃爍。若要顯示一幀畫面,先送出第一行的數(shù)據(jù),然后選通并點亮第一行,延時;此后送出第二行的數(shù)據(jù),同樣選通、點亮并延時;依次將所有行掃描完,即給出了一幀的畫面。
方案三:采用動態(tài)掃描法串行輸出數(shù)據(jù),方案二和方案三同樣采用動態(tài)掃描實現(xiàn)顯示過程。但方案二的缺點也是明顯的,比較而言,方案二的譯碼電路比較復(fù)雜,相對硬件開銷大一些;方案三電路構(gòu)成簡單,譯碼電路簡潔。
為使電路設(shè)計簡潔易行,我們采用方案三
2、行列控制方式的方案論證與選擇
方案一:采用傳統(tǒng)方案,應(yīng)用行掃描和列送數(shù)據(jù)的方式,橫向取模,從AT89C52串口發(fā)送出來的數(shù)據(jù)通過74LS595進行串-并行數(shù)據(jù)轉(zhuǎn)換輸出給LEDMATRIX UINT的各個列,從AT89C52出來的輸出口的數(shù)據(jù)通過一級總線驅(qū)動器74LS245后進入4-16線譯碼器74LS154,譯碼以后通過限流電阻進入驅(qū)動管陣列放大,直接驅(qū)動LED點陣的各行。但要組成16×64的點陣顯示電路,必須采用多片芯片,硬件電路復(fù)雜。
方案二:采用超大規(guī)?删幊踢壿嬯嚵衅鰿PL構(gòu)成行掃描和列控制模塊,利用VHDL語言設(shè)計控制邏輯,可充分發(fā)揮CPLD和數(shù)字電路EDA設(shè)計的優(yōu)勢,只用一片CPLD芯片,通過簡單的編程模擬8片74LS595和一片74LS154,就可以代替方案一中利用多塊芯片實現(xiàn)的功能,硬件電路設(shè)計簡單可靠,具有極高的穩(wěn)定性。本設(shè)計采用Altera公司的EPM7128SQC160-10芯片。
3、數(shù)字時鐘顯示模塊的設(shè)計方案論證與選擇
方案一:因為題目中只要求顯示時、分、秒,因此可以用門電路組合構(gòu)成時鐘發(fā)生器,但此方案硬件復(fù)雜,穩(wěn)定性低,且不易控制。
方案二:本方案完全用軟件定時、計數(shù)功能實現(xiàn)數(shù)字時鐘。該方案具有硬件電路簡單的特點。但由于每次執(zhí)行程序時,定時器都要重新賦初值,所以該時鐘精度不高。而且,由于是軟件實現(xiàn),當(dāng)單片機不上電、程序不執(zhí)行時,時鐘將不工作。
方案三:本方案采用實時時鐘芯片DS1302,它可以對年、月、日、周、時、分、秒進行計時,且具有閏年補償功能,采用三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號或RAM數(shù)據(jù),時鐘芯片自備電池,只需要設(shè)置初始時間即可。
基于上述分析,本設(shè)計采用方案三完成數(shù)字時鐘部分的功能。
三、系統(tǒng)硬件電路設(shè)計
1、系統(tǒng)總體框圖
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg
圖1   系統(tǒng)總體框圖
整個顯示系統(tǒng)可以分為①CPU主控電路部分②串行數(shù)據(jù)的傳送和時序控制部分 ③CPLD行列譯碼掃描部分④實時時鐘控制電路部分⑤與PC機串口通訊部分⑥按鍵控制電路部分⑦三極管驅(qū)動電路部分⑧點陣顯示部分。
2、各單元電路設(shè)計
2.1  LED點陣的選擇
LED基本陣列選用6寸的8×8點陣, 16片8×8點陣組成整個顯示屏。該種點陣的規(guī)格為雙列直插,標(biāo)準(zhǔn)引腳距(2.54mm),LED規(guī)格為Ф5,單色紅色。
8×8點陣LED結(jié)構(gòu)如下圖所示:
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image004.gif
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image006.gif
圖2  8×8點陣LED外觀及等效電路圖
2.2、掃描控制和驅(qū)動電路設(shè)計
1.EPM7128SQC160-10簡述
EPM7128SQC160-10是Altera公司推出的MAX7000S系列CPLD(ComplexProgrammable Logic Device);采用CMOSE2PROM工藝,傳輸延遲僅為5ns;內(nèi)部具有豐富的資源--128個觸發(fā)器、2500個用戶可編程門;而且具有102個用戶可編程的I/O口,為系統(tǒng)定義輸入、輸出和雙向口提供了極大的方便;為了比較適合混合電壓系統(tǒng),通過配置,輸入引腳可以兼容3.3V/5V邏輯電平,輸出可以配置為3.3V/5V邏輯電平輸出。EPM7128同時還提供了JTAG接口,可進行ISP編程,極大地方便了用戶。
2、行列掃描電路的設(shè)計
對大型LED點陣顯示屏而言,由于其數(shù)據(jù)量大,必須有很快的刷新頻率,如刷新速度跟不上,會造成點陣屏畫面晃動和閃爍。解決這個問題有很多方法,例如,采用PC機的DMA控制器來提高數(shù)據(jù)傳輸速率,采用并行數(shù)據(jù)傳輸方式,分單元多CPU控制方式等等。我們采用CPU控制,利用CPLD(EPM7128SQC160-10)設(shè)計掃描邏輯,串行列數(shù)據(jù)分時傳輸,行掃描的方式,從而使整個顯示屏可以順序工作,并利用CPU控制掃描頻率,實現(xiàn)了屏幕無閃爍顯示。
該部分控制電路原理如圖3、圖4、圖5所示,采用行掃描的方式,行掃描與列送數(shù)據(jù)電路均采用CPLD 芯片編程構(gòu)成的通用數(shù)字電路來控制,在16×64點陣顯示時,掃描輸出需要大量的I/O端口,因此我們采用具有160個I/O端口的EPM7128SQC160-10芯片,僅用一片即可滿足設(shè)計要求。
列數(shù)據(jù)傳輸控制電路如圖3所示,由單片機輸出的顯示信息串行輸入到CPLD,用VHDL語言編寫其總線讀邏輯,在CPLD芯片中實現(xiàn)八片8位3態(tài)串行輸入、并行輸出,帶鎖存功能的移位寄存器,完成數(shù)據(jù)的串并轉(zhuǎn)換,由CPLD的64列數(shù)據(jù)輸出控制LED點陣的64列。圖3為由CPLD實現(xiàn)的八片74LS595的示意圖,其中,L1-L64為列選通控制信號輸出,RCK、SCK、SCLR是由單片機送來得控制信號,RCK為鎖存控制信號,SCK為時鐘控制信號,SCLR為清零信號,各片的RCK、SCK、SCLR均接在一起, Si接單片機的掃描數(shù)據(jù)輸出,第一片74LS595(由CPLD實現(xiàn))移位輸出端接第二片74LS595的數(shù)據(jù)輸入Si2,八片進行級連,實現(xiàn)一次掃描一個字節(jié)即:八位并行輸出和串行移位功能。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg
3 用CPLD實現(xiàn)的64列數(shù)據(jù)傳輸邏輯示意圖
行掃描的控制是利用CPLD編程實現(xiàn)四線十六線譯碼器74LS154的功能,如圖4所示,AA、BB、CC、DD接單片機行控制數(shù)據(jù)輸出,H1-H16為CPLD輸出的行掃描控制信號,接行三極管驅(qū)動電路。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg
圖4   用CPLD實現(xiàn)的行掃描邏輯示意圖
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg
5  CPLD內(nèi)部邏輯電路圖
3、行驅(qū)動電路設(shè)計
該系統(tǒng)顯示部分的點陣采用單色LED共陰點陣模塊,16 塊8×8點陣模塊連接成16×64點陣。因為一個行掃描管同時控制著一行中多個LED的通斷,所以它承載較大電流。以每個發(fā)光二極管流過的電流為10mA計算,一個64列的點陣屏中,每個行掃描管所承受的電流是10mA×64=0.64A,為此我們選用高速中功率三極管8550,保證了行的驅(qū)動能力。由于顯示點陣的每一行都需要用一個三極管來控制,所以16×64點陣共需要16個8550。驅(qū)動電路如圖6所示。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg
                    圖6   行驅(qū)動電路圖
4、掃描頻率的控制
由于人眼的視覺暫留現(xiàn)象,一個LED發(fā)光管如果在一秒鐘內(nèi)亮24次以上的話,人眼就感覺不到閃爍。由此,一屏畫面連續(xù)以每秒25次的頻率循環(huán)顯示時,給人的感覺是穩(wěn)定的。為此只要利用CPU控制由CPLD實現(xiàn)的行譯碼器的譯碼速度,保證每秒內(nèi)譯碼16×25=400次,就可以保證畫面的穩(wěn)定性。設(shè)計時,我們使AT89C51的定時/計數(shù)器T0工作于方式2(自動重載方式AUTO-RELOAD MODEL)。此時設(shè)定M1M0為10,在方式2中16位計數(shù)器被拆為兩部分,其中TL0用作8bit Counter;TH0用于存放和保持計數(shù)初值。當(dāng)TL0計數(shù)溢出時,在溢出標(biāo)志TF0置1的同時,自動的將TH0的初值重載到TL0中,因此在初始化的過程中,用軟件只需一次賦初值。其周期為:
T=(2^8-TH0初值)×?xí)r鐘周期×12
采用11.0592MHZ的晶振時,計數(shù)速率約為1MHz,輸入脈沖的周期間隔為1uS,通過計算,TH0的初值為243,即為0XF3(OF3H)。采用中斷的方式控制行譯碼掃描頻率,就可以保證畫面的無閃爍顯示。
2.3實時時間控制電路的設(shè)計
1、DS1302的結(jié)構(gòu)及工作原理
DS1302 是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘電路,它可以對年、月、日、周日、時、分、秒進行計時,具有閏年補償功能,工作電壓為2.5V~5.5V。采用三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號或RAM數(shù)據(jù),同時提供了對后背電源進行涓涓細流充電的能力。其引腳功能及結(jié)構(gòu)如圖7所示
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image018.jpg
   圖7  DS1302引腳功能及結(jié)構(gòu)圖
DS1302 的控制字如圖8所示?刂谱止(jié)的最高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入DS1302中,位6如果為0,則表示存取日歷時鐘數(shù)據(jù),為1表示存取RAM數(shù)據(jù);位5至位1指示操作單元的地址;最低有效位(位0)如為0表示要進行寫操作,為1表示進行讀操作,控制字節(jié)總是從最低位開始輸出。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image020.jpg
圖8 DS1302的控制字
在控制指令字輸入后的下一個SCLK時鐘的上升沿時,數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入從低位即位0開始。同樣,在緊跟8位的控制指令字后的下一個SCLK脈沖的下降沿讀出DS1302的數(shù)據(jù),讀出數(shù)據(jù)時從低位0位到高位7。
DS1302有12個寄存器,其中有7個寄存器與日歷、時鐘相關(guān),存放的數(shù)據(jù)位為BCD碼形式,其日歷、時間寄存器及其控制字見表1。
表1
  
寄存器
  
命令字
取值范圍
各位內(nèi)容
名稱
寫操作  讀操作
7      6     5   4   3    2   1   0
秒寄存器
80H
81H
00—59
CH       10SFC           SEC
分寄存器
82H
83H
00—59
0         10MIN           MIN
時寄存器
84H
85H
01—12或00—13
12/24  0     10  HR        HR
日寄存器
86H
87H
00—28.29.30.31
0      0      10DATA       DATA
月寄存器
88H
89H
01—12
0      0    0   10M        MONTH
周寄存器
8AH
8BH
01—07
0      0    0   0    0      DAY
年寄存器
8CH
8DH
00—99
    10YEAR              YEAR
     此外,DS1302 還有年份寄存器、控制寄存器、充電寄存器、時鐘突發(fā)寄存器及與RAM相關(guān)的寄存器等。時鐘突發(fā)寄存器可一次性順序讀寫除充電寄存器外的所有寄存器內(nèi)容。
2、利用 DS1302的實時時間顯示電路硬件設(shè)計
    DS1302與CPU的連接需要三條線,即SCLK(7)、I/O(6)、RST(5)。圖9示出DS1302與89C51的連接圖,利用單片機控制,采用顯示屏分屏顯示年、月、日與時、分、秒,并能進行按鍵調(diào)時。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image022.jpg
圖9   DS1302與89C52的連接圖
    實際上,在調(diào)試程序時可以不加電容器,只加一個32.768kHz 的晶振即可。只是選擇晶振時,不同的晶振,誤差也較大。另外,還可以在上面的電路中加入DS18B20,同時顯示實時溫度。只要占用CPU一個口線即可。
2.4  系統(tǒng)電源參數(shù)的核算
對大型LED點陣顯示屏而言,由于其發(fā)光二極管數(shù)量多,在16×64點陣中,以每個發(fā)光二極管流過的電流為10mA計算,一個64列的點陣屏中,每個行掃描管所承受的電流是10mA×64=0.64A,16行并聯(lián)的總電流為0.64×16=10.24 A,要求電源輸出大電流,一般的集成穩(wěn)壓芯片均不能滿足要求,因此本設(shè)計中采用電壓為5V,電流為10A的開關(guān)穩(wěn)壓電源。
2.5 單片機與PC機通信單元設(shè)計
1、 通信單元電路組成
本單元主要有兩部分組成:上位機、下位機與電纜的接口,中間為電平轉(zhuǎn)換電路。該系統(tǒng)采用三線制,獨占 CPU串口方式。RS-232信號的電平和單片機串口信號的電平不一致,必須進行二者之間的電平轉(zhuǎn)換,在此使用的集成電平轉(zhuǎn)換芯片MAX232為RS-232C/TTL電平轉(zhuǎn)換芯片。它只使用單+5V電源,配接4個1μF電解電容即可完成RS-232電平與TTL電平之間的轉(zhuǎn)換。其電路原理如圖10所示。轉(zhuǎn)換完畢的串口信號TXD、RXD直接和89C51的串行口連接。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image024.jpg
圖10   電平轉(zhuǎn)換電路
2、 通信協(xié)議
本系統(tǒng)中PC機承擔(dān)主控任務(wù),單片機接受PC機指令,并根據(jù)指令控制顯示信息,修改顯示內(nèi)容。我們采用RS-232串口異步通信,1位起始位,8位數(shù)據(jù)位,1位停止位,無奇偶校驗,波特率9600b/s,傳輸數(shù)據(jù)采用ASCII模式。PC機傳送控制信息和數(shù)據(jù),控制信息包括修改顯示參數(shù)、修改顯示方式。同時PC機能向單片機傳送顯示內(nèi)容。下位機按接收到的指令工作。如果主控機發(fā)出錯誤的指令,將不做任何控制,并顯示Error提示,1秒鐘后自動返回。
2.6、鍵盤控制電路設(shè)計
本系統(tǒng)設(shè)置三個按鍵(k1、k2、k3)分別來控制時間、日期、滾屏顯示以及時間的調(diào)整,系統(tǒng)默認的狀態(tài)是顯示時間。首先進行鍵盤掃描判斷k1鍵是否按下,如果k1鍵按下并且只按一下則進入日期顯示狀態(tài),當(dāng)按兩下則進入信息的順序滾屏顯示狀態(tài),如果沒有按下則判斷k2鍵是否按下,當(dāng)k2鍵按下則進入時間、日期的設(shè)置狀態(tài)。K3鍵的作用是當(dāng)調(diào)整時間時,完成時間和日期的累加,直到調(diào)整到需要的時間和日期為止。
三、 軟件設(shè)計
1.主程序設(shè)計
軟件設(shè)計采用了模塊化設(shè)計,全部用C51編程。整個軟件系統(tǒng)簡潔明了,而且具有良好的擴展性。整個軟件系統(tǒng)包括主程序、行列控制邏輯CPLD程序、時鐘控制子程序和PC機串行通信子程序四大模塊。主程序負責(zé)鍵盤處理、顯示刷新、信息調(diào)用與傳輸控制。主程序流程如圖11所示。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image026.jpg
圖11  主程序流程圖
2、基于CPLD的行列控制邏輯電路的程序設(shè)計
行譯碼掃描和列數(shù)據(jù)的串并傳輸控制的功能較主控電路來講相對簡單,它是將主控電路輸出的四位二進制數(shù)據(jù)譯成16行的行選通信號,去控制行驅(qū)動管驅(qū)動行輸出,將主控電路串行輸出的數(shù)據(jù)經(jīng)CPLD完成數(shù)據(jù)的串并轉(zhuǎn)換,輸出控制64列,完成列數(shù)據(jù)的傳送。這是一個純組合邏輯電路,使用VerilogHDL 語言描述的always語句和case多分支語句即可實現(xiàn)此功能。
3、PC機串口通信子程序設(shè)計
在與PC機進行通信時,單片機的功能主要是負責(zé)通信與數(shù)據(jù)處理。單片機接收來自PC機的信息,分析后回傳信息或數(shù)據(jù)到PC機,采用串口中斷程序,不定時處理與PC機的通信信息。
四、 系統(tǒng)測試
經(jīng)過系統(tǒng)的測試與分析,得到以下結(jié)果:
1、按鍵切換顯示數(shù)字、字母與時間:
上電時,系統(tǒng)顯示當(dāng)前時間,按一下k1鍵,即進入日期顯示狀態(tài),系統(tǒng)顯示當(dāng)前的日期,按兩下k1鍵,系統(tǒng)進入順序滾屏顯示狀態(tài),依次顯示“歡迎光臨濟鐵職院”、“happyteacher day”等10組漢字與英文字符,按下k2鍵則進入時間設(shè)置狀態(tài),與K3鍵配合實現(xiàn)了對年、月、日、以及時、分、秒的調(diào)整。
2、掉電保護功能測試
為使單片機內(nèi)部RAM中的數(shù)據(jù)在電源掉電時不丟失,單片機外部中斷0平時是高電平,當(dāng)?shù)綦姇r,外部中斷口0變?yōu)榈碗娖,產(chǎn)生中斷,單片機檢測到這個中斷信號時,轉(zhuǎn)入中斷處理程序,及時把有用信息保存起來,因為系統(tǒng)接入470uF的電容,電容的放電時間完全能夠保證單片機執(zhí)行完保護數(shù)據(jù)的程序,這樣就可以避免斷電時預(yù)存信息的丟失,實現(xiàn)掉電保護功能。經(jīng)測試,我們設(shè)計的系統(tǒng)做到了信息的掉電保護。
3、亮度的調(diào)節(jié)測試
通過連續(xù)調(diào)節(jié)限流電阻,改變加在LED顯示屏上的驅(qū)動電流,達到亮度連續(xù)可調(diào)的目的。經(jīng)測試,本系統(tǒng)實現(xiàn)了顯示亮度的連續(xù)可調(diào)。
4、結(jié)論
經(jīng)過小組成員的一致努力,完成了本次課題的任務(wù),達到了預(yù)期的目的。設(shè)計制作的具有多種功能的16×64的點陣LED顯示屏,顯示畫面清晰,無閃爍,很好的完成了基本要求部分和發(fā)揮部分的功能。
五、設(shè)計總結(jié)
通過這次競賽,我們在硬件設(shè)計、軟件編程方面得到了極大的提高。同時我們小組的三個成員團結(jié)一心,通力合作,體現(xiàn)了很好的團隊合作精神。為以后走向工作崗位從事科研或管理工作積累了不可多得的經(jīng)驗。在競賽中碰到了一個接一個的難題,我們經(jīng)過不屈不撓的刻苦攻關(guān),一一得到了化解,這種體驗為我們走好今后的人生路增添了極大的信心。
六、參考文獻
[1] 全國大學(xué)生電子設(shè)計競賽組委會.第六屆全國大學(xué)生電子設(shè)計競賽獲獎作品選編(2003).北京:北京理工大學(xué)出版社,2005年
[2] 黃智偉,王彥,陳文光,朱衛(wèi)華.全國大學(xué)生電子設(shè)計競賽訓(xùn)練教程.北京:電子工業(yè)出版社,2005年
[3] 王松武,于鑫,武思軍.電子創(chuàng)新設(shè)計與實踐.北京:國防工業(yè)出版社,2005
[4]林明權(quán)、馬維旻:VHDL數(shù)字控制系統(tǒng)設(shè)計范例[M],北京,
電子工業(yè)出版社,2003
[5] 楊恒、盧飛成:FPGA/VHDL快速工程實踐入門與提高[M],北京,北京航空航天大學(xué)出版社,2003
[6] 顧斌、趙明中:數(shù)字電路EDA設(shè)計,西安電子科技大學(xué)出版社,2005
[7] 趙亮、侯國銳:單片機C語言編程與實例,人民郵電出版社,2003
部分源程序清單:
sbitCLK=P2^0;
sbitDAT=P2^1;
sbitRCLK=P2^2;
//sbitCS=P2^3;
sbitAA=P3^0;
sbitBB=P3^1;
sbitCC=P3^2;
sbitDD=P3^3;
sbitG1=P3^4;
sbitdat=P1^1;
sbitclk=P1^0;
sbitrst=P1^2;
ucharcodetab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};//0-9,-,全滅
ucharcode huan[]={0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0x9F,0xFF,0xBB,0x81,0x01,0xF9,0x7B,0xDA,0x97,
                   0xE9,0x9F,0xE3,0x1F,0xF3,0x2F,0xEB,0x6F,0xD8,0xE7,0xBD,0xF1,0xF3,0xFB,0xFF,0xFF};/*"歡",0*/
ucharcode ying[]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xCF,0x3F,0xE4,0xC1,0xED,0xDD,0xED,0xDD,0x85,0xDD,
         0xED,0xDD,0xEC,0x5D,0xE9,0xC1,0xEF,0xDF,0xEF,0xDF,0x90,0x61,0xFE,0x03,0xFF,0xFF};/*"迎",1*/
ucharcodeguang[]={0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFE,0xEF,0xE6,0xE7,0xF2,0xCF,0xFA,0xDF,0xFE,0xBB,
                   0x80,0x01,0xFB,0xBF,0xFB,0xBF,0xFB,0xBF,0xF3,0xBB,0xF7,0xBB,0x8F,0x81,0xFF,0xFF};/*"光",2*/
ucharcode lin[]= {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0x3F,0xDB,0x7B,0xDB,0x01,0xDA,0x5F,0xDA,0xEB,
                   0xD9,0x03,0xDB,0x5B,0xDB,0x5B,0xDB,0x5B,0xDB,0x5B,0xFB,0x03,0xFB,0x7B,0xFF,0xFF};/*"臨",3*/
ucharcode Dshuzi[]={0xFF,0xFF,0xFF,0xE1,0xDE,0xDE,0xBF,0xBF,0xBF,0xBF,0xBF,0xDE,0xE1,0xFF,0xFF,0xFF,/*"0",0*/
                 0xFF,0xFF,0xFF,0xF3,0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,0xE0,0xFF,0xFF,0xFF,/*"1",1*/
                 0xFF,0xFF,0xFF,0xE1,0xDC,0xBE,0xBE,0xFE,0xFC,0xF9,0xF7,0xCF,0x80,0xFF,0xFF,0xFF,/*"2",2*/
                 0xFF,0xFF,0xFF,0xE1,0xDE,0xFE,0xFE,0xFD,0xF0,0xFE,0x9F,0xDE,0xE1,0xFF,0xFF,0xFF,/*"3",3*/
                 0xFF,0xFF,0xFF,0xFC,0xF8,0xF4,0xF4,0xEC,0xDC,0xC0,0xFC,0xFC,0xF8,0xFF,0xFF,0xFF,/*"4",4*/
                  0xFF,0xFF,0xFF,0xC0,0xDF,0xDF,0xDF,0xC1,0xFE,0xFF,0xFF,0x9F,0xC0,0xFF,0xFF,0xFF,/*"5",5*/
                 0xFF,0xFF,0xFF,0xF8,0xE7,0xCF,0x9F,0x80,0x9F,0x9F,0x9F,0xDF,0xE0,0xFF,0xFF,0xFF,/*"6",6*/
                 0xFF,0xFF,0xFF,0x80,0xBF,0xFE,0xFD,0xF9,0xFB,0xF3,0xF7,0xE7,0xE7,0xFF,0xFF,0xFF,/*"7",7*/
                 0xFF,0xFF,0xFF,0xE1,0xDE,0xDE,0xDE,0xE1,0xDC,0xBF,0xBF,0x9E,0xE1,0xFF,0xFF,0xFF,/*"8",8*/
                  0xFF,0xFF,0xFF,0xE3,0x9C,0xBE,0xBE,0xBE,0x9C,0xE2,0xFE,0xFC,0xE3,0xFF,0xFF,0xFF,/*"9",9*/                              
                 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xDF,0xFF,0xFF,0xFF,0xDF,0xCF,0xFF,0xFF,0xFF};/*冒號*/
ucharcode ji[] ={0xFF,0xF7,0x60,0xCB,0xD1,0xAB,0x8B,0xFF};/*"濟",0*/
ucharcode nan[] ={0xFF,0xED,0x01,0x81,0xA1,0xB5,0xB1,0xFF};/*"南",1*/
ucharcode tie[] ={0xFF,0xDB,0xC3,0x80,0x8B,0xD5,0xCE,0xFF};/*"鐵",2*/
ucharcode dao[] ={0xFF,0xB3,0xC0,0x21,0xA1,0xA1,0x41,0xFF};/*"道",3*/
ucharcode zhi[] ={0xFF,0x01,0xA5,0x81,0xA5,0x81,0xEE,0xFF};/*"職",4*/
ucharcode ye[]  ={0xFF,0xE7,0xE5,0xA5,0xE3,0xE7,0x80,0xFF};/*"業(yè)",5*/
ucharcode jiji[]={0xFF,0xD7,0x81,0xC3,0x93,0xD7,0x89,0xFF};/*"技",6*/
ucharcode shu[] ={0xFF,0xF3,0xF6,0x80,0xE3,0xD3,0xB4,0xFF}; /*"術(shù)",7*/
ucharcode xue[] ={0xFF,0xC5,0xFB,0x80,0x80,0xF7,0xE7,0xFF}; /*"學(xué)",8*/
ucharcode yuan[]={0xFF,0x9B,0x80,0xA0,0x93,0x91,0x89,0xFF};/*"院",9*/
//定時4ms程序
voiddingshi(void)
{
         TMOD=0x01;           
         TL0=(65536-4000)%256;
         TH0=(65536-4000)/256;
         EA=1;
         ET0=1;
         TR0=1;      
         while(!TF0);
         TR0=0;
  }
       void delay(uint a)         
        {
        uint j=255;
        for(;a>0;a--)
        for(;j>0;j--);
        }
voidsendH(uchar *k)
{   
        uchar num1,num2,c,i;
        G1=0;
  for(i=0;i<16;i++)           
{
   num1=k[2*i];num2=k[2*i+1];
   for(c=0;c<8;c++)
        {
         CLK=0;
         DAT=num1&0x80;
         num1=num1<<1;        
         CLK=1;
         }
   
   for(c=0;c<8;c++)
        {
         CLK=0;
         DAT=num2&0x80;
         num1=num2<<1;        
         CLK=1;
         }
    }
         RCLK=0;        
         RCLK=1;
              ACC=i;
         AA=ACC^0;BB=ACC^1;CC=ACC^2,DD=ACC^3;
         dingshi();   
         
}
voidsendH1(uchar n,uchar *k)
{   
        uchar num1,c,i;
        G1=0;
  for(i=n;i<8+n;i++)           
{
   num1=k;                 
   for(c=0;c<8;c++)
        {
         CLK=0;
         DAT=num1&0x80;
         num1=num1<<1;        
         CLK=1;
         }
         RCLK=0;         
         RCLK=1;
              ACC=i;            
         AA=ACC^0;BB=ACC^1;CC=ACC^2,DD=ACC^3;
         dingshi();     
           }
}
voidsendD(uchar n)  
{   
        uchar num1,c,i;
        G1=0;
  for(i=0;i<16;i++)         
{
   num1=Dshuzi[n*16+i];   
   for(c=0;c<8;c++)
        {
         CLK=0;
         DAT=num1&0x80;
         num1=num1<<1;        
         CLK=1;
         }
         RCLK=0;         
         RCLK=1;
              ACC=i;
         AA=ACC^0;BB=ACC^1;CC=ACC^2,DD=ACC^3;
         dingshi();   
         }
}
voidInputByte(uchar dd)     
   {
     uchar i;
     ACC=dd;
     for(i=8;i>0;i--)
      {
       dat=A0;
       clk=1;
       clk=0;
       ACC=ACC>>=1;
        }
     }  
//-------------------------------------------------------
ucharOutputByte(void)   
   {
     uchar i;
     dat=1;     
     for(i=8;i>0;i--)
      {
        ACC=ACC>>1;
        A7=dat;
        clk=1;
        clk=0;
        }     
      return(ACC);
     }
//--------------------------------------------------
voidWrite(uchar addr,uchar num)   
  {
    rst=0;
    clk=0;
    rst=1;
    InputByte(addr);
    InputByte(num);   
    clk=1;
    rst=0;
    }
//-------------------------------------------------
ucharRead(uchar addr)      
  {
    uchar dd=0;
    rst=0;
    clk=0;
    rst=1;
    InputByte(addr);
    dd=OutputByte();
    clk=1;
    rst=0;
    return(dd);
   }
//--------------------------------------------------------------
ucharReadSec()               
  {
   uchar dd;
   dd=Read(0x81);
   return(dd);
   }
//--------------------------------------------------------------
ucharReadMin()              
  {
   uchar dd;
   dd=Read(0x83);
   return(dd);
    }      
//--------------------------------------------------------------
ucharReadHr()               
  {
    uchar dd;
    dd=Read(0x85);
    return(dd);
   }
//------------------------------------------------------------   
ucharReadWe()              
  {
    uchar dd;
    dd=Read(0x8b);
    return(dd);
    }
//------------------------------------------------------------
ucharReadDay()           
  {
    uchar dd;
    dd=Read(0x87);
    return(dd);
   }
//------------------------------------------------------------
ucharReadMn()         
  {
    uchar dd;
    dd=Read(0x89);
    return(dd);
   }
//------------------------------------------------------------
ucharReadYs()            
  {
    uchar dd;
    dd=Read(0x8d);
    return(dd);
   }
//------------------------------------------------------------
voidWriteSec(uchar num)   
      {
       Write(0x80,num);
       }
//-----------------------------------------------------------
voidWriteMin(uchar num)     
  {
    Write(0x82,num);
   }
//-----------------------------------------------------------
voidWriteHr(uchar num)      
  {
    Write(0x84,num);
   }
//-----------------------------------------------------------
voidWriteDay(uchar num)   
{
   Write(0x86,num);
  }
//-----------------------------------------------------------
voidWriteMn(uchar num)      
  {
    Write(0x88,num);
   }
//-----------------------------------------------------------
voidWriteWe(uchar num)        
{
   Write(0x8a,num);
   }
//-----------------------------------------------------------
voidWriteYs(uchar num)        
  {
    Write(0x8c,num);
   }
//-----------------------------------------------------------
voidDisableWP(void)      
{
   Write(0x8e,0x00);
   }
//----------------------------------------------------------
voidEnableWP(void)            
{
   Write(0x85,0x80);
   }
  
unsignedchar Key_Scan(void)
{
unsignedchar key_temp=0,i,j;
unsignedchar scan_code_row=0x01,scan_code_colum=0x80;
      for(i=0;i<4;i++)
       {
              KEY_PORT=scan_code_row;
              if(KEY_PORT==0)
              {
           for(j=0;j<4;j++)
                     {
                     KEY_PORT=scan_code_colum;
                     if(KEY_PORT==0&&key_temp!=0)
                     {KEY_PORT=0xff;  return key_temp=0;}
                     else
                     if(KEY_PORT==0)
                     key_temp=scan_code_row|scan_code_colum;
               scan_code_colum>>=1;
                     }
              }
              scan_code_row<<=1;
       }
  KEY_PORT=0xff;
  return key_temp;
}
voidshiy(void)
{
do{
  for (a=0;a<64;)
{
  for(b=0;b<300;b++)
  {c=0xfe;
  for(d=0;d<8;d++)
  { for(e=0;e<500;e++);
  P1=design[a+d];
  P2=c;
  c=((c<<1)|0x01);
  }
  }
  a=a+8;
}
for(a=0;a<56;)
{
  for(b=0;b<40;b++)
  {c=0xfe;
  for(d=0;d<8;d++)
  { for(e=0;e<500;e++);
    P1=design[a+d];
    P2=c;
    c=((c<<1)|0x01);
   }
  }
  a=a+1;
}
for(a=0;a<64;a++)
  {design1[a]=design[a];}
   for(b=0;b<80;b++)
   {c=0xfe;
   for(d=0;d<8;d++)
  { for(e=0;e<500;e++);
    P1=design1[d];
    P2=c;
    c=((c<<1)|0x01);
  }
}
for(a=0;a<64;a+=8)
  {
    for (b=0;b<8;b++)
    {
     for (d=0;d<8;d++)
     {
      if ((a+b+8)<64)
      { design1[d]=(design1[d])<<1;
      g=design1[a+d+8];
      design2[d]=g>>7;
      design1[d]=(design1[d]|design2[d]);
      design1[a+d+8]=(design1[a+d+8])<<1;
     }
   }
for(f=0;f<40;f++)
   { c=0xfe;
     for(d=0;d<8;d++)
   { for(e=0;e<500;e++);
     P1=design1[d];
     P2=c;
     c=((c<<1)|0x01);
     }
    }
   }

回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表