找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4431|回復: 1
打印 上一主題 下一主題
收起左側(cè)

Proteus漢字顯示仿真《能力拓展訓練》說明書 附單片機源碼

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:323748 發(fā)表于 2018-5-6 20:56 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
武漢理工大學《能力拓展訓練》說明書
1 概述1.1 Proteus簡介
Proteus軟件具有其它EDA工具軟件的功能。這些功能是:
 。1)原理布圖
 。2)PCB自動或人工布線
 。3)SPICE電路仿真
  革命性的特點:
 。1)互動的電路仿真
  用戶甚至可以實時采用諸如RAM,ROM,鍵盤,馬達,LED,LCD,AD/DA,部分SPI器件,部分IIC器件。
 。2)仿真處理器及其外圍電路
  可以仿真51系列、AVR、PIC、ARM、等常用主流單片機。還可以直接在基于原理圖的虛擬原型。
  上編程,再配合顯示及輸出,能看到運行后輸入輸出的效果。配合系統(tǒng)配置的虛擬邏輯分析儀、示波器等,Proteus建立了完備的電子設(shè)計開發(fā)環(huán)境。1.2 KEIL介紹
Keil C51 軟件是眾多單片機應(yīng)用開發(fā)的優(yōu)秀軟件之一,它集編輯,編譯,仿真于一體,支持匯編,PLM 語言和C 語言的程序設(shè)計,界面友好,易學易用。單片機開發(fā)中除必要的硬件外,同樣離不開軟件,我們寫的匯編語言源程序要變?yōu)镃PU可以執(zhí)行的機器碼有兩種方法,一種是手工匯編,另一種是機器匯編,目前已極少使用手工匯編的方法了。機器匯編是通過匯編軟件將源程序變?yōu)闄C器碼,用于MCS-51單片機的匯編軟件有早期的A51,隨著單片機開發(fā)技術(shù)的不斷發(fā)展,從普遍使用匯編語言到逐漸使用高級語言開發(fā),單片機的開發(fā)軟件也在不斷發(fā)展,Keil軟件是目前最流行開發(fā)MCS-51系列單片機的軟件。
在KEIL軟件中編程,確定編譯無誤后,將其生成為.hex文件,并將其導入proteus畫好的圖中的單片機中,即可使單片機在proteus中按程序運行。
2 LCD

當今是一個信息化的時代,信息的重要性是不言而喻的,獲取手段顯得尤其重要。人們所接受的信息有70%來自于人的視覺,無論用何種方式獲取的信息最終需要有某種顯示方式來表示。在當代顯示技術(shù)中,主流的有LED顯示屏及LCD液晶顯示,而在這些顯示技術(shù)中,尤其以液晶顯示器LCD(Liquid Crystal Display)為代表的平板顯示器發(fā)展最快、應(yīng)用最廣。LCD是典型的光電器件,它以材料科學為基礎(chǔ),綜合利用了精密機械、光電及計算機技術(shù),并正在微機械、微光學、纖維光學等前沿領(lǐng)域研究基礎(chǔ)上,向高集成化、智能化方向發(fā)展。

2.1顯示器在單片機系統(tǒng)中的應(yīng)用

在日常生活中,我們對液晶顯示器并不陌生。液晶顯示模塊已作為很多電子產(chǎn)品的通用器件,如在計算器、萬用表、電子表及很多家用電子產(chǎn)品中都可以看到,顯示的主要是數(shù)字、專用符號和圖形。在單片機的人機交流界面中,一般的輸出方式有以下幾種:發(fā)光管、LED數(shù)碼管、液晶顯示器。發(fā)光管和LED數(shù)碼管比較常用,軟硬件都比較簡單,在小型智能化電子產(chǎn)品中,普通的7段LED數(shù)碼管只能顯示數(shù)字,若要顯示英文字母或圖像漢字,則必須使用液晶顯示器,所以本課題重點研究液晶顯示器

2.2液晶顯示器的優(yōu)點

用晶液顯示器作為輸出器件有以下幾個優(yōu)點:
    1)顯示質(zhì)量高
    由于液晶顯示器每一個點在收到信號后就一直保持那種色彩和亮度,恒定發(fā)光,而不像陰極射線管顯示器(CRT)那樣需要不斷刷新新亮點。因此,液晶顯示器畫質(zhì)高且不會閃爍。
    2)數(shù)字式接口
    液晶顯示器都是數(shù)字式的,和單片機系統(tǒng)的接口更加簡單可靠,操作更加方。
    3)體積小、重量輕
    液晶顯示器通過顯示屏上的電極控制液晶分子狀態(tài)來達到顯示的目的,在重量上比相同顯示面積的傳統(tǒng)顯示器要輕得多。
    4)功耗低
    相對而言,液晶顯示器的功耗主要消耗在其內(nèi)部的電極和驅(qū)動IC上,因而耗電量比其它顯示器要少得多。

2.3 LCD字符漢字顯示原理介紹
數(shù)顯液晶模塊是一種由段型液晶顯示器件與專用的集成電路組裝成一體的功能部件,只能顯示數(shù)字和一些標識符:
點陣字符液晶模塊是由點陣字符液晶顯示器件和專用的行列驅(qū)動器,控制器及必要的鏈接件,結(jié)構(gòu)件裝配而成的,可以顯示數(shù)字和西文字,但不能顯示圖形;
點整圖形液晶模塊的點陣像素連續(xù)排列,行和列在排布中均沒有空格,不僅可以顯示字符,而且也可以顯示連續(xù),完整的圖形。點陣圖形液晶根據(jù)液晶模塊的驅(qū)動方式可以分為行列驅(qū)動型,行列驅(qū)動控制型,行列控制型。
點陣圖形式液晶由M×N個顯示單元組成,假設(shè)LCD顯示屏有64行,每行有128列,每8列對應(yīng)1字節(jié)的8位,即每行由16字節(jié),共16×8=128個點組成,屏上64×16個顯示單元與顯示RAM區(qū)1024字節(jié)相對應(yīng),每一字節(jié)的內(nèi)容和顯示屏上相應(yīng)位置的亮暗對應(yīng)。例如屏的第一行的亮暗由RAM區(qū)的 000H——00FH的16字節(jié)的內(nèi)容決定,當(000H)=FFH時,則屏幕的左上角顯示一條短亮線,長度為8個點;當(3FFH)=FFH時,則屏幕的右下角顯示一條短亮線;當(000H)=FFH,(001H)=00H,(002H)=00H,……(00EH)=00H,(00FH)=00H時,則在屏幕的頂部顯示一條由8段亮線和8條暗線組成的虛線。這就是LCD顯示的基本原理。
    字符顯示:一個字符由6 * 8或8 * 8這樣的點陣組成,要正確顯示,必須要找到和屏上某幾個位置對應(yīng)的顯示RAM區(qū)得8個字節(jié),并且要使每個字節(jié)的不同的位為1,其他位為0,為1的點亮,為0的點暗,通過明暗的變化顯示某個字符。
漢字顯示:漢字顯示一般采用圖形方式,首先需要獲得待顯示的漢字的點陣碼,每個漢字占32個字節(jié),分左右兩部分,各占16個字節(jié),根據(jù)在液晶上開始顯示的行列號以及每行的列數(shù)可找出顯示RAM所對應(yīng)的地址,然后設(shè)立光標,送上要顯示的漢字的第一個字節(jié),光標位置加1,送第二個字節(jié),換行按列對齊,送第三個字節(jié),直到32字節(jié)顯示完成,這樣就可以在液晶上得到一個完整的漢字了。
通過單片機來控制點陣中的位,使其為1或者0,進而進行字符顯示和漢字顯示。
3 電路原理圖
電路硬件原理圖如圖3.1所示。
圖3.1 電路原理圖

其中單片機AT89C51引腳這P0口與液晶的DB相連,P2部分口線與液晶控制端口相連。

AMPIRE1286液晶圖形顯示器可以顯示字母、數(shù)字符號、中文字型及圖形,具有繪圖及文字畫面混合顯示功能。提供控制接口和8位數(shù)據(jù)傳輸接口,所有的功能,包含顯示RAM,字型產(chǎn)生器,都包含在一個芯片里面,只要一個最小的微處理系統(tǒng),就可以方便操作模塊。

4 程序設(shè)計4.1 程序流程圖

程序流程圖如圖4.1所示

         

圖4.1 程序流程圖

4.2 程序代碼
頭文件代碼:
#define uchar unsigned char
#define uint unsigned int
uchar code coby[]={
0x00,0x80,0x00,0x00,0xF0,0x00,0x01,0x02,0x1C,0x08,0x00,0x40,0x80,0x00,0x00,0x00,
0x04,0x03,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x40,0x40,0x78,0x00,0x07,0x02,0x00,//心
0x00,0x00,0xFC,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08,0xFC,0x08,0x00,0x00,
0x00,0x00,0x07,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x07,0x00,0x00,0x00,//中
0x00,0x04,0x84,0x44,0xE4,0x34,0x2C,0x27,0x24,0x24,0x24,0xE4,0x04,0x04,0x04,0x00,
0x02,0x01,0x00,0x00,0xFF,0x09,0x09,0x09,0x29,0x49,0xC9,0x7F,0x00,0x00,0x00,0x00, //有
0x40,0x44,0x24,0x14,0xFF,0x94,0x64,0x40,0x24,0x14,0xFF,0x0C,0x34,0x64,0x24,0x00,
0x00,0x80,0x88,0x88,0x46,0x45,0x29,0x31,0x11,0x09,0x05,0x03,0x01,0x00,0x00,0x00, //夢
0x40,0x20,0xF0,0x1C,0x07,0xFA,0x2A,0x2A,0x2A,0xFE,0x2A,0x2A,0x2A,0xFA,0x02,0x00,
0x00,0x00,0xFF,0x00,0x80,0x83,0x45,0x29,0x19,0x17,0x21,0x21,0x41,0xC1,0x40,0x00,//便
0x80,0x40,0x40,0x20,0x50,0x48,0x44,0x43,0x44,0x48,0x50,0x20,0x60,0xC0,0x40,0x00,
0x00,0x00,0x42,0xE2,0x52,0x4A,0x46,0x62,0x22,0x22,0x2A,0xF2,0x62,0x00,0x00,0x00,//會
0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0xFE,0x60,0x90,0x08,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x10,0x21,0x40,0x78,0x00,//飛
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,//…
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01//…
};

5 系統(tǒng)仿真
利用Proteus軟件對以上系統(tǒng)進行仿真。
(1)將源程序編入KEIL軟件中,生存hex文件;
(2)用Proteus軟件畫出電路圖,并完成連線;
(3)將生存的hex文件寫入到單片機內(nèi);
(4)點擊仿真按鈕,并觀察仿真結(jié)果。
程序下載后如圖4.1所示:
圖4.1 程序下載電路圖
通過單片機控制信號控制液晶顯示器,并在兩者這間進行數(shù)據(jù)傳輸。通過仿真結(jié)果,我們會觀察到當執(zhí)行仿真時屏幕會首先變?yōu)榱辽,然后漢字一次顯示出來,并且延時等待一段時間,接著屏幕再次變?yōu)榱辽貜惋@示以上結(jié)果。


6心得體會
通過這次課程設(shè)計,加強了我們動手、思考和解決問題的能力。
單片機多功能定時系統(tǒng)理論上能很好的達到了課堂要求, 發(fā)揮了單片機在智能化方面的應(yīng)用。該系統(tǒng)的設(shè)計很好的滿足當前學校教學的需要,是一個理想的智能化的設(shè)計。通過這次的強化能力訓練我知道液晶顯示的基本原理,并且成功的設(shè)計出了漢字的顯示,以前在課堂上聽老師講總是感覺很簡單,但當自己實際操作的時候才發(fā)現(xiàn)有些問題只有在通過實踐之后才知道其解決方法。這次設(shè)計比較簡單,液晶顯示字符并實現(xiàn)循環(huán)顯示,應(yīng)此在設(shè)計中遇到的問題也輕松解決了。
平設(shè)計程序時,我發(fā)現(xiàn)只有細心才能做到完美,首先是參數(shù)設(shè)置,還有結(jié)果顯示部分的設(shè)置,兼顧到方方面面去考慮是很需要的,否則只是一紙空話。
通過這次課程設(shè)計使我懂得了理論與實際相結(jié)合是很重要的,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結(jié)合起來,從理論中得出結(jié)論,才能真正為社會服務(wù),從而提高自己的實際動手能力和獨立思考的能力,同時學到了很多課內(nèi)學不到的東西,比如獨立思考解決問題,出現(xiàn)差錯的隨機應(yīng)變,和與人合作共同提高,都受益非淺,今后的制作應(yīng)該更輕松,自己也都能扛的起并高質(zhì)量的完成項目。

  1. #include<reg51.h>
  2. #include<zhouhao.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit              E=P2^4;
  6. sbit              RW=P2^3;
  7. sbit              RS=P2^2;
  8. sbit              CS2=P2^1;            
  9. sbit              CS1=P2^0;            
  10. sbit              busy=P0^7;
  11. uchar i,j,lshu=0x40,you=0x40,ywei,end,over,fan;
  12. uint  k=0,h,m,y;
  13. void init(void)              ;                                                        //函數(shù)聲明
  14. void checkbusy(void);
  15. void l_wcode(char l_code);
  16. void l_wdata(char l_data);
  17. void r_wcode(char r_code);
  18. void r_wdata(char r_data);
  19. void l_show(void);
  20. void r_show(void);
  21. void clean();
  22. void show2();
  23. void delay(int l);
  24. void init(void)                                                                                    //**左邊屏初始化
  25. {
  26.      l_wcode(0x3f);                                                                      //***屏幕開顯示                                         
  27.                     l_wcode(0xc0);
  28.                        l_wcode(0xb8);                                          //***第一頁開始
  29.                          l_wcode(0x40);                 //***第一列開始
  30.                          r_wcode(0x3f);                //**右邊屏初始化
  31.                        r_wcode(0xc0);
  32.            r_wcode(0xb8);
  33.               r_wcode(0x40);
  34. }
  35. void checkbusy(void)                                 //***忙檢測函數(shù)*****
  36. {
  37.     E=1;
  38.                  RS=0;
  39.                    RW=1;
  40.          P0=0xff;
  41.                  ACC=P0;
  42.     while(!busy);
  43. }
  44. void l_wcode(char l_code)                            //**左寫命令函數(shù)
  45. {     checkbusy();
  46.        P2=0xf2;                                                                      //1111 0010;E=1,RW=0,RS=0,CS2=1,CS1=0
  47.                     P0=l_code;
  48.                   E=1;
  49.                   E=0; }
  50.                                                                                                                
  51. void l_wdata(char l_data)    //**左寫數(shù)據(jù)顯示
  52. {     checkbusy();
  53.                   P2=0xf6;                                                                      //1111 0110;E=1,RW=0,RS=1,CS2=1,CS1=0
  54.                    P0=l_data;
  55.                     E=1;
  56.                    E=0; }
  57. void r_wcode(char r_code)                                                                      //**右命令函數(shù)
  58.   {   checkbusy();
  59.                   P2=0xf1;                                                                      //1111 0001;E=1,RW=0,RS=0,CS2=0,CS1=1
  60.                    P0=r_code;
  61.                    E=1;
  62.                      E=0; }
  63. void r_wdata(char r_data)                                                                      //**右顯示函數(shù)
  64.   { checkbusy();
  65.        P2=0xf5;                                                                      //1111 0101;E=1,RW=0,RS=1,CS2=0,CS1=1
  66.                   P0=r_data;
  67.         E=1;
  68.                   E=0;}
  69. void show_hz()                              //顯示心中有夢·便會飛
  70. {      k=0;
  71.         m=0;
  72.         lshu=0x00;
  73.          you=0x00;
  74.           end=0x04;
  75.          for(over=0x02;over>0;over--)
  76.            {
  77.                                           for(fan=end;fan>0;fan--)
  78.                                             {                            for(i=0xba+m;i<0xbc+m;i++)
  79.                                       {                l_wcode(i);
  80.                                                        l_wcode(0x40+lshu);              //**列數(shù)的起始地址
  81.                                                        for(j=16;j>0;j--)                 //數(shù)的左半邊
  82.                                                                     {  l_wdata(coby[k++]); } }
  83.                   delay(500);
  84.                   lshu=lshu+0x10;
  85.                 }
  86.                       m=m+3;
  87.                       lshu=0x20;
  88.                        end=0x02;
  89.          }
  90.         for(ywei=0x03;ywei>0;ywei--)
  91.                 {
  92.                    for(i=0xbd;i<0xbf;i++)
  93.                         {
  94.                                                           r_wcode(i);                                                           //數(shù)的右半邊
  95.                                                                r_wcode(0x40+you);
  96.                                                           for(j=16;j>0;j--)
  97.                                           {
  98.                                                        r_wdata(coby[k++]);
  99.                                                      } }
  100.                                                                              delay(500);
  101.                            you=you+0x10; } }
  102. void delay(int l)
  103. {    int f,n;
  104.                 for(f=l;f>0;f--)
  105.                   for(n=110;n>0;n--);}
  106. void clean()              //清屏函數(shù)
  107. {for(i=0xb8;i<0xc0;i++)
  108.                               { l_wcode(i);
  109.                                              l_wcode(0x40);
  110.                                                for(j=64;j>0;j--)
  111.                                                           {              l_wdata(0x00); }}
  112.                             for(i=0xb8;i<0xc0;i++)
  113.                                { r_wcode(i);
  114. r_wcode(0x40);
  115.                             for(j=64;j>0;j--)
  116.    { r_wdata(0x00); } }}
  117. //主函數(shù)
  118. void main()
  119. {
  120.      P0=0x00;
  121.               init();
  122.               clean();
  123.                  while(1)
  124.                   {
  125.               show_hz();
  126.               delay(1000);
  127.               clean();
  128.                                                          
  129.                             }
  130. }
復制代碼


完整的Word格式文檔51黑下載地址:
液晶 漢字顯示 proteus仿真.doc (123.5 KB, 下載次數(shù): 12)


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

使用道具 舉報

沙發(fā)
ID:499910 發(fā)表于 2019-4-10 14:21 | 只看該作者
軟件設(shè)計功能是什么
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

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