您的当前位置:首页正文

单片机课程设计-----基于DS1302的电子钟设计

2022-10-05 来源:欧得旅游网
单片机课程设计

设计题目:基于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 页

因篇幅问题不能全部显示,请点此查看更多更全内容