1、武汉理工大学能力拓展训练课程设计说明书摘要本次课程设计是以AT89C52为核心控制器,1602液晶为显示器设计的液晶显示电路。该电路可在1602液晶上显示ASCII码表里的各种字符,通过编程设定的显示方式。设计中采用了二种动态显示方式,第一种是整屏左移操作,先将待显示的内容写入1602RAM的后面几个存储单元,当内容写入完成后,写入指令,实现指针不动而屏幕动的效果。第二种是将内容一个个写到1602显示,这主要通过延时函数控制写入的两个字符间的时间间隔。1602液晶一次可以显示32个字符,通过编程可以实现不同的动态显示方式。关键词:AT89C52;1602;动态显示1 Proteus仿真流程与K
2、eil编译器简介1.1 Proteus仿真流程(1)工作界面Proteus ISIS的工作界面是一种标准的Windows界面,如图1-2所示。包括:标题栏、主菜单、标准工具栏、绘图工具栏、状态栏、对象选择按钮、预览对象方位控制按钮、仿真进程控制按钮、预览窗口、对象选择器窗口、图形编辑窗口。图1.1 proteus操作界面(2) 基本操作 图形编辑窗口在图形编辑窗口内完成电路原理图的编辑和绘制。为了方便作图坐标系统(CO-ORDINATE SYSTEM)。ISIS中坐标系统的基本单位是10nm,主要是为了和Proteus ARES保持一致。但坐标系统的识别(read-out)单位被限制在1th。
3、坐标原点默认在图形编辑区的中间,图形的坐标值能够显示在屏幕的右下角的状态栏中。 点状栅格(The Dot Grid)与捕捉到栅格(Snapping to a Grid)编辑窗口内有点状的栅格,可以通过View菜单的Grid命令在打开和关闭间切换。点与点之间的间距由当前捕捉的设置决定。捕捉的尺度可以由View菜单的Snap命令设置,或者直接使用快捷键F4、F3、F2和CTRL+F1。 预览窗口该窗口通常显示整个电路图的缩略图。在预览窗口上点击鼠标左键,将会有一个矩形蓝绿框标示出在编辑窗口的中显示的区域。 其他情况下,预览窗口显示将要放置的对象的预览。这种Place Preview特性在下列情况下
4、被激活:当一个对象在选择器中被选中、当使用旋转或镜像按钮时、当为一个可以设定朝向的对象选择类型图标时(例如:Component icon, Device Pin icon等等)、当放置对象或者执行其他非以上操作时,place preview会自动消除、对象选择器(Object Selector)根据由图标决定的当前状态显示不同的内容。显示对象的类型包括:设备,终端,管脚,图形符号,标注和图形。在某些状态下,对象选择器有一个Pick切换按钮,点击该按钮可以弹出库元件选取窗体。通过该窗体可以选择元件并置入对象选择器,在今后绘图时使用。 对象选择与放置通过对象选择按钮,从元件库中选择对象,并置入对象
5、选择器窗口,供今后绘图时使用。显示对象的类型包括:设备,终端,管脚,图形符号,标注和图形。放置对象的步骤如下(To place an object:)根据对象的类别在工具箱选择相应模式的图标(mode icon)。根据对象的具体类型选择子模式图标(sub-mode icon)。如果对象类型是元件、端点、管脚、图形、符号或标记,从选择器里(selector)选择你想要的对象的名字。对于元件、端点、管脚和符号,可能首先需要从库中调出。如果对象是有方向的,将会在预览窗口显示出来,你可以通过预览对象方位按钮对对象进行调整。最后,指向编辑窗口并点击鼠标左键放置对象。1.2 Keil软件简介Keil C5
6、1是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。Keil C51开发系统基本知识Keil C51
7、开发系统基本知识 (1)系统概述 Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。下面详细介绍Keil C51开发系统各部分功能和使用。 (2)Keil C51单片机软件开发系统的整体结构 C51工具包的整体结构,uVision与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人
8、员可用IDE本身或其它编辑器编辑C或汇编源文件。然后分别由C51及C51编译器编译生成目标文件(.OBJ)。目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。2 单片机模块功能简介AT89C52是一个低电压,高性能CMOS 8位单片机,
9、片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。其主要功能特性有以下几点:(1)兼容MCS51指令系统 (2)8K可反复擦写(大于100000次)Flash ROM; (3)32个双向I/O口; (4)256x8bit内部RAM; (5)3个16位可编程定时/计数器中断; (6)时钟频率0-24MHz; (7)2个串行中断,可编程UART串行通道; (8)
10、2个外部中断源,共8个中断源; (9)2个读写中断口线,3级加密位; (10)低功耗空闲和掉电模式,软件设置睡眠和唤醒功能; (11)有PDIP、PQFP、TQFP及PLCC等几种封装形式,以适应不同产品的需求。 AT89C52为8 位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8XC51相同,其主要用于会聚调整时的功能控制。其引脚分布如图2.1所示。图2.1 AT89C52单片机引脚图3 设计方案与工作原理3.1 LCM1602液晶简介LCM(LCD Module)即LCD显示模组,是指将液晶显示器件、连接件、控制与驱动等外围电路,PCB电路板,背光源,结构件等装配
11、在一起的组件。LCM提供用户一个标准的LCD显示驱动接口,用户按照接口要求进行操作来控制LCD正确显示。LCM是一种相对更高集成度的LCD产品,对小尺寸LCD显示,LCM是一种省电的显示装置,LCM可以比较方便地与各种微控制器(比如单片机)连接,作为简易的人机接口。其中,MCS-51单片机作为LCM1602显示控制系统的核心部件。它由中央处理器(CPU)、存储器(ROM与RAM)、输入/输出单元(I/O)三大基本部分构成。单片机具有高性能、低价格;体积小,集成度高,可靠性和抗干扰能力强;较低工作电压(1.85V),低功耗等优点。并且,只要在单片机的外围适当加一些必要的扩展电路及通道接口,就可以
12、构成各种应用系统,如工业控制系统、数据采集系统、自动控制系统、自动测试系统、检测监视系统、智能仪表、功能模块等。因此单片机广泛应用于便携式智能产品与家电消费品,以及工业控制,国防装备等领域。3.2 单片机最小系统单片机控制模块是整个设计方案的核心。AT59C51芯片作为该系统的控制部件,它控制了1602液晶显示的内容以及液晶动态显示方式。单片机最下系统由时钟电路和复位电路构成,这样就可以在接入其他器件,用单片机编程实现对外部器件的控制。单片机最小系统如图3.1所示。图3.1 单片机最小系统3.3 设计方案由上面介绍的1602液晶,参看1602液晶芯片资料可以对其写入内容和设定内容的显示位置以及
13、显示方式。将1602液晶与单片机最小系统相连接就构成了本次设计方案。1602液晶与单片机的连接方式是1602液晶的数据端D0D7连接在单片机的P0口,1602液晶的数据命令选择端RD接在单片机的P2.6引脚,读写控制端R/Wj接在单片机的P2.5引脚,使能端EN接在单片机的P2.7脚。设计的电路图如图3.2所示。图3.2 设计方案原理图4 软件编程4.1 1602流程图本次课程设计1602液晶显示的内容是“WELCOME TO WU HAN LI GONG”,设定的动态显示方式是显示的内容在屏幕上从右向左移动,停留一段时间后闪烁两次消失,然后从左向右一次显示每个字符,停留一段时间后闪烁两次后消
14、失。动态显示方式的字符间的时间间隔,不同显示方式的时间间隔主要通过延时程序来完成,设计的1602系统流程图如图4.1所示。开始 对1602初始化写入显示设置命令 延迟5ms检查忙信号B_Z=0?获得RAM地址NY结束内容显示完?写入相应内容延迟5msNY图4.1 1602显示流程图4.2 软件程序#include #include typedef unsigned char BYTE; /用BYTE代替unsigned char数据类型typedef bit BOOL; /用BOOL代替bit数据类型 sbit LCD_RS = P26; /数据命令选择端 sbit LCD_RW = P25;
15、 /读写选择端sbit LCD_EP = P27; /使能信号BYTE code dis1 = WELCOME TO ;/待显示的字符BYTE code dis2 = WU HAN LI GONG ;BYTE code dis3 = BIG BIG WORLD ;BYTE code dis4 = I LOVE WHUT ;BYTE code dis5 = WANG DAO YUN ;BYTE code dis6 = 0120909310213 ;void delay(int ms) / 延时子程序int i;while(ms-) for(i = 0; i 250; i+) _nop_(); _
16、nop_(); _nop_(); _nop_(); BOOL lcd_bz() / 测试LCD忙碌状态 BOOL result;LCD_RS = 0; /写指令LCD_RW = 1;LCD_EP = 1; /为产生下降沿做好准备_nop_(); /延时5ms_nop_();_nop_();_nop_();result = (BOOL)(P0 & 0x80);/判断状态字最高位STA7,确保STA7为0LCD_EP = 0; /将LED_EP拉低,产生下降沿,写入指令return result; /返回结果,为1禁止读写,为0可以读写void lcd_wcmd(BYTE cmd)/ 写入指令数据
17、到LCD while(lcd_bz(); /为1不能进行读写操作LCD_RS = 0; /写指令LCD_RW = 0; LCD_EP = 0;_nop_();_nop_(); P0 = cmd; /将指令写到P0口_nop_();_nop_();_nop_();_nop_();LCD_EP = 1; /使能端高电平,为产生下降沿准备_nop_();_nop_();_nop_();_nop_();LCD_EP = 0; /产生下降沿,将指令写入LCD void lcd_pos(BYTE pos) /设定显示位置 lcd_wcmd(pos | 0x80); /LCD数据指针格式80H+地址void
18、 lcd_wdat(BYTE dat) /写入字符显示数据到LCD while(lcd_bz(); /LCD忙检测,为1不能进行读写,为0可以读写LCD_RS = 1; /写数据LCD_RW = 0; LCD_EP = 0;P0 = dat; /数据送入P0口_nop_();_nop_();_nop_();_nop_();LCD_EP = 1; /使能端拉高。为产生下降沿做准备_nop_();_nop_();_nop_();_nop_();LCD_EP = 0; /使能端拉低,将数据写入LCD void lcd_init() /LCD初始化设定 lcd_wcmd(0x38); /16*2显示,
19、5*7点阵,8位数据delay(1); /延时1mslcd_wcmd(0x0c); /显示开,关光标delay(1);lcd_wcmd(0x06); /移动光标,当读或写一个字符后地址指针加1且光标加1delay(1);lcd_wcmd(0x01); /清除LCD的显示内容,地址指针数据指针清零delay(1);void flash() delay(300); /控制停留时间 lcd_wcmd(0x08); /关闭显示 delay(100); /延时 lcd_wcmd(0x0c); /开显示 delay(100); lcd_wcmd(0x08); /关闭显示 delay(100); /延时 l
20、cd_wcmd(0x0c); /开显示 delay(100); void main() BYTE i,j; /定义uisigned char型变量i,j lcd_init(); / 初始化LCD delay(10); /延时10ms while(1) lcd_wcmd(0x06); /向右移动光标 lcd_pos(0x10); /设置显示位置为第一行的第17个字符 i = 0; while(dis1 i != 0) lcd_wdat(dis1 i ); /显示字符WLCOME TO i+; / delay(30); /控制两字之间显示速度 lcd_pos(0x50); /设置显示位置为第二行第
21、17个字符 i = 0; while(dis2 i != 0) lcd_wdat(dis2 i ); /显示字符 WU HAN LI GONG i+; /delay(30); /控制两字之间显示速度 for(j=0;j16;j+) /向左移动16格 lcd_wcmd(0x18); /字符同时左移一格 delay(80); /控制移动时间 flash(); /闪动二次 delay(800); /控制停留时间 lcd_wcmd(0x01); /清除LCD的显示内容 delay(1); lcd_wcmd(0x06); /向左移动光标 lcd_pos(0); /设置显示位置为第一行的第1个字符 i =
22、 0; while(dis3 i != 0) /显示字符BIG BIG WORLD lcd_wdat(dis3 i ); i+; delay(30); /控制两字之间显示速度 lcd_pos(0x40); /设置显示位置为第二行的第16个字符 i = 0; while(dis4 i != 0) lcd_wdat(dis4 i ); /显示字符 I LOVE WHUT i+; delay(30); /控制两字之间显示速度 flash(); delay(800); /控制停留时间 lcd_wcmd(0x01); /清除LCD的显示内容 delay(1); lcd_wcmd(0x06); /向左移动
23、光标 lcd_pos(0); /设置显示位置为第一行的第1个字符 i = 0; while(dis5 i != 0) /显示字符WANG DAO YUN lcd_wdat(dis5 i ); i+; delay(30); /控制两字之间显示速度 lcd_pos(0x40); /设置显示位置为第二行的第16个字符 i = 0; while(dis6 i != 0) lcd_wdat(dis6 i ); /显示字符 0120909301213 i+; delay(30); /控制两字之间显示速度 flash(); delay(800); lcd_wcmd(0x01); /清除LCD的显示内容 de
24、lay(200); /控制两屏转换时间 5 实验结果与分析本次电路采用Proteus仿真,可以实现编程所设计的动态显示,在仿真过程中第一种从右至左的动态显示在仿真时没能完全实现,但是在硬件确可以实现,这其中的问题还有待解决。Proteus仿真的结果如图5.1所示:图5.1 1602动态显示结果图6 心得体会本次课程设计的的题目为基于液晶显示单元的单片机仿真和C语言开发,主要是设计一个液晶显示电路,以51单片机作为控制器,控制并实现该液晶显示指定的字符串或图像,并实现该字符串或图像以指定的方式进行循环移动。本次设计我采用的单片机为AT89C52单片机,选用的液晶型号为LCM1602,液晶的电路接
25、法主要参考手册上的电路,硬件电路的实现相当简单。设计中采用了二种动态显示方式,第一种是整屏左移操作,先将待显示的内容写入1602RAM的后面几个存储单元,当内容写入完成后,写入指令,实现指针不动而屏幕动的效果。第二种是将内容一个个写到1602显示,这主要通过延时函数控制写入的两个字符间的时间间隔。通过本次课程设计,对1602 的各种显示方式有了深入的掌握,为以后其他的设计显示方面打下了坚实的基础。设计过程中,总会遇到各种调试错误,还有设计出来的效果不对,只有认真的比对程序和下到板子上显示的效果,以及显示中出错的情况进行分析,修改程序才能够事半功倍。这对于将来的工作或者学习中,遇到调试问题,将会有很大的帮助。参考文献1 徐爱钧.单片机原理实用教程基于Proteus虚拟仿真:电子工业出版社2 郭惠.单片机C语言程序设计完全自学手册:电子工业出版社3 公茂法.单片机人机接口实例集:航空航天大学出版社4 沈红卫.基于单片机的智能系统设计与实现:电子工业出版社5 李广弟,朱月秀等.单片机基础:北京航空航天大学出版社17