SCLK:
串行时钟输入端,控制数据的输入与输出
I/O:
三线接口时的双向数据线
CE:
输入信号,在读、写数据期间必须为高
3、DS1302使用方法
(1)时钟芯片DS1302工作原理
DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置“0”,接着把RST端置“1”,最后才给予SCLK脉冲;读/写时序如图5所示。
表2为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的控制字如表所示。
控制字节最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始传输
1
RAM
A4
A3
A2
A1
A0
RD
CK
WR
表1DS1302控制字
(3)数据输入输出(I/O)
在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。
同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。
其读写时序如图示
图2DS1302读写时序
(4)DS1302寄存器
DS1302中与时间、日期有关的寄存器共有12个,其中7个存放数据的格式为BCD码格式,其读写地址如下表所示
读寄存器
写寄存器
Bit7
Bit7
Bit7
Bit7
Bit7
Bit7
Bit7
Bit7
范围
81H
80H
CH
10秒
秒
00--59
83H
82H
10分
分
00--59
85H
84H
12
0
10
时
时
0--23
24
AM/PM
1--12
87H
86H
10日
日
1--31
89H
88H
10月
月
1--12
8BH
8AH
0
0
0
0
0
周
1--7
8DH
8CH
10年
年
00--99
8FH
8EH
WP
0
0
0
0
0
0
0
――
表2DS1302时钟寄存器
第一行秒寄存器,CH为时钟暂停标志位,该位为1时时钟停止,该位为0时时钟运行。
第二行分寄存器,bit0~bit6表示分钟数,因采用BCD编码,所以低四位最大能表示的数字为9,计数满向高三位进1。
第三行时寄存器,12/24用来定义DS1302小时的运行模式,12小时模式下bit5为1表示PM下午,bit5为0表示AM上午。
第八行控制寄存器,bit7是写保护位WP,当WP为1时,写保护位可防止对任一寄存器的写操作,在任何的对时钟和RAM的写操作之前,WP位必须为0
此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。
时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。
DS1302与RAM相关的寄存器分为两类:
一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
4、时钟集成模块内部原理图以及实物图
图3DS1302硬件图
3.2.2显示模块1602字符液晶以及显示模块介绍
1、1602液晶概述
工业字符型液晶,1602是指显示的内容为16*2,即能够同时显示两行,每行16个字符。
常见的1602字符液晶有两种,一种显示的是绿色背光黑色字体,另一种显示蓝色背光白色字体,目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的。
本课题所用1602液晶模块,显示屏是蓝色背光白色字体。
如图4所示
图4LCD封装图
2、1602引脚介绍
编号
符号
引脚说明
编号
符号
引脚说明
1
GND
电源地
2
VCC
电源正极
3
VO
液晶显示对比度调节端
4
RS
数据/命令选择端
5
R/W
读写选择
6
E
使能信号
7
D0
数据口
8
D1
数据口
9
D2
数据口
10
D3
数据口
11
D4
数据口
12
D5
数据口
13
D6
数据口
14
D7
数据口
15
BLA
背光电源正
16
BLK
背光电源负
表31602字符液晶引脚说明
各个引脚具体功能说明
第1脚:
GND为地电源。
第2脚:
VCC接5V正电源。
第3脚:
VO为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生重影,使用一个1K的电位器调整对比度。
第4脚:
RS为寄存器选择,高电平时选择数据寄存器,低电平时选择指令寄存器。
第5脚:
R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
DB0~DB7为8位双向数据线。
第15~16脚:
背光灯电源。
3、1602液晶使用方法
(1)基本操作时序
操作
输入
输出
读状态
RS=L,RW=H,E=H
D0~D7=状态字
写指令
RS=L,RW=L,D0~D7=指令码,E=高脉冲
无
读数据
RS=H,RW=H,E=H
D0~D7=数据
写数据
RS=H,RW=L,D0~D7=数据,E=高脉冲
无
图51602液晶读时序图
图61602液晶写时序图
(2)RAM
1602液晶控制器芯片内部带有80个8位的RAM缓冲区,其地址和屏幕的对应关系如图7示
图7
(3)1602字符液晶字库
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如下表所示,这些字符有:
阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。
高位
低位
0000
0010
0011
0100
0101
0110
0111
1010
1011
1100
1101
1110
1111
XXXX0000
⑴
0
@
P
\
p
-
タ
ミ
α
P
XXXX0001
⑵
!
1
A
Q
a
q
□
ア
チ
ム
ä
q
XXXX0010
⑶
“
2
B
R
b
r
┌
イ
ツ
メ
β
θ
XXXX0011
⑷
#
3
C
S
c
s
┘
ゥ
テ
モ
ε
∞
XXXX0100
⑸
$
4
D
T
d
t
\
ェ
ト
ャ
μ
Ω
XXXX0101
⑹
%
5
E
U
e
u
ロ
ォ
ナ
ュ
σ
o
XXXX0110
⑺
&
6
F
V
f
v
テ
カ
ニ
ョ
ρ
∑
XXXX0111
⑻
’
7
G
W
g
w
ア
キ
ヌ
ラ
ζ
ⅹ
XXXX1000
⑴
(
8
H
X
h
x
ィ
ク
ネ
リ
f
X
XXXX1001
⑵
)
9
I
Y
i
y
ウ
ケ
ノ
ル
-1
y
XXXX1010
⑶
*
:
J
Z
j
z
エ
コ
ハ
レ
ј
千
XXXX1011
⑷
+
;
K
[
k
{
オ
サ
ヒ
ロ
ҳ
万
XXXX1100
⑸
<
L
¥
l
|
セ
シ
フ
ヮ
ℓ
Π
XXXX1101
⑹
--
=
M
]
m
}
ユ
ス
ヘ
ソ
ŧ
÷
XXXX1110
⑺
。
>
N
^
n
→
ヨ
セ
ホ
ハ
ñ
XXXX1111
⑻
/
?
O
-
o
←
ツ
ソ
マ
ロ
ö
图8
4、时钟集成模块内部原理图以及实物图
图9LCD1602硬件图
3.2.3按键模块电子钟的调时模块
1、调时按键概述
电路通过按键对电路进行时间设置,电路的可调对象分别时年、月、日、时、分。
通过四个按键对电路进行调节。
一个按键K1控制电路调节对象的选择,当调节对象为年、月、日、时、分时液晶显示板上分别显示Y、M、D、H、M。
一个按键K2调节数字的加。
一个按键K3调节数字的减。
通过一个按键对所调节的时间进行写入确定。
按键程序的实现通过编写时间的读取函数voidDateTime(),调节时间对象的函数voidDateTime_Adjust();和中断函数,实现按键的功能。
2、调时模块原理图以及实物图
图10按键硬件图
四、系统电路图
图11电路硬件图
系统原理图如图,电路以STC89C52为最小系统控制核心,以时钟芯片DS1302提供时间计数,采用三线接口与CPU进行同步通信,实现单片机对DS1302时钟芯片的时间的读取和写入。
显示部分用1602LCD显示,1602通过控制RS、RW、E的管脚的高低电平对单片机进行状态的读取,指令的写入和数据的读取。
数据通过D0-D7口与单片机相连,进行数据的传输。
电路的输入调时部分通过四个独立的按键K1、K2、K3、K4,通过中断函数来控制按键通过单片机对DS1302时间的调节,包括调节对象的选择,数字的加1,数字的减1和时间的写入确定。
五、系统的软件设计
1、主程序部分
电子钟的时间计时有时钟芯片DS1302提供,通过液晶板显示,首先对DS1302及LCD进行初始化设置,调时功能用按键通过中断函数判断。
在住函数中Init_LCD();GetTime();inital_1302();为对DS1302和LCD的初始化和初值的写入,IE=0X83;允许INT0,T0的中断。
2、按键部分程序
电路通过4个按键来调时,按键只有在按下调节对象按钮后,其余按键才能实现其各自的共能。
首先判断控制调节对象的案件是否按下,选择其要调节的对象,在通过其他案件来对时间进行调节。
调时的中断函数用if-----else-----函数对按键按下先后控制以实现各个按键的功能。
if(K1==0),elseif(K2==0),elseif(K3==0),elseif(K4==0),来判断按键的动作。
3、DS1302时钟数据的读/写部分程序
Ds1302的读写时,要设置RST=0;CLK=0;RST=1,才可以对ds1302进行读写。
//从DS1302指定位置读数据
ucharRead_Data(ucharaddr)
{
uchardat;
RST=0;CLK=0;RST=1;
Write_A_Byte_TO_DS1302(addr);
dat=Get_A_Byte_FROM_DS1302();
CLK=1;RST=0;
returndat;
}
//向DS1302某地址写入数据
voidWrite_DS1302(ucharaddr,uchardat)
{
RST=0;CLK=0;RST=1;
Write_A_Byte_TO_DS1302(addr);
Write_A_Byte_TO_DS1302(dat);
CLK=1;RST=0;
}
4、LCD的控制程序
要进行读取LCD状态时,设置RS=L,RW=H,E=H。
ucharRead_LCD_State()
{
ucharstate;
RS=0;RW=1;EN=1;
DelayMS
(1);
state=P0;EN=0;
DelayMS
(1);
returnstate;
}
要向LCD写数据时,RS=H,RW=L,D0~D7=数据,E=高脉冲。
voidWrite_LCD_Data(uchardat)
{
LCD_Busy_Wait();
RS=1;RW=0;EN=0;P0=dat;EN=1;DelayMS
(1);EN=0;
}
要向LCD写指令时,RS=L,RW=L,D0~D7=指令码,E=高脉冲。
voidWrite_LCD_Command(ucharcmd)
{
LCD_Busy_Wait();
RS=0;RW=0;EN=0;P0=cmd;EN=1;DelayMS
(1);EN=0;
}
//LCD初始化
voidInit_LCD()
{
Write_LCD_Command(0x38);DelayMS
(1);
Write_LCD_Command(0x01);DelayMS
(1);
Write_LCD_Command(0x06);DelayMS
(1);
Write_LCD_Command(0x0c);DelayMS
(1);
}
六、结论
通过上述程序和硬件的制作,电子钟的显示如图(12),
图12电子钟
调整时间:
在调节对象为年时,液晶板右下角显示Y。
如图(13)
图13调整对象为年
调整时间:
在调节对象为月时,液晶板右下角显示M。
如图(14)
图14调整对象为月
调整时间:
在调节对象为日时,液晶板右下角显示D。
如图(15)
图15调整对象为天
调整时间:
在调节对象为小时时,液晶板右下角显示H。
如图(16)
图16调整对象为小时
调整时间:
在调节对象为分时,液晶板右下角显示M。
如图(17)
图17调整对象为分钟
时间调整完成,写入DS1302,液晶读取显示。
如图(18)
图18调时后时间确定
结论:
通过此次的电子钟的课程设计,基本实现当初设想的80%的功能,为电子日历,电子钟的显示,时间的调整功能。
由于自己后面的时间把握不好,没有实现当初设想的闹铃的功能。
在程序下载到板是出现了液晶板第二行的头尾出现乱码显示,出现了显示不足,但并不影响电子钟的功能。
七、课程设计过程中遇到的主要问题以及解决办法
1、在程序的学习、编写过程中,会因为对程序的功能的不熟悉和对函数的各个模块的整合的不了解给程序的编译和仿真不能正常工作。
2、在硬件的制作的过程中,在protel的原理图绘制中,由于对LCD的管脚不是很了解,在画板是管脚画错了,给调试带来了麻烦。
3、PCB制板中,由于对protel的不是很熟练,和电路原件的封装的绘制的误差等给电路的焊接造成了麻烦。
4、电路焊接后,通过对软件的载入,发现并不能实现电子钟的所有功能,时间不走等情况。
然而通过自己的学习和同学们的帮助,特别是在老师的指导下,不管是软件的学习还是硬件的调试,问题都在最后很好的得到了解决,让自己更深入的认识了自己的不足和团队的力量。
八、心得体会
在本次的课程设计中,是在上学期基础上的进一步对单片机的学习和进行产品的设计,通过这学期对所做的课题的程序及硬件电路的分析下,让自己更加的深入的了解了单片机的作用。
虽然是在有基础的情况下进行的课题题设计,但也不是一帆风顺的,由于自己当初对程序的学习不是很到位,加上一段时间的没去学习单片机,使自己在许多的知识都开始陌生了,软件的使用,程序的分析都不能遂心应手。
所以在这次的课程设计中也让自己对资料和课本上的知识的再次学习,最后也完成了程序的编写,也让自己更加深入的理解了以前没学到的知识,自己对单片机有了更深一层的认识。
在这个过程中让自己再次熟悉了keil,proteus,protel等软件的运用,及在编译调试程序过程中对程序的作用的进一步理解。
当然此次课程设计不仅让自己学习到了书本上的知识,也让我们知道了知识在实际生活中的应用。
更让自己看到了自己在课程设计过程中所表现出来的各种不良的心态,和有时的过分的相信自己。
让自己找到了自身的问题所在,给以后的学习和生活找到了方向。
附录
1、Keil源程序:
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitSAD=P1^0;
sbitCLK=P1^1;
sbitRST=P1^2;
sbitRS=P2^0;
sbitRW=P2^1;
sbitEN=P2^2;
sbitK1=P3^4;
sbitK2=P3^5;
sbitK3=P3^6;
sbitK4=P3^7;
uchartCount=0;
ucharMonthsDays[]={0,31,0,31,30,31,30,31,31,30,31,30,31};
uchar*WEEK[]={"SUN","MON","TUS","WEN","THU","FRI","SAT"};
ucharLCD_DSY_BUFFER1[]={"DATE00-00-00"};
ucharLCD_DSY_BUFFER2[]={"TIME00:
00:
00