资源描述
单片机数字时钟课程设计
课 程 设 计 (报 告)
课 程 设 计 题 目: 数字时钟
学 院 名 称: 电子与信息工程学院
专 业: 电气工程及其自动化
班 级:
姓 名: 学 号
指 导 教 师:
日 期: 2012.12.29~2013.01.11
21
单片机数字时钟课程设计
一. 课程设计任务
1.用80C51设计一个数字时钟
2.可显示时、分、秒
3.按键实现时、分、秒人工校准
二.总体方案
本次课程设计选用通用的80C51芯片,显示单元为实验箱的液晶1602显示单元,选用DS1302时钟芯片,利用矩阵键盘进行调时。
1.80C51简介
虽然目前单片机的品种很多,但其中最具代表性的当属Intel公司的MCS-51单片机系列。MCS-51以其典型的结构、完善的总线、SFR的集中管理模式、位操作系统和面向控制功能的丰富的指令系统,为单片机的发展奠定了良好的基础。MCS-51系列的典型芯片是80C51(CHMOS型的8051)。为此,众多的厂商都介入了以80C51为代表的8位单片机的发展,如Philips、Siemens(Infineon)、Dallas、ATMEL等公司,我们把这些公司生产的与80C51兼容的单片机统称为80C51系列。特别是在近年来,80C51系列又有了许多发展,推出了一些新产品,主要是改善单片机的控制功能,如内部集成了高速I/O口、ADC、PWM、WDT等,以及低电压、微功耗、电磁兼容、串行扩展总线和控制网络总线性能等。 单片机内部结构图为如图所示
80C51单片机管脚说明
VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为80C51的一些特殊功能口,如下所示:
口管脚
备选功能
P3.0 RXD
串行输入口
P3.1 TXD
串行输出口
P3.2 /INT0
外部中断0
P3.3 /INT1
外部中断1
P3.4 T0
记时器0外部输入
P3.5 T1
记时器1外部输入
P3.6 /WR
外部数据存储器写选通
P3.7 /RD
外部数据存储器读选通
2. 时钟芯片DS1302简介:
DS1302[1]是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽达2.5~5.5V。时钟可工作在24小时格式或12小时(AM/PM)格式。 DS1302与单片机的接口使用同步串行通信,仅用3条线与之相连接。可采用一次传送一个字节或突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。
2.1. DS1302引脚功能与内部结构
DS1302的引脚功能如表1所示,外形及内部结构如图1所示[2]:
引脚号
引脚名称
功能
1
VCC2
主电源
2、3
X1、X2
振荡源,外接32768Hz晶振
4
GND
地线
5
RST
复位/片选线
6
I/O
串行数据输入/输出端(双向)
7
SCLK
串行时钟输入端
8
VCC1
后备电源
表1 DS1302引脚功能表
图1 DS1302管脚图及内部结
2.2 DS1302的控制字DS1302的控制字节如图2所示:
7 6 5 4 3 2 1 0
1
RAM
A4
A3
A2
A1
A0
RAM
图2 DS1302控制字节的含义控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。
2.3 DS1302的复位引脚
通过把输入驱动置高电平来启动所有的数据传送。 输入有两种功能:首先,接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,提供了终止单字节或多字节数据的传送手段。当为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中置为低电平,则会终止此次数据传送,并且I/O引脚变为高阻态。上电运行时,在Vcc≥2.5V之前,必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。
2.4 DS1302的数据输入输出
在控制指令字输入后的下一个SCLK时钟的上升沿时数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位至高位7,数据读写时序如图3所示:
图3 数据读写时序
2.5 DS1302的寄存器
DS1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。其日历、时间寄存器及其控制字见表2。此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器的内容。 DS1302与RAM相关的寄存器分为两类,一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H--FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)
DS1302内部寄存器列表如表所示:
寄存器名称
命令字
取值范围
各位内容
写
读
7
6
5
4
3
2
1
0
秒寄存器
80H
81H
00-59
CH
10SEC
SEC
分寄存器
82H
83H
00-59
0
10MIN
MIN
小时寄存器
84H
85H
01-12或00-23
12/24
0
A
HR
HR
日期寄存器
86H
87H
01-28,29,30,31
0
0
10DATE
DATE
月份寄存器
88H
89H
01-12
0
0
0
10M
MONTH
周寄存器
8AH
8BH
01-07
0
0
0
0
0
DAY
年份寄存器
8CH
8DH
00-99
10YEAR
YEAR
3.LCD1602液晶显示简介:
LCD1602通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,引脚定义如下表所示:
4. 矩阵键盘
矩阵键盘如实验图所示,H1接地,L1、L2、L3、L4分别控制时钟的调时。其中L1为调设置键,L2为加键,L3为减键,L4为调时确定键。
三.硬件设计部分
1. 硬件设计流程图:
80C51
仿真单元
DS1302
时钟芯片
矩阵键盘
调时控制
液晶显示单元
2. 实验原理图:
四. 软件设计部
1.软件设计流程图:
开始
液晶初始化
DS1302初始化
调整模块
检测按键
液晶显示
DS18B20初始化
Y N
实验程序代码:
RW BIT P2.1
RS BIT P2.0
E BIT P2.7
SCLK BIT P0.1
SIO BIT P0.0
RST BIT P0.2
YH EQU 80H
EH EQU 0C0H
ORG 0000H
JMP MAIN
ORG 0040H
MAIN: MOV 30H,#00H ;30H~36H存放 时分秒日月星期年
MOV 31H,#00H
MOV 32H,#00H
MOV 33H,#01H
MOV 34H,#01H
MOV 35H,#02H
MOV 36H,#13H
MOV 37H,#00H ;37H存放 设置键按了几下
CALL LCDINIT ;调用1602初始化
CALL DSINIT ;调用1302初始化
ST1: MOV A,37H
JNZ ST2 ;查看设置有没有被按
CALL READ ;读1302内容对应存入30H~36H
CALL XS ;读30H~36H在1602中显示
ST2: CALL KEYHN ;查看有没有按下的
JZ ST1
HAVE: CALL D100MS ;延迟 去抖动
CALL KEYHN ;再查看按键
JNZ TRUE ;真的有按下
TRUE: JB ACC.3,K1 ;跳到k1对应有设置键的内容
JB ACC.4,K2 ;+1
JB ACC.5,K3 ;-1
JB ACC.6,K4 ;确定
JMP ST1
K1: INC 37H ;增加按的次数
MOV R4,37H
CJNE R4,#1,L2
L1: MOV A,#YH+3 ;按1下对应年的位置
CALL WRC
MOV A,#0FH ;1602的光标设置为闪烁
CALL WRC
JMP ST1
L2: CJNE R4,#2,L3 ;2下月的位置
MOV A,#YH+6
CALL WRC
JMP ST1
L3: CJNE R4,#3,L4 ;日期的
MOV A,#YH+9
CALL WRC
JMP ST1
L4: CJNE R4,#4,L5 ;星期的
MOV A,#YH+0DH
CALL WRC
JMP ST1
L5: CJNE R4,#5,L6 ;时
MOV A,#EH+3
CALL WRC
JMP ST1
L6: CJNE R4,#6,L7 ;分
MOV A,#EH+6
CALL WRC
JMP ST1
L7: CJNE R4,#7,L8 ;秒
MOV A,#EH+9
CALL WRC
JMP ST1
L8: MOV A,#0CH ;返回
CALL WRC
MOV 37H,#00H ;光标去闪烁
CALL DSINIT ;1302初始化
JMP ST1
K2: MOV R4,37H
CALL JIA ;调用加1的子程序
CALL XS ;1602显示
CALL GB ;把光标显示位 确定在设置位上
JMP ST1
K3: MOV R4,37H
CALL JIAN ;减的 以下同理
CALL XS
CALL GB
JMP ST1
K4: MOV 37H,#00H ;37H内容归零=返回
MOV A,#0CH ;去光标
CALL WRC
CALL DSINIT ;1302初始化
JMP ST1
D100MS: MOV R5,#100 ;延迟子程序
D1MS: MOV R4,#249
DL: NOP
NOP
DJNZ R4,DL
DJNZ R5,D1MS
RET
KEYHN: MOV P3,#78H ;按键查看子程序
MOV A,P3
CPL A
ANL A,#78H
RET
LCDINIT: ;1602初始化子程序
MOV A,#01H ;清屏
CALL WRC
MOV A,#38H ;设置液晶工作模式16*2行显示5*7点阵8位数据
CALL WRC
MOV A,#0CH ;开显示不显示光标
CALL WRC
MOV A,#06H ;整屏不移动,光标自动右移
CALL WRC
MOV A,#YH ;显示位置 在1602第一行首 YH=80H
CALL WRC
MOV A,#32H ;以下为在第一行显20 — -
CALL WRD
MOV A,#30H
CALL WRD
MOV A,#20H
CALL WRD
MOV A,#20H
CALL WRD
MOV A,#2DH
CALL WRD
MOV A,#20H
CALL WRD
MOV A,#20H
CALL WRD
MOV A,#2DH
CALL WRD
MOV A,#20H
CALL WRD
MOV A,#20H
CALL WRD
MOV A,#EH+2 ;以下在第二显 : :
CALL WRC
MOV A,#20H
CALL WRD
MOV A,#20H
CALL WRD
MOV A,#3AH
CALL WRD
MOV A,#20H
CALL WRD
MOV A,#20H
CALL WRD
MOV A,#3AH
CALL WRD
MOV A,#20H
CALL WRD
MOV A,#20H
CALL WRD
CALL XS
RET
XS: CALL WRITEYEAR
CALL WRITEWEEK
CALL WRITEY
CALL WRITER
CALL WRITES
CALL WRITEF
CALL WRITEM
CBUSY: PUSH ACC ;检查忙
PUSH DPH
PUSH DPL
PUSH PSW
WEIT: CLR RS
SETB RW
CLR E
SETB E
MOV A,P1
CLR E
JB ACC.7,WEIT
POP PSW
POP DPL
POP DPH
POP ACC
CALL DELAY
RET
WRC: CALL CBUSY ;写命令字
CLR E
CLR RS
CLR RW
SETB E
MOV P1,A
CLR E
CALL DELAY
RET
WRD: CALL CBUSY ;写数据
CLR E
SETB RS
CLR RW
SETB E
MOV P1,A
CLR E
CALL DELAY
RET
DELAY: MOV R7,#5
LP1: MOV R6,#0F8H
DJNZ R6,$
DJNZ R7,LP1
RET
WRB: MOV 40H,#8H ;1302写命令字
LPW: MOV A,B
RRC A
MOV B,A
MOV SIO,C
SETB SCLK
CLR SCLK
DJNZ 40H,LPW
RET
RDB: MOV 40H,#8 ;读数据
LPR: MOV C,SIO
RRC A
SETB SCLK
CLR SCLK
DJNZ 40H,LPR
RET
READ: MOV R0,#30H ;读数据 存放在30H~36H
MOV R7,#7
MOV R1,#81H
LOOP2: CLR RST
CLR SCLK
SETB RST
MOV B,R1
CALL WRB
CALL RDB
MOV @R0,A
INC R0
INC R1
INC R1
SETB SCLK
CLR RST
DJNZ R7,LOOP2
RET
DSINIT: CLR RST ;1302初始化子程序
CLR SCLK
SETB RST
MOV B,#8EH
CALL WRB
MOV B,#00H
CALL WRB
SETB SCLK
CLR RST
MOV R0,#30H
MOV R7,#7
MOV R1,#80H
LOOP: CLR RST
CLR SCLK
SETB RST
MOV B,R1
CALL WRB
MOV A,@R0
MOV B,A
CALL WRB
INC R0
INC R1
INC R1
SETB SCLK
CLR RST
DJNZ R7,LOOP
RET
WRITES: MOV A,#EH+2 ;1602显示写时
CALL WRC
MOV A,32H
MOV B,#10H
DIV AB
ADD A,#30H
CALL WRD
MOV A,B
ADD A,#30H
CALL WRD
RET
WRITEF: MOV A,#EH+5 ;1602显示写分
CALL WRC
MOV A,31H
MOV B,#10H
DIV AB
ADD A,#30H
CALL WRD
MOV A,B
ADD A,#30H
CALL WRD
RET
WRITEM: MOV A,#EH+8 ;1602显示写秒
CALL WRC
MOV A,30H
MOV B,#10H
DIV AB
ADD A,#30H
CALL WRD
MOV A,B
ADD A,#30H
CALL WRD
RET
WRITEY: MOV A,#YH+5 ;1602显示写月
CALL WRC
MOV A,34H
MOV B,#10H
DIV AB
ADD A,#30H
CALL WRD
MOV A,B
ADD A,#30H
CALL WRD
RET
WRITER: MOV A,#YH+8 ;1602显示写日
CALL WRC
MOV A,33H
MOV B,#10H
DIV AB
ADD A,#30H
CALL WRD
MOV A,B
ADD A,#30H
CALL WRD
RET
WRITEYEAR: ;1602显示写年
MOV A,#YH+2
CALL WRC
MOV A,36H
MOV B,#10H
DIV AB
ADD A,#30H
CALL WRD
MOV A,B
ADD A,#30H
CALL WRD
RET
WRITEWEEK: ;写星期
MOV A,#YH+0DH
CALL WRC
MOV A,35H
MON: CJNE A,#1,TUE
MOV A,#4DH
CALL WRD
MOV A,#4FH
CALL WRD
MOV A,#4EH
CALL WRD
MOV A,35H
TUE: CJNE A,#2,WED
MOV A,#54H
CALL WRD
MOV A,#55H
CALL WRD
MOV A,#45H
CALL WRD
MOV A,35H
WED: CJNE A,#3,THU
MOV A,#57H
CALL WRD
MOV A,#45H
CALL WRD
MOV A,#44H
CALL WRD
MOV A,35H
THU: CJNE A,#4,FRI
MOV A,#54H
CALL WRD
MOV A,#48H
CALL WRD
MOV A,#55H
CALL WRD
MOV A,35H
FRI: CJNE A,#5,SAT
MOV A,#46H
CALL WRD
MOV A,#52H
CALL WRD
MOV A,#49H
CALL WRD
MOV A,35H
SAT: CJNE A,#6,SUN
MOV A,#53H
CALL WRD
MOV A,#41H
CALL WRD
MOV A,#54H
CALL WRD
MOV A,35H
SUN: MOV A,#53H
CALL WRD
MOV A,#55H
CALL WRD
MOV A,#4EH
CALL WRD
RET
JIA: CJNE R4,#0,J1 ;设置内容+1子程序 没有按就返回扫描键盘
RET
J1: CJNE R4,#1,J2 ;以下分别都是先判断是不是边界数是回到可能的初值
MOV A,36H ;再判断个位是否为9是+7 不是+1
ANL A,#0FH
CJNE A,#9,JW1
MOV A,#07H
ADD A,36H
MOV 36H,A
RET
JW1: INC 36H
RET
J2: CJNE R4,#2,J3
MOV A,34H
CJNE A,#12H,JWW1
MOV 34H,#01H
RET
JWW1: ANL A,#0FH
CJNE A,#9,JW2
MOV A,#07H
ADD A,34H
MOV 34H,A
RET
JW2: INC 34H
RET
J3: CJNE R4,#3,J4
MOV A,33H
CJNE A,#31H,JWW2
MOV 33H,#01H
RET
JWW2: ANL A,#0FH
CJNE A,#9,JW3
MOV A,#07H
ADD A,33H
MOV 33H,A
RET
JW3: INC 33H
RET
J4: CJNE R4,#4,J5
MOV A,35H
CJNE A,#7,JWW3
MOV 35H,#01H
RET
JWW3: INC 35H
RET
J5: CJNE R4,#5,J6
MOV A,32H
CJNE A,#23H,JWW4
MOV 32H,#00H
RET
JWW4: ANL A,#0FH
CJNE A,#9,JW4
MOV A,#07H
ADD A,32H
MOV 32H,A
RET
JW4: INC 32H
RET
J6: CJNE R4,#6,J7
MOV A,31H
CJNE A,#59H,JWW5
MOV 31H,#00H
RET
JWW5: ANL A,#0FH
CJNE A,#9,JW5
MOV A,#07H
ADD A,31H
MOV 31H,A
RET
JW5: INC 31H
RET
J7: MOV A,30H
CJNE A,#59H,JWW6
MOV 30H,#00H
RET
JWW6: ANL A,#0FH
CJNE A,#9,JW6
MOV A,#07H
ADD A,30H
MOV 30H,A
RET
JW6: INC 30H
RET
JIAN: CJNE R4,#0,D1 ;设置位减—1的子程程序 原理同上
RET
D1: CJNE R4,#1,D2
MOV A,36H
CJNE A,#0,DW1
MOV 36H,#99H
RET
DW1: ANL A,#0FH
JZ DWW1
DEC 36H
RET
DWW1: MOV A,36H
SUBB A,#07H
MOV 36H,A
RET
D2: CJNE R4,#2,D3
MOV A,34H
CJNE A,#1,DW2
MOV 34H,#12H
RET
DW2: ANL A,#0FH
JZ DWW2
DEC 34H
RET
DWW2: MOV A,34H
SUBB A,#07H
MOV 34H,A
RET
D3: CJNE R4,#3,D4
MOV A,33H
CJNE A,#01H,DW3
MOV 33H,#31H
RET
DW3: ANL A,#0FH
JZ DWW3
DEC 33H
RET
DWW3: MOV A,33H
SUBB A,#07H
MOV 33H,A
RET
D4: CJNE R4,#4,D5
MOV A,35H
CJNE A,#1,DWW4
MOV 35H,#07H
RET
DWW4: DEC 35H
RET
D5: CJNE R4,#5,D6
MOV A,32H
CJNE A,#00H,DW5
MOV 32H,#23H
RET
DW5: ANL A,#0FH
JZ DWW5
DEC 32H
RET
DWW5: MOV A,32H
SUBB A,#07H
MOV 32H,A
RET
D6: CJNE R4,#6,D7
MOV A,31H
CJNE A,#00H,DW6
MOV 31H,#59H
RET
DW6: ANL A,#0FH
JZ DWW6
DEC 31H
RET
DWW6: MOV A,31H
SUBB A,#07H
MOV 31H,A
RET
D7: MOV A,30H
CJNE A,#00H,DW7
MOV 30H,#59H
RET
DW7: ANL A,#0FH
JZ DWW7
DEC 30H
RET
DWW7: MOV A,30H
SUBB A,#07
展开阅读全文