7、SCLK:
串行时钟,输入;
6、I/O:
数据输入输出口;
5、CE/RST:
复位脚
23、X1、X2是外接晶振脚(32.768KHZ的晶振)
4、地(GND)
3.3.3DS1302有关日历,时间的寄存器
表3-1
3.3.4DS1302与单片机接口电路
图3-3
由于DS1302是依靠外部晶振与其内部的电容配合来产生时钟脉冲,因为DS1302在芯片本身已经集成了6pF电容。
所以,为了获得稳定的可靠的时钟,必须选用具有6pF负载电容的晶振。
当它工作于所要求的负载电容时,所以要选用32768HZ的晶振。
石英晶振用12M,因为一个机器周期为1/12时钟周期,所以这样用12M的话,一个时钟周期为12us那么定时器计一次数就是1us了,电容范围是在20-40pf之间的都行。
表3-2
引脚号
DS1302
AT89C51
1
I/O
P1.0
2
SCLK
P1.1
3
RST
P1.2
3.4显示模块设计
液晶显示模块
方案
(1):
数码管是利用发光二极管的特性组合而成数字显示器件,通过控制相应的二极管的状态显示相应的数字。
要使数码管正常显示就得有驱动电路驱动相应的段码,数码管的现实方式可分为静态显示和动态显示,静态显示方式只适合显示单个的数字,因此本设计应采用动态显示方式。
由于动态显示方式利用的是人眼视觉暂留的特性,扫描的时间应不大于20毫秒,占用系统资源大,而且显示的个数和字型有限,在本设计中不易采用。
方案
(2):
LCD1602是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及点阵液晶显示器组成。
可完成字符显示,也可以显示16*2字。
该类液晶显示模块(即KS0108B及其兼容控制驱动器)的指令系统比较简单,总共只有七种。
关于行列和页的解释:
从上向下共2行,每一行为16字,汉字占32B,分左右两半,各占16B,根据在LCD上开始显示的行列号及每行的列数可以找到显示RAM对应的地址,设立光标,送上要显示的汉字的第一个字节,光标位置加一,送第二个字节,换行按列对齐。
综合比较上述两种方案,应采用LCD1602液晶组成本设计的显示模块。
3.4.1LCD1602的特性介绍
PG12864LCD是像素可寻址的图形液晶显示屏模块
芯片特性:
1.工作电压为4.5-5.5V,可自带驱动LCD所需的负电压。
2.全屏幕点阵,点阵数为16*2的字符的显示。
3.与CPU接口采用5条位控制总线和8位并行数据总线输入输出。
4.内部有显示数据锁存器,自带EL驱动。
5.简单的操作指令,显示开关设置,显示起始行设置,地址指针设置和数据读/写等指令。
3.4.2LCD1602引脚介绍
表3-3
管脚号
管脚名称
LEVER
管脚功能描述
1
VSS
0
电源地
2
VDD
+5.0V
电源电压
3
VL
-
液晶显示偏压
4
RS
H/L
RS=“H”表示选择数据寄存器
RS=“L”表示选择指令寄存器
5
R/W
H/L
R/W=“H”,E=“H”数据被读到DB7∽DB0R/W=“L”,E=“H→L”数据被写到IR或DR
6
E
H/L
R/W=“L”,E信号下降沿锁存DB7∽DB0R/W=“H”,E=“H”DDRAM数据读到DB7∽DB0
7
D0
H/L
数据线
8
D1
H/L
数据线
9
D2
H/L
数据线
10
D3
H/L
数据线
11
D4
H/L
数据线
12
D5
H/L
数据线
13
D6
H/L
数据线
14
D7
H/L
数据线
3.4.31602内部功能器件及相关功能
1.指令寄存器(IR)
指令寄存器负责存放单片机写给HD144780的指令,对IR的操作如下:
当RS=0,R/W,E引脚由1变为0,就会把D0到D7引脚的数据送入指令寄存器IR。
2.数据寄存器(DR)
DR负责存放单片机写给CGRAM与DDRAM的数据或从CGRAM与DDRAM的数据。
对DR的操作如下:
当RS=1,R/W=1,E=1,HD44780就会把数据送到D0到D7引脚上,供单片机读取。
当RS=1,R/W=0,E引脚信号由1变为0,HD44780就会把D0到D7引脚上的数据存入DR中
3.忙标志:
BF
BF标志提供内部工作情况。
BF=1表示模块在内部操作,此时模块不接受外部指令和数据。
BF=0时,模块为准备状态,随时可接受外部指令和数据。
4.显示数据RAM(DDRAM)
DDRAM是用来存放LCD要显示的数据,只要将点阵字符图形的代码送入DDRAM,内部的控制电路就会自动将数据传送到LCD显示屏上,如果想在第一行的第一个位置显示字符“0”,那么只要把字符“0”的代码送达DDRAM的0X80地址中,在显示屏就会出现一个字符“0”。
5.字符发生器(CGROM)
HD47780芯片内含一个CGROM,存储了160个不同的点阵字符图形,如数字、字母、中文等。
CGROM用来存储设计者自行设计个性化字符造型代码的RAM,共有512bit,一个5*7的字符体占用8*8bit,因此CGRAM最多只能存放8个自定义字符。
6.地址寄存器(AC)
AC是负责计算送DDRAM,CGRAM读出的地址,或者计算写到CGRAM,DDRAM数据的地址,当单片机对CGRAM,DDRAM进行操作时,AC会依照单片机对HD47780的操作自动修改地址的计数值。
LCD1602内嵌芯片HD47780的控制功能
表3-4
RS
R/W
E
D7-D0
说明
0
1
1
数据输出
读BF与AC的值
1
0
下降沿
数据输入
写数据
0
0
下降沿
数据输入
写指令代码
1
1
1
数据输出
读数据
3.4.41602液晶与单片机接口电路
图3-4
表3-5
引脚号
1602引脚
ATMEGA16引脚
1
数据线DB0-DB7
PB0-PB7
2
寄存器选择RS
PC0
3
写RW
PC1
4
使能端E
PC2
排阻的计算公式:
上拉电源/(硬件额定电流—单片机输出电流)
一、最大值的计算原则:
要保证上拉电阻明显小于负载的阻抗,以使高电平时输出有效。
例如:
负载阻抗是10K,供电电压是5V,如果要求高电平不小于4.5V,那么,上拉电阻最大值R大5-4.5)=10:
5
R大=1K
也就是最大值1k,(如果超过了1k,输出的高电平就小于4.5V了)
二、最小值的计算原则:
保证不超过管子的额定电流(如果不是场效应管而是三极管也可依照饱和电流来计算)
例:
管子的额定电流150mA,放大倍数100,基极限流电阻10k,工作在5v的系统中。
那么,算法如下:
Ib=U/R=(5-0.7)/10=0.47(mA)
Ic=100*0.47=47mA小于额定的150,所以可以按饱和法来算最小值。
上拉电阻最小值
R小=5v/47mA=106欧姆(如果小于这个电阻,管子就会过饱和而没有意义了。
如果大于这个值,管子的导体电阻就会变大一些,所以太高也不利于低电平的输出)
3.5设置模块
设置模块采用四个按键与PD连接
按键与单片机的接口电路
图3-5
按键的断开与闭合式由机械触点的动作实现。
由于机械的弹性作用在按键的断开与闭合过程中会产生抖动。
此抖动的脉冲会给单片机带来误判断,所以必须消除。
消除抖动可以从软件和硬件两方面入手。
本设计采用软件消除抖动,从按键断开到稳定闭合,此抖动的时间一般为5ms到10ms。
所以当单片机检测到有按键被按下时候,就延时一段时间。
单片机与键盘的连接方式可分为独立式,编码式,串口扩展式和矩阵式。
其中较为常用的有独立式和矩阵式。
本设计采用独立式按键,也就是每一个按键都与端口独立连接,每一个按键独立占一根输入线,一根输入线的工作状态不会影响其他按键。
独立式按键通过检测电平的状态可以很容易判断出有没有按键被按下。
独立式的电路配置灵活,软件算法简单。
3.6振荡电路
本设计芯片选用内部振荡器方式。
由于本设计的时间由内部定时器中断与软件计数相结合产生的,所以从计算方便以及系统的效率上考虑,本设计选用12MHz频率的晶振,电路原理图如下:
图3-6atmage16的振荡电路
经厂家推荐稳定电路的电容C1,C2=22uf,C3为10uf。
3.7复位电路
Atmega16有5个复位源:
上电复位、外部复位、看门狗复位、掉电检测复位及JTAG复位。
复位时所有的I/O寄存器都被设置为初始值,程序从复位向量开始执行。
本设计使用上电复位电路。
单片机晶振为12MHz,起振时间将近1ms,单片机2个机器周期的时间为2us。
单片机每次上电复位所需的最短延时应该不小于treset。
这里,treset等于上电延时与起振延时之和。
从实际上讲,延迟一个treset往往还不够,不能够保障单片机有一个良好的工作开端。
复位电路把单片机锁定在复位状态上并且维持一个延时(记作TRST),以便给予电源电压从上升到稳定的一个等待时间;在电源电压稳定之后,再插入一个延时,给予时钟振荡器从起振到稳定的一个等待时间;在单片机开始进入运行状态之前,还要至少推迟2个机器周期的延时间。
单片机是高电平的时候复位,一般是用电阻和电容组成的,电容充电的时RST复位端为高电平,此时单片机开始复位..电容充电完成,此时单片机复位完成。
由此电容值可取10uf,电阻值取10KΩ。
详细见附录文件(电容充电时间的计算方法.pdf)
图3-7Atmage上电复位电路
第四章系统软件设计
软件设计是本设计的关键,软件程序编写的好坏直接影响着系统运行情况的良好。
因本程序涉及的模块较多,所以程序编写也采用模块化设计,C语言具有编写灵活、移植方便、便于模块化设计的特点,所以本系统的软件采用Atmage16编写。
程序框图如下:
没有按键按下
初始化
显示界面
从DS1302读取信息
1602液晶显示相关信息
判断是否有按键按下
时间,日期设置模块
初始化
显示界面
从DS1302读取信息
1602液晶显示相关信息
判断是否有按键按下
4.1时钟函数模块
具体实现含有向DS1302串行写入一字节即DS1302writeByte,从DS1302读取一字节即DS1302OreadByte,从DS1302指定位置读数据Read1302,向DS1302某地址写入数据Write1302,设置时间set_clock,从DS1302获取时间(读取当前时间),get_time利用这些函数来实现时间,最终显示在液晶屏上,可以自行调整。
你可以显示系统时间,也可以显示调整时间,具体实现是设置时间函数。
4.1.1实现功能
能够显示年月日时分秒和星期,完成了24小时和12小时之间的切换,并设有闹钟,闹钟存放于EEPROM中,时间和星期以及闹钟均可调。
其中闹钟掉电数据不会丢失。
4.1.2函数设计
1:
voidDS1302writeByte(uchar_data)
(1)功能
向DS1302中写入一字节数据。
(2)依据
DS1302时序图(详见SD1302技术资料)可知,在启动DS1302时每产生一个下降沿可向DS1302中写入一位数据。
(3)右图为流程图:
2:
ucharDS1302OreadByte(void)
(1)功能
从DS1302中读取一字节数据。
(2)依据
DS1302时序图(详见SD1302技术资料)可知,在启动DS1302时每产生一个上升沿可向DS1302中
读取一位数据。
(3)右图为流程图:
3:
ucharRead1302(ucharucAddr)
(1)功能
从指定的地址中读取一字节数据。
(2)依据
DS1302时序图(详见SD1302技术资料)可知,在启动DS1302时每产生一个下降沿可向DS1302中写入一位数据。
在启动DS1302时每产生一个上升沿可向DS1302中读取一位数据。
(3)下图为流程图:
4:
voidWrite1302(ucharucAddr,ucharucDa)
(1)功能
向DS1302指定地址中写入一字节数据。
(2)依据
DS1302时序图(详见SD1302技术资料)可知,在启动DS1302时每产生一个下降沿可向DS1302中写入一位数据。
在启动DS1302时每产生一个上升
沿可向DS1302中读取一位数据。
(3)右图为流程图:
5:
voidaffirm_data(void)
(1)功能
输入数据入转换函数、将十进制转换成BCD码
(2)依据
转换公式。
(3)下图为流程图:
6:
voidget_time(uchar*time)
(1)功能
读取当前时间,并判断当前是12小时显示还是24小时显示。
(2)依据
通过对标志位的判断来确定当前为12小时制还是24小时制,如果为12小时时要将DS1302寄存器内相应位置1。
(3)右图为流程图:
7:
voidset_clock(void)
功能
向DS1302中写入初始时间,启动DS1302振荡器,判断上下午。
(1)依据
DS1302时序图(详见SD1302技术资料)。
8:
voidformat_datetime(uchard,uchar*a)
(1)功能
将数字转换成字符。
(2)依据
ASII码表。
9:
voidinit_1302(void)
功能
启动DS1302振荡器。
(1)依据
由DS1302的技术资料知,DS1302的秒寄存器的最高位为振荡器控制位,向该位置一即可启动振荡器
4.2显示函数模块
检测LCD是否忙rd_bf(),向LCD发送命令wr_dictate()向lcd发送数据wr_data()初始化1602显示init_lcd(),初始化1602显示屏show_function(通用显示函数)。
显示字符和汉字的字模是用相应的软件导出的,根据液晶显示屏的要求对时钟进行调整。
4.2.1实现功能
通过1602显示电子时钟
4.2.2函数设计
1:
voidrd_bf(void)
(1)功能
检测LCD是否忙碌
(2)依据
通过判断HD47780内部是否处于空闲状态等待单片机进行读写操作
2:
voidwr_dictate(uchardictate)
(1)功能