《利用单片机及DS1302制作电子时钟.doc》由会员分享,可在线阅读,更多相关《利用单片机及DS1302制作电子时钟.doc(20页珍藏版)》请在三一文库上搜索。
1、单片机原理及应用基于Proteus和Keil C实 习 报 告课程名:利用单片机及DS1302制作电子时钟指导教师: 专业: 年级: 组员: 设计时间: XXX大学 XXX学院摘 要为了进一步熟悉51单片机的编程以及学习电子时钟的相关设计方法,在老师的指导下我们进行了本次电子时钟的设计。我们在实习期间基于51单片机AT89C51和时钟芯片DS1302设计并实现了电子时钟显示。在PCB板制作完成并且调试成功之际,为了进一步提高自己的动手能力和编程能力,对这次电子时钟的设计和制作的过程中遇到的问题及设计思路做一次总结。本电子时钟是一种利用时钟芯片DS1302及51单片机来显示时、分、秒和年、月的装
2、置。默认显示为时间,由四个按键分别控制定时设置、时间调整、分钟调整、日期显示;设计电路工作电源为5V;由4位LED数码管显示时间,格式为时时分分,中间点每隔1S亮暗;有备用电池,掉电后再上电能正常显示时间。电子时钟大体可以分为三大模块,数码管的显示模块、DS1302时钟芯片与单片机的时钟模块和按键与单片机的模块。单片机在5V电压下,各个模块正常工作。单片机从DS1302芯片中读出一组时间日期数据,同时单片机通过按键设置当前要求显示的信息给单片机。单片机接收到各个数据时,把各个数据显示出来。目录一、总体设计41.1 设计目的41.2 硬件功能描述41.3 设计方案选择41.4 设计任务及要求4二
3、、电子时钟软件和硬件设计52.1 硬件电路设计52.1.1 工作原理52.1.2 单元模块电路52.1.3 元器件清单62.2 软件设计72.2.1 程序设计流程7三、电路调试7四、心得体会8五、参考文献10附录:12附录:程序清单13附录:21一、总体设计此电子时钟利用AT89C51单片机和时钟芯片DS1302 设计完成。1.1 设计目的1、通过对电子时钟的设计,进一步熟练掌握单片机编程方法及思想。2、通过对电子时钟的设计,掌握实时时钟芯片DS1302的使用方法。3、通过对电子时钟的设计,进一步掌握独立式键盘的编程控制并认识独立式键盘在实际中的运用。4、通过对电子时钟的设计,增强对单片机的兴
4、趣及动手能力。并在此过程中学会对程序的逐步调试。 1.2 硬件功能描述数字钟能够完成24 小时制计时,计时初始化值为00:00:00,用户可以通过按键调整时钟的初值实现校时功能,并且可以通过按键设定一个24 小时以内任意时刻的闹铃,用户可以手动选择闹铃的开或者关两种状态。1.3 设计方案选择计时方案:方案1:采用实时时钟芯片现在市场上有许多实时时钟集成电路,如:DS1287、DS2887、ds1302等。这些实时时钟芯片具备年、月、日、时、分、秒计时功能和多点定时功能,计时数据的更新每秒自动进行一次,不需要程序干预。因此,在工业实时测控系统中多采用这这一类专用芯片来实现实时时钟功能。方案2:是
5、用单片机内的可编程定时器。利用单片机内部的定时计数器进行中断定时,配合软件延时实现时分秒的计时。该方案节省硬件成本,但程序设计较复杂。显示方案:一个良好的显示模块对一个系统非常重要,所有操作结果和计时结果,都要通过显示模块来显示出来。同时显示模块提供了良好的人机交互平台。常用的显示模式有LED 7段数码管显示、点阵显示和液晶显示。液晶显示屏(LCD)具有轻薄短小、低耗电量、无辐射危险,平面直角显示以及影象稳定不闪烁等优势,可视面积大,画面效果好,分辨率高,抗干扰能力强等特点。但由于液晶其成本偏高。在使用时,不能有静电干扰,否则易烧坏液晶的显示芯片。鉴于LED 7段数码管成本低,也比较容易实现的
6、特点,最终确定使用共阳极数码管来显示。1.4 设计任务及要求任务:设计一个可调时及日期显示的电子时钟要求:1、用DS1302来实现对时间的计算2、用7段LED来显示时间3、加独立式键盘来进行调时二、电子时钟软件和硬件设计2.1 硬件电路设计2.1.1 工作原理此电子时钟可显示的时间范围为:2000年1月1日0点至2100年12月31日23时59分。此时钟在正常计时模式下具有自动调整每月的天数的变化,并用内接电池对时间保持。时间为24小时至。接通电源对时间进行调整,按定时设置键确定被修改位的值。用时钟芯片记忆当前时间并保持,待下次接通电源无须调整能正确显示当前时间。定时设置:菜单按键,松开按键时
7、有效此按键实现闹铃功能,设定一个时间,此时四位数码管第四位的小数点亮起,表示有闹铃设置;当闹铃是可按此键结束闹铃。时、分调整: 加一键,松开按键有效当定时设置键选中要修改的位时,如分(分闪烁时),按此键可以使分的值从当前值开始加一,加至60时变为00(59过后即显示00,不显示60);而时则在加至24时变为00(23过后即显示0,不显示24);日在加至32时变为00(即31过后即显示0,不显示32);月在加至13时变为00(即12过后即显示0,不显示13);年在至2100时变为2000(即2099过后即显示2000,不显示2100)日期显示: 年、月显示键,松开按键有效按下此键松开后,显示为日
8、期,5秒后自动返回时间显示。2.1.2 单元模块电路1 独立按键模块系统有四个独立按键,分别接至单片机P1.4、P1.5、P1.6、P1.7口。2 显示模块 本系统显示模块电路由四个PNP三极管和一个四位一体7段LED数码管组成。PNP三极管用来驱动数码管。3 复位电路模块 复位电路主要的功能是使整个系统初始化,在每次上电时系统自动初始化。 使CPU及其他功能部件处于一个确定的初始状态,并从这个状态开始工作,单片机应用程序必须以此作为设计的前提。4 时钟芯片模块DS1302时钟芯片是本系统实现高精度计时的关键。利用DS1302 时钟芯片独立于单片机来计时,在提高计时进度的同时也提高了整个系统的
9、抗干扰能力。DS1302通过SCLK、I/O、RES端口和单片机AT89C51 进行通信。SCLK接至单片机P1.1口,在读写操作时给DS1302提供相应的时钟脉冲;I/O接至P1.2用来传送所有的数据;RES接至单片机P1.3上用来控制单片机与时钟芯片间的数据传送的开始与结束。DS1302 的工作原理及使用方法见附录。5 主控模块主控模块的核心组成部分是单片机AT89C51, 承担着所有操作任务的调控与分派工作。6 闹钟模块闹铃模块由蜂鸣器和蜂鸣器的驱动组成。在有闹铃发生的时候,蜂鸣器的驱动电路驱动蜂鸣器发声,产生闹铃的效果。2.1.3 元器件清单元件名称规格型号数量(个)单片机AT89S5
10、11时钟芯片DS130214位一体的共阳LED显示器7SEG-MPX4-CA-BLUE1按键BUTTON3电阻2K4排阻4.7K1三极管PNP4电阻10K102.2 软件设计2.2.1 程序设计流程 开始 主程序 定时器T1初始化Ds1302读取数值与设定数值是否相同Y掉电后重启 N初始化ds1302Flag=1&flag_time=1?显示闹钟值Set_flag=1 NY显示调节时的值显示走时 YN N响闹钟判断闹钟是否发生 Y 返回 N 三、电路调试各程序模块具有一定的独立性,因此可以先调试模块,在模块功能都能实现的前提下,再调试总程序,这样能快捷地检查判断硬件或软件上的问题。调试结果及解
11、决办法如下:1测试DS读写模块时,从LED显示能正确写入与读取当前时间,但DS1302的工作情况不太理想,主要表现在实时时间稍微偏快。DS1302时钟的产生基于外接的晶体振荡器,振荡器的频率为32768HZ,该晶振通过引脚X1、X2直接连接至DS1302,即DS1302是依靠外部晶振与其内部的电容配合来产生时钟脉冲,由于DS1302 在芯片本身已经集成了5pF的电容。所以,为了获得稳定的可靠的时钟,必须选用具有5pF 负载电容的晶振。然而,许多人在选用晶振时仅仅注意了晶振的额定频率值,而忽视了晶振的负载电容大小,甚至连许多经销商也不能提供所售晶振的负载电容,所以即使在使用中选用了符合32768
12、Hz的晶振,但如果该晶振的负载电容与DS1302 提供的5pF不一致时,就会影响晶振的起振或导致振荡频率的偏移。2测试显示模块时,数码显示管全亮显示“8.8.8.8.”而不是预设”的初值。利用Proteus软件仿真,发现仿真显示正常,再检查硬件,发现段码位选线与P0口接线错误。按原理图重新焊接后能正常显示。3测试蜂鸣模块时,没有时间显示一直保持蜂鸣,不能返回主程序。重新检查程序再次赋值给DS1302和闹钟时实物正常工作,证明现有程序语法和逻辑上没有错误。从赋值过的数字中找规律,发现当DS初值的“分”个位为9而闹钟的“分”为0时,蜂鸣出现错误。查阅DS的显示有关资料,由于DS的数据是BCD码形式
13、读取,因此“X9”的数据加1后为“*0”;但程序所用为十六进制,“X9”加1后为“*A”,所以当DS刚到达闹钟时间准备蜂鸣时,程序中用INC指令对“分”加1后只达到“*A”,与DS一分钟后读取到的“*0”一直不相等,程序无法向下执行,也就是无法同步显示当前时间以及关闭蜂鸣。解决办法:进入蜂鸣状态时,先对比是否是个位为9的数据,是则按照BCD码形式直接赋值为“*0”到暂存区,再加1;否则直接用INC指令加1。不断读取DS“分”的数据与暂存区数据比较,相等则表示满一分钟,关闭蜂鸣。修改程序后该模块运行正常。4测试调整模块,进入中断时,按键后有时出现显示错乱,按键失灵,出现连续加减的情况。有了蜂鸣模
14、块的前例,增加了数据个位为9时的处理程序;分析出现连续加减可能是因为消抖延时不够,造成程序误判断为按键连击,因此增大延时时间。修改程序后该模块正常运作。5综合总程序测试,各部分功能运作正常,但是实际硬件与软件结合后没有达到达到任务要求,此次设计失败。四、心得体会 五、参考文献【1】51单片机应用从零开始 杨欣 编著 清华大学出版社 2008【2】单片机原理及接口技术(第三版) 李朝青 编著 北京航空航天大学出版社 2008【3】51单片机C语言教程 郭天祥 编著 电子工业出版社 2009附录:DS1302 时钟芯片的工作原理和使用方法1、DS1302的基本组成和工作原理DS1302的管脚排列及
15、描述如下图及表所示: 2、DS1302内部寄存器CH:时钟停止位 bit7=1,12 小时模式CH=0 振荡器工作允许 bit7=0,24 小时模式CH=1 振荡器停止 寄存器2 的第5 位:AM/PM 定义WP: 写保护位 AP=1 下午模式WP=0 寄存器数据能够写入 AP=0 上午模式 WP=1 寄存器数据不能写入 DS: 二极管选择位TCS: 涓流充电选择 DS=01 选择一个二极管TCS=1010 使能涓流充电 DS=10 选择两个二极管TCS=其它 禁止涓流充电寄存 DS=00或11,即使TCS=1010,充电器2的第7位12/24小时标志 功能也被禁3、DS1302使用说明及注意
16、的问题DS1302的控制字如表1所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。位6如果为0,则表示存取日历时钟数据;为1则表示存取RAM数据。位51(A4A0)指示操作单元的地址。最低有效位(位0)如果为0,则表示要进行写操作;为1 表示进行读操作。控制字节总是从最低位开始输入/输出。表1 DS1302 控制字时钟暂停:秒寄存器的位7定义位时钟暂停位。当它为1时,DS1302停止振荡,进入低功耗的备份方式,通常在对DS1302进行写操作时(如进入时钟调整程序),停止振荡。当它为0时,时钟将开始启动。AM-PM/12-24小时方式:小时寄存器的位7
17、定义为12或24小时方式选择位。它为高电平时,选择12小时方式。在此方式下,位5为第二个10小时位(2023h)。DS1302的晶振选用32768Hz,电容推荐值为6pF。因为振荡频率较低,也可以不接电容,对计时精度影响不大。附录:程序清单 Second EQU 41H Minute EQU 42H Hour EQU 43H Day EQU 44H Month EQU 45H Week EQU 46H YearL EQU 47H ORG 0000H LJMP MAIN ORG 0030H MAIN:MOV SP,#5FH MOV R0,30H MOV R2,#30H MOV A,#00H LP
18、0:MOV R0,A INC R0 DJNZ R2,LP0 LCALL DISPLAY MOV 41H,#00H ;启动时钟工作.秒分时日月星期年 MOV 42H,#00H ;分单元 MOV 43H,#01H ;时单元 MOV 44H,#18H ;日单元 MOV 45H,#07H ;月单元 MOV 46H,#04H ;星期单元 MOV 47H,#0DH ;年后两位单元 MOV 52H,#00H MOV 53H,#00H CLR 30H SETB 31H LCALL Set1302 LCALL DISPLAYLP1: LCALL Get1302 MOV 40H,41HLP11: LCALL DI
19、SPLAY LCALL GET1302 MOV A,41H CJNE A,40H,LP2 LJMP LP21LP2: CPL 30H MOV 40H,41H LJMP LP11LP21: JB 31H,LP22 ;31H=0,定时报警 LCALL DSBJ LCALL DISPLAYLP22: LCALL KEYSCAN MOV DPTR,#TAB MOV A,30H RL A ADD A,30H JMP A+DPTR TAB: LJMP LP11 ;无按键 LJMP TSSZ ;定时设置 LJMP SJY ;时加1 LJMP FJY ;分加1 LJMP RQXS ;日期显示 TSSZ: CP
20、L 31H TSSZ0: JB P1.4,TSSZ1 LCALL TSDISPLAY SJMP TSSZ0 TSSZ1: JNB 31H,TSSZ00 ;31H=1,定时关闭;31H=0,定时设置 LCALL DISPLAY LJMP LP11 TSSZ00:MOV 51,#20H TSSZ10:MOV 50H,#00H TSSZ11:JB P1.5,TSSZ3 ;定时时设置 MOV A,53H ADD A,#01H DA A CJNE A,#24H,TSSZ2 MOV A,#00H TSSZ2: MOV 53H,A TSS1: LCALL TSDISPLAY JNB P1.5,TSS1 TS
21、SZ3: LCALL TSDISPLAY ;定时显示 JB P1.4,TSSZ11 JNB P1.4,$ MOV 51H,#20H TSSZF0:MOV 50H,#00HTSSZF1:JB P1.6,TSSZF3 ;定时分设置 MOV A,52H ADD A,#01H DA A CJNE A,#60H,TSSZF2 MOV A,#00H TSSZF2: MOV 52H,A TSF1: LCALL TSDISPLAY JNB P1.6,TSF1 TSSZF3: LCALL TSDISPLAY JB P1.4,TSSZF1 JNB P1.4,$ LCALL TSDISPLAY LJMP LP11D
22、SBJ: MOV A,53H CJNE A,43H,DSBJ1 MOV A,52H CJNE A, 42H,DSBJ1 MOV 50H,#06H DSBJ0: CLR P1.3 LCALL DISPLAY SETB P1.3 LCALL D2MS DJNZ 50H,DSBJ0 SETB 31H DSBJ1: RET SJY: MOV A,43H ;时加1处理 ADD A,#01H DA A CJNE A,#24H,SJY0 MOV A,#00H SJY0: MOV 43H,A LCALL SET1302 SJY1: JB P1.5,SJY2 LCALL DISPLAY SJMP SJY1 SJ
23、Y2: LJMP LP11 FJY: MOV A,42H ;分加1处理 ADD A,#01H DA A CJNE A,#60H,FJY0 MOV A,#00H FJY0: MOV 42H,A LCALL SET1302 FJY1:JB P1.6,FJY2 LCALL DISPLAY SJMP FJY1 FJY2:LJMP LP11 RQXS:LCALL RQDISPLAY RQXS1:JB P1.7,RQXS2 LCALL RQDISPLAY SJMP RQXS1 RQXS2:MOV R3,#00H RQXS3:LCALL RQDISPLAY LCALL RQDISPLAY DJNZ R3,R
24、QXS3 LCALL DISPLAY LJMP LP11KEYSCAN:PUSH ACC MOV 30H,#00H ORL P1,#0F0H MOV A,P1 SWAP A ANL A,#0FH JB ACC.0,K1 MOV 30H,#01H SJMP KEYEND K1: JB ACC.1,K2 MOV 30H,#02H SJMP KEYEND K2: JB ACC.2,K3 MOV 30H,#03H SJMP KEYEND K3: JB ACC.3,KEYEND MOV 30H,#04HKEYEND: POP ACC RETKEYPLAY:MOV R5,#04H MOV R0,#42H
25、;51H为秒,52H分,53H为时,54H为日,55H为月 MOV R3,#08H DIS2:MOV DPTR,#TABLE MOV A,R0 ANL A,#0FH MOVC A,A+DPTR MOV P0,A MOV A,R3 MOV P2,A LCALL D2MS MOV A,R0 ANL A,#0F0H SWAP A MOVC A,A+DPTR MOV P0,A MOV A,R3 RR A MOV R3,A MOV P2,A INC R0 MOV A,R3 RR A MOV R3,A LCALL D2MS DJNZ R5,DIS2 CLR P2.0 RET DISPLAY:PUSH AC
26、C PUSH PSW MOV DPTR,#TABLE MOV R1,#42H MOV A,R1 ANL A,#0FH MOVC A,A+DPTR MOV C,31H ; 有定时设置则在分钟个位显示点 MOV ACC.7,C MOV P0,A MOV P2,#0FEH ;实物值 ;MOV P2,#08H ;仿真值 LCALL D2MS MOV P2,#00H MOV A,R1 SWAP A ANL A,#0FH MOVC A,A+DPTR MOV P0,A MOV P2,#0FDH ;MOV P2,#04H LCALL D2MS MOV P2,#00H MOV R1,#43H MOV A,R1
27、ANL A,#0FH MOVC A,A+DPTR MOV C,30H MOV ACC.7,C MOV P0,A MOV P2,#0FBH;MOV P2,#02H LCALL D2MS MOV P2,#00H MOV A,R1 SWAP A ANL A,#0FH MOVC A,A+DPTR MOV P0,A MOV P2,#0F7H;MOV P2,#01H MOV P2,#00H POP PSW POP ACC RETRQDISPLAY:PUSH ACC ;日期显示 PUSH PSW MOV DPTR,#TABLE MOV R1,#44H MOV A,R1 ANL A,#0FH MOVC A,A
28、+DPTR MOV P0,A MOV P2,#0FEH ;实物值 ;MOV P2,#08H ;仿真值 LCALL D2MS MOV P2,#00H MOV A,R1 SWAP A ANL A,#0FH MOVC A,A+DPTR MOV P0,A MOV P2,#0FDH;MOV P2,#04H LCALL D2MS MOV P2,#00H MOV R1,#45H MOV A,R1 ANL A,#0FH MOVC A,A+DPTR MOV P0,A MOV P2,#0FBH;MOV P2,#02H LCALL D2MS MOV P2,#00H MOV A,R1 SWAP A ANL A,#0F
29、H MOVC A,A+DPTR MOV P0,A MOV P2,#0F7H; MOV P2,#01H LCALL D2MS MOV P2,#00H POP PSW POP ACC RET TSDISPLAY:PUSH ACC ;定时显示 PUSH PSW MOV DPTR,#TABLE MOV R1,#52H MOV A,R1 ANL A,#0FH MOVC A,A+DPTR MOV P0,A MOV P2,#0FEH ;实物值 ;MOV P2,#08H ;仿真值 LCALL D2MS MOV P2,#00H MOV A,R1 SWAP A ANL A,#0FH MOVC A,A+DPTR M
30、OV P0,A MOV P2,#0FDH;MOV P2,#04H LCALL D2MS MOV P2,#00H MOV R1,#53H MOV A,R1 ANL A,#0FH MOVC A,A+DPTR MOV P0,A MOV P2,#0FBH; MOV P2,#02H LCALL D2MS MOV P2,#00H MOV A,R1 SWAP A ANL A,#0FH MOVC A,A+DPTR MOV P0,A MOV P2,#0F7H; MOV P2,#01H LCALL D2MS MOV P2,#00H POP PSW POP ACC RET D2MS: MOV R6,#02H DL1
31、: MOV R5,#249 DL2: NOP NOP DJNZ R5,DL2 NOP DJNZ R6,DL1 RET TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH;DS1302时间处理程序;*/公司名称:; 模块名称:DS1302.asm; 功 能:实时时钟模块 时钟芯片型号:DS1302; 说 明:; 程序设计:; 设计时间:2006.11.03; 版 本 号:20061103;*T_CLK Bit P1.1;实时时钟时钟线引脚T_IO Bit P1.0;实时时钟数据线
32、引脚T_RST Bit P1.2;实时时钟复位线引脚;*;子程序名:Set1302;功 能:设置DS1302 初始时间,并启动计时。;说 明:;调 用:RTInputByte;入口参数:初始时间在:Second,Minute,Hour,Day,Month,Week.YearL(地址连续);返 回 值:无;影响资源:A B R0 R2 R4 R7;设 计:ZHG 日 期:2006-11-03;修 改: 日 期:;*Set1302: CLR T_RST CLR T_CLK SETB T_RST MOV B, #8EH ;控制寄存器 LCALL RTInputByte MOV B, #00H ;写操
33、作前WP=0 LCALL RTInputByte SETB T_CLK CLR T_RST MOV R0, #Second MOV R7, #7 ;秒分时日月星期年 MOV R2, #80H ;秒写地址Set13021: CLR T_RST CLR T_CLK SETB T_RST MOV B,R2;写分时日月星期年地址 LCALL RTInputByte MOV A, R0 ;写秒数据 MOV B, A LCALL RTInputByte INC R0 INC R2 INC R2 SETB T_CLK CLR T_RST DJNZ R7, Set13021 CLR T_RST CLR T_C
34、LK SETB T_RST MOV B,#8EH;控制寄存器 LCALL RTInputByte MOV B,#80H ;控制,WP=1,写保护 LCALL RTInputByte SETB T_CLK CLR T_RST RET;*;子程序名:Get1302;功 能:从DS1302 读时间;说 明:;调 用:RTInputByte,RTOutputByte;入口参数: 时间保存在:;Second,Minute,Hour,Day,Month,Week.YearL;返 回 值:无;影响资源:A B R0 R2 R4 R7;*Get1302: PUSH ACC PUSH PSW ; SETB PSW.4 ; SETB PSW.3 MOV R0, #Second; 41H MOV R7, #7 MOV R2, #81H ;秒地址 Get1: CLR T_RST CLR T_CLK SETB T_RST MOV B,R2 ;秒分时日月星期年地址 LCALL RTInputByte NOP LCALL RTOutputByte MOV R0,A