设计题目:基于DS1302的电子钟设计
系统设计思路
要求能利用试验箱上的DS1302来显示当前时间,日期,并将其显示在数码管和液晶屏上。此设计即液晶上显示年、月、日、时、分、秒、星期,电路包括以下几个部分:单片机、时钟电路、显示电路
各部分说明:
(1) 单片机通过输出各种电脉冲信号来驱动控制各部分正常工作。
(2) 单片机发送的信号经过显示电路通过译码最终在液晶上显示出来。
系统的主要元件:主芯片:MCS—51单片机
时钟芯片:DS1302
显示器件:LED和LCD(T6963C)
系统工作过程:时间的主要处理过程是在DS1302中完成的。首先对此芯片进行初始化,对其初值进行设置,然后启动芯片工作。芯片会在内部晶振提供的频率下对秒进行加计数并
在必要时进位。
CPU会随时对DS1302进行读取数据的操作。在读取了相应的寄存器的值后,CPU将读取的值进行处理,再通过I\\O口把数据传入LED和LCD。显示器件在接受到数据后在相应的位置上进行显示。
系统的设计按照系统的工作过程,将CPU相应的I\\O口分配给对应的芯片完成相应的控制和数据的传递。简单地可概括为以CPU为中心,将DS1302的时间数据,通过CPU处理后输入到T6963C和LED进行输出显示
单元电路设计
① MCS-51单片机系统设计
MCS51核心实验板上的外设电路,使用了单片机的P1口和P3口。P1口和P3口的各个引脚,可以根据需要,用于控制核心板本身的外设器件,也可以通过核心板上面的插针,用于其它的外部控制功能,或者通过通用实验板连接插口,用于通用板的控制。通过改变拨码开关的位置,可以设定P1口和P3口各引脚用于核心板内部或外部。
CPU相应电路原理如图1.2.3所示。
第 2 页 共 54 页
VCCJ1P0123456789101112131415161718192012345678D2U1SW1LCLKSCLKRCLKSERKEY1KEY2KEY3KEY4RXDTXDSNDADOUTADINADCLKADCSDACS1234567812345678SW2161514131211109161514131211109GND12345678RST91011121314151617X218X11920P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7RESETP3.0P3.1P3.2P3.3P3.4P3.5P3.6P3.7XTAL2XTAL1Vss8051VccP0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7EAALEPSENP2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.0VCCJ240393837363534333231302928272625242322212019181716151413121110987654321VCCGND1234567812345678P1P3P212345678 图1.2.3 MCS51核心实验板CPU电路原理图
CPU的P1口和P3口分别用拨码开关SW1和SW2来选择它们是用于控制核心板还是外接到连接插口上供通用板使用。当拨码开关某一位处于“ON”的位置时,P1口和P3口对应引脚连接到核心板,否则连接到通用板。全部P0、P1、P2、P3口引脚分别接到一排插针上,可通过排线连接到其它应用电路。
② DS1302时钟芯片电路设计
数字时钟电路DS1302位于通用板的③区,电路连接如图1.3.15所示。由于不用备份电源,所以将VCC1和VCC2引脚都连接到数字电源上。
VCCVCC1X1X2GNDVCC2SCLKIO/RSTR19R17R18TSCKTIOTRST
第 3 页 共 54 页
图1.3.15 DS1302数字时钟电路
DS1320的SCLK、IO、/RST引脚分别经一个10KΩ上拉电阻连接到数字电源,同时连接到端子“TSCK”、“TIO”和“TRST”上。用户只要根据自己的设计,将这三个端子连接到单片机对应的引脚,就可以使用DS1302时钟功能。
③ 点阵液晶显示器
选用香港精电公司的QH12864T液晶显示模块,其背面带有控制电路,内置有LCD控制器T6963C。点阵LCD的数据线、地址线、控制线等,在内部已经与单片机扩展总线连接好,如图1.3.7所示。
245P0.0~P0.7D0~7D0Q0~D7OELED/C8051ALEP2.0~P2.6RDEAWRDIR373OEWECSLCDCS点点LCD
图1.3.7 点阵LCD电路原理
只须根据需要,将单片机的高位地址译码输出,连接到片选信号“LCDCS”端子,就可以得到需要的地址。例如,假定片选信号“LCDCS”连接的译码高位地址为8000H,则点阵LCD的数据端口地址、控制端口地址分别为8000H和8001H。
第 4 页 共 54 页
④ 试验箱实物接线图:
程序设计流程
① 主程序设计流程
第 5 页 共 54 页
② 源程序清单:
;定义显示数据单元
SEC_0 EQU 60H
SEC_1 EQU 61H
MIN_0 EQU 62H
第 6 页 共 54 页
MIN_1 EQU 63H
HOUR_0 EQU 64H
HOUR_1 EQU 65H
DAY EQU 66H
DATE_0 EQU 67H
DATE_1 EQU 68H
MON_0 EQU 69H
MON_1 EQU 6AH
YEAR_0 EQU 6BH
YEAR_1 EQU 6CH
LCD_D1 EQU 6DH LCD_D2 EQU 6EH LCD_C EQU 6FH
;LCD数据D1
;LCD数据D2
;LCD命令字
第 7 页 共 54 页
C_ADD EQU 8001H ;LCD指令入口地址
D_ADD EQU 8000H ;LCD数据入口地址
DS_SIO EQU P2.0
DS_CLK EQU P2.1
DS_RST EQU P2.2
ORG 0000H
AJMP START
ORG 0030H
START: MOV SP,#30H
CLR DS_RST
;初始设定时间为13/3/15 10:59:55 星期5
MOV SEC_0,#5
MOV SEC_1,#5
第 8 页 共 54 页
MOV MIN_0,#9
MOV MIN_1,#5
MOV HOUR_0,#0
MOV HOUR_1,#1
MOV DAY,#5
MOV DATE_0,#5
MOV DATE_1,#1
MOV MON_0,#3
MOV MON_1,#0
MOV YEAR_0,#3
MOV YEAR_1,#1
MOV P0,#0
CLR P1.1 ;初始化有关I/O口
第 9 页 共 54 页
CLR P1.2
MOV R0,#HOUR_1 ;初始化显示指针寄存器
;R0指向第一位显示数字
MOV R1,#01H ;初始化需点亮数码管位置代码
NOP
LCALL WR_1302
LCALL DISPA ;显示静态字符
LOOP: LCALL RD_1302
LCALL DISP ;调用数码管循环点亮子程序
LCALL I_LCD ;初始化LCD
LCALL DISPB ;显示动态字符
AJMP LOOP
第 10 页 共 54 页
WR_1302: CLR DS_RST
NOP
NOP
CLR DS_CLK
NOP
NOP
SETB DS_RST
;写控制寄存器,允许写入 MOV A,#8EH
LCALL W_BYTE
MOV A,#00H
LCALL W_BYTE
SETB DS_CLK
第 11 页 共 54 页
NOP
NOP
CLR DS_RST
NOP
NOP
CLR DS_CLK
NOP
NOP
SETB DS_RST
;写充电寄存器,禁止充电 MOV A,#90H
LCALL W_BYTE
MOV A,#04H
第 12 页 共 54 页
LCALL W_BYTE
SETB DS_CLK
NOP
NOP
CLR DS_RST
NOP
NOP
CLR DS_CLK
NOP
NOP
SETB DS_RST
;写秒寄存器,启动计时 MOV A,#80H
第 13 页 共 54 页
LCALL W_BYTE
MOV A,SEC_1
SWAP A
ORL A,SEC_0
LCALL W_BYTE SETB DS_CLK
NOP
NOP
CLR DS_RST
NOP
NOP
CLR DS_CLK
NOP
第 14 页 共 54 页
NOP
SETB DS_RST
;写分寄存器
MOV A,#82H
LCALL W_BYTE
MOV A,MIN_1
SWAP A
ORL A,MIN_0
LCALL W_BYTE SETB DS_CLK
NOP
NOP
CLR DS_RST
第 15 页 共 54 页
NOP
NOP
CLR DS_CLK
NOP
NOP
SETB DS_RST
;写时寄存器
MOV A,#84H
LCALL W_BYTE MOV A,HOUR_1
SWAP A
ORL A,HOUR_0
LCALL W_BYTE
第 16 页 共 54 页
SETB DS_CLK
NOP
NOP
CLR DS_RST
NOP
NOP
CLR DS_CLK
NOP
NOP
SETB DS_RST
;写日寄存器
MOV A,#86H
LCALL W_BYTE
第 17 页 共 54 页
MOV A,DATE_1
SWAP A
ORL A,DATE_0
LCALL W_BYTE SETB DS_CLK
NOP
NOP
CLR DS_RST
NOP
NOP
CLR DS_CLK
NOP
NOP
第 18 页 共 54 页
SETB DS_RST
;写月寄存器
MOV A,#88H
LCALL W_BYTE
MOV A,MON_1
SWAP A
ORL A,MON_0
LCALL W_BYTE SETB DS_CLK
NOP
NOP
CLR DS_RST
NOP
第 19 页 共 54 页
NOP
CLR DS_CLK
NOP
NOP
SETB DS_RST
;写星期寄存器 MOV A,#8AH
LCALL W_BYTE
MOV A,DAY
LCALL W_BYTE SETB DS_CLK
NOP
NOP
第 20 页 共 54 页
CLR DS_RST
NOP
NOP
CLR DS_CLK
NOP
NOP
SETB DS_RST
;写年寄存器
MOV A,#8CH
LCALL W_BYTE
MOV A,YEAR_1
SWAP A
ORL A,YEAR_0
第 21 页 共 54 页
LCALL W_BYTE
SETB DS_CLK
NOP
NOP
CLR DS_RST
NOP
NOP
CLR DS_CLK
NOP
NOP
SETB DS_RST
;写控制寄存器,禁止写入 MOV A,#8EH
第 22 页 共 54 页
LCALL W_BYTE
MOV A,#80H
LCALL W_BYTE
SETB DS_CLK
NOP
NOP
CLR DS_RST
RET
RD_1302:
CLR DS_CLK
NOP
NOP
SETB DS_RST
第 23 页 共 54 页
;读秒寄存器
MOV A,#81H
LCALL W_BYTE
LCALL R_BYTE
PUSH ACC
ANL A,#0FH
MOV SEC_0,A
POP ACC
ANL A,#0F0H
SWAP A
MOV SEC_1,A SETB DS_CLK
NOP
第 24 页 共 54 页
NOP
CLR DS_RST
NOP
NOP
CLR DS_CLK
NOP
NOP
SETB DS_RST ;读分寄存器
MOV A,#83H
LCALL W_BYTE
LCALL R_BYTE
PUSH ACC
第 25 页 共 54 页
ANL A,#0FH
MOV MIN_0,A
POP ACC
ANL A,#70H
SWAP A
MOV MIN_1,A SETB DS_CLK
NOP
NOP
CLR DS_RST
NOP
NOP
CLR DS_CLK
第 26 页 共 54 页
NOP
NOP
SETB DS_RST
;读时寄存器
MOV A,#85H
LCALL W_BYTE
LCALL R_BYTE
PUSH ACC
ANL A,#0FH
MOV HOUR_0,A
POP ACC
ANL A,#0F0H
SWAP A
第 27 页 共 54 页
MOV HOUR_1,A
SETB DS_CLK
NOP
NOP
CLR DS_RST
NOP
NOP
CLR DS_CLK
NOP
NOP
SETB DS_RST
;读日寄存器
MOV A,#87H
第 28 页 共 54 页
LCALL W_BYTE
LCALL R_BYTE
PUSH ACC
ANL A,#0FH
MOV DATE_0,A
POP ACC
ANL A,#0F0H
SWAP A
MOV DATE_1,A SETB DS_CLK
NOP
NOP
CLR DS_RST
第 29 页 共 54 页
NOP
NOP
CLR DS_CLK
NOP
NOP
SETB DS_RST
;读月寄存器
MOV A,#89H
LCALL W_BYTE
LCALL R_BYTE
PUSH ACC
ANL A,#0FH
MOV MON_0,A
第 30 页 共 54 页
POP ACC
ANL A,#70H
SWAP A
MOV MON_1,A SETB DS_CLK
NOP
NOP
CLR DS_RST
NOP
NOP
CLR DS_CLK
NOP
NOP
第 31 页 共 54 页
SETB DS_RST
;读星期寄存器
MOV A,#8BH
LCALL W_BYTE
LCALL R_BYTE
MOV DAY,A
SETB DS_CLK
NOP
NOP
CLR DS_RST
NOP
NOP
CLR DS_CLK
第 32 页 共 54 页
NOP
NOP
SETB DS_RST
;读年寄存器
MOV A,#8DH
LCALL W_BYTE
LCALL R_BYTE
PUSH ACC
ANL A,#0FH
MOV YEAR_0,A
POP ACC
ANL A,#0F0H
SWAP A
第 33 页 共 54 页
MOV YEAR_1,A
SETB DS_CLK
NOP
NOP
CLR DS_RST
RET
W_BYTE: MOV R2,#8
CLR DS_CLK
WR_L: RRC A
MOV DS_SIO,C
SETB DS_CLK
NOP
NOP
第 34 页 共 54 页
CLR DS_CLK
DJNZ R2,WR_L
RET
R_BYTE: MOV R2,#8
CLR DS_CLK
RD_L: MOV C,DS_SIO
RRC A
SETB DS_CLK
NOP
NOP
CLR DS_CLK
DJNZ R2,RD_L
RET
第 35 页 共 54 页
DISP: MOV A,R1 ;取位代码
MOV P0,A ;位代码送P0口
SETB P1.2
NOP
CLR P1.2 ;产生一个锁存脉冲,锁存位代码
MOV A,@R0 ;取需显示的数字
MOV DPTR,#DISPD ;装载笔画编码表首地址
MOVC A,@A+DPTR ;取需显示数字笔画代码
MOV P0,A ;笔画代码送到P0口
SETB P1.1
NOP
CLR P1.1 ;产生一个锁存脉冲,锁存笔画代码
DEC R0 ;R0增1指向下一个需显示数字
第 36 页 共 54 页
MOV A,R1
CLR C
RLC A
MOV R1,A ;R1中的值左移1位,指向下一位数码管
CJNE R0,#59H,DISP1 ;R0中不为70H则继续
MOV R0,#HOUR_1 ;R0中为70H,循环完一轮
;重新赋初值
MOV R1,#1 ;位置代码初值
DISP1: NOP
RET
;数字笔画代码表
; 0 1 2 3 4 5 6 7 8 9 熄
DISPD: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,0
第 37 页 共 54 页
I_LCD: MOV LCD_D1,#0
MOV LCD_D2,#0
MOV LCD_C,#40H
LCALL W_DAT1 ;写指令40H,设置文本区首地址
;以上设置文本区首地址为0000H
MOV LCD_D1,#16
MOV LCD_D2,#0
MOV LCD_C,#41H
LCALL W_DAT1 ;以上设置文本行宽度为16个字节
;即每行可显示16个ASCII字符
MOV LCD_C,#80H
LCALL W_COM ;设置显示方式为内部字符发生器
第 38 页 共 54 页
MOV LCD_C,#94H
LCALL W_COM ;设置光标显示启用
RET
DISPA: MOV LCD_D1,#0
MOV LCD_D2,#0
MOV LCD_C,#24H
LCALL W_DAT1 ;以上设置地址指针
;即地址0000H开始
MOV LCD_C,#0B0H
LCALL W_COM ;以上设置数据自动写方式
MOV R2,#0 ;R2为指针,其值每写一个字符增1
MOV R3,#128 ;R3中为需写的字符总数
;一屏共可显示128个字符
第 39 页 共 54 页
DISPA1: MOV DPTR,#C_ADD
MOVX A,@DPTR
JNB ACC.3,DISPA1 ;检测LCD状态
;若忙则继续检测
MOV A,R2
MOV DPTR,#DISP_D
MOVC A,@A+DPTR ;指针加初始地址得要写的字符实际地址
;取要写的数据
MOV DPTR,#D_ADD
MOVX @DPTR,A ;写入数据
INC R2
DJNZ R3,DISPA1 ;循环写入128个字符
第 40 页 共 54 页
MOV LCD_C,#0B2H
LCALL W_DAT1 ;停止数据自动写方式
RET
DISP_D: DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
;以上为第一行,显示年份
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0
DB 0,0
;以上为第二行,显示“星期”上半部分
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0
DB 0,0
;以上为第三行,显示“星期”下半部分
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
;以上为第四行,显示日期
第 41 页 共 54 页
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
;以上四行无显示内容,相当于清除屏幕内容
DISPB:
MOV LCD_D1,#0
MOV LCD_D2,#0
MOV LCD_C,#24H
LCALL W_DAT1 ;以上设置地址指针
;指向动态字符的最高位
MOV A,#2
ADD A,#10H
第 42 页 共 54 页
MOV LCD_D2,A
MOV LCD_C,#0C0H
LCALL W_DAT2 MOV A,#0
ADD A,#10H
MOV LCD_D2,A
MOV LCD_C,#0C0H
LCALL W_DAT2 MOV A,YEAR_1
ADD A,#10H
MOV LCD_D2,A
MOV LCD_C,#0C0H
LCALL W_DAT2 ;以上写入最高位数据
;以上写入最高位数据
;以上写入最高位数据
第 43 页 共 54 页
MOV A,YEAR_0
ADD A,#10H
MOV LCD_D2,A
MOV LCD_C,#0C0H
LCALL W_DAT2 ;以上写入第二个数据
MOV LCD_D1,#5
MOV LCD_D2,#0
MOV LCD_C,#24H
LCALL W_DAT1 ;以上设置地址指针
;指向动态字符的最高位
MOV A,MON_1
ADD A,#10H
MOV LCD_D2,A
第 44 页 共 54 页
MOV LCD_C,#0C0H
LCALL W_DAT2 ;以上写入第三个数据
MOV A,MON_0
ADD A,#10H
MOV LCD_D2,A
MOV LCD_C,#0C0H
LCALL W_DAT2 ;以上写入最低位数据
MOV LCD_D1,#8
MOV LCD_D2,#0
MOV LCD_C,#24H
LCALL W_DAT1 ;以上设置地址指针
;指向动态字符的最高位
MOV A,DATE_1
第 45 页 共 54 页
ADD A,#10H
MOV LCD_D2,A
MOV LCD_C,#0C0H
LCALL W_DAT2 MOV A,DATE_0
ADD A,#10H
MOV LCD_D2,A
MOV LCD_C,#0C0H
LCALL W_DAT2 MOV LCD_D1,#32
MOV LCD_D2,#0
MOV LCD_C,#24H
LCALL W_DAT1
;以上写入第三个数据
;以上写入最低位数据
;以上设置地址指针
第 46 页 共 54 页
;指向动态字符的最高位
MOV A,DAY
ADD A,#10H
MOV LCD_D2,A
MOV LCD_C,#0C0H
LCALL W_DAT2 ;以上写入第三个数据
MOV LCD_D1,#64
MOV LCD_D2,#0
MOV LCD_C,#24H
LCALL W_DAT1 ;以上设置地址指针
;指向动态字符的最高位
MOV A,HOUR_1
ADD A,#10H
第 47 页 共 54 页
MOV LCD_D2,A
MOV LCD_C,#0C0H
LCALL W_DAT2 MOV A,HOUR_0
ADD A,#10H
MOV LCD_D2,A
MOV LCD_C,#0C0H
LCALL W_DAT2 MOV LCD_D1,#67
MOV LCD_D2,#0
MOV LCD_C,#24H
LCALL W_DAT1
MOV A,MIN_1
;以上写入第三个数据
;以上写入最低位数据
第 48 页 共 54 页
ADD A,#10H
MOV LCD_D2,A
MOV LCD_C,#0C0H
LCALL W_DAT2 MOV A,MIN_0
ADD A,#10H
MOV LCD_D2,A
MOV LCD_C,#0C0H
LCALL W_DAT2 MOV LCD_D1,#70
MOV LCD_D2,#0
MOV LCD_C,#24H
LCALL W_DAT1
;以上写入第三个数据
;以上写入最低位数据
第 49 页 共 54 页
MOV A,SEC_1
ADD A,#10H
MOV LCD_D2,A
MOV LCD_C,#0C0H
LCALL W_DAT2 MOV A,SEC_0
ADD A,#10H
MOV LCD_D2,A
MOV LCD_C,#0C0H
LCALL W_DAT2 RET
;写数据及命令程序
W_DAT1:
;以上写入第三个数据
;以上写入最低位数据
第 50 页 共 54 页
MOV DPTR,#C_ADD
MOVX A,@DPTR
JNB ACC.0,W_DAT1
JNB ACC.1,W_DAT1
MOV DPTR,#D_ADD
MOV A,LCD_D1
MOVX @DPTR,A
W_DAT2:
MOV DPTR,#C_ADD
MOVX A,@DPTR
JNB ACC.0,W_DAT2
JNB ACC.1,W_DAT2
MOV DPTR,#D_ADD
第 51 页 共 54 页
MOV A,LCD_D2
MOVX @DPTR,A
W_COM:
MOV DPTR,#C_ADD
MOVX A,@DPTR
JNB ACC.0,W_COM
JNB ACC.1,W_COM
MOV A,LCD_C
MOVX @DPTR,A RET
END
实验结果
:
第 52 页 共 54 页
LCD显示的日期和时间截图:
LED数码管显示的
第 53 页 共 54 页
实验总结
经过本次电子钟的设计,我们查阅了大量的资料来弄清ds1302芯片的功能和关于LCD显示器的功能的实现。这些都是课堂上我们所没触及到的,不再是一味的按照书上的指导步骤做实验。这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说不懂一些元器件的使用方法,对单片机汇编语言掌握得不好……通过这次课程设计之后,一定把以前所学过的知识重新温故。同时,通过这次课程设计,第一次自己动手完成了日常生活中看起来很常见的器件,才知道是有多么的不容易。为前人的智慧表示钦佩,同时勉励自己以后虽然没这门课了,也要利用业余时间多加强自己关于单片机和编程语言的学习。
第 54 页 共 54 页
因篇幅问题不能全部显示,请点此查看更多更全内容