基于51单片机的电子时钟设计文档格式.docx
《基于51单片机的电子时钟设计文档格式.docx》由会员分享,可在线阅读,更多相关《基于51单片机的电子时钟设计文档格式.docx(49页珍藏版)》请在冰豆网上搜索。
在当今社会,电子时钟已经得到相当广泛的应用,产品多样,发展更是多元化。
本作品是以STC89C51单片机作为主控芯片,使用12MHZ的晶振,使用专用时钟日历芯片DS12C887产生时间信息,时间精确。
软件部分以C语言为主体,用1602LCD液晶屏显示输出信息,输出信息量多,更直观、人性化。
该时钟可实现人机交互,可通过提供的键盘对其进行调整。
系统具有以下功能:
年、月、日、时、分、秒显示;
12小时/24小时模式切换,在12小时模式中,用AM和PM区分上午和下午;
秒表功能;
整点闹铃和报时功能,且闹钟可设置多组。
本次设计的电子时钟系统由单片机最小系统,1602LCD液晶屏,时钟芯片,调整按键,蜂鸣器,电源五大部分组成。
我们在设计电子时钟时遇到了芯片选型的问题,以下是三个设计方案:
方案一:
DS1302+数码管
DS1302的使用非常方便,而且价格便宜而数码管显示的也很清楚,特别是显示时间很直观。
但在制作过程中我们发现了这方案的一些问题。
DS1302是不自带电池,虽然可以通过外接纽扣电池来达到断电走时继续的目的,但在实际调试中会发现这是比较困难的。
因为DS1302上电需要复位,而复位就会把正确的走时清零。
如果不复位,DS1302会出现各种各样的问题,如不走时、读出乱码等。
要解决这个问题需要增加如2402等存储器,上电后先存储时间值,再复位。
这么做无疑增加了电路设计和软件设计的复杂度。
而使用数码管显示,虽然价格也便宜,显示效果好,但多位的数码管在动态扫描的时候会出现闪烁。
如果少用几位,用切换的方法查看日期,时间等信息又显得麻烦。
方案二:
DS12C887+1602LCD液晶屏
DS12C887时钟芯片功能丰富价格适中,能够自动产生世纪、年、月、日、时、分、秒以及时间模式转换等的时间信息,芯片内部增加了世纪存储器,从而利用硬件电路解决了“千年”的问题。
DS12C887时钟芯片中还自带有锂电池,单片机掉电后时钟芯片内部的时间信息可以保持十年之久。
1602LCD液晶屏可以输出2行,每行显示16个字符。
虽然1602LCD液晶屏较昂贵,但是该液晶屏显示清晰且不会闪烁,由于液晶屏是数字式的,因此和单片机系统的接口简单,操作方便。
1602LCD液晶屏的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多,功耗较低。
以上两种元件的程序编写简单,适用于多方面的应用。
方案三:
SD2068+1602LCD液晶屏
SD2068实时时钟芯片功能更加丰富,它除了具备有DS12C887时钟芯片的功能,另外还内置时钟精度数字调整功能,可以在很宽的范围内校正时钟的偏差;
内置上电复位电路及指示位;
内置电源稳压,内部计时电压可低至1.5V。
该芯片为工业级产品,是在选用实时时钟IC时的理想选择。
但是该芯片是一款新型的芯片,使用并不广泛,操作不方便,可能会出现芯片不稳定等的因素。
因此由以上三种方案进行比较,我们选择方案二来设计电子时钟。
以STC89C51
为主控芯片,DS12C887为时钟芯片,1602LCD液晶屏作为显示器。
程序控制DS12C887时钟芯片实现小时,分,秒和年,月,日的计时,并在1602LCD液晶屏上显示出来。
通过按键对12小时/24小时显示模式切换。
当时间走到程序所设定的时间时,蜂鸣器响起,起到闹铃功能。
当要
显示秒表计时时,可以通过按键切换来实现。
二、系统硬件设计
2.151单片机最小系统设计
单片机最小系统如下图1-1所示:
图1-1
以STC89C51单片机为核心,选用12MHZ的晶振,由于晶振的频率越高,单片机的运行速度就越快,但考虑到单片机的运行速度快会导致对存储器的要求就会变高,因此12MHZ晶振为最佳选择。
外接电容的值虽然没有严格的要求,但是外接电容的大小会影响振荡器的频率高低、振荡器的稳定性和起振的快速性,因此我们选用30pF的电容作为起振电容。
复位电路为按键高电平复位,当按键按下,RES端为高电平,当高电平持续4us的时间就可以使单片机复位。
2.2电源供电电路设计
电源供电电路如下图1-2所示:
图1-2
我们采用外接USB端口的方式为单片机供电,LPOW1为电源显示灯,当按键
S5按下,显示灯亮,表示给单片机供+5V电压。
2.3串口通信电路设计
串口通信电路如下图1-3所示:
图1-3串口通信电路图
图中通过MAX232进行TTL电平和232电平转换,从而单片机和上位机之间通信提供通道。
通信电路的目的就是让通信双发的电平匹配,单片机用的是TTL电平,上位机的串口用的是232电平。
TTL电平的逻辑1的电压范围是+3.3V到+5V,逻辑0的电压范围是0到+3.3V;
232电平的逻辑1的电压范围是-15V到-5V,逻辑0的电压范围是+5V到+15V。
因此设计串口通信电路就是让这两种电平统一。
2.4时钟芯片电路设计
时钟芯片电路如下图1-4所示:
图1-4
我们采用DS12C887时钟芯片定时及计时功能,DS12C887时钟芯片共需要13条
信号线。
GND、VCC:
直流电源,其中VCC接+5V输入,GND接地,当VCC输入为+5V
时,用户可以访问DS12C887内RAM中的数据,并可对其进行读、写操作;
当VCC的
输入小于+4.25V时,禁止用户对内部RAM进行读、写操作,此时用户不能正确获取
芯片内的时间信息;
当VCC的输入小于+3V时,DS12C887会自动将电源发换到内部
自带的锂电池上,以保证内部的电路能够正常工作MOT:
模式选择脚。
SQW:
方波
输出脚,当供电电压VCC大于4.25V时,SQW脚可进行方波输出。
AD0~AD7:
复用地
址数据总线,该总线采用分时复用技术,在总线周期的前半部分,出现在AD0~AD7
上的是地址信息,可用以选通DS12C887内的RAM,总线周期的后半部分出现在AD0
~AD7上的数据信息AS:
地址选通输入脚。
DS/RD:
数据选择或读输入脚,该引脚
有两种工作模式,当MOT接VCC时,选用Motorola工作模式,在这种工作模式中,
每个总线周期的后一部分的DS为高电平。
在读操作中,DS的上升沿使DS12C887将
内部数据送往总线AD0~AD7上,以供外部读取在写操作中,DS的下降沿将使总线
AD0~AD7上的数据锁存在DS12C887中。
当MOT接GND时,选用Intel工作模式,在
该模式中,该引脚是读允许输入脚R/W:
读/写输入端,该管脚也有2种工作模式,
当MOT接VCC时,R/W工作在Motorola模式CS:
片选输入,低电平有效
IRQ:
中断请求输入,低电平有效,该脚有效对DS12C887内的时钟、日历和RAM中
的内容没有任何影响,仅内部的控制寄存器有影响,在典型的应用中,RESET可以直
接接VCC,这样可以保证DS1
2C887在掉电时,其内部控制寄存器不受影响
2.5LCD显示电路设计
1602LCD液晶屏显示电路如下图1-5所示:
图1-5
1602LCD液晶屏为5V电压驱动,带背光,可显示两行,每行16个字符,不能显示汉字。
液晶1,2端为电源;
15,16为背光电源;
为防止直接加5V而烧坏背光灯,在15脚串联一个1k电阻用于限流。
液晶3端为液晶对比度调节端,通过一个10k的变位器来调节液晶显示对比度。
液晶4端为向液晶控制器写数据/写命令选择端,接单片机的P3.5口。
液晶5端为读/写选择端,因为我们不从液晶中读取数据,只向其写入命令和显示数据,因此此端始终选择为写状态,即低电平接地。
液晶6端为使能信号,是操作时必须的信号,接单片机的P3.4口。
2.6报警电路设计
蜂鸣器闹铃电路如下图1-6所示
图1-6
蜂鸣器电路接在单片机的P2.3引脚上,当给该引脚一个低电平,三极管导通,蜂鸣器发出声音作为闹铃。
2.7键控电路设计
按键调整电路如下图1-7所示:
图1-7
四个独立键盘均采用查询方式,我们将按键的一端接地,另一端各接一根输入线直接与STC89C51的I/O口相连,当按键闭合时,相当于该I/O口通过按键与地相连,变成低电平,单片机通过检测I/O口的电平状态,即可以识别出按下的键。
通过四个按键实现各方式的切换,S2用于12小时/24小时的模式切换,S3用于秒表功能与时钟功能间的切换,S4用于实现参数设置和调节功能。
三、系统软件设计
3.1系统程序流程图设计
流程图1:
实验主程序流程图
流程图2:
定时中断程序流程图
流程图3:
调时功能流程图
3.2系统程序设计(见附录)
4.1作品功能、特色
四、总结
本系统实现了人机交互功能,有夏时令制以及万年历功能。
可对年、月、日、时、分、秒进行任意设定,多组闹钟设定任你行,具有整点报时功能,模式切换随你意,秒表功能同时有。
特色:
本系统采用1602LCD显示信息,相比其他电子时钟,其显示信息更丰富,可同时显示时间,日期,星期等。
秒表功能精确到毫秒级,比普通具有秒表功能的时钟要高一个数量级。
闹钟可设置多组,解决了普通电子钟只能设置一组给大家带来的烦恼。
系统具有断电保护功能,芯片可以保存掉电时候的信息并继续工作,其睡眠工作时间可长达12小时
4.2综合设计的体会
本次大赛很好的锻炼了我们的动手能力以及团队合作能力,让我们享受到电子设计的快乐。
让我们开阔了视野,同时也增长了见识,在课余时间发挥想象和积极思考,锻炼了自己的思维能力。
在元件的选择和电路的设计上我们大胆创新,敢于尝试,并且积极搜查资料,认真分析,选择出最优的电路组合,使整个系统能够按照设计要求
稳定运行。
参考文献
[1]李广弟等编单片机基础北京航空航天大学出版社
2001
[2]吴金戌等编8051单片机实践与应用清华大学出版社
[3]王洪庆编微型计算机控制技术机械工业出版社
2006
[4]付家才编单片机控制工程实践技术化学工业出版社
2004
[5]鲍宏亚等编MCS-51系列单片机应用系统设计及实用技术中国宇航出版社
2005
[6]杨文龙.单片机原理及应用[M].西安电子科技大学出版社,2000
[7]赵文博,刘文涛.单片机语言C51程序设计[M].人民邮电出版社,2006
附录
/*******************************************************************************
***************************************
1602管脚分配:
1234567891011121314
1516
VSSVDDVLRSR/WED0D1D2D3D4D5
D6D7BLABLK
||||||||||||||
||
P2.5GNDP2.6
P1.0~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~P1.7GND(R/W接GND实现只写不读)
**************************************/
#include<
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitlcd_en=P2^6;
//LCD1602使能信号E位定义
sbitlcd_rs=P2^5;
//LCD1602读/写(H/L)控制信号RS位定义
ucharii,ll;
//在1602上写字符串所用的变量
sbitbeep=P2^3;
//蜂鸣器实现闹钟报警
sbitdscs=P2^7;
sbitdsas=P2^4;
sbitdsrw=P3^6;
sbitdsds=P3^7;
sbitdsirq=P3^2;
//闹钟申请
//按键部分sbits1=P2^0;
sbits2=P2^1;
sbits3=P2^2;
sbits4=P3^0;
ucharcodetable4[]="
20--Mon"
;
ucharcodetable5[]="
:
"
ucharcount,s3_num,s4_num,flag,flag1;
ucharmiao,shi,fen,nian,yue,ri,xinqi,n_miao,n_shi,n_fen;
//显示字符串
ucharcodetable1[]="
2009-07-13Mon"
ucharcodetable2[]="
00:
00:
00"
ucharcodetable3[]="
AlarmClock"
//闹钟字符串
//voiddisplay()
//{
//wrt
//}
//////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////星期字符串///////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
ucharcodexq1[]="
Mon"
//星期一的字符串ucharcodexq2[]="
Tue"
//星期二的字符串ucharcodexq3[]="
Wed"
//星期三的字符串ucharcodexq4[]="
Thu"
//星期四的字符串ucharcodexq5[]="
Fri"
//星期五的字符串ucharcodexq6[]="
Sat"
//星期六的字符串ucharcodexq7[]="
Sun"
//星期天的字符串
//函数申明
voidwrite_ds(uchar,uchar);
//INTEL总线写时序
voidset_alarm();
//设置闹钟
ucharread_ds(uchar);
//intel总线读时序
voidset_time();
//设置时间
voidwrite_nyr(ucharadd,uchardate);
//在LCD1602上刷新年月日
voiddidi();
//1602显示操作程序
voidLCD_1602_str(ucharhang1,char*ttt1);
//每次调用都会清屏,在液晶屏上面显示字符串voidLCD_1602_t(ucharhang1,char*ttt1);
//在上次显示内容的基础上替换特定位置的字符串
voidLCD_1602_num(ucharhang1,ucharnnn1);
//在特定的位置替换为一位数字(必须是0~9
的数字,否则显示的将不是想要显示的数字)
voiddelay(uintk);
//延迟子函数
voidwrite_com(ucharcom);
//1602写指令
voidwrite_data(uchardata0);
//1602写数据
voidinit00();
//1602初始化子程序
voidint0();
//定时器初始化函数chark[]="
."
//k[]="
_."
charj[]="
s"
//j[]="
ucharsta;
//temp记录产生的1ms基准中断次数,sta存放系统状态(0时为暂停,1时为
启动)
uinttemp,ms,s,s_100;
//毫秒变量ms,秒变量s,百秒变量s_100uintms_bai,ms_shi,ms_ge,s_shi,s_ge,s_100_shi,s_100_ge;
sbitstop=P2^1;
//停表或者启动按键s2实现停止秒表计数
sbitrest=P2^0;
//清零按键s1实现清零秒表计数
voidmiao1(void);
voidkey_s4_scan();
////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////设置闹钟//////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////
voidset_alarm()
{
if(n_shi==read_ds(4)&
&
n_fen==read_ds
(2)&
n_miao==read_ds(0))
didi();
}
voiddidi()
beep=0;
delay(500);
beep=1;
delay(1000);
beep=0;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////1602显示子函数////////////////////////////////////////////////////////////////
////////////