基于单片机的lcd1602电子时钟设计说明Word格式文档下载.docx
- 文档编号:19155789
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:24
- 大小:135.73KB
基于单片机的lcd1602电子时钟设计说明Word格式文档下载.docx
《基于单片机的lcd1602电子时钟设计说明Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的lcd1602电子时钟设计说明Word格式文档下载.docx(24页珍藏版)》请在冰豆网上搜索。
采用此方案实现虽然有一定的时间误差,但可减少芯片的使用,节约成本,易于实现,符合现实选用,所以采用此种作为时钟信号发生器。
(2):
显示模块选择方案和论证:
方案一:
采用点阵式图形LCD12864液晶显示屏,液晶显示屏的显示功能强大,可显示文字,图形,显示多样,清晰可见,但是价格昂贵,需要的接口线多,所以在此设计中不采用点阵式图形LCD12864液晶显示屏。
采用点阵式字符型LCD1602液晶显示屏,LCD1602是专门用于显示字母、数字、符号等的点阵型液晶显示模块,分4位和8位数据传输方式。
提供“5×
7点阵+光标”和“5×
10点阵+光标”的显示模式。
价格现对便宜,所以用此种作为显示。
3、系统的硬件设计与实现
3.1电路设计框图
图1:
整体设计方框图
3.2单片机最小系统的设计
以AT89C51为核心组成的单片机的最小系统,主要包括时钟振荡电路,复位电路等。
正5V电源直接接到89C51的40脚(VCC),20脚(GND)接地。
时钟振荡电路的18脚(XTAL1)和19脚(XTAL2)外接11.0592MHZ的晶振和二个30PF的电容,振荡频率就是晶振的固有频率,经过一定的电路连接实现计时的功能。
复位电路采用上电自动复位和手动复位相结合的方式接到89C51的9端(RST)。
单片机最小系统原理图如图2所示:
图2:
单片机最小系统原理图
3.3显示电路设计
采用LCD1602液晶显示,LCD1602的D0~D7与单片机的P0口相连,P0口作为I/O口输出时必须外接10KΩ的上拉电阻。
分别用P
.0、P1.1、P1.2作为LCD1602的RS、RW、E控制线。
显示电路如图3所示:
图3:
液晶显示电路
3.4时间调整电路
该电路设计有三个轻触式按键,分别命名为:
模式设定键S1、加调整键S2、减调整键S3。
由P2.0口外接S1,P2.1外接S2,P2.2外接S3,P2.3作为公共端。
按一下S1,调整光标开始出现在秒位,再按一下S1光标移动到分,按一下光标移动一个校准位直到年位。
S2实现调整加1功能,S3实现调整减1功能。
时间调整电路如图4所示:
图4:
键盘电路
3.5复位电路及晶振电路
该电路采用按键复位,有一个22uF的电容、一个按键S4、一个10K的电阻和一个220Ω的电阻构成。
在产品工作期间出现错误或死机现象可采用手动复位,即按下S4,此时无论电路处于何种状态,电路都会恢复到初始状态的显示。
晶振电路可以给单片机提供所需要的时钟频率,主要由晶振这个元件固定的精确的频率来实现。
复位电路及晶振电路如图5所示:
图5复位电路及晶振电路
4、系统软件设计
软件系统分四个部分:
主函数程序部分,键盘扫描部分,定时器中断部分,LCD初始化部分。
各部分程序流程图如下所示:
4.1主函数程序流程图
图6主函数流程图
4.2键盘扫描子程序流程图
NO
YES
NONO
YESYES
图7键盘扫描程序流程图
4.3定时器中断子程序流程图
YES
4.3LCD初始化程序流程图
图9LCD初始化流程图
5、设计结果分析
5.1硬件分析
该设计电路系统较大,电路系统中只要出于一处的错误,则会对检测造成很大的不便,而且电路的交线较多。
另外,买来的元器件要先进行检测,如果有坏的器件要进行更换,还有就是要注意元器件的正确放置与安装以及布线的合理,便于成品电路的检测与维护。
为了减少复杂度,可用Proteus软件进行仿真,按照电路原理图在Proteus中选择元器件并连接,把生产的HEX文件烧入到单片机部进行仿真,若出现错误及时更改。
在本设计中遇到了很多的问题。
回想这些问题,其实只要认真思考许多都是可以避免的,以下为主要的问题:
在Proteus仿真中提示出错,没有仿真结果。
在Proteus中仿真中,提示出现了R1(R2)错误,经过仔细排查,发现有两个电阻命名,是R1,两个电阻命名是R2。
修改后就没有出现错误。
在Proteus仿真中,LCD不显示
在硬件设计上需要用P0口来对LCD进行指令的读写和数据的输入,由于没有在P0口接上拉电阻,LCD屏就一直不显示。
最终将在查阅课本时想起P0做输出口使用时外部必须接10KΩ的上拉电阻,接上后LCD就正常显示了。
5.2软件分析
该设计的功能虽然比较简单,但程序也较为复杂,所以在编写程序和调试时出现了许多问题。
最后经过多次的模块子程序的修改,一步一步的完成,最终在KEIL调试成功,解决了软件问题。
在软件的调试过程中主要遇到的问题如下:
烧入程序后,秒、分、时、年能正常工作,但是日、月出错
当秒等于60时显示为00,围是0~59;
当分等于60时显示00,围是0~59;
当时等于24时显示00,围是0~23;
年等于100是显示00,围是00~99;
日和月的显示都不包括0,当由于软件出错,显示时出现了,经过改写最终全能正常显示。
(2:
):
不能正常区分闰年和平年,每月都是31天
闰年和平年的2月份分别是29天和28天,1、3、5、7、8、10、12月份显示围是0~31,4、6、9、11月份显示围是0~30。
刚开始不能区分,最后经过修改能区分显示。
6、设计体会
通过这次单片机课程设计,发现了自身所学知识存在许多的不足和问题,同时也学到了不少东西,提高了动手实践的能力。
在整个设计过程中,从设计方案的确定,到具体电路在Proteus中的设计,最后到总体电路的联接构建以及程序的编写烧制,特别是程序的编写,要求对LCD1602的初始化操作、指令和数据的操作都需要很熟悉。
在设计过程中碰到实在不能解决的问题,就问老师或是和同学交流,把问题彻底搞清楚并加以掌握。
尽管在这次设计中遇到了许多难题,但也都一一得以解决。
比如程序编写中,由于思路不清晰,开始时遇到了许多的问题,经过静下心来思考,和同学们的共同讨论,理清了思路,反而得心应手;
在硬件方面虽然没有遇到什么大问题,但从中也学到了许多知识。
通过此次设计,也使我知道了做任何事都要有一颗平常心,不要想着走捷径,一步一个脚印,把每一步都认认真真做好了,才能取得最后的成功,同时也锻炼了我的耐心,做什么事都要有耐心,不要遇到困难就退缩,而是要静下心来去寻找解决的办法否则很难有最后的成功。
在此过程中更要注重自主学习,发挥自己的主观能动性。
总之,这次课设是我的又一次全新的尝试,也是一个小小的成功,更是一次很好的锻炼,让我有了全方位的提高和进步。
七、proteus仿真图
图(10)仿真主界面
图(11)调节分界面
图(12)调节月界面
图(13)调节年界面
八、参考文献
[1]周国运。
单片机原理及应用(C语言版)。
:
中国水利水电,2009
[2]齐、朱宁西。
单片机应用系统设计技术。
电子工业,2009
[3]汪道辉。
单片机系统设计与实践。
电子工业,2006
[4]子文。
单片机原理及应用。
电子科技大学,2006
九、程序附录:
#include<
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
#definedatasendP0
sbitlcden=P1^2;
//LCD使能端
sbitlcdrs=P1^0;
//LCD数据/指令(H/L)选择端
sbitlcdrw=P1^1;
ucharmytable0[]="
Nanyangligong"
;
ucharmytable1[]="
liuhaiyanDIY!
!
"
ucharcodeline0[]="
2010-12-01"
//初始化显示
ucharcodeline1[]="
00:
00:
00"
ucharcodemonth0[]={31,28,31,30,31,30,31,31,30,31,30,31};
//平年月
ucharcodemonth1[]={31,29,31,30,31,30,31,31,30,31,30,31};
//闰年月
ucharcount,hour,minute,second,year=1,month=1,date=1;
uchars1num;
//s1num:
定义功能键按下次数变量
voiddelay(unsignedintz)//延时子函数z*1ms
{
unsignedintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
}
voidwrite_(unsignedcharc)//写命令子函数
lcdrs=0;
//低电平选择为写指令
lcden=0;
datasend=c;
//把指令写入P0口
delay(5);
lcden=1;
//开使能
//读取指令
//关闭使能
}
voidwrite_data(unsignedchard)//写数据子函数
lcdrs=1;
//高电平选择为写数据
datasend=d;
//把数据写入P0口
//读取数据
voidwrite_hms(ucharadd,uchardat)//时分秒写函数add:
输入位置设置变量dat:
输入时分秒数据
ucharsw,gw;
//定义十位,个位变量
sw=dat/10;
gw=dat%10;
write_(0x80+0x40+add);
//从第二行(add)位开始写数据
write_data(0x30+sw);
//写入十位
write_data(0x30+gw);
//写入个位
voidwrite_ymd(ucharadd,uchardat)//年月日写函数add:
write_(0x80+add);
//从第一行(add)位开始写数据
voidt0()interrupt1//定时器0中断子程序
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
voidgethms()//时分秒处理子程序
second++;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
{
hour=0;
date++;
}
write_hms(2,hour);
//时输出显示
}
write_hms(5,minute);
//分输出显示
}
write_hms(8,second);
//秒输出显示
voidgetymd()//年月日处理子程序
if(year%4==0)
if(date==month1[month-1]+1)
date=1;
month++;
if(month==13)
month=1;
year++;
if(year==100)
{
year=1;
}
write_ymd(4,year);
write_ymd(7,month);
write_ymd(10,date);
}
else
if(date==month0[month-1]+1)
}
voidkey_process()//按键扫描子程序
{
if(P2==0xf6)//功能键
delay(25);
if(P2==0xf6)//功能键按下
while(P2==0xf6);
//松手检测
s1num++;
//功能键按下计数
TR0=0;
//T0定时停止,进入时间调整
switch(s1num)
case1:
write_(0x80+0x40+0x09);
break;
//光标闪烁位定为秒个位
case2:
write_(0x80+0x40+0x06);
//光标闪烁位定为分个位
case3:
write_(0x80+0x40+0x03);
//光标闪烁位定为时个位
case4:
write_(0x80+0x0b);
//光标闪烁位定为日个位
case5:
write_(0x80+0x08);
//光标闪烁位定为月个位
case6:
write_(0x80+0x05);
break;
//光标闪烁位定为年个位
}
write_(0x0f);
//光标闪烁
if(s1num==7)
s1num=0;
//按键计数复位
write_(0x0c);
//光标停止闪烁
TR0=1;
//重新启动定时器
}
}
if(P2==0xee)//时分秒+1模块
if(P2==0xee)
while(P2==0xee);
switch(s1num)
second++;
//秒+
if(second==60)second=0;
//复位
write_hms(8,second);
write_(0x80+0x40+0x09);
//光标闪烁位定为秒个位
if(minute==60)minute=0;
write_hms(5,minute);
//分输出显示
write_(0x80+0x40+0x06);
break;
hour++;
if(hour==24)hour=0;
write_hms(2,hour);
write_(0x80+0x40+0x03);
date++;
//日+
if(year%4==0)//平闰年判断
{
if(date==month1[month-1]+1)
{
date=1;
}
}
else
if(date==month0[month-1]+1)
write_ymd(10,date);
//日输出显示
write_(0x80+0x0b);
break;
month++;
//月+
if(month==13)month=1;
if(year%4==0)//判断日和月的配对关系
if(date>
month1[month-1])date=month1[month-1];
}
month0[month-1])date=month0[month-1];
write_ymd(7,month);
//月输出显示
write_(0x80+0x08);
year++;
//年+
if(year==100)year=1;
write_ymd(4,year);
//年输出显示
write_(0x80+0x05);
break;
}
if(P2==0xde)//时分秒-1模块
delay(5);
if(P2==0xde)
while(P2==0xde);
second--;
//秒-
if(second==255)second=59;
minute--;
if(minute==255)minute=59;
hour--;
if(hour==255)hour=23;
date--;
//日-
if(year%4==0)
if(date==0)
date=month1[month-1];
date=month0[month-1];
month--;
//月-
if(month==0)month=12;
ye
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 lcd1602 电子 时钟 设计 说明
![提示](https://static.bdocx.com/images/bang_tan.gif)