液晶时钟显示.docx

上传人:b****8 文档编号:24059820 上传时间:2023-05-23 格式:DOCX 页数:21 大小:516.72KB
下载 相关 举报
液晶时钟显示.docx_第1页
第1页 / 共21页
液晶时钟显示.docx_第2页
第2页 / 共21页
液晶时钟显示.docx_第3页
第3页 / 共21页
液晶时钟显示.docx_第4页
第4页 / 共21页
液晶时钟显示.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

液晶时钟显示.docx

《液晶时钟显示.docx》由会员分享,可在线阅读,更多相关《液晶时钟显示.docx(21页珍藏版)》请在冰豆网上搜索。

液晶时钟显示.docx

液晶时钟显示

广东岭南职业技术学院

课程设计

课题:

液晶时钟显示

指导教师:

刘欣欣

广东岭南职业技术学院

GuangdongLingnanInstituteofTechnology

组员:

Lee.Hm.

专业:

电子信息工程技术

摘要

人类生存离不开信息,如控制论创始人——N维纳说:

“要有效地生活,就要有足够的信息。

”人生活于社会,每时每刻都通过眼、耳、口、鼻、身从外部获得信息,其中视觉信息占70%,而且眼睛获取的信息数量大,最准确和可靠,如“一目了然和百闻不如一见”就是说视觉信息的重要性远胜于其他。

从古代显示技术简单、直观的火和光的结合到现代显示技术的光和电的结合利用,它追求的目标是:

清晰、准确、实时、直观、方便、节能、携带信息量大,色彩和立体化等。

它是近代科学发展的产物,是现代科学技术的一个重要组成部分。

而在显示技术发展的过程中,出现了一种名为:

液晶的高分子材料。

液晶作为一种特殊的功能材料,具有极其广泛的应用价值。

随着以液晶显示器件为主的各类液晶产品的出现和发展,液晶已经深入到各行各业以及社会生活的各个角落。

人类开发了液晶,液晶改变着人类生活。

 

引言

液晶是一种高分子材料,因为其特殊的物理、化学、光学特性,20世纪中叶开始被广泛应用在轻薄型的显示技术上。

液晶的定义,现在已放宽而囊括了在某一温度范围可以是现液晶相,在较低温度为正常结晶之物质。

而液晶的组成物质是一种有机化合物,也就是以碳为中心所构成的化合物。

同时具有两种物质的液晶,是以分子间力量组合的,它们的特殊光学性质,又对电磁场敏感,极有实用价值。

本次设计是由DS1302芯片计时,AT89C51编程控制1602液晶显示器实时显示时间(年月日、时分秒)的计时系统。

 

一、实验目的

(一)熟悉AT89C51、1602液晶显示器、1302实时计时芯片的组成结构和使用方法;

(二)掌握WAVE6000软件的使用和编程;

(三)掌握电子在线ISP编程器的使用方法;

(四)学习复杂控制程序设计思路。

 

二、实验设备

计算机,WAVE6000软件,电子在线ISP编程器,焊接工具(电烙铁,镊子,吸锡器,钳子等),实验元器件。

 

三、实验原理

(一)液晶显示要求:

利用WAVE6000软件和电子在线ISP编程器编辑和烧录所需的试验程序并加以模拟仿真。

要求如下:

(1)通过AT89S51,1302(实时计时),并在单片机与液晶显示器中显示结果;

(2)通过按键控制在紧急情况或需要时进行中断、复位功能;

(3)要求液晶显示器要实时显示时钟。

 

(二)液晶显示模拟:

利用WAVE6000软件和所完成的作品实物实现软硬件模拟。

 

(三)紧急情况:

利用WAVE6000软件中的中断命令和所完成的作品实物中的中断复位按键对突发情况进行中断复位。

 

(四)程序设计:

根据设计要求,由于控制是由不同的各种状态按顺序发生的,我们可以采用状态机制控制方法来解决此问题。

这种方法是:

首先列举所有可能发生的状态;然后将这些状态编号,按顺序产生这些状态;状态延续的时间用程序控制。

对于突发情况,可采用在正常顺序的控制中插入特殊控制序列的方式完成。

 

四、实验步骤

(一)实验准备:

(1)电路原理图的制作;

 

(2)实体焊接材料的准备与制作;

 

(3)利用WAVE6000软件编辑程序。

 

2、实体作品的制作和电路检测;

3、设计程序在WAVE6000软件中检测、仿真;

 

4、运行程序观察结果:

实验程序是否正常工作。

5、突发事件控制:

在WAVE6000中附带着一个停止中断和复位命令能控制突发情况,在运行状态下观察程序是否正常工作。

6、结束程序运行退出

7、退出WAVE6000

8、烧录程序:

利用电子在线ISP编辑器烧录芯片(C51芯片不能正常烧录,可换S51芯片)。

9、硬件仿真:

利用实体作品对说烧录的芯片程序进行仿真,观察程序是否正常工作。

10、演示文稿与设计论文的制作。

 

总结

通过完成该课题项目,能加深自己所学的理论知识并丰富了各自的实践经验。

同时对课题项目所涉及的知识有一定的了解和加深。

虽然在过程中遇到了很多问题,但是通过老师和同学的帮助下得到了解决,使我们的印象更加深刻。

在项目完成的过程中,体现出了团队精神和综合协调与个体能力的重要性。

 

设计主程序

#include

#include"LCD1602.h"

#include"DS1302.h"

voidDelay1ms(unsignedintcount)

{

unsignedinti,j;

for(i=0;i

for(j=0;j<120;j++);

}

main()

{

SYSTEMTIMECurrentTime;

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_SetTime(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);

}

}

 

液晶显示程序

/**************************************************************************

THE1602CHARLCDLIB

COPYRIGHT(c)2005BYJJJ.

--ALLRIGHTSRESERVED--

FileName:

LCD.h

Author:

JiangJianJun

Created:

2005/4/3

Modified:

NO

Revision:

1.0

***************************************************************************/

#ifndefLCD_CHAR_1602_2005_4_9

#defineLCD_CHAR_1602_2005_4_9

#include

//PortDefinitions**********************************************************

sbitLcdRs=P1^2;

sbitLcdRw=P1^1;

sbitLcdEn=P1^0;

sfrDBPort=0x80;//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口

//内部等待函数**************************************************************************

unsignedcharLCD_Wait(void)

{

LcdRs=0;

LcdRw=1;_nop_();

LcdEn=1;_nop_();

//while(DBPort&0x80);//在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时,会进入死循环,

//可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80==0x80

//实际硬件时打开此语句

LcdEn=0;

returnDBPort;

}

//向LCD写入命令或数据************************************************************

#defineLCD_COMMAND0//Command

#defineLCD_DATA1//Data

#defineLCD_CLEAR_SCREEN0x01//清屏

#defineLCD_HOMING0x02//光标返回原点

voidLCD_Write(bitstyle,unsignedcharinput)

{

LcdEn=0;

LcdRs=style;

LcdRw=0;_nop_();

DBPort=input;_nop_();//注意顺序

LcdEn=1;_nop_();//注意顺序

LcdEn=0;_nop_();

LCD_Wait();

}

//设置显示模式************************************************************

#defineLCD_SHOW0x04//显示开

#defineLCD_HIDE0x00//显示关

#defineLCD_CURSOR0x02//显示光标

#defineLCD_NO_CURSOR0x00//无光标

#defineLCD_FLASH0x01//光标闪动

#defineLCD_NO_FLASH0x00//光标不闪动

voidLCD_SetDisplay(unsignedcharDisplayMode)

{

LCD_Write(LCD_COMMAND,0x08|DisplayMode);

}

//设置输入模式************************************************************

#defineLCD_AC_UP0x02

#defineLCD_AC_DOWN0x00//default

#defineLCD_MOVE0x01//画面可平移

#defineLCD_NO_MOVE0x00//default

voidLCD_SetInput(unsignedcharInputMode)

{

LCD_Write(LCD_COMMAND,0x04|InputMode);

}

//移动光标或屏幕************************************************************

/*

#defineLCD_CURSOR0x02

#defineLCD_SCREEN0x08

#defineLCD_LEFT0x00

#defineLCD_RIGHT0x04

voidLCD_Move(unsignedcharobject,unsignedchardirection)

{

if(object==LCD_CURSOR)

LCD_Write(LCD_COMMAND,0x10|direction);

if(object==LCD_SCREEN)

LCD_Write(LCD_COMMAND,0x18|direction);

}

*/

//初始化LCD************************************************************

voidLCD_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(LCD_COMMAND,LCD_CLEAR_SCREEN);//清屏

LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);//AC递增,画面不动

}

//************************************************************************

voidGotoXY(unsignedcharx,unsignedchary)

{

if(y==0)

LCD_Write(LCD_COMMAND,0x80|x);

if(y==1)

LCD_Write(LCD_COMMAND,0x80|(x-0x40));

}

voidPrint(unsignedchar*str)

{

while(*str!

='\0')

{

LCD_Write(LCD_DATA,*str);

str++;

}

}

/*

voidLCD_LoadChar(unsignedcharuser[8],unsignedcharplace)

{

unsignedchari;

LCD_Write(LCD_COMMAND,0x40|(place*8));

for(i=0;i<8;i++)

LCD_Write(LCD_DATA,user[i]);

}

*/

//************************************************************************

#endif

 

时钟程序

/**************************************************************************

THEREALTIMERDS1302DRIVERLIB

COPYRIGHT(c)2005BYJJJ.

--ALLRIGHTSRESERVED--

FileName:

DS1302.h

Author:

JiangJianJun

Created:

2003/7/21

Modified:

NO

Revision:

1.0

***************************************************************************/

#ifndef_REAL_TIMER_DS1302_2003_7_21_

#define_REAL_TIMER_DS1302_2003_7_21_

sbitDS1302_CLK=P2^0;//实时时钟时钟线引脚

sbitDS1302_IO=P2^1;//实时时钟数据线引脚

sbitDS1302_RST=P2^2;//实时时钟复位线引脚

sbitACC0=ACC^0;

sbitACC7=ACC^7;

typedefstruct__SYSTEMTIME__

{

unsignedcharSecond;

unsignedcharMinute;

unsignedcharHour;

unsignedcharWeek;

unsignedcharDay;

unsignedcharMonth;

unsignedcharYear;

unsignedcharDateString[9];

unsignedcharTimeString[9];

}SYSTEMTIME;//定义的时间类型

#defineAM(X)X

#definePM(X)(X+12)//转成24小时制

#defineDS1302_SECOND0x80

#defineDS1302_MINUTE0x82

#defineDS1302_HOUR0x84

#defineDS1302_WEEK0x8A

#defineDS1302_DAY0x86

#defineDS1302_MONTH0x88

#defineDS1302_YEAR0x8C

#defineDS1302_RAM(X)(0xC0+(X)*2)//用于计算DS1302_RAM地址的宏

voidDS1302InputByte(unsignedchard)//实时时钟写入一字节(内部函数)

{

unsignedchari;

ACC=d;

for(i=8;i>0;i--)

{

DS1302_IO=ACC0;//相当于汇编中的RRC

DS1302_CLK=1;

DS1302_CLK=0;

ACC=ACC>>1;

}

}

unsignedcharDS1302OutputByte(void)//实时时钟读取一字节(内部函数)

{

unsignedchari;

for(i=8;i>0;i--)

{

ACC=ACC>>1;//相当于汇编中的RRC

ACC7=DS1302_IO;

DS1302_CLK=1;

DS1302_CLK=0;

}

return(ACC);

}

voidWrite1302(unsignedcharucAddr,unsignedcharucDa)//ucAddr:

DS1302地址,ucData:

要写的数据

{

DS1302_RST=0;

DS1302_CLK=0;

DS1302_RST=1;

DS1302InputByte(ucAddr);//地址,命令

DS1302InputByte(ucDa);//写1Byte数据

DS1302_CLK=1;

DS1302_RST=0;

}

unsignedcharRead1302(unsignedcharucAddr)//读取DS1302某地址的数据

{

unsignedcharucData;

DS1302_RST=0;

DS1302_CLK=0;

DS1302_RST=1;

DS1302InputByte(ucAddr|0x01);//地址,命令

ucData=DS1302OutputByte();//读1Byte数据

DS1302_CLK=1;

DS1302_RST=0;

return(ucData);

}

voidDS1302_SetProtect(bitflag)//是否写保护

{

if(flag)

Write1302(0x8E,0x10);

else

Write1302(0x8E,0x00);

}

voidDS1302_SetTime(unsignedcharAddress,unsignedcharValue)//设置时间函数

{

DS1302_SetProtect(0);

Write1302(Address,((Value/10)<<4|(Value%10)));

}

voidDS1302_GetTime(SYSTEMTIME*Time)

{

unsignedcharReadValue;

ReadValue=Read1302(DS1302_SECOND);

Time->Second=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

ReadValue=Read1302(DS1302_MINUTE);

Time->Minute=((ReadValue&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);

ReadValue=Read1302(DS1302_MONTH);

Time->Month=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

ReadValue=Read1302(DS1302_YEAR);

Time->Year=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

}

voidDateToStr(SYSTEMTIME*Time)

{

Time->DateString[0]=Time->Year/10+'0';

Time->DateString[1]=Time->Year%10+'0';

Time->DateString[2]='-';

Time->DateString[3]=Time->Month/10+'0';

Time->DateString[4]=Time->Month%10+'0';

Time->DateString[5]='-';

Time->DateString[6]=Time->Day/10+'0';

Time->DateString[7]=Time->Day%10+'0';

Time->DateString[8]='\0';

}

voidTimeToStr(SYSTEMTIME*Time)

{

Time->TimeString[0]=Time->Hour/10+'0';

Time->TimeString[1]=Time->Hour%10+'0';

Time->TimeString[2]=':

';

Time->TimeString[3]=Time->Minute/10+'0';

Time->TimeString[4]=Time->Minute%10+'0';

Time->TimeString[5]=':

';

Time->TimeString[6]=Time->Second/10+'0';

Time->Tim

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1