51单片机电子时钟设计报告.docx
《51单片机电子时钟设计报告.docx》由会员分享,可在线阅读,更多相关《51单片机电子时钟设计报告.docx(27页珍藏版)》请在冰豆网上搜索。
51单片机电子时钟设计报告
电子时钟实验报告
全部代码在文档末尾:
51单片机,LCD1602液晶显示屏平台下编程实现,可直接编译运行目录:
一,实验目的.1
二,实验要求.2
三,实验基本原理.2
四,实验设计分析.2
五,实验要现.3
A.电路设计3
1.整体设计3
2.分块设计4
输入部分4
输出部分5
晶振与复位电路6
B.程序设计6
程序总体设计6
程序主要模块7
五.实验总结及感想7
一,实验目的
20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎
渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的
提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越
快。
现代生活的人们越来越重视起了时间观念,可以说是时间和金钱划上了等
号。
对于那些对时间把握非常严格和准确的人或事来说,时间的不准确会带来
非常大的麻烦,所以电子钟是以其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受广大消费的喜爱,得到了广泛的使用。
1.学习8051定时器时间计时处理、按键扫描及LCD液晶显示的设计方法。
2.设计任务及要求利用实验平台上LCD1602液晶显示屏,设计带有闹铃功能的数字时钟
二,实验要求
A.基本要求:
1.在LCD1602液晶显示屏上显示当前日期,时间。
2.利用按键可对时间及闹玲进行设置,并可显示设置闹玲的时间。
闹玲时间到蜂鸣器发出声响,一分钟后闹铃停止。
B.扩展部分:
1.日历功能(能对年,月,日,星期进行显示,分辨平年,闰年以及各月天数,并调整)实现年月日时分秒的调整,星期准确的随着日期改变而改变进行显示。
2.定时功能(设定一段时间长度,定时到后,闹铃提示)
C.可扩展部分:
1.闹铃重响功能(闹铃被停止后,以停止时刻开始,一段时间后闹铃重响,且重响时间的间
隔可调)
2.可进行备忘录提示,按照年月日,可在设定的某年某月进行闹铃提示。
三,实验基本原理
利用单片机定时器完成计时功能,定时器0计时中断程序每隔中断一次并当作一个计数,设定定时1秒的中断计数初值为20,每中断一次中断计数初值加1,当减到20时,则表示1s到了,秒变量加1,同理再判断是否1min钟到了,再判断是否1h到了,是否一天到了,是否一个月到了,是否一年到了。
将时间在LCD液晶屏上显示,降低了程序的编写难度。
LCD的固定显示特性是我们省去了数码管的动态扫描显示。
四,实验设计分析
针对要实现的功能,采用AT89S52单片机进行设计,AT89S52单片机是一款低功耗,高
性能CMOS位单片机,片含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构。
这样,既能做到经济合理又能实现预期的功能。
在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便
于添加各项功能。
程序可分为闹钟的声音程序、时间显示程序、日期显示程序,秒表显示程序,时间调整程序、闹钟调整程序、定时调整程序,延时程序等。
运用这种方法,关键在于各模块的兼容和配合,若各模块不匹配会出现意想不到的错误。
首先,在编程之前必须了解硬件结构尤其是各引脚的用法,以及部寄存器、存储单元的
用法,否则,编程无从下手,电路也无法设计。
这是前期准备工作。
第二部分是硬件部分:
依据想要的功能分块设计设计,比如输入需要开关电路,输出需要显示驱动电路和数码管电
路等。
第三部分是软件部分:
先学习理解C语言的编程方法再根据设计的硬件电路进行分块
的编程调试,最终完成程序设计。
第四部分是软件画图部分:
设计好电路后进行画图,包括
电路图和仿真图的绘制。
第五部分是软件仿真部分:
软硬件设计好后将软件载入芯片中进行
仿真,仿真无法完成时检查软件程序和硬件电路并进行修改直到仿真成功。
第六部分是硬件
实现部分:
连接电路并导入程序检查电路,若与设计的完全一样一般能实现想要的功能。
最
后进行功能扩展,在已经正确的设计基础上,添加额外的功能!
五,实验要现
A.电路设计
1.整体设计
此次设计主要是应用单片机来设计电子时钟,硬件部分主要分以下电路模块:
显示电路
用lcd1602显示,年份,月份,星期,小时、分钟和秒(日),使电路更加简单。
单片机采用
AT89S5係列,这种单片机应用简单,适合电子钟设计。
电路的总体设计框架如下:
单片机
输出部分
输入部分
2.分块设计
模块电路主要分为:
输入部分、输出部分、复位和晶振电路。
输入部分
iffiES
RI0AK)RllMiBI
RIJAK
mfXiK.
«4©-ncQhE
按键1按键?
援键M扌澀牛扌灘£
AWW
输入信号主要是各种模式选择和调整信号,由按键开关提供。
以下为输入部分样例:
按键6*'q
0fir
在本实验中主要用用P3口输入按键信号,还用到了特殊的P0口。
对于P0口,由于其存在
高阻状态,为了实现开关功能,给其添加上拉电阻,具体如下图所示
PQILRDQn.tNipomp?
POJADlNliADiP口亦DB
PlflPl_l
PtJ
PUJ
PiiJi:
P1I£P1J
>K1EKL1
J0TAL2
RST
PStNALE
pdjwt
叮呗D
■s.iitjcdi
F3J/iwfTpi^ro
FJ3OLPJMrtR:
冊而
irac轩^TE>l=-p,rs,
P2M3P2»1QFZiWill
陀評口F2EA1tP37M15
输出部分
本电路的输出信号LC啲写入命令和写入数据,闹铃脉冲信号
闹铃由端输出,模块如下:
日期时间由LCD1602俞出,模块如下:
晶振与复位电路
本实验单片机时钟用部时钟,模块如下:
复位电路为手动复位构成,模块如下:
B.程序设计
程序总体设计
本实验用汇编程序完成程序总的流程图如下:
程序主要模块
中断服务程序:
/******************
一秒定时中断函数*****************/
voidtimer0()interrupt1using1{
ET0=0;
验总结及感想
一分耕耘,一分收获。
只有亲自用实践来验证这句话,在能得其要领。
经过这次单片机课程设计,我从一个单片机实践的门外汉,已经越升为略知一二的新手。
虽然还有很多有关单片机的应用有待学习,但万变不离其宗,只要深入了解单片的原理,全部知识点,各个细节,一切设计皆有可能。
在实验的开始几天,基本上没有收获,不知何从下手,不知所措。
为了看得更远,不妨站在前人的肩膀上,我在整体思路模糊的情况下,在网上大量招资粮,各种与电子时钟相关的文章,我阅读了不少。
随着涉猎的点滴积累,我对电子时钟的设计方案已经慢慢酝酿而成。
有了方向和不少知识储备后,在接下来的几天,几乎每天都有突破,虽然有时只是一句程序的修改或诞生,但那种收获的感觉很暖人心。
实验中遇到了不少问题,接下来总结一下,共同探讨。
1,P0口开关问题。
P0口比较特殊,它存在高阻态,要使其输入不是高电平就是低电平,就要接上拉电阻,给其高电平输入。
以上就是实验中遇到的主要问题,基本上都找到了相应的解决之道。
整个实验的过程就是一个解决问题的过程,每天都解决一些问题,我的实验也就解决了,当然结果不重要,功利化的追求结果,会使人浮躁,还是享受那份疑难迎刃而解的快感吧!
全部完整代码:
此代码未经本人优化,可以根据自己的需求优化代码。
盗版不究,可直接引用。
/****************************************************************/
基于STC89S52单片机以及液晶1602显示的万年历项目
***********************************************************
#include<>#include<>
液晶1602相关参数***************/
#defineucharunsignedchar#defineuintunsignedint/***************#definedata_portP0sbitrs=P1A0;
指令寄存器,rs=1时选择数据寄存器)sbitrw=P1A1;
入,rw=1时选择读出)sbiten=P1A2;
断,en=1时通信接口接通)ucharcodeline1_str[]={"Welcome!
"};//
ucharcodeline2_str[]={"madeby:
MCU"};//
//液晶屏指令、数据通信接口
//液晶屏寄存器选择接口(rs=0时选择
//液晶屏读写选择接口(rw=0时选择写
//液晶屏使能接口(en=0时通信接口中液晶屏第一行要显示的字符串
液晶屏第二行要显示的字符串
/***************按键设置的相关参数
sbittimer=P1A5;
sbitsound=P3A4;
ucharsflag=0,ssflag=0;
sbitset_key=P3A7;
sbitup_key=P3A6;
sbitcancle_key=P3A5;
ucharset=0;
ucharflag=0;
ucharyear=0x00;
ucharmonth=0x01;
ucharday=0x01;
ucharweek=0x06;
ucharhour;
ucharminite;
ucharsecond;
ucharjiamiao=0;
ucharfen1,fen2;
ucharshi1,shi2;
ucharcodenum_tab[]={"09"};
************/
//蜂鸣器
//进入闹铃设置状态键
//闹铃设置标志位;闹铃工作标志位
//进入设置
//加号键
//完成设置键
//是否进行了设置
//设置选择标志
//"年"寄存器
//"月"寄存器
//"日"寄存器
//"星期"寄存器
//"时"寄存器
//"分"寄存器
//"秒"寄存器
//加秒参数
//(数据交换)分定时寄存器
//(数据交换)时定时寄存器
//液晶屏要显示的数字表
uchardis_val[7]={0x00,0x01,0x01,0x06,0x00,0x00,0x00};//依次存储:
年,月,日,星期,
时,分,秒
****************
子函数部分***************
//初始化1602液晶
//欢迎界面
//向液晶屏输入命令
//向液晶屏输入数据
//延时函数
voidlcd_int();
voidwelcome();
voidin_command(uchar);voidin_data(uchardat);
voiddelay(uintms);
voidkey();
ucharcalculate_week();
voidweek_disp(ucharx);
voidlcd_disp_string(ucharstr[]);