基于单片机的可调数字时钟硬件总体设计说明书.doc_第1页
基于单片机的可调数字时钟硬件总体设计说明书.doc_第2页
基于单片机的可调数字时钟硬件总体设计说明书.doc_第3页
基于单片机的可调数字时钟硬件总体设计说明书.doc_第4页
基于单片机的可调数字时钟硬件总体设计说明书.doc_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

可调数字时钟可调数字时钟 硬件总体设计说明书硬件总体设计说明书 编制单位: 作 者: 版 本:v0.1 发布日期:2011-2-12 审 核 人: 批 准 人: ts006_硬件总体设计说明书 i 目目 录录 1.引言引言 .1 1.1.编写目的:.1 1.2.背景.1 1.3.定义.2 1.4.参考资料.2 2.总体设计总体设计 .2 2.1.开发与运行环境.2 硬件环境2 2.2.硬件功能描述.2 3.硬件模块设计硬件模块设计 .3 3.1.描述.3 单片机硬件电路原理图单片机硬件电路原理图3 图 1 单片机电路原理图3 数码管硬件电路原理图数码管硬件电路原理图4 4.嵌入式软件设计嵌入式软件设计 .8 4.1程序流程8 4.2.算法8 5.调试过程调试过程.9 6.经验总结经验总结.9 7.附录附录.11 数字钟总体设计说明书 1 1.1.引言引言 1.1.1.1.编写目的:编写目的: 该课程设计中我们选用的芯片是 stc90c51。stc90c51 是一种带 4k 字节闪烁可编程可擦 除只读存储器(fperomfalsh programmable and erasable read only memory)的低电压, 高性能 cmos8 位微处理器,俗称单片机。stc90c51 是一种带 2k 字节闪烁可编程可擦除只读 存储器的单片机。单片机的可擦除只读存储器可以反复擦除 100 次。该器件采用 atmel 高密 度非易失存储器制造技术制造,与工业标准的 mcs-51 指令集和输出管脚相兼容。由于将多功 能 8 位 cpu 和闪烁存储器组合在单个芯片中,atmel 的 stc90c51 是一种高效微控制器, at89c2051 是它的一种精简版本。at89c 单片机为很多嵌入式控制系统提供了一种灵活性高且 价廉的方案。 stc90c51 是一个低电压,高性能 cmos 8 位单片机,片内含 4k bytes 的可反复擦写的 flash 只读程序存储器和 128 bytes 的随机存取数据存储器(ram),器件采用 atmel 公司的 高密度、非易失性存储技术生产,兼容标准 mcs-51 指令系统,片内置通用 8 位中央处理器和 flash 存储单元,内置功能强大的微型计算机的 stc90c51 提供了高性价比的解决方案。 stc90c51 是一个低功耗高性能单片机,40 个引脚,32 个外部双向输入/输出(i/o)端 口,同时内含 2 个外中断口,2 个 16 位可编程定时计数器,2 个全双工串行通信口,stc90c51 可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和 flash 存储器结合在 一起,特别是可反复擦写的 flash 存储器可有效地降低开发成本。 1.2.1.2.背景背景 数字钟是采用数字电路实现对.时,分,秒.数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石 英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产 生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时 自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、 甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字 钟及扩大其应用,有着非常现实的意义。 数字钟总体设计说明书 2 本作品采用 atmel 公司的 stc90c51 单片机,以 c 语言为程序设计的基础,设计两个用四 位数码管显示时、分的时钟。 1.3.1.3.定义定义 sbit-特殊功能位声明,也就是声明某一个特殊功能寄存器中的某一位 regh52.h 在代码中引用头文件,其实际意义就是将这个头文件中的全部内容放到引用头文件的位置处, 免得在重复编写 1.4.1.4.参考资料参考资料 新概念 51 单片机 c 语言教程入门、开发、提高、拓展全攻略郭天祥 电子工业出版社 ds1302 中文资料pdf 单片机原理及接口技术李朝青 北京航空航天大学出版社 2.2.总体设计总体设计 2.1.2.1.开发与运行环境开发与运行环境 硬件环境 一台完整的电脑,包括键盘、鼠标,hot51 单片机开发板, usb 串行口接线。 软件环境 采用的是 windows 操作系统,keilc51 系统软件,用 c 语言进行开发。 2.2.2.2.硬件功能描述硬件功能描述 此时钟在正常计时模式下具有自动调整每月的天数、闰年的天数及星期的变化,并且 时制为二十四时制。 menu: 菜单按键,松开按键时有效 第一次按下此键后,进入调分状态,此时可以对分进行修改。 数字钟总体设计说明书 3 第二次按下此键后,进入调时状态,此时可以对时进行修改。 第三次按下此键后,进入闹钟调分状态,此时可以对闹钟进行 修改。 第四次按下此键后,进入闹钟调时状态,此时可以对闹钟时进 行修改。 第五次按下此键后,退出所有状态。 inc: 加一键,松开按键有效。 switch:闹钟的开与关。 3.3.硬件模块设计硬件模块设计 3.1.3.1.描述描述 单片机硬件电路原理图单片机硬件电路原理图 图 1 单片机电路原理图 发光二极管导通时,产生一个正向的工作电流 if,工作电流根据发光二极管的材料、 功率等不同,额定电流一般在 1040ma 左右,发光二极管导通时的正向压降 vf 比较大,一 般为 1.53v(普通硅二极管约为 0.7v)。因此在正常使用中,为了保证发光二极管在电源电 压 v 的作用下管子的工作电流不超过额定值,必须给发光二极管串联一只限流电阻 r,r 的阻 数字钟总体设计说明书 4 值可由下式算出:r(v-vf)/if。其中 v 为工作电源电压,vf 为发光二极管的正向压降, if 为额定工作电流。 从上面原理图 1 可知,当单片机的 p0 口输出低电平(0v)时,有正向工作电流流过发光 二极管,发光二极管就亮;相反,当 p0 口输出高电平(5v)时,发光二极管没有足够电压差 产生工作电流,此时发光二极管不亮。因此,程序中只需交替让单片机的 p0 口输出低电平 “0”和高电平“1”就可以让发光二极管发光。 另外,p0 口作为外接 i/o 口时必须接上拉电阻。 数码管硬件电路原理图数码管硬件电路原理图 数码管管脚图说明: 0.5 寸单联共阴高亮红色数码管 数字对应数码管显示控制转换字节(共阴编码) 显示hgfe,dcba编码 0 0011,11110x3f; 1 0000,01100x06; 2 0101,10110x5b; 3 0100,11110x4f; 4 0110,01100x66; 5 0110,11010x6d; 6 0111,11010x7d; 7 0000,01110x07; 8 0111,11110x7f; 9 0110,11110x6f; 共阳为编码取反即可, 数字钟总体设计说明书 5 接线为高低端口对应接法。 动态显示原理动态显示原理: 在本次时钟制作中,均采用了8位数码管动态扫描显示。它将所有数码管的8个段线相应 地并接在一起,并接到 at89s51的p0口,由p0口控制字段输出。而各位数码管的共阳极由单 片机的p2口接一个74ls138控制实现8位数码管的位输出控制。 这样,对于一组数码管动态扫描显示需要由两组信号来控制:一组是字段输出口输出的 字形代码,用来控制显示的字形,称为段码;另一组是位输出口输出的控制信号,用来选择 第几位数码管工作,称为位码。 由于各位数码管的段线并联,段码的输出对各位数码管来说都是相同的。因此,在同一 时刻如果各位数码管的位选线都处于选通状态的话,8位数码管将显示相同的字符。若要各位 数码管能够显示出与本位相应的字符,就必须采用扫描显示方式。即在某一时刻,只让某一 位的位选线处于导通状态,而其它各位的位选线处于关闭状态。同时,段线上输出相应位要 显示字符的字型码。这样在同一时刻,只有选通的那一位显示出字符,而其它各位则是熄灭 的,如此循环下去,就可以使各位数码管显示出将要显示的字符。 虽然这些字符是在不同时刻出现的,而且同一时刻,只有一位显示,其它各位熄灭,但 由于数码管具有余辉特性和人眼有视觉暂留现象,只要每位数码管显示间隔足够短,给人眼 的视觉印象就会是连续稳定地显示。 数码管不同位显示的时间间隔可以通过调整延时程序的延时长短来完成。数码管显示的 时间间隔也能够确定数码管显示时的亮度,若显示的时间间隔长,显示时数码管的亮度将亮 些,若显示的时间间隔短,显示时数码管的亮度将暗些。若显示的时间间隔过长的话,数码 管显示时将产生闪烁现象。所以,在调整显示的时间间隔时,即要考虑到显示时数码管的亮 度,又要数码管显示时不产生闪烁现象。 数码管是由7个条形的led和右下方一个圆形的led组成,这样一共有8个段线,恰好适 用于8位的并行系统。数码管有共阴极和共阳极两种,共阴极数码管的公共阴极接地,当各段 阳极上的电平为“1”时,该段点亮,电平为“0”时,该段熄灭; 晶振电路晶振电路 数字钟总体设计说明书 6 控制按钮的连接控制按钮的连接 在电路中,控制开关分别接在 p3.2,p3.3,p3.4 引脚,当开关接通,则相对应的引脚被 拉为低电平,所以在程序中只要检测对应引脚为低电平,则执行响应的操作。 ds1302ds1302 功能及说明功能及说明: ds1302 是dallas 公司推出的涓流充电时钟芯片内含有一个实时时钟/日历和31 字节静 态ram 通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信 息每月的天数和闰年的天数可自动调整时钟操作可通过am/pm 指示决定采用24 或12 小时格 式ds1302 与单片机之间能简单地采用同步串行的方式进行通信仅需用到三个口线1 res 复位 2 i/o 数据线3 sclk串行时钟时钟/ram 的读/写数据以一个字节或多达31 个字节的字符组方 式通信ds1302 工作时功耗很低保持数据和时钟信息时功率小于1mw ds1302 是由ds1202 改进而来增加了以下的特性双电源管脚用于主电源和备份电源供应 vcc1 为可编程涓流充电电源附加七个字节存储器它广泛应用于电话传真便携式仪器以及电池 供电的仪器仪表等产品领域。下面将主要的性能指标做一综合: 实时时钟具有能计算2100 年之前的秒分时日日期星期月年的能力还有闰年调整的能 力 31*8位暂存数据存储ram 串行i/o 口方式使得管脚数量最少 宽范围工作电压2.0 5.5v 数字钟总体设计说明书 7 工作电流2.0v 时,小于300na 读/写时钟或ram 数据时有两种传送方式单字节传送和多字节传送字符组方式 8 脚dip 封装或可选的8 脚soic 封装根据表面装配 简单3 线接口 与ttl 兼容vcc=5v 可选工业级温度范围-40 +85 与ds1202 兼容 在ds1202 基础上增加的特性 对vcc1 有可选的涓流充电能力 双电源管用于主电源和备份电源供应 备份电源管脚可由电池或大容量电容输入 附加的7 字节暂存存储器 ds1302ds1302 的基本组成和工作原理的基本组成和工作原理 1.ds1302 的管脚排列及描述如下图及表所示 2.ds1302 与微控制器的接口软件及功能 1写保护寄存器操作 当写保护寄存器的最高位为0 时允许数据写入寄存器写保护寄存器可以通过命令字节8e 8f 来规定禁止写入/读出写保护位不能在多字节传送模式下写入 数字钟总体设计说明书 8 2时钟停止位操作 当把秒寄存器的第 7 位时钟停止位设置为 0 时起动时钟开始 3.多字节传送方式 当命令字节为be 或bf 时ds1302 工作在多字节传送模式8 个时钟/日历寄存器从寄存器0 地址开始连续读写从0 位开始的数据当命令字节为fe 或ff 时ds1302 工作在多字节ram 传送 模式31 个ram 寄存器从0 地址开始连续读写从0 位开始的数据 4.4.嵌入式软件设计嵌入式软件设计 4.14.1程序流程程序流程 4.2.4.2.算法算法 在本次程序中用到的主要算法有十进制数转换为 bcd 码和将 bcd 码转换为十进制数 数字钟总体设计说明书 9 5.5.调试过程调试过程 本次制作过程中程序编写好之后首先在单片机开发板上调试之后再运用到实际电路中, 程序在以前也写得差不多,在制作过程中对程序的编写没有太多的时间,主要是花在了 pcb 板的绘制,在绘制过程中也出现了一些问题,在画元件封装的时候虽然用游标卡尺量过了, 但是在画封装的时候还是出现了一些问题,把部分元件的封装画的太大了,导致元件不能插 在板子上,需要把原件的引脚掰一下再插上去。以及在后来制作好的板子的调试,首先是板 子的调试,在制作好电路板之后,为了保真电路板是通的,我首先用最笨的方法就是用万用表 先测量每一个连接点是否都是通的,主要是因为在制作 pcb 板的过程中我是用 orcad 画好的, 可是在刻板机上无法刻出来,后来,在导入 dxp 之后出了问题,没法做出来,只好自动布局 了,在刻好电路板之后,只好用这种办法先测试每一根线是完好的,在测试过程中发现有好 几处线是断开的,用飞线接起来,不过也不多,只有两根,在保证了电路时完全联通的之后, 插上单片机接通电源之后发现显示是完好的,出现的唯一问题就是制作的电子钟不走,只显 示初始化的时间,在有的时候又发现走了,可是制作的表只走 60 秒,就有不走了,后来,咨 询王老师让我们看看晶振是否工作,再用示波器观察之后发现晶振是工作的,而且时钟芯片 的输出也是完好的,可是单片机就是无法读取到时钟芯片的数据,我在网上查了很多资料, 有的说最主要的原因是 ds1302 时钟芯片是坏的,说国产的很多都是山寨,我又重新找了一个 时钟芯片之后发现问题还是一样的,还有另外一种原因就是地的影响很大,我用示波器观察 之后发现地的干扰还是特别大,最后在王老师的指导下,我们把制作的板子上的时钟芯片去 了,接上开发板上的时钟电路能正常工作,把我制作的开发板上的时钟芯片接到开发板上, 开发板上的电路不能工作,最终明白了一定是我只做的电路板对地的干扰特别大,最后的解 决方法就是在时钟芯片的地引脚通过一电容在接地后电路能正常工作,仔细想一想就会发现 我们在用示波器观察晶振和时钟芯片是否正常工作是只用示波器观察了是否有波形输出,而 且并没有考虑输出信号的大小,所以这样的观察可以说是无效的。 6.6.经验总结经验总结 在本次课程设计中,通过动手实践操作,进一步学习和掌握了单片机原理的有关知识, 特别是程序的编程方面,加深了对单片机原理及应用技术的认识,进一步巩固了对单片机知 识的理解,更进一步掌握了单片机应用系统的设计、制作、调试的方法。在这次制作过程中, 进一步复习了相关的知识,查询相关的资料。这次的制作主要与实践操作和理论相结合,提 数字钟总体设计说明书 10 高动手实践能力,更在一周的时间了解了更多的有关单片机的知识,使知识更加丰富,使自 己更加充实。 同时更近一步的学习了 pcb 的设计以及制作,在绘制 pcb 的过程中我认为时花费是时间 最多的,在平时总觉得 orcad 学的还不错,可是在实际制作 pcb 的时候才发现,还是有很多 缺陷,不能够充分利用软件,在这次 pcb 的制作过程中对自动布线的依赖性很大,希望能通 过自动布线把整个电路布通,最后发现自动布线的效果其实并不怎么样,很多线都没有连接 上,仔细观察就会发现有很多线走了一半就没有了,需要自己亲自连接,而且在 pcb 板的设 计过程中另外还有一个原因就是对 orcad 中一些实用的东西还是没用掌握,比如说在 orcad 中不能插入一个焊盘,需要弄成元件库中的封装再插入,到现在我还没有掌握。而且在设计 pcb 的时候忽略了最重要的一项,没要注意线宽,电源线,地线,数据线都是同一宽度,最 终导致线很细,在电路出现问题之后的修改带来很大问题,最重要的是线很细线的阻抗很大, 也是造成这次 pcb 电路板不稳定的主要原因,在电路板设计过程中一个好的电路板是有很多 的布线规则,而且这次 pcb 的设计没有注意到任何一个规则,可以说这次设计很失败, 有的时候想起了这些规则可是不知道该怎么样做才更合理,想来想去反而更混乱了。但是在 制作过程中,初步掌握了刻板机的工作原理,并了解了在今后的制作过程中掌握了基 本的一些知识,在今后的制作中不会出现最常规的错误。在以前,没有接触过刻板机,认为 只要把图设计好了就能做出来,通过这次的制板过程中才明白了,机器总归是机器,不是为 所欲为的,机器总归是机器,在设计过程中要学会适应刻板机的工作能力,只有相互协调了, 才能有更好的工作效率。 此同时,更让我们知道了合作的重要性,在这次制作完成之后,大部分都是通上电就好了, 唯有我们四个用时钟芯片做的问题很多,出现的问题就是时钟不走,而且要走就只走一分钟, 接下来就再也不走,我们四个能都自动组合起来,相互帮助找出共同的问题,在我们的相互 帮助下,最终找到了问题等根源,解决了问题,这次的制作跟让我们明白了合作的力量,让 我们明白了只有拧成一股绳才会有更多的力量,在合作中,也学到了对方的很多优点,找到 了自己的不足。 单片机作为暨微机原理之后的一门与实际接近的专业课之一,在学习这门课的时候我感 觉在上课能认真学习,认为基本上掌握了它,可是在实际的制作中才反现了还是有很多的不 足之处,需要更进一步的掌握和学习,才能找到他的真谛,但是这次的之中找到了更多的乐 数字钟总体设计说明书 11 趣,进一步增加了学习的兴趣。我觉得做单片机时钟设计是十分有意义的,而且是十分必要 的。虽然过去在单片机开发板上调试过很多程序,自认为但单片机掌握的很不错,但是这是 我做这次制作的又一收获,更进一步的认识到了学习的不足。 当然了,要做好一个制作,就必须做到:在设计程序之前,必须对所用单片机的内部结 构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软 件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序 设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应 该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在这次制作中,我 忽略了非常重要的一点,一开始就想一口吃个大胖子,想一口气就把程序编写出来,反而出 了很多问题,在花费了一段时间之后逐渐认识到了自己的错误,我把程序一部分一部分的分 开调试,这样不仅提高了效率,而且写出的程序反而更加清晰明了,在这次在制作过程中遇 到问题增长了我的知识并把遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题 并从中学到的知识更让我受益终身。在设计的过程中发现了自己的不足之处,老是自作聪明, 对以前所学过的知识理解得不够深刻,掌握得不够牢固。通过查阅有关资料,并和其他同学, 交流经验和自学,收获巨大。通过这次课程设计我们也发现了自身存在的不足之处,虽然感 觉理论上已经掌握,但在运用到实践的过程中仍有意想不到的困惑,经过一番努力才得以解 决。 在完成单片机制作之后,我发现还有许多不足,所学到的知识还远远不够,以至于还有一些 功能不能被动完成。比如说单片机可以实现复杂的运算,而 cpld 不能进行复杂的运算,在数 字电路方面有很多优势,如果能把 cpld 和单片机的结合来互补两者的不足,将会做出更给力 的制作。但通过学习这一次实践,增强了我的动手能力,提高和巩固了单片机方面的知识,特别 是软件方面。并让我再一次认识到把理论应用到实践中去的重要性。 7.7.附录附录 说明说明: 此时钟由 ds1302 时钟芯片来完成,在现实过程中只用到了时、分、秒,另外还可以实 现年、月、日、以及星期 印制电路板印制电路板: 数字钟总体设计说明书 12 时钟芯片误差分析时钟芯片误差分析: 我认为原因在于 ds1302 的晶振部分电路的设计与调整。主要在于送选取的 32.768khz 和 对应的电容的误差,如果确保 ds1302 时钟输入输入管脚的 32.768khz 越精确可能出现的误差 会越小。 其他时钟误差来源分析其他时钟误差来源分析: 不考虑晶振等固件的误差, 因而系统误差不可能来自于硬件, 而应该主要来自于软件方面. 系统每次调用定时中断程序的过程中, 硬件并没有自动进入下一个定时周期, 而是在调用中 断程序以后由软件置数来实现的.而在程序调用过程中, 堆栈建立、参数传递等都是需要耗时, 而这些时间都被无形中加到了定时长度中去. 所以,使得每次定时长度都大于理论推导值, 在 宏观上表现出来就是系统比理论计算出来的结果变慢了。 另外, 由于系统每次调用中断处理 程序所执行的操作都是相同的, 也就是说, 系统每次定时的时间误差应该是一个常数,另外, 在调时过程中因按键按下后的消抖延时以及等待按键释放这一时间段内会有误差 1、 定时器装入新的计数初值 在keil uvision3软件中验证定时器t0每50ms 产生一次中断的时间。在初始化中费时为 551s ,每一次中断时间应该考虑该项的影响。在实际处理中可以利用两次中断时间的差来 作为定时器的中断时间间隔。通过测试,得到第一次为0.05055642s,第二次为0.100 56185s,第三次为0.15056728 s。可以看出,每中断一次会比定时值长了5.43s即5个机器周 期,所以,应该在给定时器赋初值时加上这个误差,可以把中断服务程序作如下修改: 数字钟总体设计说明书 13 th0=(65536-50000)/256+5/256; tl0=(65536-50000)%256+5/256; 2、计算出防抖次数,然后再把防抖时的延时时间与防抖次数相乘,在加到总时间中去; 3、对时时关闭计时中断; 4、在中断中设置中断优先级。 我认为还有两个可能的误差: 一是定时器溢出中断信号时,正在执行某指令;由于正在执行某指令,因 此它不能及时响应定时器的溢出中断。 二是定时器溢出中断信号时,正在执行某中断服务程序。定时器溢出中断信号时, 若正在执行同级或高优先级中断服务程序,则它仍需继续执行这些程序,不能及时响 应定时器的溢出中断请求。 本次制作程序如下: #include #include #define uchar unsigned char #define uint unsigned int uchar code table10 = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; unsigned char ahour,amin ; uint min,hour; uint flag1 = 0; uint flag = 0; sbit acc0 = acc0; 数字钟总体设计说明书 14 sbit acc7 = acc7; sbit p3_2 = p32; sbit p3_3 = p33; sbit p3_4 = p34; sbit beep = p12; sbit t_clk = p16; /*实时时钟时钟线引脚 */ sbit t_io = p35; /*实时时钟数据线引脚 */ sbit t_rst = p17; /*实时时钟复位线引脚 */ /* * 名称 : delay() * 功能 : 延时程序 * 输入 : * 输出 : 无 */ void delay(uint z) uint x,y; for(x=z;x0;x-) for(y=110;y0;y-); /* * 名称 : di() * 功能 : 报警程序 * 输入 : * 输出 : 无 */ void di() 数字钟总体设计说明书 15 beep=0; delay(100); beep=1; /* * 名称 : delay_1ms() * 功能 : 延时子程序,延时时间为 1ms * x * 输入 : x (延时一毫秒的个数) * 输出 : 无 */ void delay_1ms(uint i)/1ms 延时 uchar x,j; for(j=0;j0; i-) t_io = acc0; t_clk = 1; t_clk = 0; acc = acc 1; /* * 名称 : uc_rtoutputbyte() * 功能 : 从 ds1302 读取 1byte 数据 * 输入 : 无 * 返回值: acc */ uchar uc_rtoutputbyte(void) uchar i; t_rst = 1; for(i=8; i0; i-) acc = acc 1; t_io=1; acc7 = t_io; t_clk = 1; t_clk = 0; 数字钟总体设计说明书 17 return(acc); /* * 名称 : v_w1302(uchar ucaddr, uchar ucda) * 功能 : 往 ds1302 写入数据 * 输入 : ucaddr: ds1302 地址, ucda: 要写的数据 * 返回值 : 无 */ void v_w1302(uchar ucaddr, uchar ucda) t_rst = 0; t_clk = 0; t_rst = 1; v_rtinputbyte(ucaddr); / 写地址 _nop_(); _nop_(); v_rtinputbyte(ucda); / 写 1byte 数据 t_clk = 1; t_rst = 0; /* * 名称 : uc_r1302(uchar ucaddr) * 功能 : 读取 ds1302 某地址的数据 * 输入 : ucaddr: ds1302 地址 * 返回值 : ucda :读取的数据 */ uchar uc_r1302(uchar ucaddr) 数字钟总体设计说明书 18 uchar ucda; t_rst = 0; t_clk = 0; t_rst = 1; v_rtinputbyte(ucaddr); /写地址,命令 _nop_(); _nop_(); ucda = uc_rtoutputbyte(); /读 1byte 数据 t_clk = 1; t_rst = 0; return(ucda); /* * 名称 : v_burstw1302t * 功能 : 往 ds1302 写入时钟数据(多字节方式) * 输入 : psecda: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制 * 8byte (bcd 码) 1b 1b 1b 1b 1b 1b 1b 1b * 返回值 : 无 */ void v_burstw1302t(uchar *psecda) uchar i; v_w1302(0x8e, 0x00); /控制命令,wp=0,写操作 t_rst = 0; t_clk = 0; t_rst = 1; v_rtinputbyte(0xbe); /0xbe:时钟多字节写命令 数字钟总体设计说明书 19 for(i=8; i0; i-) /8byte = 7byte 时钟数据 + 1byte 控制 v_rtinputbyte(*psecda); /写 1byte 数据 psecda+; t_clk = 1; t_rst = 0; /* * 名称 : v_burstr1302t(uchar *psecda) * 功能 : 读取 ds1302 时钟数据 * 输入 : psecda: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 * 7byte (bcd 码) 1b 1b 1b 1b 1b 1b 1b * 返回值 : ucda :读取的数据 */ void v_burstr1302t(uchar *psecda) uchar i; t_rst = 0; t_clk = 0; t_rst = 1; v_rtinputbyte(0xbf); /0xbf:时钟多字节读命令 for(i=8; i0; i-) *psecda = uc_rtoutputbyte(); /读 1byte 数据 psecda+; t_clk = 1; 数字钟总体设计说明书 20 t_rst = 0; /* * 名称 : v_burstw1302r(uchar *preda) * 功能 : 往 ds1302 寄存器数写入数据(多字节方式) * 输入 : preda: 寄存器数据地址 * 返回值 : 无 */ void v_burstw1302r(uchar *preda) uchar i; v_w1302(0x8e,0x00); /控制命令,wp=0,写操作 t_rst = 0; t_clk = 0; t_rst = 1; v_rtinputbyte(0xfe); /0xbe:时钟多字节写命令 for(i=31; i0; i-) /31byte 寄存器数据 v_rtinputbyte(*preda); /写 1byte 数据 preda+; t_clk = 1; t_rst = 0; /* * 名称 : v_burstr1302r(uchar *preda) * 功能 : 读取 ds1302 寄存器数据 数字钟总体设计说明书 21 * 输入 : preda: 寄存器数据地址 * 返回值 : 无 */ void v_burstr1302r(uchar *preda) uchar i; t_rst = 0; t_clk = 0; t_rst = 1; v_rtinputbyte(0xff); /0xbf:时钟多字节读命令 for(i=31; i0; i-) /31byte 寄存器数据 *preda = uc_rtoutputbyte(); /读 1byte 数据 preda+; t_clk = 1; t_rst = 0; /* * 名称 : v_set1302(uchar *psecda) * 功能 : 设置初始时间 * 输入 : psecda: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年 * 7byte (bcd 码) 1b 1b 1b 1b 1b 1b 1b * 返回值: 无 */ void v_set1302(uchar *psecda) uchar i; 数字钟总体设计说明书 22 uchar ucaddr = 0x80; v_w1302(0x8e, 0x00); /控制命令,wp=0,写操作 for(i=7; i0; i-) v_w1302(ucaddr, *psecda); / 秒 分 时 日 月 星期 年 psecda+; ucaddr += 2; v_w1302(0x8e, 0x80); /控制命令,wp=1,写保护 /* * 名称 : v_get1302(uchar uccurtime) * 功能 : 读取 ds1302 当前时间 * 输入 : uccurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 * 7byte (bcd 码) 1b 1b 1b * 返回值 : 无 */ void v_get1302(uchar uccurtime) uchar i; uchar ucaddr = 0x81; for(i=0; i= 10) dec -= 10; bcd+; bcd 1; data1 += bcd 3; /用位移代替乘法运算 return data1; /* * 名称 : write_ds1302init() * 功能 : 往 ds1302 中写入数据。最开始显示的数据就是在这里设置的。 * 输入 : 无 * 输出 : 无 */ void write_ds1302init(void) v_w1302(0x8e,0); v_w1302(0x80,0x50);/写入秒 v_w1302(0x8e,0); v_w1302(0x82,0x59);/写入分 v_w1302(0x8e,0); v_w1302(0x84,0x07);/写入小时 v_w1302(0x8e,0); v_w1302(0x86,0x08);/写入日 v_w1302(0x8e,0); v_w1302(0x88,0x08);/写入月 v_w1302(0x8e,0); v_w1302(0x8a,0x05);/写入星期 v_w1302(0x8e,0); v_w1302(0x8c,0x08);/写入年 数字钟总体设计说明书 25 /* * 名称 : ds1302() * 功能 : 用于时钟动态扫描 * 输入 : 无 * 输出 : 无 */ void ds1302() uchar sec, min, hour; v_w1302(0x8f, 0); sec = uc_r1302(0x81); /读出 ds1302 中的秒 v_w1302(0x8f, 0); min = uc_r1302(0x83); /读出 ds1302 中的分 v_w1302(0x8f, 0); hour = uc_r1302(0x85); /读出 ds1302 中的小时 v_w1302(0x8f, 0); p0 = 0xff; _nop_(); p0 = tablehour / 10 % 10; p2 = 0; delay_1ms(2); p0 = tablehour % 10; p2 = 1; delay_1ms(2); p0 = 0x40; p2 = 2; 数字钟总体设计说明书 26 delay_1ms(2); p0 = tablemin / 10 % 10; p2 = 3; delay_1ms(2); p0 = tablemin % 10; p2 = 4; delay_1ms(2); switch(flag1) case 0:: p0 = 0x40;break; case 1: p0 = 0xc0;break; p2 = 5; delay_1ms(2); p0 = tablesec / 10 % 10; p2 = 6; del

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论