电子万年历毕业设计(基于AT89C51单片机和DS1302时钟芯片)

更新时间:2023-09-15 20:24:01 阅读量: 高中教育 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

鹤壁职业技术学院

毕业设计论文

论文题目:电子时钟

学 院: 机电工程学院 专 业:电气自动化 班 级: 2009级01班 学生姓名: 贾贯可 学 号: 0902511005 指导教师: 司新生

2011年10月 18 日

目 录

摘要 ….…………………………………………………………………….……………3 绪论 …….….……………………………………………………………….……………5 第1章 设计要求与方案论证…….………….………………………………7

1.1 引言…….……………………………………………………………….……………7 1.2 功能要求.…………………………..……………………………….………………7 1.3方案论证…….………………………………………………………..………………7

第2章 系统硬件电路设计 …….…………………………….………………11

2.1 电路设计…….………………………………………………………….…………11 2.2 系统硬件概述…….……………………………………………………………15 2.3主要单元电路的设计…….………………………………………………………15

第3章 系统的软件设计…….………………………………….……………22

3.1程序设计…….……………………………………………………………………22 3.2程序设计流程图…….……………………………………………………………22

第4章 结束语…….….………………………………………….……………24 附录一(电路原理图)…… ……………………………………..…………… 附录二(程序清单)…….…………………………………………………………27

摘要

随着社会、科技的发展,人类得知时间,从观太阳、摆钟到现在电子钟,不断研究、创新。为了在观测时间,能够了解与人类密切相关的信息,比如星期、日期等,电子时钟诞生了,它集时间、日期、星期等功能于一身,具有读取方便、显示直观、功能多样、电路简洁等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。

该电子时钟主要采用STC89C52RC单片机作为主控核心,由DS1302时钟芯片提供时钟、LED动态扫描显示屏显示。STC89C52RC单片机是由Atmel公司推出的,功耗小,电压可选用4~6V电压供电;DS1302时钟芯片是美国DALLAS公司推出的具有涓细电流充电功能的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小;数字显示是采用的LED显示屏来显示,可以同时显示年、月、日、星期、时、分、秒和温度等信息。此外,该电子时钟还具有时间校准等功能。

关键词:时钟电路; 时钟芯片DS1302;LED动态扫描; 单片机STC89C52RC;

绪论

随着人们生活水平的提高和生活节奏的加快,对时间的要求越来越高,精准数字计时的消费需求也是越来越多。

二十一世纪的今天,最具代表性的计时产品就是电子时钟,它是近代世界钟表业界的第三次革命。第一次是摆和摆轮游丝的发明,相对稳定的机械振荡频率源使钟表的走时差从分级缩小到秒级,代表性的产品就是带有摆或摆轮游丝的机械钟或表。第二次革命是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,使钟表的走时月差从分级缩小到秒级。第三次革命就是单片机数码计时技术的应用,使计时产品的走时日差从分级缩小到1/600万秒,从原有传统指针计时的方式发展为人们日常更为熟悉的夜光数字显示方式,直观明了,并增加了全自动日期、星期的显示功能,它更符合消费者的生活需求!因此,电子时钟的出现带来了钟表计时业界跨跃性的进步……

我国生产的电子时钟有很多种,总体上来说以研究多功能电子时钟为主,使万年历除了原有的显示时间,日期等基本功能外,还具有闹铃,报警等功能。商家生产的电子万年历更从质量,价格,实用上考虑,不断的改进电子时钟的设计,使其更加的具有市场。

本设计为软件,硬件相结合的一组设计。在软件设计过程中,应对硬件部分有相关了解,这样有助于对设计题目的更深了解,有助于软件设计。基本的要了解一些主要器件的基本功能和作用。

除了采用集成化的时钟芯片外,还有采用MCU的方案,利用STC89系列单片微机制成电子电路,采用软件和硬件结合的方法,控制LED数码管输出,分别用来显示年、月、日、时、分、秒,其最大特点是:硬件电路简单,安装方便易于实现,软件设计独特,可靠。STC89C52RC是由ATMEL公司推出的一种小型单片机。95年出现在中国市场。其主要特点为采用Flash存贮器技术,降低了制造成本,其软件、硬件与MCS-51完全兼容,可以很快被中国广大用户接受。

本文介绍了基于STC89C52RC单片机设计的电子时钟。

首先我们在绪论中简单介绍了单片机的发展与其在中低端领域中的优势以及课题的开发意义;接着介绍了STC89C52RC单片机的硬件结构和本毕业设计所要外扩的LED显示及其驱动方法,并在此基础上实现了时钟基本电路的设计;然后使用单片机C语言进行时钟程序的设计,程序采用模块化结构,使得逻辑关系简单明了,维护方便。

图2.5 DS1302

DS1302在任何数据传送时必须先初始化,把RST脚置为高电平,然后把8位地址和命令字装入移位寄存器,数据在SCLK的上升沿被访问到。在开始8个时钟周期,把命令字节装入移位寄存器后,另外的时钟周期在读操作时输出数据,在写操作时写入数据。时钟脉冲的个数在单字节方式下为8+8,在多字节方式下为8+字节数,最大可达248字节数。如果在传送过程中置RST脚为低电平,则会终止本次数据传送,并且I/O引脚变为高阻态。上电运行时,在Vcc≥2.5V之前,RST脚必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。

DS1302的控制字如图所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。位6如果为0,则表示存取日历时钟数据;为1则表示存取RAM数据。位5~1(A4~A0)指示操作单元的地址。最低有效位(位0)如果为0,则表示药进行写操作;为1表示进行读操作。控制字节总是从最低位开始输入/输出。

为了提高对32个地址寻址能力(地址/命令位1~5=逻辑1),可以把时钟/日历或RAM寄存器规定为多字节(burst)方式。位6规定时钟或RAM,而位0规定读或写。在时钟/日历寄存器中的地址9~31或RAM寄存器中的地址31不能存储数据。在多字节方式下,读或写从地址0的位0开始。必须按数据传送的次序写最先的8个寄存器。但是,当以多字节方式写RAM时,为了传送数据不必写所有的31字节,不管是否谢了全部31字节,所写的每一字节都将传送至RAM。

DS1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。其日历、时间寄存器及其控制字如下表所示,其中奇数为读操作,偶数为写操作。

表2.3 DS1302控制字

时钟暂停:秒寄存器的位7定义位时钟暂停位。当它为1时,DS1302停止振荡,进入低功耗的备份方式,通常在对DS1302进行写操作时(如进入时钟调整程序),停止振荡。当它为0时,时钟将开始启动。

AM-PM/12-24小时方式:小时寄存器的位7定义为12或24小时方式选择位。它为高电平时,选择12小时方式。在此方式下,位5为第二个10小时位(20~23h)。

DS1302的晶振选用32768Hz,电容推荐值为6pF。因为振荡频率较低,也可以不接电容,对计时精度影响不大。

第3章 系统的软件设计(3.1 程序设计)

电子时钟的程序主要包括3个方面的内容:一是DS1302从单片机中读取数据进行计数,二是利用按键进行时间的调整,三是单片机中读取DS1302中的数据驱动LED数码管显示时间。STC89C52RC单片机主要I/O口的分配:P10、P11、P12分别接时钟芯片的SCLK、I/O、RST引脚,P13、P14、P15、P16接四个独立按键。

开始

K加1程序K等于0显示时间K等于1显示日期K等于2显示报警时间报警程序按键程序返回主程序流程图

时间调整程序流程图

第4章 结束语

2010年3月,我开始了我的毕业论文工作,时至今日,论文基本完成。从最初的茫然,到慢慢的进入状态,再到对思路逐渐的清晰,整个写作过程难以用语言来表达。历经了一个多月的奋战,紧张而又充实的毕业设计终于落下了帷幕。回想这段日子的经历和感受,我感慨万千,在这次毕业设计的过程中,我拥有了无数难忘的回忆和收获。当我终于完成了所有打字、绘图、排版、校对的任务后整个人都很累,但同时看着电脑荧屏上的毕业设计稿件我的心里是甜的,我觉得这一切都值了。这次毕业论文的制作过程是我的一次再学习,再提高的过程。在论文中我充分地运用了大学期间所学到的知识。

我不会忘记这难忘的几个月的时间。毕业论文的制作给了我难忘的回忆。在我徜徉书海查找资料的日子里,面对无数书本的罗列,最难忘的是每次找到资料时的激动和兴奋;亲手用protel 99设计电路图的时间里,记忆最深的是每一步小小思路实现时那幸福的心情;为了论文我曾赶稿到深夜,但看着亲手打出的一字一句,心里满满的只有喜悦毫无疲惫。这段旅程看似荆棘密布,实则蕴藏着无尽的宝藏。我从资料的收集中,掌握了很多单片机及其接口应用的知识,让我对我所学过的知识有所巩固和提高,并且让我对当今单片机的最新发展技术有所了解。在整个过程中,我学到了新知识,增长了见识。在今后的日子里,我仍然要不断地充实自己,争取在所学领域有所作为。

脚踏实地,认真严谨,实事求是的学习态度,不怕困难、坚持不懈、吃苦耐劳的精神是我在这次设计中最大的收益。我想这是一次意志的磨练,是对我实际能力的一次提升,也会对我未来的学习和工作有很大的帮助。在这次毕业设计中也使我们的同学关系更进一步了,同学之间互相帮助,有什么不懂的大家在一起商量,听听不同的看法对我们更好的理解知识,所以在这里非常感谢帮助我的同学。

在此更要感谢我的指导老师和专业老师,是你们的细心指导和关怀,使我能够顺利的完成毕业论文。在此我要向司老师致以最衷心的感谢和敬意。

{ }

baojingshi=23;

ds1302_write(0x88,((baojingshi/10)<<4)+((b

aojingshi)&0x0f)); }

else if(mod==7) {

baojingfen=(((baojingfen>>4)&0x01)*10+(baojingfen&0x0f))-1;

if(baojingfen==-1) { }

baojingfen=59;

ds1302_write(0x88,((baojingfen/10)<<4)+((b

aojingfen)&0x0f)); }

}

}

}

}

//Key.c//

//Bell.c//

#include

#define uint unsigned int sbit beep=P3^7;

extern void delay(uint);

void didi(uint cnt) { }

//Bell.c//

uint t;

for(t=cnt;t>0;t--) { }

beep=0; delay(100); beep=1; delay(200);

//Ds1302.h//

void ds1302_write(char comm,char dat1); char ds1302_read(char comm);

//Ds1302.h// //Key.h// void key(); //key.h// //Bell.h// void didi(uint cnt);

//Bell.h//

程序 //main.c//

#include

#define uint unsigned int #include\#include\#include\sbit k4=P1^3; char k=0;

char shi,fen,miao,nian,yue,ri; char

baojingshi=0x00,baojingfen=0x06,baojingmiao=0x00;

void sjdisplay(); void rqdisplay(); void baojingdisplay(); void delay(uint ms);

void display(char shu,char wei);

char table[]={0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e}; void main() {

ds1302_write(0x80,0x55); ds1302_write(0x82,0x45); ds1302_write(0x84,0x00); ds1302_write(0x8c,0x11); ds1302_write(0x88,0x10); ds1302_write(0x86,0x07); while(1) {

if(k4==0)

{

delay(5); if(k4==0) {

while(k4==0); k++; if(k==3) { k=0; } } } if(k==0) sjdisplay(); if(k==1) rqdisplay(); if(k==2)

baojingdisplay();

if((shi==baojingshi)&&(fen==baojingfen)&(miao==baojingmiao)) {

didi(10); } key(); } }

void sjdisplay() {

shi=ds1302_read(0x85);//hour fen=ds1302_read(0x83);//minites miao=ds1302_read(0x81);//second display((shi>>4)&0x07,0); display(shi&0x0f,1);

display((fen>>4)&0x07,3); display(fen&0x0f,4);

display((miao>>4)&0x07,6); display(miao&0x0f,7); }

void rqdisplay() {

nian=ds1302_read(0x8d);//nian yue=ds1302_read(0x89);//yue ri=ds1302_read(0x87);//ri display((nian>>4)&0x07,0); display(nian&0x0f,1); display((yue>>4)&0x07,3); display(yue&0x0f,4);

display((ri>>4)&0x07,6);//0000 0111

display(ri&0x0f,7); }

void baojingdisplay() {

display((baojingshi>>4)&0x07,0); display(baojingshi&0x0f,1);

display((baojingfen>>4)&0x07,3); display(baojingfen&0x0f,4);

display((baojingmiao>>4)&0x07,6); display(baojingmiao&0x0f,7); }

void delay(uint ms) {

uint i,j;

for(i=ms;i>0;i--) for(j=124;j>0;j--); }

void display(char shu,char wei) {

P0=table[shu]; P2=~(1<

//main.c//

// Ds1302.c// #include

#define uchar unsigned char #define uint unsigned int sbit rst=P1^2; sbit dat=P1^1; sbit clk=P1^0;

void ds1302_write(char comm,char dat1) {

char temp,t; rst=0; clk=0; rst=1; temp=comm; for(t=0;t<8;t++) {

if(temp&0x01)

dat=1; else dat=0; clk=1;

temp=(temp>>1); clk=0; }

temp=dat1; for(t=0;t<8;t++) {

if((temp&0x01)==1)//0000 0001 dat=1; else dat=0; clk=1; temp=temp>>1; clk=0; }

rst=0; }

uchar ds1302_read(char comm) {

char temp,t; rst=0; clk=0; rst=1; temp=comm; for(t=0;t<8;t++) {

if(temp&0x01) dat=1; else dat=0;

clk=1;temp=temp>>1; clk=0;}

temp=0;//00000000 for(t=0;t<8;t++) {

temp=temp>>1; if(dat==1) temp=temp|0x80; else temp=temp&0x7f; clk=1; clk=0; } rst=0;

return temp; }

//Ds1302.c//

//Key.c//

#include #define char signed char #define uint unsigned int sbit mode=P1^4; sbit add=P1^5; sbit sub=P1^6; char mod=0;

extern void delay(uint ms); extern char shi,fen,nian,yue,ri; extern char baojingshi,baojingfen; extern char ds1302_read(char); extern void ds1302_write(char,char);

void key() {

shi=ds1302_read(0x85);

fen=ds1302_read(0x83); if(mode==0) { }

if(add==0) {

delay(5); if(add==0) delay(5); if(mode==0) { }

while(mode==0); mod++; if(mod==8) { }

mod=0;

{

while(add==0); if(mod==1) {

shi=(((shi>>4)&0x03)*10+(shi&0x0f))+1;

if(shi==24) { }

shi=0;

ds1302_write(0x84,((shi/10)<<4)+((shi)&

0x0f));//hour

}

else if(mod==2) {

fen=(((fen>>4)&0x07)*10+(fen&0x0f))+1;

if(fen==60) { }

fen=0;

ds1302_write(0x82,((fen/10)<<4)+((fen)&

0x0f));

}

else if(mod==3) {

nian=(((nian>>4)&0x0f)*10+(nian&0x0f))+1;

if(nian==99) { }

nian=1;

{

shi=(((shi>>4)&0x03)*10+(shi&0x0f))-1;

if(shi==-1) { }

shi=23;

ds1302_write(0x84,((shi/10)<<4)+((shi)&0x0f));

}

else if(mod==2) {

fen=(((fen>>4)&0x07)*10+(fen&0x0f))-1;

if(fen==-1) {

fen=59;

}

ds1302_write(0x82,((fen/10)<<4)+((fen)&

0x0f));

else if(mod==3) {

nian=(((nian>>4)&0x0f)*10+(nian&0x0f))-1; if(nian==0)

{ }

nian=99;

}

ds1302_write(0x8c,((nian/10)<<4)+((nian

)&0x0f)); }

else if(mod==4) {

yue=(((yue>>4)&0x01)*10+(yue&0x0f))-1; if(yue==0)

{ }

yue=12;

ds1302_write(0x88,((yue/10)<<4)+((yue)&

0x0f));//yue }

else if(mod==5)

{

if((yue==1)||(yue==3)||(yue==5)||(yue==7)||(yue==8)||(yue==10)||(yue==12)) {

ri=(((ri>>4)&0x03)*10+(ri&0x0f))-1;

if(ri==0)

{ ri=31;}

}

if((yue==4)||(yue==6)||(yue==9)||(yue==11)) {

ri=(((ri>>4)&0x03)*10+(ri&0x0f))-1; if(ri==0) { ri=30; }

} if(yue==2) { ri=(((ri>>4)&0x03)*10+(ri&0x0f))-1; if(ri==0) { ri=28; } }

ds1302_write(0x86,((ri/10)<<4)+((ri)&0x0f));

}

else if(mod==6) {

baojingshi=(((baojingshi>>4)&0x01)*10+(baojingshi&0x0f))-1;

if(baojingshi==-1)

本文来源:https://www.bwwdw.com/article/mfth.html

Top