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