找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4425|回复: 1
收起左侧

Proteus汉字显示仿真《能力拓展训练》说明书 附单片机源码

[复制链接]
ID:323748 发表于 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、等常用主流单片机。还可以直接在基于原理图的虚拟原型。
  上编程,再配合显示及输出,能看到运行后输入输出的效果。配合系统配置的虚拟逻辑分析仪、示波器等,Proteus建立了完备的电子设计开发环境。1.2 KEIL介绍
Keil C51 软件是众多单片机应用开发的优秀软件之一,它集编辑,编译,仿真于一体,支持汇编,PLM 语言和C 语言的程序设计,界面友好,易学易用。单片机开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为CPU可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已极少使用手工汇编的方法了。机器汇编是通过汇编软件将源程序变为机器码,用于MCS-51单片机的汇编软件有早期的A51,随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级语言开发,单片机的开发软件也在不断发展,Keil软件是目前最流行开发MCS-51系列单片机的软件。
在KEIL软件中编程,确定编译无误后,将其生成为.hex文件,并将其导入proteus画好的图中的单片机中,即可使单片机在proteus中按程序运行。
2 LCD

当今是一个信息化的时代,信息的重要性是不言而喻的,获取手段显得尤其重要。人们所接受的信息有70%来自于人的视觉,无论用何种方式获取的信息最终需要有某种显示方式来表示。在当代显示技术中,主流的有LED显示屏及LCD液晶显示,而在这些显示技术中,尤其以液晶显示器LCD(Liquid Crystal Display)为代表的平板显示器发展最快、应用最广。LCD是典型的光电器件,它以材料科学为基础,综合利用了精密机械、光电及计算机技术,并正在微机械、微光学、纤维光学等前沿领域研究基础上,向高集成化、智能化方向发展。

2.1显示器在单片机系统中的应用

在日常生活中,我们对液晶显示器并不陌生。液晶显示模块已作为很多电子产品的通用器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。发光管和LED数码管比较常用,软硬件都比较简单,在小型智能化电子产品中,普通的7段LED数码管只能显示数字,若要显示英文字母或图像汉字,则必须使用液晶显示器,所以本课题重点研究液晶显示器

2.2液晶显示器的优点

用晶液显示器作为输出器件有以下几个优点:
    1)显示质量高
    由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。因此,液晶显示器画质高且不会闪烁。
    2)数字式接口
    液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方。
    3)体积小、重量轻
    液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。
    4)功耗低
    相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。

2.3 LCD字符汉字显示原理介绍
数显液晶模块是一种由段型液晶显示器件与专用的集成电路组装成一体的功能部件,只能显示数字和一些标识符:
点阵字符液晶模块是由点阵字符液晶显示器件和专用的行列驱动器,控制器及必要的链接件,结构件装配而成的,可以显示数字和西文字,但不能显示图形;
点整图形液晶模块的点阵像素连续排列,行和列在排布中均没有空格,不仅可以显示字符,而且也可以显示连续,完整的图形。点阵图形液晶根据液晶模块的驱动方式可以分为行列驱动型,行列驱动控制型,行列控制型。
点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。例如屏的第一行的亮暗由RAM区的 000H——00FH的16字节的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H,……(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。这就是LCD显示的基本原理。
    字符显示:一个字符由6 * 8或8 * 8这样的点阵组成,要正确显示,必须要找到和屏上某几个位置对应的显示RAM区得8个字节,并且要使每个字节的不同的位为1,其他位为0,为1的点亮,为0的点暗,通过明暗的变化显示某个字符。
汉字显示:汉字显示一般采用图形方式,首先需要获得待显示的汉字的点阵码,每个汉字占32个字节,分左右两部分,各占16个字节,根据在液晶上开始显示的行列号以及每行的列数可找出显示RAM所对应的地址,然后设立光标,送上要显示的汉字的第一个字节,光标位置加1,送第二个字节,换行按列对齐,送第三个字节,直到32字节显示完成,这样就可以在液晶上得到一个完整的汉字了。
通过单片机来控制点阵中的位,使其为1或者0,进而进行字符显示和汉字显示。
3 电路原理图
电路硬件原理图如图3.1所示。
图3.1 电路原理图

其中单片机AT89C51引脚这P0口与液晶的DB相连,P2部分口线与液晶控制端口相连。

AMPIRE1286液晶图形显示器可以显示字母、数字符号、中文字型及图形,具有绘图及文字画面混合显示功能。提供控制接口和8位数据传输接口,所有的功能,包含显示RAM,字型产生器,都包含在一个芯片里面,只要一个最小的微处理系统,就可以方便操作模块。

4 程序设计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 系统仿真
利用Proteus软件对以上系统进行仿真。
(1)将源程序编入KEIL软件中,生存hex文件;
(2)用Proteus软件画出电路图,并完成连线;
(3)将生存的hex文件写入到单片机内;
(4)点击仿真按钮,并观察仿真结果。
程序下载后如图4.1所示:
图4.1 程序下载电路图
通过单片机控制信号控制液晶显示器,并在两者这间进行数据传输。通过仿真结果,我们会观察到当执行仿真时屏幕会首先变为亮色,然后汉字一次显示出来,并且延时等待一段时间,接着屏幕再次变为亮色,重复显示以上结果。


6心得体会
通过这次课程设计,加强了我们动手、思考和解决问题的能力。
单片机多功能定时系统理论上能很好的达到了课堂要求, 发挥了单片机在智能化方面的应用。该系统的设计很好的满足当前学校教学的需要,是一个理想的智能化的设计。通过这次的强化能力训练我知道液晶显示的基本原理,并且成功的设计出了汉字的显示,以前在课堂上听老师讲总是感觉很简单,但当自己实际操作的时候才发现有些问题只有在通过实践之后才知道其解决方法。这次设计比较简单,液晶显示字符并实现循环显示,应此在设计中遇到的问题也轻松解决了。
平设计程序时,我发现只有细心才能做到完美,首先是参数设置,还有结果显示部分的设置,兼顾到方方面面去考虑是很需要的,否则只是一纸空话。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力,同时学到了很多课内学不到的东西,比如独立思考解决问题,出现差错的随机应变,和与人合作共同提高,都受益非浅,今后的制作应该更轻松,自己也都能扛的起并高质量的完成项目。

  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)              ;                                                        //函数声明
  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)                                 //***忙检测函数*****
  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)                            //**左写命令函数
  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)    //**左写数据显示
  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)                                                                      //**右命令函数
  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)                                                                      //**右显示函数
  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);              //**列数的起始地址
  81.                                                        for(j=16;j>0;j--)                 //数的左半边
  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);                                                           //数的右半边
  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()              //清屏函数
  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. //主函数
  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, 下载次数: 12)


回复

使用道具 举报

ID:499910 发表于 2019-4-10 14:21 | 显示全部楼层
软件设计功能是什么
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表