课 题:多功能电子万年历的设计
姓 名:
班 级:
学 号:
指导老师:
日 期:
一、绪论
随着科技的快速发展,时间的流逝,至从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。美国DALLAS公司推出的具有涓细电流充电能的低功耗实时时钟电路DS1302。它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。该电路采用ATS51单片机作为核心,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。
综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。
二、系统总体方案
我选用的是单片机(8051)来实现电子万年历的功能。共具备两个功能:
(1)显示年月日及分秒信息
(2)具有可调整日期和时间功能。
该电子万年历能够成功实现时钟运行,调整功能,且精确度经调试一天的误差在2S内。
1微处理器
本系统采用的就是51系列的ATC51单片机进行的万年历设计。由于51系列的上下兼容性,51核的内部功能大体一致。下图为51系列单片机的管脚图。
ATC51管脚图
VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。P3口可以为闪烁编程和编程校验接收一些控制信号。
RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:地址锁存允许/编程脉冲输入端。
PSEN:外部程序存储器的选通信号。
EA/VPP:寻址外部ROM控制端/编程电源输入端。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。
2输出LED显示功能简介
在单片机应用系统中常用的显示器有发光二极管数码显示器LED和液晶显示器LCD。LED显示器具有耗电少、成本低廉、配置简单灵活,抗干扰性强等优点,但显示内容有限,且不能显示图形,因而其灵活性受到;LCD显示了具有LED特点外还能显示图形,但其驱动比较复杂。本设计的万年历输出部分采用LED
3按键电路
由于我设计的是电子万年历,在设计过程中我一共采用了4个按键,尽量在小的空间里实现最多的功能。其中MODE键是年月日与时间显示切换键,按下一次就能够更换一次显示位。在调整显示环境下UP和DONW键是显示调整位的的加1减1键,FUNCTION键实现清零,并提高万年历显示的精确性。按键电路如图所示
4 时钟芯片DS1302的工作原理:
DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置 “0”,接着把RST端置“1”,最后才给予SCLK脉冲;读/写时序如下图4所示。图5为DS1302的控制字,此控制字的位7必须置1,若为0则不能把对DS1302进行读写数据。对于位6,若对程序进行读/写时RAM=1,对时间进行读/写时,CK=0。位1至位5指操作单元的地址。位0是读/写操作位,进行读操作时,该位为1;该位为0则表示进行的是写操作。控制字节总是从最低位开始输入/输出的。表6为DS1302的日历、时间寄存器内容:“CH”是时钟暂停标志位,当该位为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位为0时,时钟开始运行。“WP”
是写保护位,在任何的对时钟和RAM的写操作之前,WP必须为0。当“WP”为1时,写保护位防止对任一寄存器的写操作。
(2) DS1302的控制字节
DS1302的控制字如表-1所示。控制字节的高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出
RAM RD
1 A4 A3 A2 A1 A0
/CK /WR
表-1 DS1302的控制字格式
(3) 数据输入输出(I/O)
在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。如下图-4所示
图-4 DS1302读/写时序
(4) DS1302的寄存器
DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表-2。
表-2 DS1302的日历、时间寄存器
此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)
三、硬件电路的总体框图设计
该设计的硬件电路的总体框图下图所示
四、系统软件设计
主程序流程图
Proteus ISIS简介
Labcenter公司开发的电路分析与实物仿真软件。它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路。
该软件的特点是:
(1)全部满足我们提出的单片机软件仿真系统的标准,并在同类产品中具有明显的优势。
(2)具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS-232动态仿真、I2 C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。
(3)目前支持的单片机类型有:ARM7系列、68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。
(4)支持大量的存储器和外围芯片。
总之,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大 ,可仿真ARM、51、AVR、PIC。
Proteus启动画面:
图9界面
仿真结果
通过在KEIL下对源程序的编译,改正了其中的很多错误,运行之后生成HEX文件。然后按原理图选择正确合理的电气元件,画出正确而且美观的电路图,加载源程序运行,顺利实现了电子万年历年月日时分秒以及星期和阴历日期的输出。
下图为电子万年历的显示效果:
按下调时键后(第一个键)表示小时的数字开始闪动
按下调日期键后(第三个键)年代键开始闪动
第2个键为调整显示数字按键,实行加一
仿真结果
通过在WAVE6000下对源程序的编译,改正了其中的很多错误,然后运行,保证源程序的正确性。然后按原理图选择正确合理的电器元件,画出正确的电路图,加载源程序运行,顺利实现了单片机数字电子钟的“小时”、“分钟”、“秒”的显示。该电子万年历的显示效果如图
五、总结
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域, 在生活中可以说得是无处不在。因此作为二十一世纪的大学生,掌握单片机的开发技术是十分重要的。
此次设计立足于电子技术的实际运用,不断实践,开拓了思维,设计以考查、调研、搜集资料、拟订方案、进行系统规划、编程、仿真、调试的流程,使我深刻的体会到了在学习我们专业的过程中理论与实践相结合的重要性,同时也解决了以前学习比较模糊的专业知识点,使自己掌握的专业知识更加结构化、系统化。
参考文献
[1] ATC51,http://www.zlgmcu.com,广州周立功单片机发展有限公司
[2] DS1302 Trickle Charge Timekeeping Chip,www.dalsemi.com
[3] 刘嘉新 李明 于明淳 DS18B20在林学气象测量中的应用,2002年7月第30卷第4期
[4] 蒋敏,单片微机万年历设计,职大学报2002年第2期
[5] 邸春芳,电脑实时时钟的设计,(西南石油学院电子信息工程学院)
[6] 维普资讯 http://www.cqvip.com
[7] 王越明,电子万年历的设计,黑龙江煤矿机电设备厂,维普资讯 http://www.cqvip.com
[8] 适用于51系列单片机的一种万年历优化算法,维普资讯 http://www.cqvip.com
[9] 吴有富,推导万年星期历的turoc-c程序,贵州民族学院
[10] 刘峰 周炳峻 李晓静,遥控电脑万年历的改造,河北,应用与改造
[11] 藤迪安,最新万年历,《黑龙江珠算》1996年第5期
[12] 韩志军 刘新民,数字温度传感器DS18B20及其应用,2003年3月第1卷第1期
附源程序代码:
SCLK EQU P3.2
IO EQU P3.3
RST EQU P3.4
TRL EQU P3.5
JIA1 EQU P3.6
TSH EQU P3.7
YEAR DATA 66H
MONTH DATA 65H
WEEK DATA H
DAY DATA 63H
HOUR DATA 62H
MINUTE DATA 61H
SECOND DATA 60H
DS_ADDR DATA 32H
DS_DATA DATA 31H
ORG 00H
AJMP START
MAIN2F: LJMP MAIN2
START: MOV SP,#70H
LCALL DELAY1
MOV DS_ADDR,#8EH
MOV DS_DATA,#00H
LCALL WRITE
START0: MOV DS_ADDR,#81H
LCALL READ
MOV DS_ADDR,#80H
MOV DS_DATA,A
LCALL WRITE
STAR1: MOV DS_ADDR,#0C0H
MOV DS_DATA,#9CH
LCALL WRITE
MOV 20H,#0
MOV 21H,#0FH
MAIN1: JB TRL,MAIN2FA
MOV 22H,#1
AJMP MAIN2FB
MAIN2FA:JB TSH,MAIN2F
MOV 22H,#2
MOV DS_ADDR,#81H
LCALL READ
ORL A,#80H
MOV DS_ADDR,#80H
MOV DS_DATA,A
LCALL WRITE
MAIN4: LCALL DISP
JNB TSH,MAIN4
MOV 22H,#2
LJMP SSS
MAIN2FB:MOV DS_ADDR,#81H
LCALL READ
ORL A,#80H
MOV DS_ADDR,#80H
MOV DS_DATA,A
LCALL WRITE
MAIN4J: LCALL DISP
JNB TRL,MAIN4J
MOV 22H,#1
NNN: LCALL DISP
JNB TRL,YYY
MOV 20H,#8
LCALL DISP
JB JIA1,NNN
NNN2: LCALL DISP
JNB JIA1,NNN2
MOV R7,YEAR
LCALL JIAY1
MOV YEAR,A
CJNE A,#30H,NNN1
MOV YEAR,#06
NNN1: MOV DS_ADDR,#8CH
MOV DS_DATA,YEAR
LCALL WRITE
MOV R0,YEAR
LCALL DIVIDE
MOV 4AH,R1
MOV A,4AH
SWAP A
MOV 4AH,A
MOV 4BH,R2
MOV A,4BH
SWAP A
MOV 4BH,A
SJMP NNN
YYY: LCALL DISP
JNB TRL,YYY
YYY3: JNB TRL,DDD
MOV 20H,#4
LCALL DISP
JB JIA1,YYY3
YYY2: LCALL DISP
JNB JIA1,YYY2
MOV R7,MONTH
LCALL JIAY1
MOV MONTH,A
CJNE A,#13H,YYY1
MOV MONTH,#1
YYY1: MOV DS_ADDR,#88H
MOV DS_DATA,MONTH
LCALL WRITE
MOV R0,MONTH
LCALL DIVIDE
MOV 48H,R1
MOV A,48H
SWAP A
MOV 48H,A
MOV 49H,R2
MOV A,49H
SWAP A
MOV 49H,A
SJMP YYY3
DDD: LCALL DISP
JNB TRL,DDD
MOV 20H,#2H
DDD3: JNB TRL,NYD
MOV 20H,#2
LCALL DISP
JB JIA1,DDD3
DDD2: LCALL DISP
JNB JIA1,DDD2
MOV R7,DAY
LCALL JIAY1
MOV DAY,A
CJNE A,#32H,DDD1
MOV DAY,#1
DDD1: MOV DS_ADDR,#86H
MOV DS_DATA,DAY
LCALL WRITE
MOV R0,DAY
LCALL DIVIDE
MOV 46H,R1
MOV A,46H
SWAP A
MOV 46H,A
MOV 47H,R2
MOV A,47H
SWAP A
MOV 47H,A
SJMP DDD3
NYD: LJMP MAIN3A
SSS: LCALL DISP
JNB TSH,FFF
MOV 20H,#8
SSS3: JNB TSH,FFF
LCALL DISP
JB JIA1,SSS3
SSS2: LCALL DISP
JNB JIA1,SSS2
MOV R7,HOUR
LCALL JIAY1
MOV HOUR,A
CJNE A,#24H,SSS1
MOV HOUR,#0
SSS1: MOV DS_ADDR,#84H
MOV DS_DATA,HOUR
LCALL WRITE
MOV R0,HOUR
LCALL DIVIDE
MOV 44H,R1
MOV 45H,R2
SJMP SSS
FFF: LCALL DISP
JNB TSH,FFF
MOV 20H,#4
FFF3: JNB TSH,MMM
LCALL DISP
JB JIA1,FFF3
FFF2: LCALL DISP
JNB JIA1,FFF2
MOV R7,MINUTE
LCALL JIAY1
MOV MINUTE,A
CJNE A,#60H,FFF1
MOV MINUTE,#0
FFF1: MOV DS_ADDR,#82H
MOV DS_DATA,MINUTE
LCALL WRITE
MOV R0,MINUTE
LCALL DIVIDE
MOV 42H,R1
MOV 43H,R2
SJMP FFF3
MMM: LCALL DISP
JNB TSH,MMM
MOV 20H,#2
MMM3: JNB TSH,MAIN3
LCALL DISP
JB JIA1,MMM3
MMM2: LCALL DISP
JNB JIA1,MMM2
MOV R7,SECOND
LCALL JIAY1
MOV SECOND,A
CJNE A,#60H,MMM1
MOV SECOND,#0
MMM1: ORL SECOND,#80H
MOV DS_ADDR,#80H
MOV DS_DATA,SECOND
LCALL WRITE
ANL SECOND,#7FH
MOV R0,SECOND
LCALL DIVIDE
MOV 40H,R1
MOV 41H,R2
SJMP MMM3
MAIN3: SETB P3.0
SETB P3.1
MOV 22H,#0
LCALL DISP
JNB TSH,MAIN3
MOV 20H,#0
MOV 21H,#0FH
MOV 22H,#0
MOV DS_ADDR,#81H
LCALL READ
ANL A,#7FH
MOV DS_ADDR,#80H
MOV DS_DATA,A
LCALL WRITE
LJMP MAIN1
MAIN3A: SETB P3.0
SETB P3.1
MOV 22H,#0
LCALL DISP
JNB TRL,MAIN3A
MOV 20H,#0
MOV 21H,#0FH
MOV 22H,#0
MOV DS_ADDR,#81H
LCALL READ
ANL A,#7FH
MOV DS_ADDR,#80H
MOV DS_DATA,A
LCALL WRITE
LJMP MAIN1
MAIN2: MOV P1,#0
MOV DS_ADDR,#8DH
LCALL READ
MOV YEAR,DS_DATA
MOV DS_ADDR,#H
LCALL READ
MOV MONTH,DS_DATA
MOV DS_ADDR,#87H
LCALL READ
MOV DAY,DS_DATA
MOV DS_ADDR,#85H
LCALL READ
MOV HOUR,DS_DATA
MOV DS_ADDR,#83H
LCALL READ
MOV MINUTE,DS_DATA
MOV DS_ADDR,#81H
LCALL READ
MOV SECOND,DS_DATA
MOV R0,YEAR
LCALL DIVIDE
MOV 4AH,R1
MOV A,4AH
SWAP A
MOV 4AH,A
MOV 4BH,R2
MOV A,4BH
SWAP A
MOV 4BH,A
MOV R0,MONTH
LCALL DIVIDE
MOV 48H,R1
MOV A,48H
SWAP A
MOV 48H,A
MOV 49H,R2
MOV A,49H
SWAP A
MOV 49H,A
MOV R0,DAY
LCALL DIVIDE
MOV 46H,R1
MOV A,46H
SWAP A
MOV 46H,A
MOV 47H,R2
MOV A,47H
SWAP A
MOV 47H,A
MOV R0,HOUR
LCALL DIVIDE
MOV 44H,R1
MOV 45H,R2
MOV R0,MINUTE
LCALL DIVIDE
MOV 42H,R1
MOV 43H,R2
MOV R0,SECOND
LCALL DIVIDE
MOV 40H,R1
MOV 41H,R2
LCALL DISP
LJMP MAIN1
DISP: SETB P3.1
SETB P3.0
JNB 10H,DISP2
CLR P3.0
DISP2: JNB 11H,DISP1
CLR P3.1
DISP1: NOP
MOV A,46H
ORL A,40H
MOV P1,A
JNB 01H,MIAOL
MOV A,21H
RL A
MOV 21H,A
CJNE A,#78H,MIAO1
MIAO1: JC MIAOL
CLR P2.4
CLR P2.5
SJMP FEN
MIAOL: SETB P2.5
LCALL DELAY1
CLR P2.5
LCALL DELAY2
MOV A,47H
ORL A,41H
MOV P1,A
SETB P2.4
LCALL DELAY1
CLR P2.4
LCALL DELAY2
FEN: MOV A,48H
ORL A,42H
MOV P1,A
JNB 02H,FENL
MOV A,21H
RL A
MOV 21H,A
CJNE A,#78H,FEN1
FEN1: JC FENL
CLR P2.2
CLR P2.3
SJMP SHI
FENL: SETB P2.3
LCALL DELAY1
CLR P2.3
LCALL DELAY2
MOV A,49H
ORL A,43H
MOV P1,A
SETB P2.2
LCALL DELAY1
CLR P2.2
LCALL DELAY2
SHI: MOV A,4AH
ORL A,44H
MOV P1,A
JNB 03H,SHIL
MOV A,21H
RL A
MOV 21H,A
CJNE A,#78H,SHI1
SHI1: JC SHIL
SJMP SHI2
SHIL: SETB P2.1
LCALL DELAY1
CLR P2.1
LCALL DELAY2
MOV A,4BH
ORL A,45H
MOV P1,A
SETB P2.0
LCALL DELAY1
CLR P2.0
LCALL DELAY2
SJMP SFM
SHI2: CLR P2.0
CLR P2.1
SFM: RET
DELAY1: MOV R7,#5
DELAY11:MOV R6,#0
DJNZ R6,$
DJNZ R7,DELAY11
RET
DELAY2: MOV R7,#1
DELAY21:MOV R6,#0
DJNZ R6,$
DJNZ R7,DELAY21
RET
DELAY3: MOV R7,#40
DELAY31:MOV R6,#0
DJNZ R6,$
DJNZ R7,DELAY31
RET
JIAY1: MOV A,R7
ADD A,#1
DA A
RET
DIVIDE: MOV A,R0
ANL A,#0FH
MOV R1,A
MOV A,R0
SWAP A
ANL A,#0FH
MOV R2,A
RET
WRITE: CLR SCLK
NOP
SETB RST
NOP
MOV A,DS_ADDR
MOV R4,#8
WRITE1: RRC A
NOP
NOP
CLR SCLK
NOP
NOP
NOP
MOV IO,C
NOP
NOP
NOP
SETB SCLK
NOP
NOP
DJNZ R4,WRITE1
CLR SCLK
NOP
MOV A,DS_DATA
MOV R4,#8
WRITE2: RRC A
NOP
CLR SCLK
NOP
NOP
MOV IO,C
NOP
NOP
NOP
SETB SCLK
NOP
NOP
DJNZ R4,WRITE2
CLR RST
RET
READ: CLR SCLK
NOP
NOP
SETB RST
NOP
MOV A,DS_ADDR
MOV R4,#8
READ1: RRC A
NOP
MOV IO,C
NOP
NOP
NOP
SETB SCLK
NOP
NOP
NOP
CLR SCLK
NOP
NOP
DJNZ R4,READ1
MOV R4,#8
READ2: CLR SCLK
NOP
NOP
NOP
MOV C,IO
NOP
NOP
NOP
NOP
NOP
RRC A
NOP
NOP
NOP
NOP
SETB SCLK
NOP
DJNZ R4,READ2
MOV DS_DATA,A
CLR RST
RET
DEY: NOP
NOP
NOP
NOP
NOP
NOP
NOP
RET
END