基于单片机的电子钟设计.docx
- 文档编号:7090769
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:26
- 大小:522.99KB
基于单片机的电子钟设计.docx
《基于单片机的电子钟设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的电子钟设计.docx(26页珍藏版)》请在冰豆网上搜索。
基于单片机的电子钟设计
摘要
随着科技的发展,单片机的应用正在不断深入,涉及到日常生活的方方面面。
本设计是基于单片机AT89S51为控制核心,以液晶为显示的数字时钟。
本数字时钟设计的原理相对简单,所以硬件电路也相对简单,难点和重点主要放在C语言的编程上,使用到定时器的子程序、延时程序、时分秒的控制程序、液晶模块和单片机模块的初始化程序、液晶显示的程序等,各个函数交叉调用,配合主程序的运行。
关键字:
LCD1602AT89S51定时器
Abstract
Withthedevelopmentoftechnology,SCMapplicationsaredeepening,involvingallaspectsofdailylife.ThedesignisbasedontheMCUAT89S52forthecontrolofthecore,theliquidcrystaldisplaydigitalclock.Thedigitalclockdesignprincipleisrelativelysimple,thehardwarecircuitisrelativelysimple,difficult,andfocusedmainlyontheCprogramminglanguage,usethetimersubroutine,delayprocedures,minutesandsecondsofthecontrolprogram,theLCDmoduleandmicrocontrollermoduleinitializationprocedures,proceduresforliquidcrystaldisplay,cross-eachfunctioncall,withthemainprogramtorun.
Keywords:
LCD1602AT89S51timer
目录
1实验任务1
2设计方案1
2.1硬件设计1
2.1.1原理框图1
2.1.2控制模块1
2.1.3显示模块3
2.1.4按键电路5
2.2软件设计5
2.2.1基本资源的使用5
2.2.2程序设计的基本思路5
3仿真与调试结果5
4心得体会6
附录7
附录1实物图及说明7
附录2程序流程图9
附录3程序清单9
1实验任务
设计一个多功能LCD电子钟。
要求
(1)能显示年、月、日、星期、时、分、秒;
(2)能对年、月、日、星期、时、分、秒进行预置;
2设计方案
2.1硬件设计
2.1.1原理框图
2.1.2控制模块
a.LCD液晶屏显示电路
b.晶振电路
c.复位电路
2.1.3显示模块
1602LCD主要技术参数:
显示容量:
16×2个字符
芯片工作电压:
4.5—5.5V
工作电流:
2.0mA(5.0V)
模块最佳工作电压:
5.0V
字符尺寸:
2.95×4.35(W×H)mm
引脚功能说明:
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如下表所示:
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
数据
2
VDD
电源正极
10
D3
数据
3
VL
液晶显示偏压
11
D4
数据
4
RS
数据/命令选择
12
D5
数据
5
R/W
读/写选择
13
D6
数据
6
E
使能信号
14
D7
数据
7
D0
数据
15
BLA
背光源正极
8
D1
数据
16
BLK
背光源负极
第1脚:
VSS为地电源。
第2脚:
VDD接5V正电源。
第3脚:
VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15脚:
背光源正极。
第16脚:
背光源负极。
硬件连接原理图如下:
2.1.4按键电路
S0设置闹钟(按键1次设置秒,2次设置分,3次设置时,4次设置星期,5次设置日期,6次设置月份,7次设置年份);
S1增加一(设置中对所选择变量加一);
S2减少一(设置中对所选择变量减一);
2.2软件设计
2.2.1基本资源的使用
本次实验采用了AT89S52型单片机,1602LCD液晶显示屏。
为了实现时钟,用到了单片机的外部中断,计时器中断,及I/O端口。
2.2.2程序设计的基本思路
主程序包括闰年判定,键盘识别控制及液晶屏显示3个子程序,实现时钟的显示,调节功能。
另外,还有延时,初始化等子程序。
利用定时器0来控制时间,实现分钟,小时,年月的计算。
3仿真与调试结果
本实验采用Keil4和Protues联合仿真调试
仿真结果:
经过多次的反复测试与分析,掌握了硬件的设计与分析的能力,对所学的知识得到很大的提高与巩固。
最终实现功能:
(1)能显示阳历年、月、日、星期、小时、分、秒
(2)显示模块采用LCD液晶显示,要求能用按键调整日期、时间。
4心得体会
本次电子时钟的实验课程设计,学习将理论和实践相结合,对数字器件及集成电路有较深入的认识,初步掌握综合运用所学知识分析和设计一般数字系统的基本方法,增强动手解决实际问题的能力。
认识到了自身的许多缺点和不足,初步接触到了如何将硬件和软件相连接来实现一定的自动化。
在试验板的焊接过程中,更深地意识到焊接技术的重要性。
使我明白现实生活中电子钟的工作原理,锻炼了查找资料的能力。
同时也了解到了仿真成功后,实物图连接与仿真图无误,还是可能会存在实际电路无法正常工作的情况,使用器件,芯片前应先做好对器件,芯片的了解工作,知道每一引脚的用途,正确的连接方法,焊接前做好准备工作,设计好电路图,到焊接时可以事半功倍,焊接时也要小心翼翼,最后,也要不断调试,完善电路。
附录
附录1实物图及说明
说明1:
上2图为上电后,时钟开始显示,每进一日,时钟开始判断有无月份进一,年份进一等情况,同时实现闰年的判断。
说明2:
此时进入时钟调节模式,第一次按下调节时间按键后,显示秒钟调节,可进行加一减一,之后是分钟调节,以此类推,时钟,星期,日,月,年,此图显示为月调节。
年份调节后,返回时钟显示,正常显示时间。
附录2程序流程图
Y
N
...............................................
附录3程序清单
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitkey0=P2^0;//时间设置
sbitkey1=P2^1;//加一
sbitkey2=P2^2;//减一
sbitlcdrw=P2^5;
sbitlcdrs=P2^6;
sbitlcden=P2^7;
uints,f,m,n,t,shis,shig,fens,feng,mias,miag,
nian1,nian2,nian3,nian4,yues,yueg,ris,rig,rp;
intnian,yue,ri,shi,fen,mia,a;
ucharcodetab[]="MonTusWedThuFriSatSun";
voiddelay(uintx)//延时函数
{
uinti,j;
for(i=0;i for(j=0;j<110;j++); } voidwrite_cmd(ucharcmd)//读命令 { lcdrs=0; P0=cmd; delay(5); lcden=1; delay(5); lcden=0; } voidwrite_data(uchardat)//读数据 { lcdrs=1; P0=dat; delay(5); lcden=1; delay(5); lcden=0; } voidinit() { shi=23;fen59;mia=55;//时间显示初值 nian=2014;yue=2;ri=27; t=0;f=1;m=0; TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1;ET0=1;TR0=1;a=0; lcdrw=0; write_cmd(0x38); write_cmd(0x0c); write_cmd(0x06); write_cmd(0x01); } voiddisplay()//时钟显示函数 { write_cmd(0x81); nian1=nian/1000; nian2=(nian%1000)/100; nian3=(nian%100)/10; nian4=nian%10; yues=yue/10; yueg=yue%10; ris=ri/10; rig=ri%10; write_data(nian1+0x30); write_data(nian2+0x30); write_data(nian3+0x30); write_data(nian4+0x30); write_data(0x2d); write_data(yues+0x30); write_data(yueg+0x30); write_data(0x2d); write_data(ris+0x30); write_data(rig+0x30); write_cmd(0x80+0x0c); for(n=a;n<3+a;n++) { write_data(tab[n]); delay(10); } shis=shi/10; shig=shi%10; fens=fen/10; feng=fen%10; mias=mia/10; miag=mia%10; write_cmd(0x80+0x44); write_data(shis+0x30); write_data(shig+0x30); write_data(0x3a); write_data(fens+0x30); write_data(feng+0x30); write_data(0x3a); write_data(mias+0x30); write_data(miag+0x30); } voidkey()//按键控制函数 { if(! key0) { delay(5); if(! key0) { while(! key0); s++; if(s==1) { TR0=0; f=0; display(); write_cmd(0x80+0x40+0x0b); write_cmd(0x0f); } if(s==2) { display(); write_cmd(0x80+0x40+0x08); } if(s==3) { display(); write_cmd(0x80+0x40+0x05); } if(s==4) { display(); write_cmd(0x80+0x0d); } if(s==5) { display(); write_cmd(0x80+0x0a); } if(s==6) { display(); write_cmd(0x80+0x07); } if(s==7) { display(); write_cmd(0x80+0x04); } if(s==8) { TR0=1; write_cmd(0x0c); display(); f=1; } if(s==9) s=0; } } if(! key1) { delay(5); if(! key1) { while(! key1); if(s! =0) { if(s==1) { mia++; if(mia==60) mia=0; display(); write_cmd(0x80+0x40+0x0b); } if(s==2) { fen++; if(fen==60) fen=0; display(); write_cmd(0x80+0x40+0x08); } if(s==3) { shi++; if(shi==24) shi=0; display(); write_cmd(0x80+0x40+0x05); } if(s==4) { a=a+3; if(a>18) a=0; display(); write_cmd(0x80+0x0d); } if(s==5) { ri++; if(ri==32) ri=1; display(); write_cmd(0x80+0x0a); } if(s==6) { yue++; if(yue==13) yue=1; display(); write_cmd(0x80+0x07); } if(s==7) { nian++; if(nian>9999) nian=0; display(); write_cmd(0x80+0x04); } } } } if(! key2) { delay(5); if(! key2) { while(! key2); if(s! =0) { if(s==1) { mia--; if(mia<0) mia=59; display(); write_cmd(0x80+0x40+0x0b); } if(s==2) { fen--; if(fen<0) fen=59; display(); write_cmd(0x80+0x40+0x08); } if(s==3) { shi--; if(shi<0) shi=23; display(); write_cmd(0x80+0x40+0x05); } if(s==4) { a=a-3; if(a<0) a=18; display(); write_cmd(0x80+0x0d); } if(s==5) { ri--; if(ri<0) ri=31; display(); write_cmd(0x80+0x0a); } if(s==6) { yue--; if(yue==0) yue=12; display(); write_cmd(0x80+0x07); } if(s==7) { nian--; if(nian<0) nian=9999; display(); write_cmd(0x80+0x04); } } } } } intpanding(ints)//闰年判定函数 { if(s%100==0) { if(s%400==0) return (1); else return (2); } else if(s%4==0) return (1); else return (2); } voidmain() { init(); while (1) { rp=panding(nian); key(); if(f==1) { display(); } } } voidtimer()interrupt1//定时器0 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; t++; if(t==20) { t=0; mia++; if(mia==60) { mia=0; fen++; if(fen==60) { fen=0; shi++; if(shi==24) { shi=0; a=a+3; if(a>18) a=0; ri++; if(rp==1) { if(yue==2) if(ri==30) { ri=1; yue++; if(yue==13) { yue=1; nian++; } } } else { if(yue==2) if(ri==29) { ri=1; yue++; if(yue==13) { yue=1; nian++; } } } if(yue%2==1) { if(yue<8) { if(ri==32) { ri=1; yue++; if(yue==13) { yue=1; nian++; } } } else { if(ri==31) { ri=1; yue++; if(yue==13) { yue=1; nian++; } } } } else { if(yue<7) { if(yue>2) if(ri==31) { ri=1; yue++; if(yue==13) { yue=1; nian++; } } } else { if(ri==32) { ri=1; yue++; if(yue==13) { yue=1; nian++; } } } } } } } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 电子钟 设计