课程设计基于LCD1602的数字时钟.docx
《课程设计基于LCD1602的数字时钟.docx》由会员分享,可在线阅读,更多相关《课程设计基于LCD1602的数字时钟.docx(32页珍藏版)》请在冰点文库上搜索。
![课程设计基于LCD1602的数字时钟.docx](https://file1.bingdoc.com/fileroot1/2023-6/2/a2f3cee6-22f3-4283-a767-1c4edac5a89d/a2f3cee6-22f3-4283-a767-1c4edac5a89d1.gif)
课程设计基于LCD1602的数字时钟
摘要
20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。
忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。
但是,一旦重要事情,一时的耽误可能酿成大祸。
目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。
下面是单片机的主要发展趋势。
单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。
从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。
这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。
纵观自己所处的这个快速发展的信息时代,数字电路的技术已广泛应用于各个领域中,它们无处不在我们的身边,我们通常所使用的手机,数码相机,MP3,MP4等电子产品都关联到数字电路的应用,而我想从自己所学专业的某一点出发,来分析数字电路在生活中的广泛应用。
由于时间在日常生活中的重要性,所以以时间为媒介的电子钟就被选为我这次论文选题的目标。
关键词:
单片机AT89C51LCD1602
摘要………………………………………………………………..2
第一章前言…………………………………………………………...4
第二章设计要求和总体设…………………………………………...5
1设计要求和目的………………………………………………………………….5
2总体设计………………………………………………………………………….5
第三章系统框图……………………………………………………...6
第四章硬件部分……………………………………………………...7
1单片机AT89C51简介…………………………………………………...............7
2LCD显示部分………………………………………………………….................7
3电路组成及分析………………………………………………………..................7
第五章软件部分……………………………………………..............12
1系统程序流程图…………………………………………………………………12
2定时器T0程序流程图……………………………………………………….....13
3显示时、分、秒子程序流程图………………………………………………..14
第六章原理图………………………………………………………..15
第七章程序代码……………………………………………..............16
第八章仿真调试部分-…………………………………………………….....35
1硬件调试………………………………………………………………................35
2软件调试………………………………………………………………................35
第九章设计总结……………………………………………………...............36
参考文献………………………………………………………………37
基于LCD1602数字时钟
第一章前言
随着科学技术的发展和电子技术产业结构调整,单片机开始迅速发展,由于家用电器逐渐普及,市场对于智能时钟控制系统的需求也越来越大。
单片机以其芯片集成度高、处理功能强、可靠性高等优点,成功应用于工业自动化、智能仪器仪表、家电产品等领域。
近些年,人们对数字钟的要求也越来越高,传统的时钟已不能满足人们的需求。
多功能数字钟不管在性能还是在样式上都发生了质的变化,有电子闹钟、数字闹钟等等。
单片机在多功能数字钟中的应用已是非常普遍的,人们对数字钟的功能及工作顺序都非常熟悉。
但是却很少知道它的内部结构以及工作原理。
由单片机作为数字钟的核心控制器,可以通过它的时钟信号进行计时实现计时功能,将其时间数据经单片机输出,利用显示器显示出来。
通过键盘可以进行定时、校时功能。
输出设备显示器可以用液晶显示技术和数码管显示技术。
单片机系统作为一种典型的嵌入式系统,其系统设计包括硬件设计和软件编程设计两个方面,其调试过程一般分为软件调试、硬件测试、系统调试。
本文所述智能时钟设计主要指时钟显示、时间设置等控制系统。
第二章设计要求和总体设计
1设计要求和目的
用液晶显示器显示时间以及日期,并用按键修改时间,显示出年月日和时分秒。
1显示格式为:
XX:
XX:
XX,即:
时:
分:
秒。
2时间显示24小时制
3系统上电后从上电时初始化显示:
00-00-00开始计时。
4能进行时间的调整,可暂停时间的变动
2总体设计方案
数字时钟设计方案论证
方案一:
由于本设计是数字时钟电路,可以使用数码管显示数据,但是进一步讨论可以发现,我们做的时钟要显示年月日,时分秒以及星期,如果用数码管显示显然是不可取的。
方案二:
从方案一发现的问题可以知道,本次设计的产品要求显示很多位数据,然而可以采用LCD1602,,它可以显示32个字符,完全能解决方案一遇到的问题,并且方案二的电路比较简单,而且它不占I/O资源,软件设计也比较简单。
第三章系统框图
第四章硬件部分
1单片机AT89C51简介
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除100次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
外形及引脚排列如图所示
主要特性:
·与MCS-51兼容
·4K字节可编程闪烁存储器
·寿命:
1000写/擦循环
·数据保留时间:
10年
·全静态工作:
0Hz-24MHz
·三级程序存储器锁定
·128×8位内部RAM
·32可编程I/O线
·两个16位定时器/计数器
·5个中断源
·可编程串行通道
·低功耗的闲置和掉电模式
·片内振荡器和时钟电路
管脚说明:
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
口管脚备选功能
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(记时器0外部输入)
P3.5T1(记时器1外部输入)
P3.6/WR(外部数据存储器写选通)
P3.7/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
振荡器特性:
XTAL1和XTAL2分别为反向放大器的输入和输出。
该反向放大器可以配置为片内振荡器。
石晶振荡和陶瓷振荡均可采用。
如采用外部时钟源驱动器件,XTAL2应不接。
有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
2LCD显示模块
液晶显示器简称是利用液晶经过处理后能够改变光线传输方向的特性,达
到显示字符或者图形的目的。
其特点是体积小、重量轻、功耗极低、显示内容丰富等特点,在单片机应用系统中有着日益广泛的应用。
1602芯片:
主要用于显示时间和定时时间。
1602芯片由点阵字符液晶显示器件和专用的行、列驱动器、控制及必要的链接件、结构件组装而成,可以显示数字和西文字符,但不能显示图形,已经可以满足本次设计的需要。
1602型LCD可以显示2行16个字符,有8位数据总线D0~D7和RS,R/W,EN三个控制端口,
工作电压为5V,并且具有字符对比度调节和背光功能。
3电路组成及分析
本设计基于单片机技术原理,以单片机芯片AT89C51作为核心控制器,通过硬件电路的制作以及软件程序的编制,设计制作出一个多功能数字时钟系统。
单片机扩展的LCD显示器用来显示秒、分、时计数单元中的值。
该时钟系统主要由时钟模块、液晶显示模块、键盘控制模块以及信号提示模块组成。
能够准确显示时间(显示格式为时时:
分分:
秒秒,24小时制),可随时进行时间调整。
(1)晶振电路
振荡器是数字钟的核心。
振荡器的稳定度及频率的精确度决定了数字钟计时的准确程度,通常选用石英晶体构成振荡器电路。
石英晶体振荡器的作用是产生时间标准信号。
因此,一般采用石英晶体振荡器经过分频得到这一时间脉冲信号。
(2)LCD1602电路
其中D0~D7为数据端口,E为使能端,通过对RS、RW及E的控制来对LCD1602写入数据或指令、VSS为电源负,VDD为电源正,VEE是为调整LCD1602亮度的。
(3)扫描按键电路
独立按键使用起来简单方便,在编写程序时必须对其进行消抖,原因如下:
当按键未按下时输出高电平,当按键按下时输出低电平。
通常按键为机械式开关,由于机械触点的弹性作用,一个按键在闭合时不会马上稳定的接通,断开时也不会马上断开,因而在闭合和断开的瞬间都会伴随着一串的抖动。
本次设计中焊接了3个独立按键、分别同P1.0,P1.1,P1.2相连。
P1.0口控制光标的显示及移动、P1.1、P1.2口分别代表“+”、“—”。
(4)复位电路
51单片机最小系统复位电路的极性电容C1的大小直接影响单片机的复位时间,一般采用10~30uF,51单片机最小系统容值越大需要的复位时间越短。
51单片机高电平复位。
以当前使用较多的AT89系列单片机来说,在复位脚加高电平2个机器周期(即24个振荡周期)可使单片机复位。
复位后,主要特征是各IO口呈现高电平,程序计数器从零开始执行程序。
(5)P0口电路
第五章软件部分
1系统程序流程图
2定时器T0中断流程图
3显示时、分、秒子程序流程图
第六章原理图
第七章程序代码
#include
#defineucharunsignedchar//赋初值
#defineuintunsignedint
sbitM=P1^0;//按键
sbitA=P1^1;
sbitI=P1^2;
sbitlcden=P1^4;//定义1602使能端
sbitrs=P1^5;//功能数据选择位
ucharAnum=0,Mnum=0,Inum=0,bs=0;//初始值
uintyear=2000;
ucharcount=0,miao=0,fen=0,shi=0,mouth=1,day=1,dayqd;
ucharhmiao=0,miao1=0,fen1=0,shi1=0;
ucharmiao2=0,fen2=0,shi2=0;
ucharcodetable[]="Time";
ucharcodetable1[]="00:
00:
00";
ucharcodetable2[]="Date";
ucharcodetable3[]="Meter";
ucharcodetable4[]="00:
00:
00:
00";
ucharcodetable5[]="Beepoff";
voiddelay(uintz)//延时
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_com(ucharcom)//写命令
{
rs=0;//选择指令寄存器
lcden=0;
P0=com;//将指令从P0口输出
delay
(1);//延时1毫秒
lcden=1;//E端高电平
delay
(1);
lcden=0;
}
voidwrite_date(uchardate)//写数据
{
rs=1;//选择数据寄存器
lcden=0;
P0=date;
delay
(1);
lcden=1;
delay
(1);
lcden=0;
}
voidinit()//初始化
{
ucharnum;
lcden=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]);
}
write_com(0x80+0x40);//从第二行显示
for(num=0;num<12;num++)
{
write_date(table1[num]);
}
TMOD=0x11;
TH0=(65536-50000)/256;//定时50ms
TL0=(65536-50000)%256;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
EA=1;//中断允许总控位
ET0=1;//定时器中断0打开
ET1=1;//定时器中断1打开
TR0=1;//定时器0运行
TR1=0;
}
voidwrite_sz(ucharadd,uchardate)
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
voidwrite_year(ucharadd,uintdate)
{
ucharqian,bai,shi,ge;
qian=date/1000;
bai=date%1000/100;
shi=date%1000%100/10;
ge=date%1000%100%10;
write_com(0x80+0x40+add);//设置数据地址指针
write_date(0x30+qian);
write_date(0x30+bai);
write_date(0x30+shi);
write_date(0x30+ge);
}
/*************时间显示及时间调节*************/
voidtimeinit()//时间初始化
{
ucharnum;
write_com(0x01);
write_com(0x80);
for(num=0;num<12;num++)
{
write_date(table[num]);
}
write_sz(4,shi);
write_com(0x80+0x40+6);
write_date(':
');
write_sz(7,fen);
write_com(0x80+0x40+9);
write_date(':
');
write_sz(10,miao);
}
voidtimekey()//按键
{
if(A==0)
{Anum++;//消抖
while(!
A);
if(Anum==1)
{
TR0=0;
write_com(0x80+0x40+4);
write_com(0x0f);
}
if(Anum==2)
{
write_com(0x80+0x40+7);
}
if(Anum==3)
{
write_com(0x80+0x40+10);
}
if(Anum==4)
{
Anum=0;
write_com(0x0c);
TR0=1;//t0的启动
}
}
if(Anum!
=0)
{
if(I==0)
{
while(!
I);
if(Anum==1)
{
shi++;
if(shi==24)
shi=0;
write_sz(4,shi);
write_com(0x80+0x40+4);
}
if(Anum==2)
{
fen++;
if(fen==60)
fen=0;
write_sz(7,fen);
write_com(0x80+0x40+7);
}
if(Anum==3)
{
miao++;
if(miao==60)
miao=0;
write_sz(10,miao);
write_com(0x80+0x40+10);
}
}
}
}
/*****************日期显示及日期调节****************/
voiddateinit()
{
ucharnum;
write_com(0x01);
write_com(0x80);
for(num=0;num<12;num++)
{
write_date(table2[num]);
}
write_year(3,year);
write_com(0x80+0x40+7);
write_date(':
');
write_sz(8,mouth);
write_com(0x80+0x40+10);
write_date(':
');
write_sz(11,day);
}
voiddatekey()
{
if(A==0)
{Anum++;
while(!
A);
if(Anum==1)
{
write_com(0x80+0x40+3);
write_com(0x0f);//光标
}
if(Anum==2)
{
write_com(0x80+0x40+8);
}
if(Anum==3)
{
write_com(0x80+0x40+11);
}
if(Anum==4)
{
Anum=0;
write_com(0x0c);
}
}
if(Anum!
=0)
{
if(I==0)
{
while(!
I);
if(Anum==1)
{
year++;
write_year(3,year);
write_com(0x80+0x40+3);
}
if(Anum==2)
{
mouth++;
if(mouth==13)
mouth=1;
write_sz(8,mouth);
write_com(0x80+0x40+8);
}
if(Anum==3)
{
day++;
if(mouth==1||mouth==3||mouth==5||mouth==7||mouth==8||mouth==10||mouth==12)
dayqd=32;
elseif(mouth==2)
{
if((year%4==0&&year%100!
=0)||year%400==0)
dayqd=30;
else
dayqd=29;
}
else
dayqd=31;
if(day==dayqd)
day=1;