基于单片机实时钟设计毕业设计Word文档格式.docx
《基于单片机实时钟设计毕业设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于单片机实时钟设计毕业设计Word文档格式.docx(39页珍藏版)》请在冰豆网上搜索。
能以3V的超低压工作;
同时也与MCS-51系列单片机完全兼容。
该芯片内部存储器为8KBROM存储空间,同样具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。
所以选择采用AT89S52作为主控制系统.
2.3.3显示模块的选择方案
采用LED数码管动态扫描,LED数码管价格适中,对于显示数字最合适,而且采用动态扫描法与单片机连接时,占用的单片机口线少。
所以采用了LED数码管作为显示。
I2C串行接口,提供键盘中断信号,方便与处理器接口。
可驱动8位共阴数码管或64只独立LED和64个按键。
可控扫描位数,可控任一数码管闪烁。
8个功能键,可检测任一键的连击次数。
无需外接元件即直接驱LED,可扩展驱动电流和驱动电压。
2.3.4时钟芯片的选择方案
采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,位的RAM做为数据暂存区,工作电压2.5V~5.5V范围内,2.5V时耗电小于300nA。
2.4系统设计的具体实现
本电路是由AT89S52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作。
时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。
采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31*8的用于临时性存放数据的RAM寄存器。
可产生年、月、日、周日、时、分、秒,具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能。
在每个显示刷新周,ZLG7290按照扫描位数寄存器(ScanNum)指定的显示位数N,把显示缓存DpRam0~DpRamN的内容按先后循序送入LED驱动器实现动态显示,减少N值可提高每位显示扫描时间的占空比,以提高LED亮度,显示缓存中的内容不受影响。
2.4.1单片机主控制模块的设计
AT89S52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3,MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。
单片机的最小系统如下图所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出.第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,20引脚为接地端,40引脚为电源端。
如图-1所示
图-1最小系统原理
2.4.2时钟电路模块的设计
图-2示出DS1302的引脚排列,其中Vcc1为后备电源,Vcc2为主电源。
在主电源关闭的情况下,也能保持时钟的连续运行。
DS1302由Vcc1或Vcc2两者中的较大者供电。
当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。
当Vcc2小于Vcc1时,DS1302由Vcc1供电。
X1和X2是振荡源,外接32.768KHz晶振。
RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
RST输入有两种功能:
首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;
其次,RST提供终止单字节或多字节数据的传送手段。
当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。
如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。
上电动行时,在Vcc大于等于2.5V之前,RST必须保持低电平。
只有在SCLK为低电平时,才能将RST置为高电平,I/O为串行数据输入端(双向)。
SCLK始终是输入端。
图-2DS1302的引脚图
2.4.3显示模块的设计
图-3示出ZLG7290的引脚排列,Dig7~Dig0为输入/输出端,由LED显示位驱动及键盘扫描线。
SegH~SegA为输入/输出端,由LED显示段驱动及键盘扫描线。
SDA为输入/输出端,是I2C总线接口数据/地址线。
SCL为输入端,是I2C总线接口时钟线。
/INT是中断输出端,低电平有效。
/RES是复位输入端,低电平有效。
OSC1、OSC2是连接晶体以产生内部时钟。
11引脚为接地端,16引脚为电源端。
图-3ZLG7290的引脚图
2.4.4DS1302电路原理及说明
(1)、时钟芯片DS1302的工作原理:
串行时钟芯片主要由寄存器、控制寄存器、振荡器、实时时钟以及RAM组成。
为了对任何数据传送进行初始化,需要将/RST置为高电平且将8位地址和命令信息装入移位寄存器。
数据在SCLK的上升沿串行输入,前8位指定访问地址,命令字装入移位寄存器后,在之后的时钟周期,读操作时输出数据,写操作时输入数据。
时钟脉冲的个数在单字节方式下为8加8(8位地址加8位数据),在多字节方式下为8加最多可达248的数据。
(2)、DS1302的控制命令字节与寄存器
a、控制命令字节
控制命令字节结构如下:
RAMRD
1/CKA4A3A2A1A0/WR
表1
控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中;
位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;
位5至位1指示操作单元的地址;
最低有效位(位0)为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。
b、日历、时钟寄存器
DS1302共有12个寄存器,其中有7个寄存器与日历、时钟有关,存放的数据位为BCD码形式。
其日历、时间寄存器及控制字如以下表所示。
寄存器的选择根据命令字而定,其中日历、时钟各个寄存器与控制字对照表如表2所示。
寄存器名称
7
6
5
4
3
2
1
RAW/CK
A4
A3
A2
A1
A0
RW//W
秒寄存器
分寄存器
小时寄存器
日寄存器
月寄存器
星期寄存器
年寄存器
写保护寄存器
慢充电寄存器
时间突发寄存器
表2
最后一位RD//W为0表示要进行写操作,为1表示进行读操作。
表3为主要寄存器命令字、取值范围以及各位内容对照表。
寄存器名
命令字
取值范围
各位内容
写操作
读操作
3~0
80H
81H
00~59
CH
10SEC
SEC
82H
83H
10MIN
MIN
时寄存器
84H
85H
01~12或00~23
12、24
10÷
A/P
HR
86H
87H
01~28,29,30,31
10DATE
DATE
88H
89H
01~12
10M
MONTH
周寄存器
8AH
8BH
01~07
DAY
8CH
8DH
01~99
10YEAR
YEAR
8EH
8FH
WP
90H
91H
TCS
DS
RS
时钟突发寄存器
BEH
BFH
表3
其中有些特殊位需要特别指出:
CH:
时钟暂停位,当此位设置为1时,振荡器停止,DS1302处于低功率的备份方式;
当此位变为0时,时钟开始启动。
12/24:
12或24小时方式选择位,为1时选择12小时方式。
在12小时方式下,位5是AM/PM选择位,此位为1时表示PM。
在24小时方式下,位5是第2个小时位(20-23时)。
WP:
写保护位,写保护寄存器的开始7位(0~6)置为0,在读操作时总是读出0。
在对时钟或RAM进行写操作之前,位7(WP)必须为0,当它为高电平时,写保护位防止对任何其他寄存器进行写操作。
TCS:
控制慢充电的选择,为了防止偶然因素始DS1302工作,只有1010模式才能使慢速充电工作。
DS:
二极管选择位。
如果DS为01,那么选择一个二极管;
如果DS为10,则选择两个二极管。
如果DS为11或00,那么充电器被禁止,与TS无关。
RS:
选择连接在Vcc2与Vcc1之间的电阻,如果RS为00,那么充电器被禁止,与TS无关。
选择的电阻如表4所示。
RS位
电阻器
典型值
00
无
01
R1
2k欧
10
R2
4k欧
11
R3
8k欧
表4
c、RAM寄存器
DS1302与RAM相关的寄存器分为两类,一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字位C0H~FDH,其中奇数为读操作,偶数为写操作;
另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31字节,命令控制字为FEH(写)、FFH(读)。
RAM区寄存器与控制字对照表如表5所示。
RAM//CK
RD//W
RAM0
RAM1
………
…
RAM30
RAM突发
表5
(3)、复位和时钟控制
通过将、/RST输入驱动置高电平来启动所有的数据传送。
/RST输入有两种功能:
首先,/RST接通控制逻辑,允许地址/命令序列送入移位寄存器;
其次,/RST提供了终止单字节或多字节数据的传送手段。
当/RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。
如果在传送过程中置/RST为低电平,则会终止此次数据传送,并且I/O引脚变为高阻态。
上电运行时,在Vcc大于等于2.5V之前,/RST必须保持低电平。
只有在SCLK为低电平时,才能将RST置为高电平。
(4)、数据输入输出(I/O)
在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。
同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。
如下图-4所示
图-4DS1302读/写时序图
2.4.5动态扫描芯片ZLG7290的工作原理
(1)、键盘部分
ZLG7290可采样64个按键或传感器,可检测每个按键的连击次数。
其基本功能如下:
a、键盘去抖动处理
当键被按下和放开时,可能会出现电平状态反复变化,称作键盘抖动。
若不作处理会引起按键盘命令错误,所以要进行去抖动处理,以读取稳定的键盘状态为准。
b、双键互锁处理
当有两个以上按键被同时按下时,ZLG7290只采样优先级高的按键(优先顺序为S1>
S2>
…>
S64,如同时按下S2和S18采样到S2)。
c、连击键处理
当某个按键按下时,输出一次键值后,如果该按键还未释放,该键值连续有效,就像连续压按该键一样,这种功能称为连击。
连击次数计数器(RepeatCnt)可区别出单击(某些功能不允许连击,如开/关)或连击。
判断连击次数可以检测被按时间,以防止某些功能误操作(如连续按5秒经入参数设置状态)。
d、功能键处理
功能键能实现2个以上按键同时按下来扩展按键数目或实现特殊功能。
如PC机
的“Shift”“Ctrl”、“Alt”键。
(2)、显示部分
ZLG7290提供两种控制方式:
寄存器映象控制和命令解释控制,如上述对显示部分的控制,寄存器映象控制是指直接访问底层寄存器,实现基本控制功能,这些寄存器须字节操作。
命令解释控制是指通过解释命令缓冲区(CmdBuf0~CmdBuf1)中的指令,间接访问底层寄存器实现扩展控制功能。
如实现寄存器的位操作;
对显示缓存循环,移位;
对操作数译码等操作。
(3)、寄存器详解
系统状态部分:
系统寄存器(SystemReg):
地址00H,复位值11110000B。
系统寄存器保存ZLG7290系统状态,并可对系统运行状态进行配置,其功能分位描述如下:
KeyAvi(Systemeg.0):
置1时表示有效的按键动作(普通键的单击,连击,和功能键状态变化),/INT引脚信号有效(变为低电平);
清0表示无按键动作,/INT引脚信号无效(变为高阻态)。
有效的按键动作消失后或读Key后,KeyAvi位自动清0。
键盘部分:
a、键值寄存器(Key):
地址01H,复位值00H。
Key表示被压按键的键值。
当Key=0时,表示没有键被压按。
b、连击次数计数器(RepeatCnt):
地址02H,复位值00H。
RepeatCnt=0时,表示单击键。
RepeatCnt大于0时,表示键的连击次数。
用于区别出单击键或连击键,判断连击次数可以检测被按时间。
c、功能键寄存器(FunctionKey):
地址03H,复位值0FFH。
FunctionKey对应位的值=0表示对应功能键被压按(FunctionKey.7FunctionKey.0对应S64~S57)。
命令接口部分:
命令缓冲区(CmdBuf0~CmdBuf1):
地址07H~08H,复位值00H~00H。
用于传输指令。
显示部分:
a、闪烁控制寄存器(FlashOnOff):
地址0CH,复位值0111B/0111B。
高4位表示闪烁时亮的时间,低4位表示闪烁时灭的时间,改变其值同时也改变了闪烁频率,也能改变亮和灭的占空比。
FlashOnOff的1个单位相当于150~250ms(亮和灭的时间范围为:
1~16,0000B相当1个时间单位),所有象素的闪烁频率和占空比相同。
b、扫描位数寄存器(ScanNum):
地址0DH,复位值7。
用于控制最大的扫描显示位数(有效范围为:
0~7,对应的显示位数为:
1~8),减少扫描位数可提高每位显示扫描时间的占空比,以提高LED亮度。
不扫描显示的显示缓存寄存器则保持不变。
如ScanNum=3时,只显示DpRam0~DpRam3的内容。
c、显示缓存寄存器(DpRam0~DpRam7):
地址10H~17H,复位值00H~00H。
缓存中一位置1表示该像素亮,DpRam7~DpRam0的显示内容对应Dig7~Dig0引脚。
三、软件设计
3.1程序流程框图
3.2ZLG7290如何与单片机进行通信
通过I2C总线进行通信。
在数据传输期间,时钟(SCL)为高电平时,数据(SDA)必须保持不变。
在SCL为高电平时,数据(SDA)从高电平跳变到低电平,为开始数据传输(START)的条件,开始数据传输条件后所有的命令有效;
SCL为高电平时,数据(SDA)从低电平跳变到高电平,为停止数据传输(STOP)的条件,停止数据传输条件后所有的操作结束。
开始数据传输START后、停止数据传输STOP前,SCL高电平期间,SDA上为有效数据。
字节写入时,每写完一个字节,送一个应答信号ACK,直至STOP;
读出时,每读完一个字节,送一位应答信号ACK,但STOP前一位结束时不送ACK信号。
对不带I2C接口的单片机用软件模拟I2C时序使用I2C器件。
起动总线函数
voidStart_I2c()
{
SDA=1;
/*发送起始条件的数据信号*/
_Nop();
SCL=1;
/*起始条件建立时间大于4.7us,延时*/
SDA=0;
/*发送起始信号*/
/*起始条件锁定时间大于4μs*/
SCL=0;
/*钳住I2C总线,准备发送或接收数据*/
}
结束总线函数
voidStop_I2c()
/*发送结束条件的数据信号*/
/*发送结束条件的时钟信号*/
/*结束条件建立时间大于4μs*/
/*发送I2C总线结束信号*/
字节数据传送函数
voidSendByte(ucharc)
ucharBitCnt;
for(BitCnt=0;
BitCnt<
8;
BitCnt++)/*要传送的数据长度为8位*/
{
if((c<
<
BitCnt)&
0x80)SDA=1;
/*判断发送位*/
elseSDA=0;
/*置时钟线为高,通知被控器开始接收数据位*/
/*保证时钟高电平周期大于4μs*/
}
/*8位发送完后释放数据线,准备接收应答位*/
if(SDA==1)ack=0;
elseack=1;
/*判断是否接收到应答信号*/
ucharRcvByte()
ucharretc;
retc=0;
/*置数据线为输入方式*/
BitCnt++)
/*置时钟线为低,准备接收数据位*/
/*时钟低电平周期大于4.7μs*/
/*置时钟线为高使数据线上数据有效*/
retc=retc<
1;
if(SDA==1)retc=retc+1;
/*读数据位,接收的数据位放入retc中*/
return(retc);
应答子函数
voidAck_I2c(bita)
if(a==0)SDA=0;
/*在此发出应答或非应答信号*/
elseSDA=1;
/*时钟低电平周期大于4μs*/
/*清时钟线,钳住I2C总线以便继续接收*/
向无子地址器件发送字节数据函数
bitISendByte(ucharsla,ucharc)
Start_I2c();
/*启动总线*/
SendByte(sla);
/*发送器件地址*/
if(ack==0)return(0);
SendByte(c);
/*发送数据*/
Stop_I2c();
/*结束总线*/
return
(1);
向有子地址器件发送多字节数据函数
bitISendStr(uchar