找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5191|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

點(diǎn)陣電子顯示屏制作

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:155769 發(fā)表于 2016-12-18 23:26 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
編號(hào):A乙0301
點(diǎn)陣電子顯示屏制作
   
摘要………………………………………………………………………………2
前言 ……………………………………………………………………………4
一、設(shè)計(jì)要求……………………………………………………………………4
二、方案論證與比較……………………………………………………5
1、掃描方式的選擇 ………………………………………………………5
2、行列控制方式的方案論證與選擇 ………………………………………5
3、數(shù)字時(shí)鐘顯示模塊的設(shè)計(jì)方案論證與選擇 ……………………………6
三、系統(tǒng)硬件電路設(shè)計(jì)…………………………………………………………6
1、系統(tǒng)總體框圖………………………………………………………………6
2、各單元電路設(shè)計(jì)  …………………………………………………………6
2.1、LED點(diǎn)陣的選擇………………………………………………………6
2.2、行列控制和驅(qū)動(dòng)電路設(shè)計(jì) ……………………………………………7
2.3、實(shí)時(shí)時(shí)間控制電路的設(shè)計(jì)……………………………………………11
2.4、系統(tǒng)電源參數(shù)的核算…………………………………………………13
2.5、單片機(jī)與PC機(jī)通信單元設(shè)計(jì)………………………………………13
2.6、鍵盤控制電路設(shè)計(jì) …………………………………………………14
三、 軟件設(shè)計(jì)……………………………………………………………………15
1、主程序設(shè)計(jì)…………………………………………………………………15
2、基于CPLD的行列控制邏輯電路的程序設(shè)計(jì)……………………………16
3. PC機(jī)串口通信子程序設(shè)計(jì)…………………………………………………16
四、 系統(tǒng)測(cè)試……………………………………………………………………16
五、設(shè)計(jì)總結(jié) ……………………………………………………………………17
六、參考文獻(xiàn) ……………………………………………………………………17
點(diǎn)陣電子顯示屏制作
摘要:
本設(shè)計(jì)是以AT-89S52單片機(jī)為控制核心,基于CPLD獨(dú)立掃描的實(shí)用、高效的智能型LED大屏幕顯示屏系統(tǒng),該系統(tǒng)實(shí)現(xiàn)了按鍵切換、顯示屏亮度連續(xù)可調(diào)、信息上下左右滾屏顯示、預(yù)存信息定時(shí)循環(huán)顯示,利用DS1302實(shí)現(xiàn)實(shí)時(shí)時(shí)間顯示等功能,并能通過(guò)PC機(jī)串口直接對(duì)顯示信息進(jìn)行控制更新,具有刷新速度快、亮度高、功耗低等特點(diǎn)。
關(guān)鍵字點(diǎ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 Screen,CPLD,
MAX232,  DS1302
   
社會(huì)的信息化,促進(jìn)了顯示技術(shù)的發(fā)展,LED大屏幕點(diǎn)陣顯示系統(tǒng)作為一項(xiàng)高科技產(chǎn)品已經(jīng)漸漸融入了人們的生活。與傳統(tǒng)的顯示媒體相比,由于其亮度高、動(dòng)態(tài)影像顯示效果好、耗能少、使用壽命長(zhǎng)、顯示內(nèi)容多樣、顯示方式靈活、性價(jià)比高等優(yōu)勢(shì),已經(jīng)開始廣泛應(yīng)用于各行各業(yè)。采用單片機(jī)控制的LED點(diǎn)陣顯示屏顯示形式美觀大方,顯示內(nèi)容靈活可變,具有低功耗,結(jié)構(gòu)簡(jiǎn)單,操作方便等優(yōu)點(diǎn),已廣泛應(yīng)用于銀行,證券,影視,體育和公路交通等各個(gè)方面,顯示了其良好的市場(chǎng)前景。
一、    設(shè)計(jì)要求
1、 基本要求:設(shè)計(jì)并制作LED電子顯示屏和控制器。
(1)自制一臺(tái)簡(jiǎn)易16行*32列點(diǎn)陣顯示的LED電子顯示屏;
(2)自制顯示屏控制器,擴(kuò)展鍵盤和相應(yīng)的接口實(shí)現(xiàn)多功能顯示控制,顯示屏顯示數(shù)字和字母亮度適中,應(yīng)無(wú)閃爍。
(3)顯示屏通過(guò)按鍵切換顯示數(shù)字和字母;
(4)顯示屏能顯示4組特定數(shù)字或者英文字母組成的句子,通過(guò)按鍵切換顯示內(nèi)容;
(5)能顯示4組特定漢字組成的句子,通過(guò)按鍵切換顯示內(nèi)容。
2、 發(fā)揮部分
1)       自制一臺(tái)簡(jiǎn)易16行*64列點(diǎn)陣顯示的LED電子顯示屏;
2)       LED顯示屏亮度連續(xù)可調(diào)。
3)       實(shí)現(xiàn)信息的左右滾屏顯示,預(yù)存信息的定時(shí)循環(huán)顯示;
4)       實(shí)現(xiàn)實(shí)時(shí)時(shí)間的顯示,顯示屏數(shù)字顯示: 時(shí)∶分∶秒(例如 18∶38∶59);
5)       增大到10組(每組漢字8個(gè)或16個(gè)數(shù)字和字符)預(yù)存信息,信息具有掉電保護(hù);
6)       實(shí)現(xiàn)和PC機(jī)通訊,通過(guò)PC機(jī)串口直接對(duì)顯示信息進(jìn)行更新(須做PC機(jī)客戶程序);
7)       其他發(fā)揮功能。
二、方案論證與比較
1、掃描方式的選擇
方案一:靜態(tài)顯示,所謂的靜態(tài)顯示就是對(duì)LED電子顯示屏中的每一像素點(diǎn)都通過(guò)硬件單獨(dú)控制,整個(gè)LED顯示屏所有的LED的同時(shí)顯示。此方式最大優(yōu)點(diǎn)是程序設(shè)計(jì)簡(jiǎn)單,且畫面無(wú)閃爍。但這種設(shè)計(jì)存在致命的缺點(diǎn):電路復(fù)雜,硬件利用率低,成本巨大。所以此方式一般不被采用。
方案二:采用動(dòng)態(tài)掃描法并行輸出數(shù)據(jù),所謂的動(dòng)態(tài)掃描法是利用人眼的視覺(jué)暫留特點(diǎn)而實(shí)現(xiàn)的一種顯示方法,即當(dāng)刷新速率足夠高時(shí),人眼就察覺(jué)不出顯示屏畫面更迭的閃爍。若要顯示一幀畫面,先送出第一行的數(shù)據(jù),然后選通并點(diǎn)亮第一行,延時(shí);此后送出第二行的數(shù)據(jù),同樣選通、點(diǎn)亮并延時(shí);依次將所有行掃描完,即給出了一幀的畫面。
方案三:采用動(dòng)態(tài)掃描法串行輸出數(shù)據(jù),方案二和方案三同樣采用動(dòng)態(tài)掃描實(shí)現(xiàn)顯示過(guò)程。但方案二的缺點(diǎn)也是明顯的,比較而言,方案二的譯碼電路比較復(fù)雜,相對(duì)硬件開銷大一些;方案三電路構(gòu)成簡(jiǎn)單,譯碼電路簡(jiǎn)潔。
為使電路設(shè)計(jì)簡(jiǎn)潔易行,我們采用方案三
2、行列控制方式的方案論證與選擇
方案一:采用傳統(tǒng)方案,應(yīng)用行掃描和列送數(shù)據(jù)的方式,橫向取模,從AT89C52串口發(fā)送出來(lái)的數(shù)據(jù)通過(guò)74LS595進(jìn)行串-并行數(shù)據(jù)轉(zhuǎn)換輸出給LEDMATRIX UINT的各個(gè)列,從AT89C52出來(lái)的輸出口的數(shù)據(jù)通過(guò)一級(jí)總線驅(qū)動(dòng)器74LS245后進(jìn)入4-16線譯碼器74LS154,譯碼以后通過(guò)限流電阻進(jìn)入驅(qū)動(dòng)管陣列放大,直接驅(qū)動(dòng)LED點(diǎn)陣的各行。但要組成16×64的點(diǎn)陣顯示電路,必須采用多片芯片,硬件電路復(fù)雜。
方案二:采用超大規(guī)模可編程邏輯陣列器CPL構(gòu)成行掃描和列控制模塊,利用VHDL語(yǔ)言設(shè)計(jì)控制邏輯,可充分發(fā)揮CPLD和數(shù)字電路EDA設(shè)計(jì)的優(yōu)勢(shì),只用一片CPLD芯片,通過(guò)簡(jiǎn)單的編程模擬8片74LS595和一片74LS154,就可以代替方案一中利用多塊芯片實(shí)現(xiàn)的功能,硬件電路設(shè)計(jì)簡(jiǎn)單可靠,具有極高的穩(wěn)定性。本設(shè)計(jì)采用Altera公司的EPM7128SQC160-10芯片。
3、數(shù)字時(shí)鐘顯示模塊的設(shè)計(jì)方案論證與選擇
方案一:因?yàn)轭}目中只要求顯示時(shí)、分、秒,因此可以用門電路組合構(gòu)成時(shí)鐘發(fā)生器,但此方案硬件復(fù)雜,穩(wěn)定性低,且不易控制。
方案二:本方案完全用軟件定時(shí)、計(jì)數(shù)功能實(shí)現(xiàn)數(shù)字時(shí)鐘。該方案具有硬件電路簡(jiǎn)單的特點(diǎn)。但由于每次執(zhí)行程序時(shí),定時(shí)器都要重新賦初值,所以該時(shí)鐘精度不高。而且,由于是軟件實(shí)現(xiàn),當(dāng)單片機(jī)不上電、程序不執(zhí)行時(shí),時(shí)鐘將不工作。
方案三:本方案采用實(shí)時(shí)時(shí)鐘芯片DS1302,它可以對(duì)年、月、日、周、時(shí)、分、秒進(jìn)行計(jì)時(shí),且具有閏年補(bǔ)償功能,采用三線接口與CPU進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)或RAM數(shù)據(jù),時(shí)鐘芯片自備電池,只需要設(shè)置初始時(shí)間即可。
基于上述分析,本設(shè)計(jì)采用方案三完成數(shù)字時(shí)鐘部分的功能。
三、系統(tǒng)硬件電路設(shè)計(jì)
1、系統(tǒng)總體框圖
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg
圖1   系統(tǒng)總體框圖
整個(gè)顯示系統(tǒng)可以分為①CPU主控電路部分②串行數(shù)據(jù)的傳送和時(shí)序控制部分 ③CPLD行列譯碼掃描部分④實(shí)時(shí)時(shí)鐘控制電路部分⑤與PC機(jī)串口通訊部分⑥按鍵控制電路部分⑦三極管驅(qū)動(dòng)電路部分⑧點(diǎn)陣顯示部分。
2、各單元電路設(shè)計(jì)
2.1  LED點(diǎn)陣的選擇
LED基本陣列選用6寸的8×8點(diǎn)陣, 16片8×8點(diǎn)陣組成整個(gè)顯示屏。該種點(diǎn)陣的規(guī)格為雙列直插,標(biāo)準(zhǔn)引腳距(2.54mm),LED規(guī)格為Ф5,單色紅色。
8×8點(diǎn)陣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點(diǎn)陣LED外觀及等效電路圖
2.2、掃描控制和驅(qū)動(dòng)電路設(shè)計(jì)
1.EPM7128SQC160-10簡(jiǎn)述
EPM7128SQC160-10是Altera公司推出的MAX7000S系列CPLD(ComplexProgrammable Logic Device);采用CMOSE2PROM工藝,傳輸延遲僅為5ns;內(nèi)部具有豐富的資源--128個(gè)觸發(fā)器、2500個(gè)用戶可編程門;而且具有102個(gè)用戶可編程的I/O口,為系統(tǒng)定義輸入、輸出和雙向口提供了極大的方便;為了比較適合混合電壓系統(tǒng),通過(guò)配置,輸入引腳可以兼容3.3V/5V邏輯電平,輸出可以配置為3.3V/5V邏輯電平輸出。EPM7128同時(shí)還提供了JTAG接口,可進(jìn)行ISP編程,極大地方便了用戶。
2、行列掃描電路的設(shè)計(jì)
對(duì)大型LED點(diǎn)陣顯示屏而言,由于其數(shù)據(jù)量大,必須有很快的刷新頻率,如刷新速度跟不上,會(huì)造成點(diǎn)陣屏畫面晃動(dòng)和閃爍。解決這個(gè)問(wèn)題有很多方法,例如,采用PC機(jī)的DMA控制器來(lái)提高數(shù)據(jù)傳輸速率,采用并行數(shù)據(jù)傳輸方式,分單元多CPU控制方式等等。我們采用CPU控制,利用CPLD(EPM7128SQC160-10)設(shè)計(jì)掃描邏輯,串行列數(shù)據(jù)分時(shí)傳輸,行掃描的方式,從而使整個(gè)顯示屏可以順序工作,并利用CPU控制掃描頻率,實(shí)現(xiàn)了屏幕無(wú)閃爍顯示。
該部分控制電路原理如圖3、圖4、圖5所示,采用行掃描的方式,行掃描與列送數(shù)據(jù)電路均采用CPLD 芯片編程構(gòu)成的通用數(shù)字電路來(lái)控制,在16×64點(diǎn)陣顯示時(shí),掃描輸出需要大量的I/O端口,因此我們采用具有160個(gè)I/O端口的EPM7128SQC160-10芯片,僅用一片即可滿足設(shè)計(jì)要求。
列數(shù)據(jù)傳輸控制電路如圖3所示,由單片機(jī)輸出的顯示信息串行輸入到CPLD,用VHDL語(yǔ)言編寫其總線讀邏輯,在CPLD芯片中實(shí)現(xiàn)八片8位3態(tài)串行輸入、并行輸出,帶鎖存功能的移位寄存器,完成數(shù)據(jù)的串并轉(zhuǎn)換,由CPLD的64列數(shù)據(jù)輸出控制LED點(diǎn)陣的64列。圖3為由CPLD實(shí)現(xiàn)的八片74LS595的示意圖,其中,L1-L64為列選通控制信號(hào)輸出,RCK、SCK、SCLR是由單片機(jī)送來(lái)得控制信號(hào),RCK為鎖存控制信號(hào),SCK為時(shí)鐘控制信號(hào),SCLR為清零信號(hào),各片的RCK、SCK、SCLR均接在一起, Si接單片機(jī)的掃描數(shù)據(jù)輸出,第一片74LS595(由CPLD實(shí)現(xiàn))移位輸出端接第二片74LS595的數(shù)據(jù)輸入Si2,八片進(jìn)行級(jí)連,實(shí)現(xiàn)一次掃描一個(gè)字節(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實(shí)現(xiàn)的64列數(shù)據(jù)傳輸邏輯示意圖
行掃描的控制是利用CPLD編程實(shí)現(xiàn)四線十六線譯碼器74LS154的功能,如圖4所示,AA、BB、CC、DD接單片機(jī)行控制數(shù)據(jù)輸出,H1-H16為CPLD輸出的行掃描控制信號(hào),接行三極管驅(qū)動(dòng)電路。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg
圖4   用CPLD實(shí)現(xiàn)的行掃描邏輯示意圖
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg
5  CPLD內(nèi)部邏輯電路圖
3、行驅(qū)動(dòng)電路設(shè)計(jì)
該系統(tǒng)顯示部分的點(diǎn)陣采用單色LED共陰點(diǎn)陣模塊,16 塊8×8點(diǎn)陣模塊連接成16×64點(diǎn)陣。因?yàn)橐粋(gè)行掃描管同時(shí)控制著一行中多個(gè)LED的通斷,所以它承載較大電流。以每個(gè)發(fā)光二極管流過(guò)的電流為10mA計(jì)算,一個(gè)64列的點(diǎn)陣屏中,每個(gè)行掃描管所承受的電流是10mA×64=0.64A,為此我們選用高速中功率三極管8550,保證了行的驅(qū)動(dòng)能力。由于顯示點(diǎn)陣的每一行都需要用一個(gè)三極管來(lái)控制,所以16×64點(diǎn)陣共需要16個(gè)8550。驅(qū)動(dòng)電路如圖6所示。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg
                    圖6   行驅(qū)動(dòng)電路圖
4、掃描頻率的控制
由于人眼的視覺(jué)暫留現(xiàn)象,一個(gè)LED發(fā)光管如果在一秒鐘內(nèi)亮24次以上的話,人眼就感覺(jué)不到閃爍。由此,一屏畫面連續(xù)以每秒25次的頻率循環(huán)顯示時(shí),給人的感覺(jué)是穩(wěn)定的。為此只要利用CPU控制由CPLD實(shí)現(xiàn)的行譯碼器的譯碼速度,保證每秒內(nèi)譯碼16×25=400次,就可以保證畫面的穩(wěn)定性。設(shè)計(jì)時(shí),我們使AT89C51的定時(shí)/計(jì)數(shù)器T0工作于方式2(自動(dòng)重載方式AUTO-RELOAD MODEL)。此時(shí)設(shè)定M1M0為10,在方式2中16位計(jì)數(shù)器被拆為兩部分,其中TL0用作8bit Counter;TH0用于存放和保持計(jì)數(shù)初值。當(dāng)TL0計(jì)數(shù)溢出時(shí),在溢出標(biāo)志TF0置1的同時(shí),自動(dòng)的將TH0的初值重載到TL0中,因此在初始化的過(guò)程中,用軟件只需一次賦初值。其周期為:
T=(2^8-TH0初值)×?xí)r鐘周期×12
采用11.0592MHZ的晶振時(shí),計(jì)數(shù)速率約為1MHz,輸入脈沖的周期間隔為1uS,通過(guò)計(jì)算,TH0的初值為243,即為0XF3(OF3H)。采用中斷的方式控制行譯碼掃描頻率,就可以保證畫面的無(wú)閃爍顯示。
2.3實(shí)時(shí)時(shí)間控制電路的設(shè)計(jì)
1DS1302的結(jié)構(gòu)及工作原理
DS1302 是美國(guó)DALLAS公司推出的一種高性能、低功耗、帶RAM的實(shí)時(shí)時(shí)鐘電路,它可以對(duì)年、月、日、周日、時(shí)、分、秒進(jìn)行計(jì)時(shí),具有閏年補(bǔ)償功能,工作電壓為2.5V~5.5V。采用三線接口與CPU進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)或RAM數(shù)據(jù),同時(shí)提供了對(duì)后背電源進(jìn)行涓涓細(xì)流充電的能力。其引腳功能及結(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í)鐘數(shù)據(jù),為1表示存取RAM數(shù)據(jù);位5至位1指示操作單元的地址;最低有效位(位0)如為0表示要進(jìn)行寫操作,為1表示進(jìn)行讀操作,控制字節(jié)總是從最低位開始輸出。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image020.jpg
圖8 DS1302的控制字
在控制指令字輸入后的下一個(gè)SCLK時(shí)鐘的上升沿時(shí),數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入從低位即位0開始。同樣,在緊跟8位的控制指令字后的下一個(gè)SCLK脈沖的下降沿讀出DS1302的數(shù)據(jù),讀出數(shù)據(jù)時(shí)從低位0位到高位7。
DS1302有12個(gè)寄存器,其中有7個(gè)寄存器與日歷、時(shí)鐘相關(guān),存放的數(shù)據(jù)位為BCD碼形式,其日歷、時(shí)間寄存器及其控制字見(jiàn)表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
時(shí)寄存器
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 還有年份寄存器、控制寄存器、充電寄存器、時(shí)鐘突發(fā)寄存器及與RAM相關(guān)的寄存器等。時(shí)鐘突發(fā)寄存器可一次性順序讀寫除充電寄存器外的所有寄存器內(nèi)容。
2、利用 DS1302的實(shí)時(shí)時(shí)間顯示電路硬件設(shè)計(jì)
    DS1302與CPU的連接需要三條線,即SCLK(7)、I/O(6)、RST(5)。圖9示出DS1302與89C51的連接圖,利用單片機(jī)控制,采用顯示屏分屏顯示年、月、日與時(shí)、分、秒,并能進(jìn)行按鍵調(diào)時(shí)。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image022.jpg
圖9   DS1302與89C52的連接圖
    實(shí)際上,在調(diào)試程序時(shí)可以不加電容器,只加一個(gè)32.768kHz 的晶振即可。只是選擇晶振時(shí),不同的晶振,誤差也較大。另外,還可以在上面的電路中加入DS18B20,同時(shí)顯示實(shí)時(shí)溫度。只要占用CPU一個(gè)口線即可。
2.4  系統(tǒng)電源參數(shù)的核算
對(duì)大型LED點(diǎn)陣顯示屏而言,由于其發(fā)光二極管數(shù)量多,在16×64點(diǎn)陣中,以每個(gè)發(fā)光二極管流過(guò)的電流為10mA計(jì)算,一個(gè)64列的點(diǎn)陣屏中,每個(gè)行掃描管所承受的電流是10mA×64=0.64A,16行并聯(lián)的總電流為0.64×16=10.24 A,要求電源輸出大電流,一般的集成穩(wěn)壓芯片均不能滿足要求,因此本設(shè)計(jì)中采用電壓為5V,電流為10A的開關(guān)穩(wěn)壓電源。
2.5 單片機(jī)與PC機(jī)通信單元設(shè)計(jì)
1、 通信單元電路組成
本單元主要有兩部分組成:上位機(jī)、下位機(jī)與電纜的接口,中間為電平轉(zhuǎn)換電路。該系統(tǒng)采用三線制,獨(dú)占 CPU串口方式。RS-232信號(hào)的電平和單片機(jī)串口信號(hào)的電平不一致,必須進(jìn)行二者之間的電平轉(zhuǎn)換,在此使用的集成電平轉(zhuǎn)換芯片MAX232為RS-232C/TTL電平轉(zhuǎn)換芯片。它只使用單+5V電源,配接4個(gè)1μF電解電容即可完成RS-232電平與TTL電平之間的轉(zhuǎn)換。其電路原理如圖10所示。轉(zhuǎn)換完畢的串口信號(hào)TXD、RXD直接和89C51的串行口連接。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image024.jpg
圖10   電平轉(zhuǎn)換電路
2、 通信協(xié)議
本系統(tǒng)中PC機(jī)承擔(dān)主控任務(wù),單片機(jī)接受PC機(jī)指令,并根據(jù)指令控制顯示信息,修改顯示內(nèi)容。我們采用RS-232串口異步通信,1位起始位,8位數(shù)據(jù)位,1位停止位,無(wú)奇偶校驗(yàn),波特率9600b/s,傳輸數(shù)據(jù)采用ASCII模式。PC機(jī)傳送控制信息和數(shù)據(jù),控制信息包括修改顯示參數(shù)、修改顯示方式。同時(shí)PC機(jī)能向單片機(jī)傳送顯示內(nèi)容。下位機(jī)按接收到的指令工作。如果主控機(jī)發(fā)出錯(cuò)誤的指令,將不做任何控制,并顯示Error提示,1秒鐘后自動(dòng)返回。
2.6、鍵盤控制電路設(shè)計(jì)
本系統(tǒng)設(shè)置三個(gè)按鍵(k1、k2、k3)分別來(lái)控制時(shí)間、日期、滾屏顯示以及時(shí)間的調(diào)整,系統(tǒng)默認(rèn)的狀態(tài)是顯示時(shí)間。首先進(jìn)行鍵盤掃描判斷k1鍵是否按下,如果k1鍵按下并且只按一下則進(jìn)入日期顯示狀態(tài),當(dāng)按兩下則進(jìn)入信息的順序滾屏顯示狀態(tài),如果沒(méi)有按下則判斷k2鍵是否按下,當(dāng)k2鍵按下則進(jìn)入時(shí)間、日期的設(shè)置狀態(tài)。K3鍵的作用是當(dāng)調(diào)整時(shí)間時(shí),完成時(shí)間和日期的累加,直到調(diào)整到需要的時(shí)間和日期為止。
三、 軟件設(shè)計(jì)
1.主程序設(shè)計(jì)
軟件設(shè)計(jì)采用了模塊化設(shè)計(jì),全部用C51編程。整個(gè)軟件系統(tǒng)簡(jiǎn)潔明了,而且具有良好的擴(kuò)展性。整個(gè)軟件系統(tǒng)包括主程序、行列控制邏輯CPLD程序、時(shí)鐘控制子程序和PC機(jī)串行通信子程序四大模塊。主程序負(fù)責(zé)鍵盤處理、顯示刷新、信息調(diào)用與傳輸控制。主程序流程如圖11所示。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image026.jpg
圖11  主程序流程圖
2、基于CPLD的行列控制邏輯電路的程序設(shè)計(jì)
行譯碼掃描和列數(shù)據(jù)的串并傳輸控制的功能較主控電路來(lái)講相對(duì)簡(jiǎn)單,它是將主控電路輸出的四位二進(jìn)制數(shù)據(jù)譯成16行的行選通信號(hào),去控制行驅(qū)動(dòng)管驅(qū)動(dòng)行輸出,將主控電路串行輸出的數(shù)據(jù)經(jīng)CPLD完成數(shù)據(jù)的串并轉(zhuǎn)換,輸出控制64列,完成列數(shù)據(jù)的傳送。這是一個(gè)純組合邏輯電路,使用VerilogHDL 語(yǔ)言描述的always語(yǔ)句和case多分支語(yǔ)句即可實(shí)現(xiàn)此功能。
3、PC機(jī)串口通信子程序設(shè)計(jì)
在與PC機(jī)進(jìn)行通信時(shí),單片機(jī)的功能主要是負(fù)責(zé)通信與數(shù)據(jù)處理。單片機(jī)接收來(lái)自PC機(jī)的信息,分析后回傳信息或數(shù)據(jù)到PC機(jī),采用串口中斷程序,不定時(shí)處理與PC機(jī)的通信信息。
四、 系統(tǒng)測(cè)試
經(jīng)過(guò)系統(tǒng)的測(cè)試與分析,得到以下結(jié)果:
1、按鍵切換顯示數(shù)字、字母與時(shí)間:
上電時(shí),系統(tǒng)顯示當(dāng)前時(shí)間,按一下k1鍵,即進(jìn)入日期顯示狀態(tài),系統(tǒng)顯示當(dāng)前的日期,按兩下k1鍵,系統(tǒng)進(jìn)入順序滾屏顯示狀態(tài),依次顯示“歡迎光臨濟(jì)鐵職院”、“happyteacher day”等10組漢字與英文字符,按下k2鍵則進(jìn)入時(shí)間設(shè)置狀態(tài),與K3鍵配合實(shí)現(xiàn)了對(duì)年、月、日、以及時(shí)、分、秒的調(diào)整。
2、掉電保護(hù)功能測(cè)試
為使單片機(jī)內(nèi)部RAM中的數(shù)據(jù)在電源掉電時(shí)不丟失,單片機(jī)外部中斷0平時(shí)是高電平,當(dāng)?shù)綦姇r(shí),外部中斷口0變?yōu)榈碗娖剑a(chǎn)生中斷,單片機(jī)檢測(cè)到這個(gè)中斷信號(hào)時(shí),轉(zhuǎn)入中斷處理程序,及時(shí)把有用信息保存起來(lái),因?yàn)橄到y(tǒng)接入470uF的電容,電容的放電時(shí)間完全能夠保證單片機(jī)執(zhí)行完保護(hù)數(shù)據(jù)的程序,這樣就可以避免斷電時(shí)預(yù)存信息的丟失,實(shí)現(xiàn)掉電保護(hù)功能。經(jīng)測(cè)試,我們?cè)O(shè)計(jì)的系統(tǒng)做到了信息的掉電保護(hù)。
3、亮度的調(diào)節(jié)測(cè)試
通過(guò)連續(xù)調(diào)節(jié)限流電阻,改變加在LED顯示屏上的驅(qū)動(dòng)電流,達(dá)到亮度連續(xù)可調(diào)的目的。經(jīng)測(cè)試,本系統(tǒng)實(shí)現(xiàn)了顯示亮度的連續(xù)可調(diào)。
4、結(jié)論
經(jīng)過(guò)小組成員的一致努力,完成了本次課題的任務(wù),達(dá)到了預(yù)期的目的。設(shè)計(jì)制作的具有多種功能的16×64的點(diǎn)陣LED顯示屏,顯示畫面清晰,無(wú)閃爍,很好的完成了基本要求部分和發(fā)揮部分的功能。
五、設(shè)計(jì)總結(jié)
通過(guò)這次競(jìng)賽,我們?cè)谟布O(shè)計(jì)、軟件編程方面得到了極大的提高。同時(shí)我們小組的三個(gè)成員團(tuán)結(jié)一心,通力合作,體現(xiàn)了很好的團(tuán)隊(duì)合作精神。為以后走向工作崗位從事科研或管理工作積累了不可多得的經(jīng)驗(yàn)。在競(jìng)賽中碰到了一個(gè)接一個(gè)的難題,我們經(jīng)過(guò)不屈不撓的刻苦攻關(guān),一一得到了化解,這種體驗(yàn)為我們走好今后的人生路增添了極大的信心。
六、參考文獻(xiàn)
[1] 全國(guó)大學(xué)生電子設(shè)計(jì)競(jìng)賽組委會(huì).第六屆全國(guó)大學(xué)生電子設(shè)計(jì)競(jìng)賽獲獎(jiǎng)作品選編(2003).北京:北京理工大學(xué)出版社,2005年
[2] 黃智偉,王彥,陳文光,朱衛(wèi)華.全國(guó)大學(xué)生電子設(shè)計(jì)競(jìng)賽訓(xùn)練教程.北京:電子工業(yè)出版社,2005年
[3] 王松武,于鑫,武思軍.電子創(chuàng)新設(shè)計(jì)與實(shí)踐.北京:國(guó)防工業(yè)出版社,2005
[4]林明權(quán)、馬維旻:VHDL數(shù)字控制系統(tǒng)設(shè)計(jì)范例[M],北京,
電子工業(yè)出版社,2003
[5] 楊恒、盧飛成:FPGA/VHDL快速工程實(shí)踐入門與提高[M],北京,北京航空航天大學(xué)出版社,2003
[6] 顧斌、趙明中:數(shù)字電路EDA設(shè)計(jì),西安電子科技大學(xué)出版社,2005
[7] 趙亮、侯國(guó)銳:?jiǎn)纹瑱C(jī)C語(yǔ)言編程與實(shí)例,人民郵電出版社,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};/*冒號(hào)*/
ucharcode ji[] ={0xFF,0xF7,0x60,0xCB,0xD1,0xAB,0x8B,0xFF};/*"濟(jì)",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*/
//定時(shí)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);
     }
    }
   }

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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