LCD液晶多钟设计.docx
《LCD液晶多钟设计.docx》由会员分享,可在线阅读,更多相关《LCD液晶多钟设计.docx(12页珍藏版)》请在冰豆网上搜索。
LCD液晶多钟设计
2011年6月25日
一.设计目的
设计制作基于LCD液晶显示屏的,可以调整的时钟系统。
二.设计要求
(1)采用1602液晶屏显示显示时间。
(2)时间可以显示为:
时分秒。
三.原理框图
四.电路图设计
五.主要元件选择及参数设计
(1)单片机STC89S52
STC89S52是比较常用的52系列单片机。
它的工作电压是+5v。
外围电路加上12M的晶振,使其正常工作。
P2口控制DAC0832。
通过对P2口赋值来改变输出增益的大小。
(2)1602A液晶
1602A显示容量为16乘2个字符。
工作电压为+5v。
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
DateI/O
2
VDD
电源正极
10
D3
DateI/O
3
VL
液晶显示偏压信号
11
D4
DateI/O
4
RS
数据/命令选择端
12
D5
DateI/O
5
R/W
读写选择端
13
D6
DateI/O
6
E
使能端
14
D7
DateI/O
7
D0
DateI/O
15
BLA
背光源正极
8
D1
DateI/O
16
BLK
背光源负极
六.软件编程
按照电路图的设计焊接好硬件电路。
就开始软件编程。
程序主要分为两个部分,即液晶显示部分和复位的部分。
该数字时钟实现的功能是液晶正常显示时分秒,年月日。
编程思路是,在确定了时钟要实现的功能后编写程序。
本程序包含液晶写指令函数(write_com())、写数据函数(write_data())、初始化函数(init())、写入时分秒函数(write_sfm())、写入月和日函数(write_nyr())
七.调试部分
本次实验的调试部分花了大量的时间。
当程序写好编译通过后,下载到单片机中,调试硬件看有无显示和输出。
液晶部分,经过几次程序的修改,和对液晶部分电路的检测终于将液晶部分调出有显示。
再检查电路的焊接确定无误后,结果显示良好。
八.心得体会与总结
单片机设计不仅给我们提供了一个很好的展现自己所掌握知识的平台,又是检验自己所学知识的一次考核。
我们运用各自在各方面的优势中,通过团队力量,才使设计得以完成.可以说,我们四个人是一个不可或缺的整体,少了任何一个人都是无法完成任务的。
本次实验总共做了两大方面的任务,编程和调试。
在编程过程中必须牢牢把握数字时钟所要实现的功能,在确定方案的情况下理清思路,认真思考如何实现时钟的各种功能。
通过编程认识到一个单片机编程人员必须有清晰的思路。
编写这个程序花费了将近一天的时间,耗费了不少精力。
在编程过程中使用的是自己焊接的单片机开发板,其液晶的用法(主要是RS、RW,E这些端口的时序),在调试过程中我们发现了一些问题,一是液晶上在年月日后面空白处出现了乱码,原因是在初始化函数中显示年月日的时候for语句多执行了3次。
通过此次单片机设计我们掌握了1602A液晶的用法,也学到了很多编程技巧,获益匪浅。
附录实验源程序
#include
#defineuintunsignedint
#defineucharunsignedchar
Ucharcodetable[]="2010-05-18";
ucharcodetime[]="23:
00:
00";
ucharcodexi1[]="mon";
ucharcodexi2[]="tue";
ucharcodexi3[]="wed";
ucharcodexi4[]="thu";
ucharcodexi5[]="fri";
ucharcodexi6[]="sat";
ucharcodexi7[]="sun";
sbitwr=P3^3;
sbitrd=P3^5;
sbitlcde=P3^4;
uinti,shi,fen,miao,nian,yue,ri,count,num,x;
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_add(ucharadd)
{
rd=0;
P0=add;
lcde=1;
delay(5);
lcde=0;
}
voidwrite_date(uchardate)
{
rd=1;
P0=date;
lcde=1;
delay(5);
lcde=0;
}
voidwritesfm(ucharadd,uchardate)
{
uchars,g;
s=date/10;
g=date%10;
write_add(0x80+0x40+add);
write_date(0x30+s);
write_date(0x30+g);
}
voidwritenyr(ucharadd,uchardate)
{
uchars,g;
s=date/10;
g=date%10;
write_add(0x80+0x00+add);
write_date(0x30+s);
write_date(0x30+g);
}
voidxi(uchara)
{
if(a==1)
{
write_add(0x80+0x00+10);
for(i=0;i<3;i++)
{
write_date(xi1[i]);
delay(5);
}
}
if(a==2)
{
write_add(0x80+0x00+10);
for(i=0;i<3;i++)
{
write_date(xi2[i]);
delay(5);
}
}
if(a==3)
{
write_add(0x80+0x00+10);
for(i=0;i<3;i++)
{
write_date(xi3[i]);
delay(5);
}
}
if(a==4)
{
write_add(0x80+0x00+10);
for(i=0;i<3;i++)
{
write_date(xi4[i]);
delay(5);
}
}
if(a==5)
{
write_add(0x80+0x00+10);
for(i=0;i<3;i++)
{
write_date(xi5[i]);
delay(5);
}
}
if(a==6)
{
write_add(0x80+0x00+10);
for(i=0;i<3;i++)
{
write_date(xi6[i]);
delay(5);
}
}
if(a==7)
{
write_add(0x80+0x00+10);
for(i=0;i<3;i++)
{
write_date(xi7[i]);
delay(5);
}
}
}
voidinit()
{
lcde=0;
wr=0;
write_add(0x38);
write_add(0x0c);
write_add(0x06);
write_add(0x01);
write_add(0x80+0x00+0);
for(i=0;i<10;i++)
{
write_date(table[i]);
delay(5);
}
write_add(0x80+0x00+10);
for(i=0;i<3;i++)
{
write_date(xi7[i]);
delay(5);
}
write_add(0x80+0x40+0);
for(i=0;i<8;i++)
{
write_date(time[i]);
delay(5);
}
}
voidmain()
{
init();
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while
(1)
{
key();
if(count==20)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
ri++;
x++;
xi(x);
if(x==7)
{
x=0;
}
if(ri==30)
{
ri=0;
yue++;
if(yue==13)
{
yue=0;
nian++;
if(nian==100)
{
nian=0;
}
writenyr(2,nian);
}
writenyr(5,yue);
}
writenyr(8,ri);
}
writesfm(0,shi);
}
writesfm(3,fen);
}
writesfm(6,miao);
}
}
}
voidt()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
}