1、液晶时钟显示广东岭南职业技术学院课 程 设 计课题:液晶时钟显示指 导 教 师:刘欣欣广东岭南职业技术学院Guangdong Lingnan Institute of Technology组 员: Lee.Hm. 专 业: 电子信息工程技术摘要 人类生存离不开信息,如控制论创始人N 维纳说:“要有效地生活,就要有足够的信息。”人生活于社会,每时每刻都通过眼、耳、口、鼻、身从外部获得信息,其中视觉信息占70%,而且眼睛获取的信息数量大,最准确和可靠,如“一目了然和百闻不如一见”就是说视觉信息的重要性远胜于其他。从古代显示技术简单、直观的火和光的结合到现代显示技术的光和电的结合利用,它追求的目标是
2、:清晰、准确、实时、直观、方便、节能、携带信息量大,色彩和立体化等。它是近代科学发展的产物,是现代科学技术的一个重要组成部分。而在显示技术发展的过程中,出现了一种名为:液晶的高分子材料。液晶作为一种特殊的功能材料,具有极其广泛的应用价值。随着以液晶显示器件为主的各类液晶产品的出现和发展,液晶已经深入到各行各业以及社会生活的各个角落。人类开发了液晶,液晶改变着人类生活。引言液晶是一种高分子材料,因为其特殊的物理、化学、光学特性,20世纪中叶开始被广泛应用在轻薄型的显示技术上。液晶的定义,现在已放宽而囊括了在某一温度范围可以是现液晶相,在较低温度为正常结晶之物质。而液晶的组成物质是一种有机化合物,
3、也就是以碳为中心所构成的化合物。 同时具有两种物质的液晶,是以分子间力量组合的,它们的特殊光学性质,又对电磁场敏感,极有实用价值。本次设计是由DS1302芯片计时,AT89C51编程控制1602液晶显示器实时显示时间(年月日、时分秒)的计时系统。一、 实验目的(一)熟悉AT89C51、1602液晶显示器、1302实时计时芯片的组成结构和使用方法;(二) 掌握WAVE6000软件的使用和编程;(三)掌握电子在线ISP编程器的使用方法;(四)学习复杂控制程序设计思路。二、实验设备 计算机,WAVE6000软件,电子在线ISP编程器,焊接工具(电烙铁,镊子,吸锡器,钳子等),实验元器件。三、实验原理
4、(一)液晶显示要求: 利用WAVE6000软件和电子在线ISP编程器编辑和烧录所需的试验程序并加以模拟仿真。要求如下: (1)通过AT89S51,1302(实时计时),并在单片机与液晶显示器中显示结果;(2)通过按键控制在紧急情况或需要时进行中断、复位功能;(3)要求液晶显示器要实时显示时钟。(二)液晶显示模拟:利用WAVE6000软件和所完成的作品实物实现软硬件模拟。(三)紧急情况: 利用WAVE6000软件中的中断命令和所完成的作品实物中的中断复位按键对突发情况进行中断复位。(四)程序设计: 根据设计要求,由于控制是由不同的各种状态按顺序发生的,我们可以采用状态机制控制方法来解决此问题。这
5、种方法是:首先列举所有可能发生的状态;然后将这些状态编号,按顺序产生这些状态;状态延续的时间用程序控制。对于突发情况,可采用在正常顺序的控制中插入特殊控制序列的方式完成。四、实验步骤(一)实验准备:(1)电路原理图的制作;(2)实体焊接材料的准备与制作;(3)利用WAVE6000软件编辑程序。2、实体作品的制作和电路检测;3、设计程序在WAVE6000软件中检测、仿真;4、运行程序观察结果: 实验程序是否正常工作。5、突发事件控制: 在WAVE6000中附带着一个停止中断和复位命令能控制突发情况,在运行状态下观察程序是否正常工作。6、结束程序运行退出7、退出WAVE60008、烧录程序: 利用
6、电子在线ISP编辑器烧录芯片(C51芯片不能正常烧录,可换S51芯片)。9、硬件仿真: 利用实体作品对说烧录的芯片程序进行仿真,观察程序是否正常工作。10、演示文稿与设计论文的制作。总结 通过完成该课题项目,能加深自己所学的理论知识并丰富了各自的实践经验。同时对课题项目所涉及的知识有一定的了解和加深。虽然在过程中遇到了很多问题,但是通过老师和同学的帮助下得到了解决,使我们的印象更加深刻。在项目完成的过程中,体现出了团队精神和综合协调与个体能力的重要性。设计主程序#include #include LCD1602.h#include DS1302.hvoid Delay1ms(unsigned
7、int count) unsigned int i,j; for(i=0;icount;i+) for(j=0;j120;j+);main() SYSTEMTIME CurrentTime; LCD_Initial(); Initial_DS1302(); DS1302_SetTime(DS1302_SECOND,0); DS1302_SetTime(DS1302_MINUTE,27); DS1302_SetTime(DS1302_HOUR,21); DS1302_SetTime(DS1302_DAY,16); DS1302_SetTime(DS1302_MONTH,12); DS1302_S
8、etTime(DS1302_YEAR,10); GotoXY(0,0); Print(Date: ); GotoXY(0,1); Print(Time: ); while(1) DS1302_GetTime(&CurrentTime); DateToStr(&CurrentTime); TimeToStr(&CurrentTime); GotoXY(6,0); Print(CurrentTime.DateString); GotoXY(6,1); Print(CurrentTime.TimeString); Delay1ms(300); 液晶显示程序/* THE 1602 CHAR LCD L
9、IB COPYRIGHT (c) 2005 BY JJJ. - ALL RIGHTS RESERVED - File Name: LCD.h Author: Jiang Jian Jun Created: 2005/4/3 Modified: NO Revision: 1.0 */#ifndef LCD_CHAR_1602_2005_4_9#define LCD_CHAR_1602_2005_4_9#include /Port Definitions*sbit LcdRs = P12;sbit LcdRw = P11;sbit LcdEn = P10;sfr DBPort = 0x80; /P
10、0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口/内部等待函数*unsigned char LCD_Wait(void) LcdRs=0; LcdRw=1; _nop_(); LcdEn=1; _nop_(); /while(DBPort&0x80);/在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时,会进入死循环, /可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80=0x80 /实际硬件时打开此语句 LcdEn=0; return DBPort; /向LCD写入命令或数据*#define LCD_COMMAND 0 / Com
11、mand#define LCD_DATA 1 / Data#define LCD_CLEAR_SCREEN 0x01 / 清屏#define LCD_HOMING 0x02 / 光标返回原点void LCD_Write(bit style, unsigned char input) LcdEn=0; LcdRs=style; LcdRw=0; _nop_(); DBPort=input; _nop_();/注意顺序 LcdEn=1; _nop_();/注意顺序 LcdEn=0; _nop_(); LCD_Wait(); /设置显示模式*#define LCD_SHOW 0x04 /显示开#de
12、fine LCD_HIDE 0x00 /显示关 #define LCD_CURSOR 0x02 /显示光标#define LCD_NO_CURSOR 0x00 /无光标 #define LCD_FLASH 0x01 /光标闪动#define LCD_NO_FLASH 0x00 /光标不闪动void LCD_SetDisplay(unsigned char DisplayMode) LCD_Write(LCD_COMMAND, 0x08|DisplayMode); /设置输入模式*#define LCD_AC_UP 0x02#define LCD_AC_DOWN 0x00 / default#d
13、efine LCD_MOVE 0x01 / 画面可平移#define LCD_NO_MOVE 0x00 /defaultvoid LCD_SetInput(unsigned char InputMode) LCD_Write(LCD_COMMAND, 0x04|InputMode);/移动光标或屏幕*/*#define LCD_CURSOR 0x02 #define LCD_SCREEN 0x08#define LCD_LEFT 0x00#define LCD_RIGHT 0x04void LCD_Move(unsigned char object, unsigned char directi
14、on) if(object=LCD_CURSOR) LCD_Write(LCD_COMMAND,0x10|direction); if(object=LCD_SCREEN) LCD_Write(LCD_COMMAND,0x18|direction);*/初始化LCD*void LCD_Initial() LcdEn=0; LCD_Write(LCD_COMMAND,0x38); /8位数据端口,2行显示,5*7点阵 LCD_Write(LCD_COMMAND,0x38); LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); /开启显示, 无光标 LCD_Write(
15、LCD_COMMAND,LCD_CLEAR_SCREEN); /清屏 LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); /AC递增, 画面不动/*void GotoXY(unsigned char x, unsigned char y) if(y=0) LCD_Write(LCD_COMMAND,0x80|x); if(y=1) LCD_Write(LCD_COMMAND,0x80|(x-0x40);void Print(unsigned char *str) while(*str!=0) LCD_Write(LCD_DATA,*str); str+; /*void L
16、CD_LoadChar(unsigned char user8, unsigned char place) unsigned char i; LCD_Write(LCD_COMMAND,0x40|(place*8); for(i=0; i0; i-) DS1302_IO = ACC0; /相当于汇编中的 RRC DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC 1; unsigned char DS1302OutputByte(void) /实时时钟读取一字节(内部函数) unsigned char i; for(i=8; i0; i-) ACC = ACC
17、1; /相当于汇编中的 RRC ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0; return(ACC); void Write1302(unsigned char ucAddr, unsigned char ucDa) /ucAddr: DS1302地址, ucData: 要写的数据 DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr); / 地址,命令 DS1302InputByte(ucDa); / 写1Byte数据 DS1302_CLK = 1;
18、DS1302_RST = 0; unsigned char Read1302(unsigned char ucAddr) /读取DS1302某地址的数据 unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr|0x01); / 地址,命令 ucData = DS1302OutputByte(); / 读1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; return(ucData);void DS1302_SetProtect(bit f
19、lag) /是否写保护 if(flag) Write1302(0x8E,0x10); else Write1302(0x8E,0x00);void DS1302_SetTime(unsigned char Address, unsigned char Value) / 设置时间函数 DS1302_SetProtect(0); Write1302(Address, (Value/10)Second = (ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_MINUTE); Time-Minute = (Read
20、Value&0x70)4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_HOUR); Time-Hour = (ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_DAY); Time-Day = (ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_WEEK); Time-Week = (ReadValue&0x70)4)*10 + (ReadValue&0x0F)
21、; ReadValue = Read1302(DS1302_MONTH); Time-Month = (ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_YEAR); Time-Year = (ReadValue&0x70)4)*10 + (ReadValue&0x0F); void DateToStr(SYSTEMTIME *Time) Time-DateString0 = Time-Year/10 + 0; Time-DateString1 = Time-Year%10 + 0; Time-DateSt
22、ring2 = -; Time-DateString3 = Time-Month/10 + 0; Time-DateString4 = Time-Month%10 + 0; Time-DateString5 = -; Time-DateString6 = Time-Day/10 + 0; Time-DateString7 = Time-Day%10 + 0; Time-DateString8 = 0;void TimeToStr(SYSTEMTIME *Time) Time-TimeString0 = Time-Hour/10 + 0; Time-TimeString1 = Time-Hour%10 + 0; Time-TimeString2 = :; Time-TimeString3 = Time-Minute/10 + 0; Time-TimeString4 = Time-Minute%10 + 0; Time-TimeString5 = :; Time-TimeString6 = Time-Second/10 + 0; Time-Tim
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1