基于单片机实时钟设计(毕业设计)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

苏州信息职业技术学院
毕业设计报告(论文)
系别:电气与电子工程系
专业:楼宇智能化工程技术
班级:09楼宇1班
***名:**
学生学号:G********
设计(论文)题目:基于单片机实时钟设计
指导教师:
起讫日期:2011.9.5—2011.11.11 \
苏州信息职业技术学院
毕业设计(论文)成绩评定表
苏州信息职业技术学院毕业设计(论文)任务书
学生(签名)年月日指导教师(签名)年月日教研室主任(签名)年月日系主任(签名)年月日
苏州信息职业技术学院
毕业设计(论文)开题报告
苏州信息职业技术学院
毕业设计(论文)中期检查表
毕业设计报告(论文)摘要
目录
一、引言 10
二、系统原理与器件选择11
2.1设计要求 (11)
2.2设计背景条件 (11)
2.3系统基本方案的选择 (11)
2.3.1电路设计框图11
2.3.2单片机芯片的选择方案12
2.3.3显示模块的选择方案12
2.3.4时钟芯片的选择方案12
2.4系统设计的具体实现 (12)
2.4. 1单片机主控制模块的设计13
2.4. 2时钟电路模块的设计13
2.4. 3显示模块的设计14
2.4. 4 DS1302电路原理及说明15
2.4. 5动态扫描芯片ZLG7290的工作原理19
三、软件设计 22
3.1程序流程框图 (22)
3.2ZLG7290如何与单片机进行通信 (22)
3.3DS1302如何与单片机进行通信 (29)
四、系统调试 32
4.1硬件测试 (32)
4.2软件测试 (32)
4.3测试结果分析与结论 (32)
4.3.1测试结果分析32
4.3.2测试结论33
五、总结35
六、致谢词36
七、参考文献 37
附录一:系统电路图附录二:系统程序清单
一、引言
20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。

时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。

忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。

但是,一旦重要事情,一时的耽误可能酿成大祸。

电子实时钟是采用数字电路实现对时,分,秒数字显示的计时装置。

广泛用于个人家庭,车站,码头办公室等公共场所,成为人们日常生活中不可少的必需品。

由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。

目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS 化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。

下面是单片机的主要发展趋势。

单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。

从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。

这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。

单片机模块中最常见的是电子实时钟,电子实时钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,因此得到了广泛的使用。

诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。

因此,研究电子实时钟及扩大其应用,有着非常现实的意义。

二、系统原理与器件选择
2.1设计要求
(1)、画出电路设计原理图。

(2)、综合运用AT89S52开发设计具有一定功能的单片机控制系统,进行软、硬件设计及调试。

(3)、电子钟的格式为:时:分:秒。

具有一定的计时功能。

(4)、通过按键进行控制,具有闹钟,整点报时功能。

2.2设计背景条件
(1)、巩固、加深和扩大单片机应用的知识面,提高综合及灵活运用所学知识。

(2)、培养针对课题需要,选择和查阅有关手册及文献资料的自学能力,提高组成系统、编程、调试的动手能力。

(3)、熟悉单片机系统开发、研制的过程,软硬件设计的方法、内容及步骤。

(4)、熟悉时钟芯片DS1302、动态扫描芯片ZLG7290与七段码显示译码器的使用。

2.3系统基本方案的选择
2.3.1电路设计框图
2.3.2单片机芯片的选择方案
采用AT89S52,片内ROM全都采用Flash ROM;能以3V的超低压工作;同时也与MCS-51系列单片机完全兼容。

该芯片内部存储器为8KB ROM存储空间,同样具有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线都能独
LS?
立地作输出或输入。

单片机的最小系统如下图所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出.第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,20引脚为接地端,40引脚为电
源端。

如图-1所示
39
38
37
36
35
34
33
32
21
22
23
24
25
26
27
28
10
11
30
29
图-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 LS?
置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。

上电动行时,在Vcc 大于等于2.5V之前,RST必须保持低电平。

只有在SCLK为低电平时,才能将
RST置为高电平,I/O为串行数据输入端(双向)。

SCLK始终是输入端。

图-2 DS1302的引脚图
2.4. 3显示模块的设计
图-3示出ZLG7290的引脚排列,Dig7~ Dig0为输入/输出端,由LED显示位驱
动及键盘扫描线。

SegH~SegA为输入/输出端,由LED显示段驱动及键盘扫描线。

SDA为输入/输出端,是I2C总线接口数据/地址线。

SCL为输入端,是I2C总线接口时钟线。

/INT是中断输出端,低电平有效。

/RES是复位输入端,低电平有效。

ZLG7290
图-3 ZLG7290的引脚图
2.4. 4 DS1302电路原理及说明
(1)、时钟芯片DS1302的工作原理:
串行时钟芯片主要由寄存器、控制寄存器、振荡器、实时时钟以及RAM 组成。

为了对任何数据传送进行初始化,需要将/RST置为高电平且将8位地址和命令信息装入移位寄存器。

数据在SCLK的上升沿串行输入,前8位指定访问地址,命令字装入移位寄存器后,在之后的时钟周期,读操作时输出数据,写操作时输入数据。

时钟脉冲的个数在单字节方式下为8加8(8位地址加8位数据),在多字节方式下为8加最多可达248的数据。

(2)、DS1302的控制命令字节与寄存器
a、控制命令字节
控制命令字节结构如下:
RAM RD
1 /CK A4 A3 A
2 A1 A0 /WR
表1
控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中;位6如果为0,则表示存取日历时钟数据,为1表示存取RAM 数据;位5至位1指示操作单元的地址;最低有效位(位0)为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。

b、日历、时钟寄存器
DS1302共有12个寄存器,其中有7个寄存器与日历、时钟有关,存放的数据位为BCD码形式。

其日历、时间寄存器及控制字如以下表所示。

寄存器的选择根据命令字而定,其中日历、时钟各个寄存器与控制字对照表如表2所示。

表2
最后一位RD//W为0表示要进行写操作,为1表示进行读操作。

表3为主要寄存器命令字、取值范围以及各位内容对照表。

表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所示。

表4
c、RAM寄存器
DS1302与RAM相关的寄存器分为两类,一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字位C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31字节,命令控制字为FEH(写)、FFH(读)。

RAM区寄存器与控制字对照表如表5所示。

RAM30 1 1 1 1 1 1 0
RAM突发 1 1 1 1 1 1 1
表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所示
图-4 DS1302读/写时序图
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.7 FunctionKey.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.2 ZLG7290如何与单片机进行通信
通过I2C总线进行通信。

在数据传输期间,时钟(SCL)为高电平时,数据(SDA)必须保持不变。

在SCL为高电平时,数据(SDA)从高电平跳变到低电平,为开始数据传输(START)的条件,开始数据传输条件后所有的命令有效;SCL为高电平时,数据(SDA)从低电平跳变到高电平,为停止数据传输(STOP)的条件,停止数据传输条件后所有的操作结束。

开始数据传输START 后、停止数据传输STOP前,SCL高电平期间,SDA上为有效数据。

字节写入时,每写完一个字节,送一个应答信号ACK,直至STOP;读出时,每读完一个字节,送一位应答信号ACK,但STOP前一位结束时不送ACK信号。

对不带I2C接口的单片机用软件模拟I2C时序使用I2C器件。

起动总线函数
void Start_I2c()
{
SDA=1; /*发送起始条件的数据信号*/
_Nop();
SCL=1;
_Nop(); /*起始条件建立时间大于4.7us,延时*/
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0; /*发送起始信号*/
_Nop(); /* 起始条件锁定时间大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0; /*钳住I2C总线,准备发送或接收数据*/
_Nop();
_Nop();
}
结束总线函数
void Stop_I2c()
{
SDA=0; /*发送结束条件的数据信号*/
_Nop(); /*发送结束条件的时钟信号*/
SCL=1; /*结束条件建立时间大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1; /*发送I2C总线结束信号*/
_Nop();
_Nop();
_Nop();
_Nop();
}
字节数据传送函数
void SendByte(uchar c)
{
uchar BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
{
if((c<<BitCnt)&0x80)SDA=1; /*判断发送位*/
else SDA=0;
_Nop();
SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/ _Nop();
_Nop(); /*保证时钟高电平周期大于4μs*/
_Nop();
_Nop();
_Nop();
SCL=0;
}
_Nop();
_Nop();
SDA=1; /*8位发送完后释放数据线,准备接收应答位*/ _Nop();
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
if(SDA==1)ack=0;
else ack=1; /*判断是否接收到应答信号*/
SCL=0;
_Nop();
_Nop();
}
字节数据传送函数
uchar RcvByte()
{
uchar retc;
uchar BitCnt;
retc=0;
SDA=1; /*置数据线为输入方式*/
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_Nop();
SCL=0; /*置时钟线为低,准备接收数据位*/
_Nop();
_Nop(); /*时钟低电平周期大于4.7μs*/
_Nop();
_Nop();
_Nop();
SCL=1; /*置时钟线为高使数据线上数据有效*/
_Nop();
_Nop();
retc=retc<<1;
if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中*/
_Nop();
_Nop();
}
SCL=0;
_Nop();
_Nop();
return(retc);
}
应答子函数
void Ack_I2c(bit a)
{
if(a==0)SDA=0; /*在此发出应答或非应答信号*/
else SDA=1;
_Nop();
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop(); /*时钟低电平周期大于4μs*/
_Nop();
_Nop();
_Nop();
SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/ _Nop();
_Nop();
}
向无子地址器件发送字节数据函数
bit ISendByte(uchar sla,uchar c)
{
Start_I2c(); /*启动总线*/
SendByte(sla); /*发送器件地址*/
if(ack==0)return(0);
SendByte(c); /*发送数据*/
if(ack==0)return(0);
Stop_I2c(); /*结束总线*/ return(1);
}
向有子地址器件发送多字节数据函数
bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no) {
uchar i;
Start_I2c(); /*启动总线*/
SendByte(sla); /*发送器件地址*/
if(ack==0)return(0);
SendByte(suba); /*发送器件子地址*/
if(ack==0)return(0);
for(i=0;i<no;i++)
{
SendByte(*s); /*发送数据*/
if(ack==0)return(0);
s++;
}
Stop_I2c(); /*结束总线*/
return(1);
}
向无子地址器件读字节数据函数
bit IRcvByte(uchar sla,uchar *c)
{
Start_I2c(); /*启动总线*/
SendByte(sla+1); /*发送器件地址*/
if(ack==0)return(0);
*c=RcvByte(); /*读取数据*/
Ack_I2c(1); /*发送非就答位*/ Stop_I2c(); /*结束总线*/ return(1);
}
向有子地址器件读取多字节数据函数
bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no) {
uchar i;
Start_I2c(); /*启动总线*/
SendByte(sla); /*发送器件地址*/
if(ack==0)return(0);
SendByte(suba); /*发送器件子地址*/
if(ack==0)return(0);
Start_I2c();
SendByte(sla+1);
if(ack==0)return(0);
for(i=0;i<no-1;i++)
{
*s=RcvByte(); /*发送数据*/
Ack_I2c(0); /*发送就答位*/
s++;
}
*s=RcvByte();
Ack_I2c(1); /*发送非应位*/
Stop_I2c(); /*结束总线*/
return(1);
}
3.3 DS1302如何与单片机进行通信
通过SPI总线进行通信的。

SPI总线系统是一种同步串行外设接口,该接口一般使用4条线:串行时钟线(SCK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从机选择线SS(有的SPI接口芯片带有中断信号线INT、有的SPI接口芯片没有主机输出/从机输入数据线MOSI)。

对于不带SPI串行总线接口的单片机,可以使用软件来模拟SPI的操作,包括串行时钟、数据输入和数据输出。

发送数据:
void SPISendData(unchar uiData)
{
unchar i;
CS=0;
DelayUS(50);
for(i=0;i<8;i++)
{
SCK=0;
DelayUS(50);
if(uiData & 0x80)
SI=1;
else
SI=0;
DelayUS(50);
SCK=1;
uiData <<=1;
DelayUS(50);
}
}
读取数据:
unchar SPIRcvByte()
{
unchar i;
uint dat=0;
CS=0;
for(i=0;i<9;i++)
{
DelayUS(50);
if(SO==1)
dat = dat | 0x01;
else
dat = dat & 0xFE;
dat = dat<<1;
SCK=1;
DelayUS(50);
SCK=0;
}
dat = dat>>1;
SCK=0;
return (unsigned char)dat; }
读寄存器子程序:
unchar Read(unchar addr)
{
unchar M;
CS=1;
DelayUS(50);
SPISendData(0x03);//向spi总线写入读命令使其进入读状态,spi的读指令为0x03
SPISendData(addr);//向spi总线写入要读数据寄存器的首地址
M=SPIRcvByte();
CS=1;
return M;
}
写寄存器子程序:
void Write(unchar addr, unchar numb,unchar *buf)
{
unchar i,M;
CS=1;
DelayUS(50);
SPISendData(0x02);//向spi总线写入写命令使其进入写状态,spi的读指
令为0x02
SPISendData(addr);//向spi总线写入要写数据寄存器的首地址
for(i=0;i<numb;i++)
{
M=*buf;
SPISendData(M);
buf++;
}
DelayUS(50);
CS=1;
}
四、系统调试
4.1硬件测试
电子实时钟的电路系统较大,对于焊接方面更是不可轻视,庞大的电路系统中只要出于一处的错误,则会对检测造成很大的不便,而且电路的交线较多,对于各种锋利的引脚要注意处理,否则会刺破导线,则会对电路造成短路现象。

在此电子实时钟的设计调试中遇到了很多的问题。

回想这些问题只要认真多思考都是可以避免的,以下为主要的问题:
(1)、LED数码管的断码错乱,原因出于没有认真看清a、b 、c等引脚信息。

解决:用万用表进行检测,依次检测是哪段亮了。

即可解决出现的断码或乱码。

(2)、对电子实时钟修改时间时,有时LED数码管被屏蔽掉,造成不亮现象。

解决:根据测试,发现电路的驱动能力不足,最后在DS1302时钟芯片的/CS、SCLK、RET端接入3.3K的上拉电阻后,电路的驱动能力才能满足,即可解决不亮现象。

4.2软件测试
电子实时钟功能很多,所以对于它的程序也较为复杂,所以在编写程序和调试时出现了相对较多的问题。

最后经过多次的模块子程序的修改,一步一步的完成,最终解决了软件。

在软件的调试过程中主要遇到的问题如下:烧入程序后,LED数码管显示闪动,而且亮度不均匀。

解决:对调用的延时进行逐渐修改,可以解决显示闪动问题。

4.3测试结果分析与结论
4.3.1测试结果分析
(1)、在测试中遇到发光二极管、LED数码管为不显示时,首先使用万用表对电路进行测试,观察是否存在漏焊,虚焊,或者元件损坏。

(2)、LED 数码管显示不正常,还有亮度不够,首先使用万用表对电路进行测试,观察电路是否存在短路现象。

查看烧写的程序是否正确无误,对程序进行认真修改。

再进行查看数码管的位选段选是否正确。

4.3.2测试结论
经过多次的反复测试与分析,可以对电路的原理及功能更加熟悉,同时提高了设计能力与及时对电路的分析能力.同时在软件的编程方面得到更到的提高,对编程能力得到加强.同时对所学的知识得到很大的提高与巩固.
五、总结
在整个设计过程中,自主学习,学到了许多没学到的知识。

较好的完成了作品。

虽然没达到预期的目的,在最初的设计中,发挥“三个臭皮匠,顶个诸葛亮”的作用。

相互学习、相互讨论、研究。

如果时间再宽松几天也许能达到预期效果。

在电路焊接时虽然没什么大问题,但从中也知道了焊接在整个作品中的重要性,电路工程量大,不能心急,一个个慢慢来不能急于求成。

反而达到事半功倍的效果。

对电路的设计、布局要先有一个好的构思,才显得电路板美观、大方。

程序编写中,由于思路不清晰,开始时遇到了很多的问题,经过静下心来思考,和同组员的讨论,理清了思路,反而得心应手。

在此次设计中,知道了做凡事要有一颗平常的心,不要想着走捷径,一步一脚印。

也练就了我们的耐心,做什么事都在有耐心。

六、致谢词
感谢论文评阅组和答辩组的老师们,多谢你们这段时间的辛勤工作以及对本论文的批评指导。

谢谢!
七、参考文献
1、赵亮,单片机C语言人民邮电出版社2003
2、彭为,单片机典型系统设计电子工业出版社2006
3、窦振中,基于单片机的嵌入式系统工程设计中国电力出版社2008
4、马忠梅,单片机的C语言应用程序设计北京航空航天大学出版社2007
默认模式为显示正常情况下的时间
按K1:显示调整时间
K2:调时
K3:调分
K4:调秒
再按K1,显示显示闹钟设置,并且结束上个操作再按K1:设置闹钟时间
K2:调时
K3:调分
K4:调秒
再按K1,闹钟设置结束
K2:闹钟开
K3:闹钟关
附录二:系统程序清单
#include "REG52.h"
#include <intrins.h>
#include <absacc.h>
#include "VIIC_C51.h"
#include "ZLG7290.h"
#include "ds1302.h"
sbit ZLG7290_INT=P3^3; //ZLG7290 中断引脚
sbit ZLG7290_RST=P2^5; //ZLG7290 复位引脚
sbit Speaker=P1^4; //蜂鸣器
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
uchar inittime[7] = {0,5,15,21,5,5,9}; //初始化后设置为:09年5月21日星期
4 15点05分0秒
uchar disp_buf[8] = {0,0,0,0,0,0,0,0}; //显示缓冲区
uchar curr_buf[6] = {0,0,0,0,0,0}; //现在时间显示缓冲区
uchar alarm_buf[6]= {0,0,0,0,0,0}; //闹钟时间显示缓冲区
uchar TEST[3]= {12,13,14}; //闹钟时间显示缓冲区
uchar sec,min,hou; //正常时间显示时分秒
uchar alarm_min;
uchar alarm_hou; //闹钟时分秒
uchar alarm_sec;
uchar alarm_flag; //闹钟开关标志
uchar key1=0,key2=0,key3=0,key4=0;
uchar k1_d=0; //模式转换
unsigned char display(unsigned char *sd)
{。

相关文档
最新文档