基于51单片机和时钟芯片DS1302的数字时钟方案设计书2文档格式.docx

上传人:b****6 文档编号:20939330 上传时间:2023-01-26 格式:DOCX 页数:34 大小:233.57KB
下载 相关 举报
基于51单片机和时钟芯片DS1302的数字时钟方案设计书2文档格式.docx_第1页
第1页 / 共34页
基于51单片机和时钟芯片DS1302的数字时钟方案设计书2文档格式.docx_第2页
第2页 / 共34页
基于51单片机和时钟芯片DS1302的数字时钟方案设计书2文档格式.docx_第3页
第3页 / 共34页
基于51单片机和时钟芯片DS1302的数字时钟方案设计书2文档格式.docx_第4页
第4页 / 共34页
基于51单片机和时钟芯片DS1302的数字时钟方案设计书2文档格式.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

基于51单片机和时钟芯片DS1302的数字时钟方案设计书2文档格式.docx

《基于51单片机和时钟芯片DS1302的数字时钟方案设计书2文档格式.docx》由会员分享,可在线阅读,更多相关《基于51单片机和时钟芯片DS1302的数字时钟方案设计书2文档格式.docx(34页珍藏版)》请在冰豆网上搜索。

基于51单片机和时钟芯片DS1302的数字时钟方案设计书2文档格式.docx

因此,电子万年历的出现带来了钟表计时业界跨跃性的进步……  

我国生产的电子万年历有很多种,总体上来说以研究多功能电子万年历为主,使万年历除了原有的显示时间,日期等基本功能外,还具有闹铃,报警等功能。

商家生产的电子万年历更从质量,价格,实用上考虑,不断的改进电子万年历的设计,使其更加的具有市场。

除了采用集成化的时钟芯片外,还有采用MCU的方案,利用STC89系列单片微机制成万年历电路,采用软件和硬件结合的方法,控制LED数码管输出,分别用来显示年、月、日、时、分、秒,其最大特点是:

硬件电路简单,安装方便易于实现,软件设计独特,可靠。

在21世纪的今天,单片机仍然有着它不可替代的地位和独特的作用在学完单片机后,为了进一步学习51单片机的控制和编程,我们利用51单片机自己设计并制作数字钟。

1.3参考资料

【1】8051系列单片机C程序设计完全手册求是科技编著

人民邮电出版社2006

【2】51单片机应用从零开始杨欣编著清华大学出版社2008

【3】单片机原理及接口技术(第三版)李朝青编著北京航空航天大学出版社2008

【4】51单片机C语言教程郭天祥编著电子工业出版社2009

二、总体设计

此数字钟利用单片机STC89C52和时钟芯片DS1302设计完成。

2.1设计与运行环境

数字钟的程序设计和调试均在KeiluVision2环境下完成的。

设计并完成的程序下载至STC89C52单片机后,即可初始化时钟芯片DS1302从而开始计时,系统开始正常运行。

2.2硬件功能描述

数字钟能够完成24小时制计时,计时初始化值为00:

00:

00,用户可以通过按键调整时钟的初值实现校时功能,并且可以通过按键设定一个24小时以内任意时刻的闹铃,用户可以手动选择闹铃的开或者关两种状态。

三、数字钟软件和硬件设计

3.1硬件电路设计

数字钟的电路主要有电源模块、显示模块、按键模块、复位电路模块、时钟芯片模块、主控芯片STC89C52模块和闹铃模块等7大模块组成。

3.1.1电源

电源模块采用7805进行稳压,保证+5V电压的稳定输出,进一步提高系统的抗干扰能力和稳定性。

3.1.2独立按键模块

系统有三个独立按键,独立按键S1、S2、S3分别接至单片机P3.2、P3.3、P3.4口。

S1用来功能选择,其功能可以用按键次数N来表示:

N=1:

校准计时的小时位N=2:

校准计时的分钟位

N=3:

校准闹铃的小时位N=1:

校准闹铃的分钟位

N=5:

退出

S2主要功能用来进行加一操作。

在有功能选择的情况下,无论选中那一种功能操作,按下S2即进行一次加一操作,在没有功能选择的情况下,系统不响应此按键的任何操作。

S3用来控制闹铃的开或者关,在任意时间只要按下此键即可打开(或关闭)闹铃,在按键一次就可以关闭(或打开)闹铃。

3.1.3显示模块

一个良好的显示模块对一个系统非常重要,所有操作结果和计时结果,都要通过显示模块来显示出来。

同时显示模块提供了良好的人机交互平台。

常用的显示模式有LED7段数码管显示、点阵显示和液晶显示。

液晶显示屏(LCD)具有轻薄短小、低耗电量、无辐射危险,平面直角显示以及影象稳定不闪烁等优势,可视面积大,画面效果好,分辨率高,抗干扰能力强等特点。

但由于液晶其成本也偏高。

在使用时,不能有静电干扰,否则易烧坏液晶的显示芯片。

鉴于LED7段数码管成本低,也比较容易实现的特点,最终确定使用共阴极数码管来显示。

本系统显示模块电路由一块74HC573、一块74HC138芯片和两个四位一体7段数码管组成。

74HC573用来驱动数码管,74HC573的Q0~Q7分别接四位一体数码管的A~dp。

74HC138控制位选。

3.1.4复位电路模块

复位电路主要的功能是是整个系统初始化,在每次上电时系统自动初始化,如果在程序运行的过程中程序没有响应或者需要进行一次初始化,这是可以通过按复位开关来实现需要的有效操作。

3.1.5时钟芯片模块

DS1302时钟芯片是本系统实现高精度计时的关键。

利用DS1302时钟芯片独立于单片机来计时,在提高计时进度的同时也提高了整个系统的抗干扰能力。

DS1302通过SCLK、I/O、RES端口和单片机STC90C52进行通信。

SCLK接至单片机P1.7口,在读写操作时给DS1302提供相应的时钟脉冲;

I/O接至P3.5用来传送所有的数据;

RES接至单片机P1.6上用来控制单片机与时钟芯片间的数据传送的开始于结束。

DS1302的工作原理及使用方法见附录Ⅰ。

3.1.6主控模块

主控模块的核心组成部分是单片机STC89C52,承担着所有操作任务的调控与分派工作。

3.1.7闹铃模块

闹铃模块由蜂鸣器和蜂鸣器的驱动组成。

在有闹铃发生的时候,蜂鸣器的驱动电路驱动蜂鸣器发声,产生闹铃的效果。

3.2软件设计

3.2.1程序设计流程图

1、主程序流图

2、读DS1302中断及闹铃检测流程图

3、功能选择中断操作的程序流程图

4、加一中断操作的程序流程图

3.2.2源程序

/*本程序主要实现的功能:

利用时钟芯片DS1302和STC89C52进行高精度计时,能够实现时、分、秒的显示,具有校时,调整闹铃的功能。

设计者:

****2011/1/24*/

ORG0000H

SJMPMAIN;

主程序入口地址

ORG0003H

AJMPANJIAN_FUNCTION;

功能选择操作入口

ORG000BH

AJMPDELAY_10MS;

防抖延时以及闹铃

ORG0013H

AJMPCOUNT_UP;

按键加1操作入口

ORG001BH

AJMPDU_1302;

每300ms读ds1302中断入口

MAIN:

T_CLKBITP1.7;

实时时钟

T_IOBITP3.5;

数据线

T_RSTBITP1.6;

复位线

MOVTMOD,#11H

MOVTH1,#15H;

设置扫描ds1302的计数初值

MOVTL1,#0A0H

MOVTH0,#0C5H;

设置按键防抖延时

MOVTL0,#68H

SEC0DATA40H;

定义秒显示的个位

SEC1DATA41H;

定义秒显示的十位

LINE0DATA42H;

定义秒-时分隔符

MIN0DATA43H;

定义分显示个位

MIN1DATA44H;

定义分显示十位

LINE1DATA45H;

定义时-分分隔符

HOUR0DATA46H;

定义时显示个位

HOUR1DATA47H;

定义时显示十位

;

--------预读计数位寄存器-----------

SECONDDATA52H;

秒寄存器,用于暂存当前由DS1302读的的秒的数据

MINUTEDATA53H;

分-用于暂存当前由DS1302读的的分的数据

HOURDATA54H;

时-用于暂存当前由DS1302读的的时的数据

SMJSDATA55H;

设置ds1302扫描定时控制位(扫描计数)

FUNCDATA56H;

定义按键功能选择控制位

ZANCUN0DATA57H;

定义按键操作时存储校准值的个位

ZANCUN1DATA58H;

定义按键操作时存储校准值的十位

ZANCUN_SECONDDATA59H;

用于校时和对闹铃时对秒的显示值清零

NLHOUR_0DATA60H;

闹铃小时值存储单元

NLMINUTE_0DATA61H;

闹铃分值存储单元

NLHOUR_1DATA62H

NLMINUTE_1DATA63H

TEMPDATA64H;

闹铃发生标志位

NLJSDATA65H;

闹铃计时标志

MOVTEMP,#00H;

闹铃发生标志位初始化为0,表示没有闹铃的发生

MOVNLJS,#00H;

闹铃铃声长短控制单元

MOVNLHOUR_0,#08H;

闹铃符初值

MOVNLMINUTE_0,#30H

MOVLINE0,#40H;

显示分和秒的间隔符

MOVLINE1,#40H;

显示小时和分的间隔符

MOVSMJS,#00H

MOVSECOND,#00H;

时钟计时初始化值

MOVMINUTE,#25H

MOVHOUR,#08H

MOVZANCUN_SECOND,#00H

MOVR1,#40H;

--------------------------------R1

MOVR3,#07H;

确定当前选通的显示位------R3

SETBEX0

SETBIT0;

外部中断葿边沿触发

SETBIT1

SETBET0

SETBET1

SETBPT0;

设置定时器T0中断位高优先级

SETBPX1;

外部中断1中断为高优先级,用来在有功能操作

时来中断功能选择的中断

SETBEA;

开总中断

SETBTR1;

T1主要进行显示扫描中断

LCALLSET1302;

DS1302初始化

;

--------------------数码管显示程序------------------

XIANSHI:

-----检测闹铃是否发生-------------------------

MOVZANCUN0,R6

PUSHZANCUN0;

R6压栈

MOVR6,TEMP

CJNER6,#01H,XIANSHI_1;

检测闹零定时是否到时

SETBTR0;

XIANSHI_1:

MOVA,@R1;

读计数位的计数值----R1

CJNER3,#05H,NEXTWEI;

判断当前为是否需要显示分隔符"

-"

MOVP2,R3

MOVP0,LINE0

NEXTWEI:

CJNER3,#02H,SEL_0

MOVP0,LINE1

SEL_0:

MOVP2,R3;

送位选信号

/*--对计数位的计数值译码输出--开始-*/

CJNEA,#00H,SEL_1

MOVP0,#3FH;

0,如果当前计数位的计数值位0,则将0的共阴极七段数码管编码3FH送出显示

SJMPSEL_10

SEL_1:

CJNEA,#01H,SEL_2

MOVP0,#06H;

1

SEL_2:

CJNEA,#02H,SEL_3

MOVP0,#5BH;

2

SEL_3:

CJNEA,#03H,SEL_4

MOVP0,#4FH;

3

SEL_4:

CJNEA,#04H,SEL_5

MOVP0,#66H;

4

SEL_5:

CJNEA,#05H,SEL_6

MOVP0,#6DH;

5

SEL_6:

CJNEA,#06H,SEL_7

MOVP0,#7DH;

6

SEL_7:

CJNEA,#07H,SEL_8

MOVP0,#07H;

7

SEL_8:

CJNEA,#08H,SEL_9

MOVP0,#7FH;

8

SEL_9:

CJNEA,#09H,SEL_10

MOVP0,#6FH;

9

/*--对计数位的计数值译码输出--结束-*/

SEL_10:

INCR1;

R1加一,使当前计数位后移一位

DECR3;

位扫描控制位减一,因为初始位扫描是从111开始的

ACALLDELAY

CJNER3,#0FFH,SEL_11

MOVR3,#07H

SEL_11:

CJNER1,#48H,SEL_12

MOVR1,#40H

SEL_12:

POPZANCUN0

MOVR6,ZANCUN0

AJMPXIANSHI

---------------------扫描延时程序--------

DELAY:

MOVR5,#4;

----------------R5

D1:

MOV48H,#120

DJNZ48H,$

DJNZR5,D1

RET

--功能:

对当前由ds1302读得的计数值进行转换---(寄存器均已压栈)---

JSZH:

功能:

计数转换子程序,用于对当前读得的ds1302的计数值转换成sec0-houro的格式,便于显示

PUSHACC

MOVA,R0

PUSHACC;

R0压栈

MOVA,R1

R1压栈

PUSHPSW

计数数据sec0---hour0的存储首地址

MOVR0,#52H;

由ds1302读得的数据存放首地址

LOOP_1:

MOVA,@R0

ANLA,#0FH

MOV@R1,A

INCR1

MOVA,@R0

ANLA,#0F0H

SWAPA

INCR1

地址加一跳过分隔符"

_"

的存储单元

INCR0

CJNER1,#49H,LOOP_1

POPPSW

POPACC;

R1弹栈

MOVR1,A

R0弹栈

MOVR0,A

A弹栈

RET

-------读取DS1302计数程序(T1中断)-------(寄存器均已压栈)

DU_1302:

PUSHACC

R1压栈

DU_1302_1:

INCSMJS

MOVR1,SMJS

CJNER1,#03H,BELL;

每300ms读一次ds1302的计数值,避免在ds1302定时一秒

计数值改变时发生错读

LCALLGET1302

LCALLJSZH;

调计数转换子程序

设置扫描ds1302的计数60MS初值

MOVTL1,#0A0H

BELL:

-------------闹铃----------------

MOVA,NLHOUR_0

CJNEA,HOUR,DU_1302_RET

MOVA,NLMINUTE_0

CJNEA,MINUTE,DU_1302_RET

MOVTEMP,#01H;

定义TEMP为闹铃发生的标志

MOVNLMINUTE_0,#00H

MOVNLHOUR_0,#00H

DU_1302_RET:

POPACC

MOVR1,A;

RETI

************DS1302初始化子程序************************************

SET1302:

设置ds1302初始时间,并启动计时

A断点保护

CLRT_RST

CLRT_CLK

SETBT_RST

MOVB,#8EH;

控制寄存器

LCALLWRITEBYTE

MOVB,#00H;

写操作前WP=0

SETBT_CLK

movR0,#SECOND

MOVR7,#3;

秒/时/分;

-----R7

MOVR1,#80H;

秒写地址;

-----R1

S1302:

MOVB,R1;

写秒/时/分地址;

---R1

MOVA,@R0;

写秒数据;

-----R0

MOVB,A

DJNZR7,S1302

MOVB,#80H;

控制,wp=1,写保护

A恢复数据

-------------------------------------

GET1302:

从ds1302读时间秒/时/分

MOVR0,#SECOND;

------R0

MOVR7,#03H;

MOVR2,#81H;

-----R2

G13021:

CLRT_RST

MOVB,R2

LCALLWRITEBYTE;

写操作时,将一字节的内容由B写至DS1302中

LCALLREADBYTE;

读操作时,将一字节的内容读至A中

MOV@R0,A

INCR2

DJNZR7,G13021

--------------------------------------------

WRITEBYTE:

写B寄存器中的内容至1302一字节

MOVR4,#08H;

------R4

INBIT1:

MOVA,B

RRCA

SETBT_IO;

T_IO口做输入口

MOVT_IO,C

DJNZR4,INBIT1

-------------------------------------------

READBYTE:

读1302一字节至A寄存器

MOVR4,#8;

----R4

OUTBIT1:

MOVC,T_IO

DJNZR4,OUTBIT1

--------------------ENDDS0302--------------------------------

********************按键操作*********************

ANJIAN_FUNCTION:

功能选择键中断接至P3.2

WAIT:

JBP3.2,WAIT

启动定时器0,延时10ms

JNBTF0,$

JNBP3.2,$;

检测按键是否弹起

SETBEX1;

在有功能选择的时候开中断1

INCFUNC

保存A中的数值

MOVA,FUNC

CJNEA,#03H,FUN_1

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 冶金矿山地质

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1