基于51单片机时钟LCD显示.docx
《基于51单片机时钟LCD显示.docx》由会员分享,可在线阅读,更多相关《基于51单片机时钟LCD显示.docx(14页珍藏版)》请在冰点文库上搜索。
基于51单片机时钟LCD显示
实
验
报
告
设计课题:
基于51单片机时钟LCD显示
班级:
学号:
姓名:
时间:
2012-11-11
一需求分析
1.功能描述:
本设计是基于51单片机时钟的LCD显示,通过单片机产生计数功能,通过LCD1602显示,显示时间包括:
年,月,日,时,分,秒,星期。
同时可用按键进行时间调整。
二总体设计
1.设计思路
通过51内部定时器产生时钟来进行准确计时,用独立键盘来实现时钟的可调,最后由LCD1602来显示。
2.器件选择
AT89C51LCD160212M晶振独立按键电容排阻
三硬件设计
1.硬件模块
2电路图
四软件设计
1.软件框图
2.软件流程图
2.1定时器框图
2.2键盘扫描控制模块
五总结:
本设计实现了时钟时,分,秒准确计时和显示。
由于时间仓促,设计仍有不足,主要是还不能对星期的自动调节,还需要进一步研究LCD1602datasheet的字库,来实现这一功能。
附程序代码:
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitrs=P2^5;
sbitrw=P2^6;
sbiten=P2^7;
sbitk0=P2^0;//k0键
sbitk1=P2^1;//k1键
ucharcount,k0num;
charmiao,shi,fen;
ucharcodetable[]="2012-11-12MON";
ucharcodetable1[]="00:
00:
00";
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_com(ucharcom)//写指令
{
rs=0;
en=0;
P0=com;
delay(5);
en=1;
delay(5);
en=0;
}
voidwrite_date(uchardate)//写数据
{
rs=1;
en=0;
P0=date;
delay(5);
en=1;
delay(5);
en=0;
}
voidinit()
{
ucharnum;
en=0;
rw=0;
write_com(0x38);//显示模式设置
write_com(0x0c);//开显示,光标闪烁不显示
write_com(0x06);//光标读写指针自动加一
write_com(0x01);//显示清屏
write_com(0x80);//数据指针地址
for(num=0;num<15;num++)
{
write_date(table[num]);
delay(5);
}
write_com(0x80+0x40);//写入液晶屏显示第二行
for(num=0;num<12;num++)
{
write_date(table1[num]);
delay(5);
}
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
voidwrite_sfm(ucharadd,uchardate)//时钟数据显示
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
voidkeyscan()//键盘扫描
{
if(k0==0)
{
if(k0==0)//k0按下,进入选择模式
{delay(8);
k0num++;
while(!
k0);
if(k0num==1)//修改秒
{
TR0=0;
write_com(0x80+0x40+10);
write_com(0x0f);
}
}
if(k0num==2)//修改分
{
write_com(0x80+0x40+7);
}
if(k0num==3)//修改时
{
write_com(0x80+0x40+4);
}
if(k0num==4)
{
k0num=0;
write_com(0x0c);//开显示,光标闪烁不显示
TR0=1;
}
}
if(k0num!
=0)
{
if(k1==0)//修改秒
{
delay(40);
if(k1==0)
{delay(40);
while(!
k1);
delay(40);
if(k0num==1)
{delay(40);
miao++;
if(miao==60)
miao=0;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
if(k0num==2)//修改分
{delay(40);
fen++;
if(fen==60)
fen=0;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(k0num==3)//修改时
{delay(40);
shi++;
if(shi==24)
shi=0;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
}
}
}
}
voidmain()
{
init();
while
(1)
{
keyscan();
}
}
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
write_sfm(4,shi);
}
write_sfm(7,fen);
}
write_sfm(10,miao);
}
}