欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 20696|回復: 0
打印 上一主題 下一主題
收起左側

基于51單片機的LED點陣顯示屏系統的設計與實現論文分享

[復制鏈接]
跳轉到指定樓層
樓主
ID:317003 發表于 2018-4-26 14:37 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
摘要:本文介紹了一款以單片機AT89S51為控制器的LED點陣顯示屏系統的設計。該系統可實現中英文字符的顯示和動態特效顯示。并且可以通過級連的方式來擴大顯示屏幕的尺寸以達到增加顯示內容的目的。系統采用PC機作為上位機,上位機向單片機發送控制命令和上位機所存儲的顯示代碼,AT89S51單片機接收并處理PC機的控制命令以及顯示代碼,由顯示驅動模塊驅動一個16×16分辨率的LED點陣顯示屏的掃描顯示。PC機與單片機之間的通信采用RS—232C通信標準來實現。所選用的AT89S51單片機具有價格低廉程序寫入方便的特點使得整個系統方便維護和檢修。除此之外,該系統只占用了單片機少量的I /O口和內存,為系統留下了功能擴展的空間。

對設計題目的特點,作者對論文的內容和結構將做如下安排:
(1)初步方案的論證和選擇
    搜集題目的有關資料,并參照目前通用的設計思想和設計方法擬定幾套設計方案進行分析比較。最終選定了以PC機為上位機,單片機為核心控制器件,外加譯碼電路和驅動電路的設計方案。
(2)方案實現
以設計方案為指導思想選擇合適的器件來實現這一思想,選擇器件時要從功能和電氣特性兩方面來選擇和論證。經過對比選擇選定AT89S51單片機為核心控制器件,由串并轉換器74LS164和鎖存器74LS373為譯碼電路器件,三極管8550和ULN2803為驅動電路器件。論文列出了詳細的器件參數和在系統中的連接使用方法。                                      
(3)軟件編寫
根據硬件特點和設計要求,軟件選用C語言編寫。程序按功能分為靜態顯示、動態顯示、通信等幾個功能上相對獨立的模塊。然后按照所劃分的模塊逐個編寫和調試,最后將獨立的模塊整合起來。
(4)驗證與測試
    調試分為硬件調試、軟件調試和系統聯合調試幾步來進行。在硬件調試中發現有單片機端口驅動能力不足、驅動電路工作不穩定等問題。在軟件調試中出現程序整合工作不協調等問題。通過分析,查找找出了問題原因并設法將其解決。
(5)結論
   設計完成后對設計中所遇到的問題、經驗教訓、以及自己的想法進行總結。
第2章  方案論證與選擇2.1  系統硬件方案
大多數的LED顯示屏都在戶外,所以對硬件的質量要求非常的高。為方便檢修和維護硬件電路設計時常常采用模塊化的設計方法。硬件的設計采用模塊化設計,既要滿足模塊本身功能又要能夠和整個系統兼容。如圖2-1所示,根據顯示系統的功能特點確定系統硬件由顯示屏部分,控制部分,通信系統及上位機四部分組成。上位機通過通信部分向控制部分發送控制指令和顯示內容代碼,控制部分執行顯示指令并將顯示代碼處理后控制顯示部分的顯示內容和顯示方式[3]。
2-1 系統硬件組成框圖
2.1.1  顯示屏主控制器
控制部分是整個系統的核心部分,其功能為與上位機通信接收上位機發送的數據和控制指令處理過后控制顯示部分顯示內容。其常用的電子設計方法有單片機、DSP、及EDA技術。幾種設計方法比較各有其特點:
(1)單片機
單片機是集成了CPU,ROM,RAM和I/ O口的微型計算機。它有很強的接口性能,非常適合于工業控制,因此又叫微控制器(MCU)。單片機品種齊全,型號多樣 CPU 從8,16,32到64位,多采用RISC 技術,片上I/O非常豐富,有的單片機集成有A/ D,“ 看門狗”,PWM,顯示驅動,函數發生器,鍵盤控制等。它們的價格也高低不等,這樣極大地滿足了開發者的選擇自由。除此之外單片機還具有低電壓和低功耗的特點。隨著超大規模集成電路的發展,NMOS工藝單片機被CMOS代替,并開始向HMOS 過渡。供電電壓由5V 降到3V,2V甚至到1V,工作電流由mA降至μA ,這在便攜式產品中大有用武之地[4]。
(2)DSP 芯片
DSP 又叫數字信號處理器。顧名思義,DSP主要用于數字信號處理領域,非常適合高密度,重復運算及大數據容量的信號處理。現在已經廣泛應用于通信、便攜式計算機和便攜式儀表、雷達、圖像、航空、家用電器、醫療設備等領域,DSP具有修正的哈佛結構,多總線技術以及流水線結構。將程序與數據存儲器分開,使用多總線,取指令和取數據同時進行,以及流水線技術,這使得速度有了較大的提高。DSP區別于一般微處理器的另一重要標志是硬件乘法器以及特殊指令,一般微處理器用軟件實現乘法,逐條執行指令,速度慢。而DSP 依靠硬件乘法器單周期完成乘法運算,而且還具有專門的信號處理指令,如TM320 系列的FIRS ,LMS,MACD指令等[5]。
(3)EDA
EDA(即Electronic Design Automation) 即電子設計自動化,它是以計算機為工具,在EDA 軟件平臺上,對用硬件描述語言HDL 完成的設計文件自動地邏輯編譯、邏輯化簡、邏輯分割、邏輯綜合及優化、邏輯布局布線、邏輯仿真,直至對于特定目標芯片進行適配編譯、邏輯影射和編程下載等。設計者只需用HDL 語言完成系統功能的描述,借助EDA工具就可得到設計結果,將編譯后的代碼下載到目標芯片就可在硬件上實現。由于FPGA/CPLD可以通過軟件編程對該硬件的結構和工作方式進行重構,修改軟件程序就相當于改變了硬件,軟件編寫可以采用自頂向下的設計方案,而且可以多個人分工并行工作這樣便縮短了開發周期和上市時間,有利于在激烈的市場競爭中搶占先機。而且MCU和DSP都是通過串行執行指令來實現特定功能,不可避免低速,而FPGA/CPLD則可實現硬件上的并行工作,在實時測控和高速應用領域前景廣闊;另一方面,FPGA/CPLP器件在功能開發上是軟件實現的,但物理機制卻和純硬件電路一樣,十分可靠。
三種設計方式相比較各有優點且都能夠實現控制功能,但單片機的技術門檻較低開發成本也較低非常適合初學者進行學習和鍛煉使用。現在市場上常用的單片機主要有MCS-51、AVR、ARM、PIC等。其中應用最廣泛的單片機首推Intel的51系列,由于產品硬件結構合理,指令系統規范,加之生產歷史“悠久”,有先入為主的優勢常作為單片機學習的教材。且51系列的I/O腳的設置和使用非常簡單,當該腳作輸入腳使用時,只須將該腳設置為高電平(復位時,各I/O口均置高電平)。當該腳作輸出腳使用時,則為高電平或低電平均可。所以在控制部分方案的選擇中選定51系列單片機作為控制部分的核心器件。
2.1.2  通信系統
通信部分要滿足的設計要求就是穩定、快速、簡單易實現。因為通常情況下顯示屏和上位機的距離不會很遠,所以通信距離的要求不是很高。計算機數據通信主要采用并行通信和串行通信兩種方式。
(1)并行通信
并行通信時數據的各個位同時傳送,可以字或字節為單位并行進行。并行通信速度快,但用的通信線多、成本高,故不宜進行遠距離通信。
(2)串行通信
串行通信數據是一位一位順序傳送,只用很少幾根通信線,串行傳送的速度低,但傳送的距離長,因此串行適用于長距離而速度要求不高的場合。在串行發送時,數據是一位一位按順序進行的,而計算機內部的數據是并行的。因此,當計算機向外發送數據時,必須將并行數據轉換為串行數據再發送。反之,又必須將串行數據轉換為并行數據輸入計算機中。這種轉換即可以用硬件實現也可以用軟件實現。單由軟件實現會增加CPU負擔,降低其利用率,故目前常采用硬件實現。通用的通用異步接收/發送器,簡稱UART(Universal AsynchromousReceeiver/Trabsnitter)是完成這一功能的硬件電路。在單片機芯片中,UART已經集成在其中,作為其組成部分,構成一個串行口[6]。
    綜上所述,題目設計已經選定了單片機為開發方式而單片機的UART已經集成在單片機內,所以通信系統選擇串行通信為通信方式。
2.1.3  LED點陣顯示屏
顯示部分包括了一塊至少可以顯示一個漢字的顯示屏,以及驅動該顯示屏的驅動電路。由于單片機的I/O口有限要不能直接用I/O口來驅動LED顯示屏,所以需要對單片機IO口進行擴展增加單片機并行輸出的能力。
LED顯示屏是由一個一個的發光二極管點陣構成的,要構成大屏幕的LED顯示屏就需要多個發光二極管。構成LED屏幕的方法有兩種,一是由單個的發光二極管逐點連接起來,如圖2-2所示;二是選用一些由單個發光二極管構成的LED點陣子模塊構成大的LED點陣模塊。目前市場上普遍采用的點陣模塊有8×8、16×16幾種;這兩種屏幕構成方法各有有缺點,單個發光二極管構成顯示屏優點在于當單個的發光二極管出現問題時只需更換一個二極管即可,檢修的成本較低,缺點在于連接線路復雜;而點陣模塊構成的方法卻正好與之相反,模塊構成省約了大量的連線,不過當一個LED出現問題時同在一個模塊的所有LED都必須被更換。這就加大了維修的成本。
兩種方法相比較,決定采取模塊構成的方法來制作一個LED點陣顯示屏。為了避免模塊的缺點,選擇點陣數較小的模塊來減小出現這一問題的風險。所以構建一個16×16的LED點陣屏選用四塊8×8點陣模塊。
2-2LED點陣圖
一個16×16的LED顯示屏行和列各有16支引腳,不能單靠51單片機的端口驅動所以必須要對單片機的端口個數進行擴展。經常采用的端口擴展方法是用串并轉換芯片進行譯碼。常用的串并轉換芯片有74LS154(4線-16線譯碼器)、74LS164(8位串并轉換器)、74HC595等。51系列單片機端口低電平時,吸入電流可達20mA,具有一定的驅動能力;而為高電平時,輸出電流僅數十μA甚至更小(電流實際上是由腳的上拉電流形成的),基本上沒有驅動能力,所以單片機不能直接驅動LED顯示屏顯示。在單片機和顯示屏之間還需要增加以功能放大位目的的驅動電路[7]。
2.1.4  硬件設計方案
最終方案如圖2-3所示,以PC機作為上位機存儲和處理顯示內容用串行通信的方式將顯示內容和控制指令傳輸到單片機系統,單片機根據上位機傳輸來的內容和指令通過端口譯碼擴展后驅動4塊8×8LED點陣模塊構成的16×16的LED點陣顯示屏。題目將以此方案為指導思想展開具體的硬件電路設計。
2-3  硬件設計方案
2.2  系統軟件方案
軟件的設計除了滿足設計功能外還必須要滿足易讀寫,方便下載和編譯。設計目標和硬件總體結構確定的情況下,軟件可以分為主程序,顯示子程序,各種特效顯示子程序,通信程序三個主要部分組成。具體結構如圖2-4所示。
2-4  軟件功能結構框圖
軟件的編寫需要借助軟件編輯器和編譯軟件,編譯完成后還需要下載到單片機中執行。編寫軟件之前得首先選擇一種合適的語言以及配套的編輯器和編譯軟件。最后還要選擇一款與所選單片機的下載器或下載軟件來把編寫的程序下載到單片機中執行。
第3章  系統硬件設計3.1  硬件整體設計概述及功能分析
     顯示系統具體設計主要由上位機,通信系統,單片機系統,譯碼電路,顯示驅動電路和16×16的點陣屏六部分組成。具體工作流程為:上位PC機通過通信系統向單片機發送控制指令和顯示代碼內容,單片機接收后執行控制指令處理顯示代碼將顯示內容通過I/O口串行輸出并且控制譯碼電路完成串并轉換并行輸出,最后由顯示驅動電路進行電壓和電流的處理以達到LED顯示屏的顯示電流,電壓要求進而使顯示屏顯示內容[11]。
根據硬件的功能結構圖選取合適器件,器件不但要求能實現所要求的功能還要能兼容至整個系統之中。通過查閱資料和對比最終的硬件原理圖如圖3-1所示。
  3-1  硬件原理圖
   
3.2.2  控制系統設計
控制電路設計中采用的是單片機系統,該系統必須要是工作在一個最小系統(指單片機的可以的最小配置系統)。AT89S51的最小系統包括了外界時鐘電路和復位電路,選定一定數量的IO口作為控制口控制外部的各種器件和數據的輸出。根據功能選擇一定的單片機端口添加外圍的器件,具體電路如圖3-2所示。
在該系統中,P1各口主要用作LED顯示數據的控制輸出。由于端口的驅動能力有限所以該端口外接了5K的上拉電阻來提高驅動能力。其中P1.5P1.6P1.7還復用為ISP下載功能口。具體接法為:P1.0,P1.1,P1.4,P1.5分別接四塊74LS164的A端,向74LS164送入串行數據經過其轉換后并行輸出;P1.2和P1.6分別接列和行的74LS164的CLOCK端,產生移位脈沖是串行數據并行輸出;P1.3和P1.7接列和行的CLEAR端,在一組數據完成串并轉換后清除164芯片中的內容轉換新的數據;其中P1.5P1.6P1.7還復用為ISP下載功能口。P2.0接164芯片的使能控制端,當為高電平使允許輸出;P2.2和P2.3接鎖存器74LS373的OE和LE端控制鎖存器的工作狀態。
端口30,EA/VPP:外部訪問允許。欲使CPU僅訪問外部程序存儲器(地址為0000H-FFFFH),EA端必須保持低電平(接地)。因為沒有擴展外部程序存儲器所以將EA置為高電平。
3-2  控制部分電路圖
由于P3口是特殊功能口,在該系統中基本是采用其第二功能。其第二功能和實際運用如表3-1所示:
3-1  AT89S51P3口第二功能的應用
端口
第二功能
實際作用
P3.0
RXD(串行輸入口)
與上位機通信的數據輸入口
P3.1
TXD(串行輸出口)
與上位機通信的數據輸出口
P3.2
外部中斷0
做按鍵中斷,控制顯示狀態
P3.3
外部中斷1
做按鍵中斷,控制運行模式

AT89S51單片機的P1在訪問外部數據存儲器或程序存儲器時,這組口線分時轉換地址(低8位)和數據總線復用,P2口在訪問外部程序存儲器或16位地址的外部數據存儲器時,P2口送出高8位地址數據。所以P1和P2口留為外部數據存儲器和程序存儲器的擴展用,以備內部存儲器和程序存儲器不夠用的情況時使用[12]。
3.3  譯碼電路設計

譯碼電路的功能是為了解決單片機I/O端口不足。行譯碼所用器件為串并轉換器74LS164和鎖存器74LS373。具體電路如圖3-3所示
圖3-3  行譯碼電路圖
3.3.1  串并轉換器74LS164
列譯碼采用的是芯片74LS164。如果不采用譯碼電路完全依靠單片機的端口輸出來控制16×16的LED點陣屏顯示,需要32個端口。而采用了譯碼電路后僅僅需要7~9個端口便可實現控制顯示。大大減少了I/O口的占用數目,為單片機擴展其他功能預留下來了空間。
74LS164為一個8位數據的串并轉換器。當清除端(CLEAR)為低電平時,輸出端(QA-QH)均為低電平。串行數據輸入端(A,B)可控制數據。當A、B任意一個為低電平,則禁止新數據輸入,在時鐘端(CLOCK)脈沖上升沿作用下Q0為低電平。當A、B有一個為高電平,則另一個就允許輸入數據,并在CLOCK上升沿作用下決定Q0的狀態。
3-1  74LS164工作參數
參數
最小值
標準值
最大值
單位
高電平輸入電壓
2
V
低電平輸入電壓
0.8
V
高電平輸出電壓
2.4
3.2
--
V
低電平輸出電壓
0.2
0.4
V
時鐘頻率
0
25
MHZ
這就要求單片機的引腳輸出的高低電平要在芯片的識別范圍內,由于采用了列選通行傳送顯示代碼的方法所以行譯碼電路上也加上了74L373鎖存芯片。這就要求74LS164芯片的輸出要滿足鎖存芯片的高低電平區分范圍和頻率要求。
3.3.2  鎖存器74L373
由于74LS164芯片不具有鎖存功能,所以在74LS164進行八位數據的串并轉換時,串行數據的第一位會從QA依次移位到QH,第二位數據會從QA依次移位到QG,依次類推在八位數據轉換完成之前74LS164芯片的輸出會出現一段時間的亂序輸出,這一結果會通過驅動電路表現在顯示屏上。結果就是顯示屏無序導通閃爍,不能顯示所需內容。因此在串并轉換完成前就需要74LS164的輸出口不與驅動電路導通。所以選擇鎖存器74LS373來完成這一功能。
74LS373為八D鎖存器(3S,鎖存允許輸入有回環特性)。373為三態輸出的八D透明鎖存器,共有54/74S373和54/74LS373兩種線路結構形式當三態允許控制端OE為低電平時,O0~O7為正常邏輯狀態,可用來驅動負載或總線。當OE為高電平時,O0~O7呈高阻態,即不驅動總線,也不為總線的負載,但鎖存器內部的邏輯操作不受影響。當鎖存允許端LE為高電平時,O隨數據D而變。當LE為低電平時,O被鎖存在已建立的數據電平。
3-2  74LS373工作參數表
參數
最小值
額定值
最大值
單位
電源電壓
4.75
5
5.25
V
輸入高電平電壓
2
V
輸入低電平電壓
0.8
V
輸出高電平電壓
-2.6
mA
輸出低電平電壓
24
mA
由表與表比較可以看出,74LS164的輸出條件與74LS373的輸入條件相匹配,理論上可以實現鎖存器對譯碼器的數據鎖存。
3.4  驅動電路設計3.4.1  行驅動電路設計
發光二極管,LED(Light Emitting Diodes),即是在在某些半導體材料的PN結中,注入的少數載流子與多數載流子復合時會把多余的能量以光的形式釋放出來,從而把電能直接轉換為光能。PN結加反向電壓,少數載流子難以注入,故不發光。這種利用注入式電致發光原理制作的二極管叫發光二極管,通稱LED。 行驅動采用PNP三極管8550接法如圖3-4示:
3-4  行驅動器件8550的接法
8550為PNP型三極管,內部結構如圖3-5示。發射極e接5V電源,基極接譯碼信號輸出端,集電極接輸出驅動LED點陣屏。當譯碼器端口輸出為低電平時,發射極與基極電勢差為5V-基極中帶負電的電子越過PN結擴散到發射區。發射極產生和電子擴散方向相反的電流,由于基極電子大量擴散到發射極集電極電子擴散到基極中形成了電流。當譯碼器端口輸出高電平時發射極與基極之間的電勢差為5V-,由于發射極與基極之間電勢差的減少基極電子向發射極擴散的電子數量減少故集電極電流也隨之減少。故8550在驅動電路中起到提供驅動電流和選通開關的作用。
3-5  8550內部結構圖
3.4.2  列驅動電路設計
列驅動采用ULN2803。ULN2803是一種高電壓大電流達林頓管陣列內部結構如圖,該陣列中的八個NPN達林頓連接晶體管是低邏輯電平數字電路(如TTL,CMOS或PMOS)和大電流高電壓的燈,繼電器,打印機錘和其他類似負載間的接口的理想器件。廣泛用于計算機,工業和消費類產品中。所有器件有集電極開路輸出和用于瞬變抑制的續流箝位二極管。集電極輸出功率可達50V×600mA[13]。
ULN2803作為列驅動執行的是列選的工作,當選通的列輸入高電平時其對應的輸輸出低電平。相對應的輸出取反,并能提供較大的灌電流來吸收行驅動流出進過顯示屏后的電流。具體電路如圖3-7所示。
圖3-7  列驅動原理圖
3.5  通信系統硬件設計
AT89S51單片機具有全雙工串行UART通道,支持單片機進行數據的串行傳輸。除了單片機要與PC機制定通信協議,確定發送速率外還需要解決的問題就是信號電平問題。RS-232C標準規定了PC機發送數據總線TXD和接收數據總線RXD采用EIA電平,即傳送數字“1”時傳輸線上的電平在-3~-15V之間;傳送數字“0”時,傳輸線上的電平在+3~+15之間。但單片機串行口采用正邏輯TTL電平,即數字“1”時為+5V數字“0”時為-5V,所以單片機與計算機不能直接相連進行通信必須將RS-232C與TTL電平進行轉換[14]。
在通用的電平轉換芯片中MAX232系列的芯片以集成度高,單+5V電源工作,只需外接5個小電容即可完成RS-232C與TTL電平之間的轉換而成為單片機系統中的常用芯片。在該顯示系統中,MAX232為通信系統中最重要的硬件組成部分[15]。電路如圖3-8所示:
3-8  串口通信系統電路圖
3.6  電源設計
在系統中MAX232、74LS164、74LS373、AT89S51都需要5V的供電電壓,在系統開發過程中可以使用電腦USB供電。在實際的大屏幕LED顯示屏設計中,用電腦USB供電明顯不切實際。此時需要對民用的220V進行降壓整流為5V直流電壓為顯示系統供電。電路圖如圖3-9所示。
3-9  電源原理圖
如圖所示,用220V轉12V的變壓器進行降壓后再通過一個橋式整流電路將交流電整流為直流電。最后通過5V三端穩壓模塊LM7805得出穩定的5V輸出。
3.7  級連大屏幕LED顯示屏
   要實現LED的大屏幕顯示主要采用內部譯碼器級連和多個單片機系統級連的方法。譯碼器級連如圖3-10所示
    將第1個74LS164的Q7端接第2個74LS164的A端,將第2個74LS164的Q7端接第3個74LS164的A端,如此炮制當N塊74LS164相級連時就變為一個串行輸入7×N口輸出的串并轉換器。這種級連的優點在于一塊單片機可以同時控制更多的LED點陣顯示屏,且74LS164的價格低廉整體成本得到了降低。但是這種級連方法也存在一定的缺點,51系列的單片機的晶振頻率不高74LS164級連過多會增加一次掃描的時間從而導致顯示出現閃爍。從端口輸出的顯示數據的顯示也要作出相應的改變。
3-10  74LSL64級連
構建大屏幕LED顯示屏的另一種方法是將以較小的LED顯示系統做為模塊進行級連。如圖3-11所示,由獨立的LED顯示系統組成一個大的LED顯示系統。其中各子顯示系統之間在功能和控制上都是相互獨立的,將一幅大屏幕畫面拆分為幾塊小畫面再分別送入到各子系統中,各子系統同步顯示便可以得到一幅大的畫面。使用這種級連的辦法可以避免51單片機晶振頻率低的弱點,更容易實現大屏幕的顯示。但這種方法仍然存在難點,一是各獨立的子系統的通信和協調性要求更高了,如果要實現顯示內容的實時性必須需要上位機不斷更新顯示內容則增加了上位機的通信數據量,逐個的單片機傳送數據也會影響整個畫面的更新速度;二是成本提高了。
3-11  由子系統構建大屏幕LED顯示屏
在實際應用中通常采用內部擴展和外部級連聯合使用的方法來構建大屏幕LED顯示屏幕。即增加單個顯示系統顯示屏幕大小的同時又將單個的顯示系統級連。詳細硬件原理圖見附錄1。

第4章  系統軟件設計
4.1  程序設計
系統軟件采用C語言編寫,按照模塊化的設計思路設計。首先分析程序所要實現的功能,程序要實現串口通信,靜態顯示,動態顯示三大功能。其功能結構如圖2-4所示。通信程序接收上位機數據,交給主程序處理再通過控制程序選擇不同的顯示程序進行顯示。
主程序的工作流程如圖4-1所示:
4-1主程序流程圖
程序開始時首先必須對單片機進行初始化,其中初始化的內容包括:中斷優先級的設定,中斷初始化,串行通信時通信方式的選擇和波特率的設定,各IO口功能的設定等。初始化完成后程序進入待機狀態等待中斷的發生,該程序中主要用到了兩個外部中斷源和串行中斷。外部中斷源由按鍵的電平變化觸發,外部中斷主要功能是選擇LED點陣顯示屏的控制方式是由按鍵控制還是上位機控制和顯示狀態是靜態顯示還是動態顯示。串行中斷包括發送中斷和接收中斷都是由軟件觸發。中斷產生后由預先初始化時設定跳轉執行中斷子程序。中斷程序設定了LED點陣顯示屏所要顯示的內容和顯示的方式,最后執行的是各種顯示程序。按照設定的方式和內容顯示出所需要的內容。
4.2  顯示程序的設計4.2.1  LED顯示屏的顯示方式
LED點陣屏顯示方式主要由靜態顯示和動態掃描顯示兩種。
   對靜態顯示來說,每一個發光二極管都需要一套驅動電路,一幀畫面輸入以后便可一勞永逸地顯示,除非我們改變了顯示內容,需要重新輸出新的點陣數據.這種方式系統原理相對簡單一些,但所需的譯碼驅動裝量很多,引線多而繁雜,不便于大屏幕的制造,成本高,其可靠性也較低.
另一種動態掃描顯示是把整個LED屏幕分成若干部分,每一幅畫面的顯示是顯示完一部分后,又顯示第二部分……直到顯示完最后一部分又重新開始顯示第一部分,重復循環進行.在重復掃描速度足夠快的情況下,我們看到的就是一幅穩定的畫面.也就是說采用動態掃描顯示需要不斷進行畫面的刷新.在這種方式下其顯示驅動電路可重復利用,引線也大大減少,從而使硬件成本降低,且屏幕上的發光二極管輪流發光,使用時的耗電量大大降低.大屏幕的制造、維護要容易許多,可靠性也增加了.
兩種顯示方式的比較再結合51單片機IO口數量有限的原因決定采用動態掃描的方式進行顯示。
動態掃描分為行掃描和列掃描兩種方式區別在于選通端和數據輸入端分別是行還是列。在該顯示系統中掃描顯示的工作原理如圖4-2所示,先選通列然后再從行送入對應列的數據,這樣從第1列到第16列循環往復,只要切換的速度足夠的快利用人眼的延時特性就可以看見一幅穩定的畫面。
4-2掃描顯示程序原理圖
4.2.2  點陣數據表達方式
該顯示系統的顯示數據采取縱向取模方向正向的數據存儲方式如圖4-3,
4-3  點陣數據原理圖
    即數據是縱向的,一個像素對應一個位。8個像素對應一個字節,字節的位順序是上高下低,比如從上到下8個點的狀態是“*-----*-”(*為黑點,-為白點),則轉換的字模數據是0x82(B1000_0010)。如圖(4-3)所示,一幅16×16的點陣畫面點陣數據按照B1B2B3……B31B32存儲。所以一幅畫面的數據量為32字節。畫面顯示時選通的第i列對應的數組元素為第i和i+16個元素[16]。
4.2.3  顯示程序的設計
顯示程序分為靜態顯示程序、左移顯示、右移顯示、上移顯示、下移顯示五種種顯示方式。其中上下左右移動程序都調用了靜態顯示程序為子程序。靜態顯示程序流程圖如圖4-4所示:

4-4  靜態顯示程序流程圖
顯示采用的是列掃描的顯示方式,選通一列后按照列與數據元素的對應關系第i列對應的行數據為數組中的第i和第i+16個元素。將對應元素的由低至高位依次從端口輸出具體做法為將元素向右邏輯移位后再與0X01相與,所得結果通過單片機端口輸出到串并轉換器的A端,鎖存在鎖存器里完成一列數據移位后再將其輸出。如此依次循環選通各列來顯示所需畫面[17]。
4-5  左右移/上下移程序流程圖
     動態顯示程序流程如圖4-5所示,根據顯示數據的存儲原理通過改變實際LED列與數據邏輯列的方法來實現程序的左右移動。顯示數據與列的對應關系為:第i列對應的數據為數組中i和第2×i個數據。所以當ULN2803選通時,而送入后一列的數據則相當于畫面左移移位,同理送入前一列數據相當于右移一位。如此循環則產生一幅穩定運動的畫面。
    顯示數組中,第1至16個元素的第8至第1位LED顯示屏中的第1至第8行。同理第17至32個元素的第8至第1位LED顯示屏中的第9至第16行。所以將元素數據進行邏輯位移便能產生上下移動的效果[18]。
4.3  通信程序的設計
系統采用串行中斷的方式進行通信。MCS-51單片機的五個中斷源兩種類型:一類是外部中斷源;另一類是內部中斷源,包括兩個定時器/計數器(T0和T1)的溢出中斷和串行口的接收和發送中斷。MCS-51單片機設置了4個專用寄存器用于中斷控制,分別為定時器控制寄存器(TCON),串行口中斷控制器(SCON),中斷允許控制寄存器(IE),中斷優先級控制寄存器(IP)。編程時通過設置其狀態來管理中斷系統。
在編輯中斷程序時首先是將中斷控制寄存器(IE)初始化。其控制位分布如表。EA為中斷允許總控制位,EA=1時CPU開發中斷;EA=1時。CPU屏蔽所有中斷。ES、ET、EX1、ET0、EX0為對應的串行口中斷、定時器/計數器1中斷、外部中斷1中斷、定時器/計數器0中斷、外部中斷0中斷的中斷允許位。對應位為1時允許其中斷,對應位為0時,禁止其中斷。
4-1  中斷允許寄存器格式


所以初始化時設定中斷允許寄存器初值為0XFF,指令為 IE=0XFF。程序設計時還要考慮到中斷優先級的問題。因為不同的中斷同時產生而CPU響應的順序取決于內部查詢順序。
設置串口工作方式1,波特率9600,計算可得計數器初值的十六進制表示為0XFD。通信協議如表4-2所示:
4-2  串口通信數據結構
數據結構
第1個字節
第2至第33個字節
第34個字節
內容
起始標志位‘S’
顯示數據
控制指令
作用
判斷是否開始接收數據
LED的顯示內容
控制LED顯示方式
具體串口中斷程序流程圖如圖4-6所示,在主程序中先進行了串行中斷的初始化,初始化內容包括了串行工作方式選擇,波特率的設定,計數初值的設定。程序開始進入中斷等待,當PC機向單片機發送數據時產生中斷接收允許位RI置1,將SBUF(緩沖寄存器)中的值輸入到暫存器中進行數據處理。首先判斷數據是否設定的起始標志位‘S’如果是則開始接收起始位后的33個字節,不是則中斷返回繼續等待。接收到第34個字節后便將收到的數據發送回PC機進行驗證比較。
           
圖4-6  通信程序流程圖
所有軟件編寫完成后都必須經過編譯才能被單片機識別使用。為了減小軟件的修改和優化難度,先把各子程序寫為一個可單獨執行的完整程序。各子程序編譯沒有錯誤后再輸入單片機進行驗證,這兩項都通過后再將所有的程序整合到一起形成一個完整的程序再進行編譯和驗證。詳細程序見附錄2。

第5章  系統調試

硬件制作和軟件編寫過后,得出實物如圖5-1所示。實物完成后必須對其進行調試,檢查設計功能是否實現了。軟件硬件完成后開始進行調試。調試可分為硬件調試,軟件調試和系統聯合調試。
5-1  實物圖
5.1  系統硬件部分調試方法
硬件調試主要是調試各部分的焊接是否合格和各芯片的輸出輸入電壓是否符合設計要求,最后測試各硬件部分能否完成設計功能。因此把硬件調試按照以下四部分分步來進行:
(1)測試所有焊點是否有短路和虛焊的現象存在;
(2)通電測試所有硬件芯片的輸入輸出電壓是否在設計要求的范圍內;
(3)測試ISP下栽線的功能是否能夠實現;
(4)測試串口系統的通信功能是否能夠實現。
由于最重要的顯示系統功能的測試需要軟件配合所以在硬件調試部分只測試單片機復位電平,功能部分測試放在系統聯合調試部分來完成。
5.1.1 短路與虛焊檢測
    檢測工具為萬用表,使用萬用表的短路報警功能,逐個測試相臨的兩個焊點檢測是否短路。按照電路圖檢測需要連接的兩點是否短路來檢測是否已經連接上,以此來檢測虛焊的情況。檢測和修改完成后為下一步通電檢測排除了短路的危險和由于虛焊引起檢測結果不真實的麻煩。
5.1.2 上電測試
由于系統測試時是采用USB電源為系統電源,所以電源輸入都為5V。顯示系統中單片機、譯碼器,鎖存器,驅動電路的電源電壓均要求為5V所以可同時直接接入。
上電后首先觀察電路是否有過熱,異味,冒煙的現象出現。經過觀察,沒有這些現象出現。然后測試各器件的電源,接地及一些電平應該固定的端口的電壓。測試的結果為:各器件電源端在4.3V~4.8V之間滿足器件的電源電壓要求,單片機端口在未接負載時端口電壓為4.5V。
5.1.3 串口調試
串口部分的作用為單片機與PC機之間通信,要檢查硬件是否正常工作可以采用將MAX232芯片的單片機端輸出口與輸入口直接相連的辦法來測試。具體電路圖如圖5-2所示,將MAX232的第10端和第9端直接短接。功能上表示將單片機的輸出口與輸入口直接相連,單片機收到數據的同時就將數據發送回PC機。如果發送的數據能夠被接收則證明串口通信部分的硬件是正常的。【19】將串口與電腦COM1相接,通過串口調試助手發送不同位數的數據再在把發送的數據與接收數據相比較。
5-2  串口硬件調試
5.2  系統軟件調試方法
由于已經進行了硬件調試,所以軟件調試主要是軟件編譯和將各功能塊程序分別寫入以驗證其功能的可實現性。在進行功能調試前必須用KEIL C對所有程序進行編譯,編譯成功生產可執行的.hex后方可進行功能測試。
其中測試串口程序的功能是否完善不但要連接單片機系統還要借助串口調試工具。串口調試工具選用的是串口調試助手,其功能是按照設定的串口、波特率向單片機發送數據和接收單片機向PC機發送的數據。并且能把發送和接收的數據內容顯示在狀態欄內。因此只要設定PC機向單片機發送的內容和單片機向PC機發送的內容就可以通過串口調試助手驗證串口通信是否準確,是否滿足功能要求。
串口程序的設計為:設定波特率位9600,以0XAA為起始標志位,單片機接收自起始標志位后的32位十六進制數再發送會PC機。測試程序時設定波特率為9600,選擇串口1,無校驗,8位數據。PC機向單片機發送的內容為aa 11223344556677889900aabbccddeeff11223344556677889900aabbccddeeff。PC機收到的數據為 11 22 33 44 55 66 77 88 99 00 AA BB CC DD EE FF 11 22 33 44 55 66 77 88 99 00 AA BB CC DD EE FF。測試表明串口程序和串口電路實現了設計目的。再進行數次不同數據的發送,接收到的數據也驗證了設計要求的實現。
5-3  串口調試圖
串口程序測試成功后為顯示程序提供了準確的顯示內容。余下得各種顯示程序和中斷程序都編譯成功后只有聯合硬件才能驗證其功能的可行性。
5.3  系統聯合調試及結果
經過硬件調試和軟件調試,排除了硬件的連接問題和驗證了串口功能的可實現性。其余功能的軟件便可以在此基礎上調試驗證其功能的正確性。聯合調試的具體方法如下:
(1)編寫一個逐點掃描的顯示程序,再結合硬件電路運行。這樣做的目的在于檢測各器件是否能夠正常運行和顯示屏的各個LED燈是否有損壞。結果顯示顯示屏中只有邊角出有一個LED燈被燒壞,其他器件邏輯功能運行正常。
(2)將靜態顯示子程序與各種動態顯示程序結合硬件電路進行調試。系統運行時顯示如圖5-1所示,顯示圖像比較清晰,各動態顯示效果也能夠實現。但顯示存在兩個問題。一是發光點的下方會出現一個很微弱的亮點,影響了整體的顯示效果。二是同一列的LED燈被點亮的數量與其亮度出反比,即如果同一列的燈都被點亮則亮度比只點亮幾個時要暗一點。
(3)將串口通信,顯示,硬件聯合調試。按照設定的通信協議,先由PC機向單片機發送起始控制字s,接著再發送32比特的顯示數據,最后發送控制顯示方式的顯示控制字。再發送不同的顯示數據和顯示控制字,觀察各種顯示方式的運行情況和各種顯示方式之間的切換情況。結果是顯示屏執行顯示控制指令,顯示所發送的內容。
5.4  調試結果分析
對調試中出現的問題進行了分析,得出以下原因和修改辦法。
(1)硬件的工作表現出不穩定,主要是表現在LED顯示屏的驅動電路部分和單片機系統部分。具體表現為單片機接負載后電壓被拉低值1.7V左右,無法滿足譯碼電路的輸入要求。顯示時會有一些行驅動的輸出不夠設計指標 ,導致所驅動的那一行在顯示屏上表現為選定的點不能夠很好區分,圖像出現模糊。分析造成這一現象的原因為,焊接時三極管8550遭到了高溫損壞以致工作不穩定和焊接的電路不夠牢靠,還有就是8550的e端所接電壓過高。修改辦法為將單片機輸出端口外接5K的上拉電阻,替換損壞三極管。
(2)虛點的產生與軟件和三極管電壓有關。修改辦法是將軟件中的延時時間調至恰當值,將8550的e端電壓降至3V左右。
經過調試和修改,系統實現了題目所要求的中英文顯示,動態顯示及上位機通信與控制的要求。     

結    論
經過一段時間的工作,終于完成了基于51單片機的LED顯示系統的設計,項目所要求的功能全部達到。通過這次設計收獲頗多,不僅是所作題目涉及到的軟硬件知識還有更為重要的實際經驗和過程中所發現的問題。
接手題目之后從互聯網上對LED進行了詳細的資料收集,從技術和產業的兩方面對LED進行了了解。通過了解我認識到LED是一門當今應用非常廣泛的技術,整個產業每年都會有巨大的產值而且技術還在不斷發展和創新[20]。
從設計之初就確定了參照大屏幕顯示屏的實現方法和實際情況設計一款小屏幕的LED點陣顯示屏。在查閱了大量的大屏幕顯示屏資料后確定了題目的設計方案。整個設計采用AT89S51做核心控制器,74LS164和74LS373組成譯碼電路,三極管8550和ULN2803做行和列驅動。在實現這一設計的過程中所遇到的問題和困難給我留下了寶貴的經驗和深刻教訓。這些經驗和教訓是:
(1)設計之前應該進行大量的資料收集和分析,確定一個清晰的設計思路;
(2)器件選擇時要詳細閱讀器件使用手冊,不但要考慮器件的功能實現還要考慮器件在整個系統中的兼容性;
(3)硬件的系統的建立必須合理和穩定,實物建立之前最好進行仿真這樣才能為軟件提供一個可靠的試驗平臺;
(4)軟件的編寫不但要實現功能還要不斷的優化、簡練、易讀。
隨著課題的進行,對LED的了解也越來越深入。認為LED技術也會進一步發展,LED應用將會更加廣泛。可以設想利用LED的高穩定性和低能耗,再與無線通信技術相結合在沙漠深處或者人跡罕至的雪山之顛樹立一塊依靠太陽能充電,通過無線傳輸方式更改顯示內容的信息板為登山者提供指示和天氣信息,為沙漠迷路的人指引方向。
設計結束了,但學習還在繼續。我相信通過此次設計所得到的知識、心得、經驗乃至感受都會讓我在以后的日子里受益匪淺。

致謝
這次能夠圓滿完成畢業設計我首先要感謝我的指導老師***老師、***老師、***老師,感謝他們在畢業設計期間對我的指導、勉勵、和督導。同時我要感謝大學四年里教過我課程的老師們,感謝他們對我知識增長所付出的辛勤勞動。
我還要感謝全班同學,感謝他們大學四年所做的所有令人感動的、幽默的、滑稽的、荒誕的事情。我所在的實驗室的同學,我也要感謝你們。雖然大家來自不同專業相處時間也不長,但大家共同的愛好相同的目標使得大家互相扶持共同努力。
最后我要感謝我所住宿舍的管理員阿姨們,感謝她們不論多晚回去都給我們開門讓我們不至于露宿街頭。還有學校的保安和廚師,你們是我安全完成畢業設計的保障。


附錄 1:  硬件原理圖



附錄 2:  設計程序
  1. //主程序主要為各功能子程序提供運行平臺,子程序分為顯示程序,特效顯示程序,//按鍵輸入中斷子程序

  2. //#include<reg51.h>
  3. //#include <absacc.h>
  4. //#include <intrins.h>
  5. #include<AT89x52.h>
  6. //#include<regx52.h>

  7. #define COUNT 34
  8. #define W 0X01

  9. unsigned char buffer[COUNT];
  10. unsigned char point;

  11. sbit  A1=P1^0;                 //定義第一列對應端口
  12. sbit  A2=P1^1;                 //    第二列
  13. sbit  A3=P1^4;                 //    第一行
  14. sbit  A4=P1^5;                 //    第二行
  15. sbit  CLK_L=P1^2;              //列移位時鐘    上升沿觸發
  16. sbit  CLEAR_L=P1^3;            //列清除控制位  低電平有效
  17. sbit  CLK_H=P1^6;              //行移位時鐘
  18. sbit  CLEAR_H=P1^7;            // 行清除控制位 低電平有效
  19. sbit  EN=P2^0;

  20. sbit  P21=P2^1;
  21. sbit  OE=P2^2;                //三態允許控制端  低電平有效
  22. sbit  LE=P2^3;                //鎖存允許端



  23. unsigned char code H1[16]={1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},H2[16]={0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}; //分別暫存行(H)列(L)所要顯示的數據
  24. unsigned char  L1,L2,i,command,k,j;
  25. char    z,l,m,n,x;
  26. unsigned char data ziku[32];
  27. unsigned char idata sort[32];
  28. unsigned int  data temp;
  29. unsigned char code Bmp019[]=                                                                          //靜態顯示內容
  30. {
  31. /*----------------------------------------------------------
  32.   源文件 / 文字 : 壽
  33.   寬×高(像素): 16×16
  34.   字模格式/大小 : 單色點陣液晶字模,縱向取模,字節正序/32字節
  35.   數據轉換日期  : 2007-5-31 16:26:59
  36. ----------------------------------------------------------*/
  37. 0x00,0x22,0x22,0x2A,0x2A,0x2A,0x2F,0xFA,0x2A,0x2A,0x2A,0x2B,0x2A,0x2A,0x22,0x00,
  38. 0x04,0x04,0x08,0x10,0x20,0xC0,0x20,0x5C,0x48,0x42,0x41,0xFE,0x40,0x40,0x40,0x00
  39. };

  40. //*************************************************************
  41. //串口中斷程序
  42. //功能:從PC機接收數據,當接收滿34位后將接收到的數據發送回PC機
  43. //*************************************************************
  44. com_interrupt(void)interrupt 4 using 3
  45. {
  46. unsigned char RECEIVR_buffer;
  47. if(RI==1)
  48. {
  49.   RECEIVR_buffer=SBUF;
  50.   RI=0;
  51.   TI=0;
  52. if(point==0)
  53.    { if(RECEIVR_buffer=='s')
  54.        point++;
  55.   else
  56.        point=0;
  57.    }
  58. if(point>0&&point<35)
  59.     buffer[point++]=RECEIVR_buffer;
  60. else point=0;
  61. }

  62. //TI=0;
  63. if(point==35&&RI==0)
  64.   {            
  65.     command=buffer[34];
  66.      point=0;
  67.               x=0;
  68.    for(k=2;k<34;k++)
  69.     {
  70.        SBUF=buffer[k];
  71.                  sort[k-2]=buffer[k];
  72.                  while(TI==0);
  73.        TI=0;
  74.      }
  75.               }


  76. }

  77. void delay(int k)         //延時程序
  78. {  
  79.    while(k--);
  80. }

  81. //**********************************************************************
  82. //靜態顯示程序
  83. //功能:將顯示數據處理后,控制串并轉換器并行輸出控制LED顯示
  84. //**********************************************************************
  85. void display()                  //顯示子程序
  86. {
  87.     EN=1;
  88.     P21=1;
  89.     CLEAR_L=0;
  90.               delay(5);
  91.               CLEAR_L=1;


  92.   for(i=0;i<16;i++)
  93.    {
  94.      CLK_L=0;
  95.      A1=H1[i];
  96.      A2=H2[i];
  97.      CLK_L=1;
  98.             
  99.               L1=ziku[i+z];
  100.               L2=ziku[i+16+z];
  101.     if(i+z<0||i+z>15)
  102.      continue;

  103.                 OE=1;
  104.                 LE=1;
  105.                 if(L1==0x00 && L2==0x00)
  106.                 continue;

  107.             
  108.      for(j=0;j<8;j++)
  109.       { CLK_H=0;
  110.                             if(L1&W==1)
  111.          A3=0;
  112.         else
  113.          A3=1;
  114.         if(L2&W==1)
  115.                    A4=0;
  116.        else
  117.          A4=1;

  118.                                CLK_H=1;

  119.                      L1>>=1;
  120.                      L2>>=1;
  121.         }
  122.        OE=0;
  123.                  LE=0;
  124.                  delay(110);
  125.                
  126.                  CLEAR_H=0;
  127.                   delay(1);
  128.                   CLEAR_H=1;
  129.    }

  130. }

  131. //右移顯示
  132. //功能:使得LED產生畫面右移得效果


  133. void sdisplay_left()
  134. {  if(m==0)
  135.     {
  136.               z++;
  137.               m=30;
  138.               }
  139.               if(z==15)
  140.                 {
  141.                 l=0;
  142.                 z=0;
  143.                 }
  144.     display();
  145.               m--;
  146.   }
  147. //**********************************************************************
  148. //右移顯示
  149. //功能:使得LED產生畫面右移得效果
  150. //**********************************************************************
  151. void sdisplay_right( )
  152. {

  153.   if(m==1)
  154.     {
  155.               z--;
  156.               m=30;
  157.               }
  158.               if(z==-15)
  159.                 {
  160.                 l=0;
  161.                 z=0;
  162.                 }
  163.     display();
  164.               m--;

  165.   }
  166. //**********************************************************************
  167. //上移顯示
  168. //功能:使得LED產生畫面上移得效果
  169. //**********************************************************************

  170. void sdisplay_up()
  171. {   z=0;
  172.      l=1;
  173.               m=0;
  174.    for(k=0;k<16;k++)
  175.    {
  176.      for(n=0;n<16;n++)
  177.      {
  178.               temp=ziku[n];
  179.               temp<<=8;
  180.               temp=temp|ziku[n+16];
  181.               temp<<=1;
  182.               ziku[n+16]=temp;
  183.               temp>>=8;
  184.               ziku[n]=temp;
  185.               }
  186.               do
  187.               {
  188.               display();            
  189.      m++;
  190.               if(m==50)
  191.      {
  192.                  l=0;
  193.                  m=0;
  194.               }
  195.               else l=1;
  196.               }
  197.               while(l);
  198.               }
  199.   }
  200. //**********************************************************************
  201. //下移顯示
  202. //功能:使得LED產生畫面下移得效果
  203. //**********************************************************************
  204. void sdisplay_down()
  205. {  z=0;
  206.     l=1;
  207.               m=0;
  208.    for(k=0;k<16;k++)
  209.    {
  210.      for(n=0;n<16;n++)
  211.      {
  212.               temp=ziku[n];
  213.               temp<<=8;
  214.               <font color="rgb(0, 0, 0)">…………
  215. …………
  216. …………限于本文篇幅 余下代碼請從51黑下載附件…………</font>
復制代碼

完整的Word格式文檔51黑下載地址:

基于51單片機的LED點陣顯示屏系統的設計與實現.doc (8.96 MB, 下載次數: 64)


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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表