lcd液晶时钟.docx

上传人:b****2 文档编号:20686290 上传时间:2023-04-25 格式:DOCX 页数:28 大小:377.61KB
下载 相关 举报
lcd液晶时钟.docx_第1页
第1页 / 共28页
lcd液晶时钟.docx_第2页
第2页 / 共28页
lcd液晶时钟.docx_第3页
第3页 / 共28页
lcd液晶时钟.docx_第4页
第4页 / 共28页
lcd液晶时钟.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

lcd液晶时钟.docx

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

lcd液晶时钟.docx

lcd液晶时钟

 

多媒体通信系统综合实验文档

 

题目:

家用电子时钟设计(LCD显示)

学校:

天津商业大学

姓名:

范吟雪刘冉

日期:

2013年6月22日

 

摘要

随着科技的快速发展,时间的流逝,至从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。

本设计所用的STC89C52它可以对周、时、分、秒进行计时,并自动更新还具有整点提醒功能,而STC89C52的使用寿命长,误差小。

对于LCD电子时钟采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和毫秒等信息,还具有时间校准等功能。

该电路采用AT89S52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。

综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。

关键词:

STC89C52;独立键盘;P1;LCD

 

Abstract

Withtherapiddevelopmentofscienceandtechnology,thepassageoftime,tonowfromtheviewofthesun,pendulumclocktoelectronicclock,humanconstantlyresearchandinnovation.STC89C52itcanbeusedinthisdesignwascarriedoutontheweek,time,minutesandsecondstime,andautomaticallyupdatedtoremindfunction,alsohasthehourandSTC89C52longservicelifeandsmallerror.ForLCDelectronicclockUSESintuitivedigitaldisplay,candisplayyear,month,day,andatthesametimeonSunday,whentheinformationsuchas,minutes,seconds,andmilliseconds,butalsohastimecalibration,etc.ThecircuitadoptstheAT89S52singlechipmicrocomputerasthecore,lowconsumption,abletoworkunder3vlowvoltage,thevoltagecanchoose3~5vvoltagesupply.

Tosumuptheperpetualcalendariseasytoread,displayvisual,functionaldiversity,alotofadvantagessuchassimplecircuit,lowcost,conformingtothetrendofthedevelopmentoftheelectronicinstrumentsandmeters,hasabroadmarketprospect.

Keywords:

STC89C52;isolationkeyboard;P1;LCD

 

目录

1.设计要求1

1.1设计方案1

2.系统的硬件设计与实现2

2.1电路设计框图2

2.2系统硬件概述2

2.3主要单元电路的设计2

2.4液晶电路设计模块3

2.5键盘扫描模块3

2.6I2C总线和E2PROM模块4

2.7电路原理及说明5

2.7.1LCD1602的工作原理5

3系统的软件设计6

3.1程序流程框图6

4.软件测试6

4.2测试结论7

参考文献8

附录一:

系统电路图9

附录二:

系统程序10

LCD液晶电子时钟

1.设计要求

本课题以单片机为核心,设计并制作LCD液晶电子时钟,具有以下功能:

1)使用字符型LCD显示器显示当前时间。

显示格式为“时时:

分分:

秒秒”。

2)用4个功能键操作来设置当前时间。

功能键K1~K4功能如下

⏹K1—进入设置现在的时间。

⏹K2—设置小时。

⏹K3—设置分钟。

⏹K4—确认完成设置。

3)程序执行后工作指示灯LED闪动,表示程序开始执行,LCD显示“00:

00:

00”,然后开始计时。

4)整点报时(蜂鸣器响)。

5)LCD第二行显示设计者姓名缩写。

1.1设计方案

采用STC89C52,片内ROM全都采用FlashROM;能以3V的超底压工作;同时也与MCS-51系列单片机完全该芯片内部存储器为8KBROM存储空间,具有89C51的全部功能,可在线编程可擦除技术,采用LED液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见,与单片机连接时占用的单片机口线少。

直接采用单片机定时计数器提供秒信号,使用程序实现年、星期、时、分、秒、毫秒计数。

采用此种方案虽然减少芯片的使用,节约成本,所以选择采用STC89C52作为主控制系统.

2.系统的硬件设计与实现

2.1电路设计框图

图1硬件电路设计总体框图

2.2系统硬件概述

本设计主要利用STC89C52单片机、LCD液晶、I2C总线、E2PROM、独立键盘及一些外围电路设计出简易LCD电子时钟,具有时间可调,可以通过按键调整年、星期、时、分、秒、整点报时;并且具有掉电保存数据功能还可以作为电子跑表使用。

单片机中主要利用了STC89C52的P0口、P2口、P3口。

P0作为STC89C52对LCD液晶写数据的接口;独立键盘用于对时间调整。

利用以上所选的模块就能实现LCD液晶电子时钟的设计。

2.3主要单元电路的设计

AT89S52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3,MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。

单片机的最小系统如下图所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出.第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,20引脚为接地端,40引脚为电源端.如图2所示

图2主控制系统

2.4液晶电路设计模块

图3示出LCD1602的引脚排列,其中Vcc为主电源。

LCD1602由Vcc供电。

RS接P2.4口用于对数据的读控制,RW接P2.5口用于对数据的写控制,E接P2.6口是LCD1602的使能端。

当操作LCD1602液晶时必须给E使能端一个高电平后才能对其进行操作。

图3LCD1602液晶连接模块

2.5键盘扫描模块

图4示出键盘的连接方式,S2键连接P3.0用于调整时间是的年、星期、时、分、秒的位置切换。

按下S3可在相应模式下进行数据加1,而S4则减1。

图4独立键盘连接模块

2.6I2C总线和E2PROM模块

图4示出24C02的连接方式。

24C02用于对时间的外部存储。

当单片机掉电是可对掉电前的时间保存在E2PROM中。

SCL为时钟线,SDA为数据线,A2、A1、A0芯片物理地址选择,WP端是写保护,可以防止误操作损坏EEPROM中的数据。

图524C02与单片机连接模块

2.7电路原理及说明

2.7.1LCD1602的工作原理

LCD1602在每次进行读、写程序前都必须初始化,先把E端置“0”,接着把RS端置“1”,最后才给RW高电平;读/写时序如下图6所示。

若对程序进行写时RS=1,RW=0,E=1;对时间进行读RS=0,RW=1,E=1。

图6LCD1602液晶的写操作时序

3系统的软件设计

3.1程序流程框图

图7程序流程框图

4.软件测试

4.1测试内容

LCD1602液晶时钟可以看当前星期,时间。

LCD1602液晶时钟功能比较多,所以对于它的程序也较为复杂,所以在编写程序和调试时出现了相对较多的问题。

最后经过多次的模块子程序的修改,一步一步的完成,最终解决了软件。

在软件的调试过程中主要遇到的问题如下:

1.烧入程序后,LCD1602液晶显示亮度暗。

解决:

调节连接LCD1602液晶的电位器改变电压,可以解决LCD1602液晶显示亮度暗的问题。

2.修改时间、日期时液晶显示乱码。

解决:

调整相关的程序,把不相关的程序暂时屏蔽,用按键调整调试,发现在写数据时,液晶的指针定位弄错了。

最后把相应的指针位置进行修改,使得指针位置对应,最后解决了此问题.

4.2测试结论

经过多次的反复测试与分析,可以对电路的原理及功能更加熟悉,同时提高了设计能力与及对电路的分析能力.同时在软件的编程方面得到更到的提高,对编程能力得到加强.同时对所学的知识得到很大的提高与巩固.

 

参考文献

[1]楼然苗,李光飞.单片机课程设计指导.北京航空航天大学出版社,2007

[2]郭天祥.51单片机C语言教程.北京电子工业出版社,2009

[3]张鑫,华臻,陈书谦.单片微机原理与应用.北京电子工业出版社,2005

[4]张毅坤,陈善久,裘雪红.单片微型计算机原理与应用.西安电子科技大学出版社.2008

[5]康华光,陈大钦,张林.模拟电子技术基础.高等教育出版社,2002

 

附录一:

系统电路图

 

附录二:

系统程序

#include

#include

#defineAddWr0xae//写数据地址,需要参考24c02芯片文档

#defineAddRd0xaf//读数据地址

#defineucharunsignedchar

#defineuintunsignedint

sbitrs=P2^4;

sbitrw=P2^5;

sbiten=P2^6;

sbitkey1=P3^0;

sbitkey2=P3^1;

sbitkey3=P3^2;

sbitkey4=P3^3;

sbitbeep=P1^7;

sbitsda=P1^2;//定义总线连接端口

sbitscl=P1^1;

sbitwp=P1^0;

ucharcount;

ucharhour,minute,second,year=2010,weekday=4;

ucharkey1num,msecond=0;

ucharcodetable[]="2013WeekDay:

4";

ucharcodetable1[]="00:

00:

00mb:

00";

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

//毫秒延时函数

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

voiddelay(uintz)

{

ucharx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

 

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

//LCD1602写命令

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

voidwrite_com(ucharcom)

{

rs=0;

rw=0;

P0=com;

delay(5);

en=1;

delay(5);

en=0;

}

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

//LCD1602写数据

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

voidwrite_data(uchardate)

{

rs=1;

rw=0;

P0=date;

delay(5);

en=1;

delay(5);

en=0;

}

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

//初始化函数

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

voidinit()

{

ucharnum;

rs=1;

rw=1;

en=0;

write_com(0x38);

write_com(0x06);

write_com(0x0c);

write_com(0x10);

write_com(0x80);

for(num=0;num<16;num++)

{

write_data(table[num]);

delay(5);

}

write_com(0x80+0x40);

for(num=0;num<16;num++)

{

write_data(table1[num]);

delay(5);

}

TMOD|=0x01;

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

TR0=1;

ET0=1;

EA=1;

}

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

//向LCD1602中写入数据

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

write_time(ucharadd,uchardate)

{

ucharshi,ge;

shi=date/10;

ge=date%10;

write_com(0x80+0x40+add);

write_data(0x30+shi);

write_data(0x30+ge);

}

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

//键盘扫描函数

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

voidkeyscan()

{

if(key1==0)

{

delay(10);

if(key1==0)

{

while(!

key1);

key1num++;

}

}

if(key1num==1)

{

TR0=0;

write_com(0x80+0x40+7);

write_com(0x0f);

}

if(key1num==2)

{

write_com(0x80+0x40+4);

}

if(key1num==3)

{

write_com(0x80+0x40+1);

}

if(key1num==4)

{

write_com(0x80+14);

}

if(key1num==5)

{

write_com(0x80+4);

}

if(key1num==6)

{

TR0=1;

key1num=0;

write_com(0x0c);

}

if(key1num!

=0)

{

if(key2==0)

{

delay(10);

if(key2==0)

{

while(!

key2);

if(key1num==1)

{

second++;

if(second==60)

second=0;

write_time(7,second);

}

if(key1num==2)

{

minute++;

if(minute==60)

minute=0;

write_time(4,minute);

}

if(key1num==3)

{

hour++;

if(hour==24)

hour=0;

write_time(1,hour);

}

if(key1num==4)

{

weekday++;

if(weekday==8)

weekday=0;

write_com(0x80+14);

write_data(0x30+weekday);

}

if(key1num==5)

{

year++;

if(year==9)

year=0;

write_com(0x80+4);

write_data(0x30+year%10);

}

}

}

if(key3==0)

{

delay(10);

if(key3==0)

{

while(!

key3);

if(key1num==1)

{

second--;

if(second==255)

second=59;

write_time(7,second);

}

if(key1num==2)

{

minute--;

if(minute==255)

minute=59;

write_time(4,minute);

}

if(key1num==3)

{

hour--;

if(hour==255)

hour=23;

write_time(1,hour);

}

if(key1num==4)

{

weekday--;

if(weekday==8)

{

weekday=1;

}

write_com(0x80+14);

write_data(0x30+weekday);

}

if(key1num==5)

{

year--;

if(year==255)

year=9;

write_com(0x80+4);

write_data(0x30+year%10);

}

}

}

}

}

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

//us延时函数

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

voiddelay2()

{

uinti;

for(i=0;i<6;i++)_nop_();

}

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

//I2C总线初始化

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

voidinit_i2c()

{

wp=0;

sda=1;

delay2();

scl=1;

delay2();

}

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

//启动I2C总线

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

voidstart()//开始信号

{

sda=1;

delay2();

scl=1;

delay2();

sda=0;

delay2();

}

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

//I2C总线应答

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

voidresponse()//应答信号

{

sda=1;

delay2();

scl=1;

delay2();

scl=0;

delay2();

}

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

//I2C总线停止

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

voidstop()//停止信号

{

sda=0;

delay2();

scl=1;

delay2();

sda=1;

delay2();

}

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

//I2C总线写入一个字节

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

voidwrite_byte(uchardate)//写字节

{

uchari,temp;

temp=date;

wp=0;

scl=0;

delay2();

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

{

if(temp&0x80)

sda=1;

else

sda=0;

delay2();

scl=1;

delay2();

scl=0;

delay2();

temp=temp<<1;

}

scl=0;

delay2();

sda=1;

delay2();

}

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

//I2C总线读出一个字节

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

ucharread_byte()//读字节

{

uchari,k;

sda=1;

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

{

scl=1;

delay2();

k=k<<1;

if(sda)

k=k|0x01;

else

k=k&0xfe;

scl=0;

delay2();

}

returnk;

}

voidwrite_add(ucharaddress,uchardate,uchardate1,uchardate2,uchardate3)

{

wp=0;

start();

write_byte(0xae);

response();

write_byte(address);

response();

write_byte(date);

response();

write_byte(date1);

response();

write_byte(date2);

response();

write_byte(date3);

response();

stop();

}

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

//I2C总线读地址

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

ucharread_add(ucharaddress)

{

uchardate;

start();

write_byte(0xae);

response();

write_byte(address);

response();

start();

write_byte(0xaf);

response();

date=read_byte();

stop();

returndate;

}

 

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

//主函数

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

voidmain()

{

init();

init_i2c();

//write_add(10,4,0,0,0);//只需写入一次即可

second=read_add(11);

write_time(7,second);

minute=read_add(12);

write_time(4,minute);

hour=r

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

当前位置:首页 > 医药卫生 > 基础医学

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

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