單片機與接口技術
課程設計(論文)
點陣LED顯示屏設計
院(系)名稱
電子與信息工程學院
摘要
隨著單片機技術的快速發展,現如今LED點陣廣告牌隨處可見,它的應用領域極其廣泛。像證券交易實時信息的顯示,LED顯示屏需求量都是非常大的,而這些LED的基本單元都是8x8的點陣,它是組成漢字及其它圖形的基礎,可通過單片機的控制實現顯示功能,因此具有廣泛應用的意義。
設計的點陣LED顯示屏包括兩個部分電路。一是單片機控制部分電路,包括AT89C51單片機、時鐘電路、復位電路和按鍵控制電路等,通過Keil軟件編程實現控制LED顯示的功能;二是點陣LED顯示電路,由LED點陣、74HC595移位寄存器芯片和74159編碼器芯片構成。以74HC595移位寄存器芯片為主要器件,設計的點陣LED顯示屏要求分辨率為64x16點,可顯示4個漢字或8個字母,具有靜止顯示、滾動顯示等顯示方式。整體電路結構緊湊、參數設置合理,具有斷電儲存,控制靈敏度高,電路穩定性好,抗干擾能力強等優點。
整體電路設計采用Proteus仿真軟件進行繪圖和測試。經過仿真測試,LED顯示屏能夠靜止或滾動顯示4個漢字,分辨率達到64x16點,滿足可顯示4個漢字或8個字母,具有靜止顯示、滾動顯示等顯示方式的設計要求。
目 錄
第1章 緒論
1.1 點陣LED顯示屏的應用意義
1.2 本文研究內容
第2章 方案設計與論證
2.1 核心控制電路設計與論證
2.2 點陣LED顯示模塊論證
2.3 系統設計要求
2.4 總體設計
第3章 單元電路設計
3.1 單片機最小系統
3.1.1 最小系統
3.1.2 時鐘電路
3.1.3 復位電路
3.2 按鍵控制模塊
3.3 斷電儲存模塊
3.4 驅動模塊
3.4.1 行驅動
3.4.2 列驅動
3.5 點陣LED模塊
第4章 系統軟件設計
4.1 主程序的設計
4.2 按鍵程序設計
4.3 編程C語言代碼
第5章 系統仿真與調試
第6章 總結
參考文獻
附錄I
附錄II
第1章 緒論1.1 點陣LED顯示屏的應用意義隨著現代電子技術的快速發展,各類智能電子產品的功能日益強大,與人們日常生活的聯系也日益緊密。電子產品向小型化,精密化的趨勢快速發展。在任何的電子系統中,顯示電路都是實現人機交互、信息顯示的重要組成部分,所以對點陣LED顯示技術的研究具有廣泛的意義。 目前應用最廣的是紅色、綠色、黃色。LED顯示屏可以顯示變化的數字、文字、圖形圖像;不僅可以用于室內環境還可以用于室外環境,具有投影儀、電視墻等無法比擬的優點。LED點陣顯示屏以高亮度、工作電壓低、功耗小、小型化、壽命長和性能穩定的優點迅速的發展。在信息顯示領域得到廣泛的應用,例如證券交易、金融信息的顯示、機場航班動態的顯示等服務領域的業務宣傳及信息顯示。未來的LED顯示屏會向著標準化、規范化,產品結構多樣化的方向發展。 采用LED點陣屏與AT89C51單片機作為主要器件設計的64x16點陣LED顯示屏,通過不同的模塊相互聯系,其中每個模塊之間只需要極少的聯系,極大的提高了系統的穩定性、可靠性。調試、維護的難度大大降低。顯示部分被分為不同的單元獨立進行掃描,每個單元之間的信號采用信號鎖存進行同步控制。整個點陣LED顯示屏具有反應靈敏度高、抗干擾能力強、顯示精準度高和電路穩定性良好等優點,完全滿足常規室內環境下的使用需要。 1.2 本文研究內容設計分辨率為64x16點的點陣LED顯示屏,能夠輸出四個漢字或8個字母,具有靜止顯示、滾動顯示等顯示方式,同時具有斷電儲存的功能。采用AT89C51單片機作為控制模塊的主要器件,設置獨立按鍵,可通過控制獨立按鍵使輸出狀態在滾動或靜止之間切換,LED顯示模塊由16塊8x8的單色點陣、74159芯片和8塊74HC595移位寄存器芯片組成,在默認狀態下采用滾動方式顯示字符,可通過按鍵進行狀態轉換。顯示電路采用行掃描和列掃描的方法,各單元之間的信號進行同步控制。整個系統達到了輸出4個漢字或字母具有滾動、靜止顯示的設計要求且電路穩定工作。
第2章 方案設計與論證2.1 核心控制電路設計與論證方案一:采用由51單片機實現控制功能,由74138譯碼器和74LS273地址鎖存器進行16塊8x8單色LED點陣的行掃描和列掃描。但是多片鎖存器的控制極為困難,而且51單片機的I/O資源有限。這種方法的單片機編程控制較為困難,在調試過程中有可能出現信號不同步、掃描出現延時錯誤等情況,電路結構復雜,可靠性不高。 方案二:采用AT89C51單片機和獨立按鍵構成控制電路,采用74159芯片對LED顯示屏進行行掃描,同時使用74HC595移位寄存器芯片進行顯示屏的列掃描。因為74HC595采用串行控制,大大節約了單片機的I/O口資源,同時降低了編程和調試的難度。這種方法控制較為方便,輸出穩定性好,可靠性高。 與方案一相比,本系統選用方案二作為設計方案。獨立按鍵能有效控制輸出狀態,使輸出能在靜止和滾動之間切換,單片機的I/O口資源能夠大大的節約,工作穩定可靠,抗干擾能力高,實用性強。 2.2 點陣LED顯示模塊論證方案一:采用74LS273地址鎖存器與8x8點陣構成列掃描,采用兩級74138譯碼器級聯構成顯示屏的行掃描。為實現動態掃描單片機的控制較為復雜,編程難度較高。 方案二:選用74HC595移位寄存器構成顯示屏的列掃描。I/O口資源得到大大節約,同時各級之間的信號能夠實現同步控制。采用74159 4-16線譯碼-多路分配器作為行掃描。單片機的控制編程難度大大降低,可靠性大大提高,實用性更強。 綜上所述,選擇方案二做點陣LED顯示。 2.3 系統設計要求設計一個點陣LED顯示屏,其分辨率為64x16點,基于單片機控制能夠實現顯示屏的輸出狀態的控制。整體電路包括單片機最小系統,按鍵控制電路,點陣LED顯示電路,斷電儲存電路。其中單片機編程要求程序結構簡單調試方便,可移植性強,可靠性高。按鍵控制電路要求控制靈敏度高、控制精準度高。顯示電路要求達到分辨率為64x16點的輸出穩定的要求。整體系統能夠滿足在一般室內環境下的使用要求。 任務要求: 1、設計一個單片機控制的室內用點陣LED顯示屏。 2、點陣LED顯示屏分辨率為64x16點,可顯示4個漢字或8個字母。 3、具有靜止顯示、滾動顯示等顯示方式。 2.4 總體設計本設計采用以AT89C51單片機控制方案。 利用單片機靈活的編程設計和豐富的I/O口資源,可通過按鍵復位單片機。通過獨立按鍵控制使輸出的狀態在滾動和靜止顯示之間切換,通過分辨率為64x16點的點陣LED顯示屏不僅能實現基本的輸出顯示4個漢字的控制功能,整體電路具有斷電儲存的功能,還能根據實際需要添加控制按鍵實現更多的功能。系統結構框圖如圖2.1所示。 圖2.1 系統結構框圖 第3章 單元電路設計3.1 單片機最小系統3.1.1 最小系統采用的AT89C51單片機利用ATMEL高密度非易失存儲器制造技術制造,與工業標準的MCS-51指令集和輸出管腳相兼容。它作為一種高性能的微處理器帶有4K字節閃爍可編程可擦除只讀存儲器。AT89C51由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,因此AT89C51是一種高效微控制器得到廣泛的應用。由AT89C51單片機,時鐘電路和復位電路共同組成了單片機最小系統,可以上電手動復位,同時集成4個I/O端口,資源豐富滿足一般控制系統設計的需求。單片機最小系統如圖3.1所示。 圖3.1 單片機最小系統 3.1.2 時鐘電路為了保證各部件的同步工作,單片機內部電路應在唯一的時鐘信號下嚴格地按照時序進行工作。MCS-51系列單片機內部有一個高增益反相放大器,用于構成振蕩器,但要形成時鐘脈沖,外部還需要附加電路。這里采用內部時鐘方式,單片機的兩個引腳XTAL1和XTAL2兩端跨接晶體振蕩器。外接晶振選擇12MHz,電容C1和C2選擇30pF獨石電容,同時為了減小寄生電容,更好的保證振蕩器穩定、可靠的工作,振蕩器和電容應盡量安裝的靠近單片機的XTAL1和XTAL2引腳。時鐘電路圖如圖3.2所示。 圖3.2 時鐘電路圖 3.1.3 復位電路復位是單片機的初始化操作,單片機系統在上電啟動運行時,都需要先復位。其作用是使CPU和系統中其它部件都處于一個確定的初始狀態,但是單片機本身是不能自動進行復位的,必須配合相應的外部復位電路才能實現。 利用電容器的充電實現,在單片機的RST端連續給出兩個機器周期的高電平就可以完成復位操作。選擇22μF的電解電容與電源Vcc和復位端相連,10K的電阻與復位端和地相連構成復位電路,也可通過按鍵復位。復位電路圖如圖3.3所示。 圖3.3 復位電路圖 3.2 按鍵控制模塊獨立按鍵具有結構簡單控制方便,但是在實際使用中必須去抖。按鍵在按下和松開的時候都存在抖動問題,不能將抖動誤認為多次按鍵,通常可以采用軟件去抖的方法,也可以采用硬件去抖的方法。這里選擇軟件去抖的方法。按鍵控制電路要求控制靈敏度高、控制精準度高。選擇單片機P3.2端口和按鍵相連,在編程中可采用外部中斷0進行判斷控制,使輸出在滾動和靜止的狀態之間切換。按鍵電路圖如圖3.4所示。 圖3.4 按鍵電路圖 3.3 斷電儲存模塊采用AT24C512作為主要的斷電儲存模塊,它是ATMEL公司生產的64KB串行電可擦的可編程存儲器,內部有512頁,每一頁為128字節,任一單元的地址為16位,地址范圍為0000-0FFFH。采用8引腳封裝,具有結構緊湊,存儲容量大等特點,可以在2線總線上并接4片芯片,特別適用于具有大容量數據存儲要求的數據采集系統,因此完全滿足輸出數據的存儲且其存儲容量完全滿足要求。斷電存儲電路圖如圖3.5所示。 圖3.5 存儲電路圖 3.4 驅動模塊
3.4.1 行驅動采用74159 4-16線譯碼-多路分配器芯片進行行掃描。它抗噪聲能力強,功耗低且與低電壓TTL電路兼容。只要掃描頻率設置合適,點陣屏就可以看成是穩定平滑過渡, 沒有閃爍的感覺,給人以正常的視覺效果。將芯片的使能端均接地讓其正常工作,通過單片機的P1口的低四位輸出0000B-1111B即十進制的0-15的數值,通過一次譯碼后74159的輸出端有唯一引腳輸出為低電平信號,其它引腳的輸出均為高電平信號。通過 軟件編程循環就可實現對LED顯示屏的行掃描。行驅動電路圖如圖3.6所示。 圖3.6 行驅動電路圖 3.4.2 列驅動采用74HC595移位寄存器作為列驅動的主要器件。74HC595是一款漏極開路輸出的CMOS移位寄存器,輸出端口為可控的三態輸出端,也能串行輸出控制下一級的級聯芯片,而且功耗低、高速移位時鐘頻率Fmax>25MHz,滿足設計的需要。 74HC595芯片的SDI為串行數據輸入端接單片機的P2.0端口;SH_CP為移位寄存器的時鐘輸入端,上升沿時移位寄存器的數據依次移動一位,下降沿保持寄存器的數據不變,接單片機的P2.1端口;ST_CP為存儲寄存器的時鐘輸入端,上升沿時移位寄存器中的數據進入存儲寄存器,下降沿保持存儲寄存器中數據不變。 應用時通常ST_CP置為低電平,移位結束后再在ST_CP端產生一個正脈沖更新顯示數據,接單片機的P2.2端口。用AT89C51的三個I/O分別控制SDI、SH_CP和ST_CP,將RST和OE分別接Vcc和地。各級之間通過上一級芯片的第9腳即SQH串行數據輸出管腳和下一級的SDI串行數據輸入引腳相連。可通過編程實現對字符數據表的移位輸出,同時各單元之間的信號能夠同步進行控制。列驅動電路圖如圖3.7所示。
圖3.7 列驅動電路 3.5 點陣LED模塊為了到達分辨率64x16點的設計要求,采用16塊8x8的LED單色點陣組成LED顯示屏。將顯示屏的列控制引腳分別對應并聯至74HC595移位寄存器的輸出端。將上半屏和下半屏的行控制引腳對應連接至74159 4-16線譯碼-多路分配器的輸出端。通過單片機控制行掃描和列掃描實現輸出4個漢字的功能。點陣LED電路如圖3.8所示。 圖3.8 點陣LED電路 第4章 系統軟件設計4.1 主程序的設計 單片機上電后自動復位,開始執行程序初始化程序,進行行掃描和列掃描,默認狀態是循環向左滾動顯示“愛我中華”4個漢字。若獨立按鍵則執行狀態切換,此時LED屏靜止顯示“愛我中華”4個漢字。當按鍵再次按下則再次切換為循環向左滾動的狀態,否則一直保持顯示狀態。主程序流程如圖4.1所示。圖4.1 主程序流程圖 4.2 按鍵程序設計單片機通過檢測獨立按鍵的狀態,若獨立按鍵被按下開始執行去抖程序,如果按鍵有效則在向左滾動或者靜止顯示狀態之間切換,控制LED顯示屏輸出的狀態,否則不會執行切換程序保持原來的狀態,一直維持在行掃描和列掃描的狀態。同時繼續檢測是否有按鍵按下,實時根據按鍵控制顯示屏的顯示模式。按鍵程序流程圖如圖4.2所示。 圖4.2 按鍵程序設計流程圖
第5章 系統仿真與調試 使用Proteus軟件繪制原理圖,然后將編程軟件Keil生成的hex程序文件載入到AT89C51單片機中,點擊仿真運行: 1、默認LED顯示屏顯示4個漢字“愛我中華”,循環向左滾動顯示。左滾動顯示仿真結果如圖5.1所示。 圖5.1 左滾動顯示 2、當獨立按鍵按下,若經過去抖程序,判斷為有效則在向左滾動或靜止顯示兩種狀態之間進行轉換,控制LED顯示屏輸出顯示的模式。在默認左滾動狀態下,按下按鍵,LED輸出靜止狀態下的“愛我中華”4個漢字。靜止顯示仿真結果如圖5.2所示。 圖5.2 靜止顯示 綜合以上仿真結果分析:設計的點陣LED顯示滿足輸出4個漢字的功能,且可以進行靜止狀態和滾動狀態之間的切換,滿足設計的要求。
第6章 總結本次課程設計的題目是點陣LED顯示屏設計。設計過程包括理解設計要求,查閱相關資料,到Proteus軟件設計和仿真。要求達到輸出4個漢字或8個字母,且具有靜止或滾動顯示等顯示模式的設計要求。 設計的點陣LED顯示屏包括單片機控制部分電路和LED顯示電路。其中單片機控制部分電路,包括AT89C51單片機、時鐘電路、復位電路和按鍵控制電路,可以通過軟件編程實現對整個系統的控制功能。由多塊LED 8x8點陣構成LED顯示屏,通過行列控制引腳分別與74159 4-16線譯碼-多路分配器芯片和74HC595移位寄存器芯片進行相應的連接。其中以74HC595芯片為主要器件,設計的點陣LED顯示屏要求分辨率為64x16點,可顯示4個漢字或8個字母,具有靜止顯示、滾動顯示等顯示方式,且滿足一般室內環境下的使用需求。整個系統結構緊湊、參數設置合理,具有控制靈敏度高,電路穩定性好,抗干擾能力強等優點。 但是設計點陣LED顯示屏需要結合實際綜合考慮很多因素,因此該點陣LED顯示屏設計需要在實際應用中進一步改進和完善。另外,在單片機控制程序方面,該設計只實現了顯示4個漢字,具有靜止顯示或滾動顯示兩種顯示方式的控制。要想在現實生活中推廣,還必須針對實際應用場合的需要,進一步完善LED顯示屏的其它功能。
整體電路原理圖
單片機源碼:
- #include <reg51.H>
- #include <intrins.h>
- #define I2Cdelay() {_nop_();_nop_();_nop_();_nop_();}
- #define uchar unsigned char
- #define uint unsigned int
- uchar flag=1,yid,h; //YID為移動計數器,H為行段計數器
- //flag=1 左移顯示 flag=0靜態顯示
- uint zimuo; //字模計數器
- uchar BUFF[10]; //緩存
- void in_data(void); //調整數據
- void rxd_data(void); //發送數據
- void Scan(void); //掃描
- void I2CStart(void);
- void I2CWrite(uchar dat);
- sbit R=P2^0; //數據輸入端口
- sbit CLK=P2^1; //時鐘信號
- sbit STB=P2^2; //鎖存端
- sbit key=P3^2; //定義按鍵
- sbit I2C_SCL = P3^7;
- sbit I2C_SDA = P3^6;
- uchar code table[]={
- /*前4位無顯示*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- …………
- …………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};
- void delay(int z) //延時
- {
- int x,y;
- for(x=0;x<z;x++)
- for(y=0;y<50;y++);
- }
-
- void main(void)
- {
- uchar i,speed=2;
- yid=0;
- zimuo=0;
- I2CStart();
- I2CWrite(0xA0); //10100001讀10100000寫
- EA=1;EX0=1;IT0=1; //全局中斷開,中斷0初始化
-
- while(1)
- {
- if(flag==1)
- {
- while(zimuo<8*32)
- { if(flag==1)
- {
- while(yid<16) //數據移位。
- { if(flag==1)
- {
- for(i=0;i<speed;i++) //移動速度
- {
- if(flag==1)
- {Scan();}
- else break;
- }
- yid++; //移動一步
- }
- else break;
- }
- yid=0;
- zimuo=zimuo+32; //后移一個字,
- }
- else break;
- }
- zimuo=0; //到最后從頭開始,有字數決定
- }
- else
- {
- zimuo=128; //靜態掃描從第一個中文字開始
- Scan();
- }
- }
- }
- /*----------中斷0的服務子程序-----------*/
- void int_0s() interrupt 0 using 0
- {
- if(key==0)
- {
- delay(2); //去抖
- if(key==0)
- flag=~flag;
- while(key==0); //等待按鍵釋放
- }
-
- }
- /*-------------掃描函數-----------------*/
- void Scan()
- {
- for(h=0;h<16;h++) //16行掃描
- {
- in_data(); //調整數據
- rxd_data(); //串口發送數據
- P1=h; //送行選
- STB=1;
- STB=0;
- delay(2);
- }
- }
- void in_data(void)
- {
- uchar s;
- for(s=0;s<5;s++)
- {
- BUFF[2*s]=table[zimuo+32*s+2*h]; /*把第一個字模的第一個字節放入BUFF0
- 中,第二個字模的第一個字節放入BUFF2中*/
- BUFF[2*s+1]=table[zimuo+1+32*s+2*h]; /* 把第一個字模的第二個字節放入BUFF1
- 中,第二個字模的第二個字節放入BUFF3中*/
- }
- }
-
- /**********74HC595輸出函數*************/
- void rxd_data(void) //串行發送數據
- {
- char s;
- uchar inc,tempyid,temp;
- uchar k;
- R=1;
- if(yid<8)
- inc=0;
- else
- inc=1;
- for(s=0+inc;s<=7+inc;s++) //發送2字節數據
- {
- if(yid<8)
- tempyid=yid;
- else
- tempyid=yid-8;
- //字模左邊字節右移tempyid位,右邊字節左移8-tempyid位,2者相或
- temp=(BUFF[s]>>tempyid)|(BUFF[s+1]<<(8-tempyid));
- for(k=0;k<8;k++)
- {
- I2C_SCL =1; //拉高SCL
- CLK=0;
- //R=(bit)(temp&0x80);
- temp=temp>>1;
- R=CY;
- CLK=1;
- I2C_SDA =R;
- I2C_SCL =0; //再拉低SCL,完成一個位周期
- }
- }
- }
- /*----------AT24C512-------------*/
- /* 產生總線起始信號 */
- void I2CStart()
- {
- I2C_SDA=1; //首先確保SDA、SCL都是高電平
- I2C_SCL=1;
- I2Cdelay();
- I2C_SDA=0; //先拉低SDA
- I2Cdelay();
- I2C_SCL=0; //再拉低SCL
- }
- /* I2C總線寫操作,dat-待寫入字節,返回值-從機應答位的值 */
- void I2CWrite(uchar dat)
- {
-
- uchar mask; //用于探測字節內某一位值的掩碼變量
- for (mask=0x80;mask!=0;mask>>=1) //從高位到低位依次進行
- {
- if ((mask&dat)==0) //該位的值輸出到SDA上
- I2C_SDA=0;
- else
- I2C_SDA=1;
- I2Cdelay();
- I2C_SCL=1; //拉高SCL
- I2Cdelay();
- I2C_SCL=0; //再拉低SCL,完成一個位周期
- }
- I2C_SDA=1; //8位數據發送完后,主機釋放SDA
-
- }
復制代碼
全部資料51hei下載地址:
16X64.zip
(4.64 MB, 下載次數: 98)
2018-7-13 10:08 上傳
點擊文件名下載附件
|