硬件课程设计说明书教学楼课铃系统硬件电路设计.doc
教学楼课铃系统硬件电路设计学生学号: 学生姓名: 专业班级: 电信0803 指导教师: 职 称: 高级实验师 讲师 起止日期:2011.3.28-2011.4.15 吉林化工学院Jilin Institute of Chemical Technology课程设计任务书一、 设计题目:教学楼课铃系统二、设计目的1、掌握DS1302时钟芯片的硬件电路构成原理及软件编程方法,熟悉DS1302时钟芯片的性能指标及特点;2、熟悉SST89E/V516RD2单片机的性能特点,并掌握SST89E/V516RD2单片机控制DS1302读写时间、日期的硬件电路组成及软件编程方法;3、了解LED显示及按键电路的组成原理,熟悉LED动态显示原理及实现方法;4、了解7805构成直流稳压电源的电路组成及工作原理。三、设计任务及要求 设计并实现具有显示日期和时间的电子数字钟,数字钟具有以下基本功能:1、使用7位LED显示时间、日期和星期,正常显示时、分、秒、星期,使用按键可切换显示年、月、日;2、具有时间、日期调整功能,通过键盘可进行时间、日期的调整;3、具有闹钟功能,使用键盘设定闹铃时间,由蜂鸣器产生闹铃;4、定时控制功能,使用小型继电器完成定时控制功能(发挥部分)。4、定时控制功能,使用小型继电器完成定时控制功能(发挥部分)。四、设计时间及进度安排设计时间共三周(2011.3.282011.4.17),具体安排如下表:周安排设 计 内 容设计时间第一周硬件电路设计2011.3.282011.4.3第二周硬件电路焊接与调试2011.4.42011.4.10第三周编写课程设计说明书,课程设计答辩。2011.4.42011.4.17五、 指导教师评语及学生成绩指导教师评语:年 月 日成绩指导教师(签字):目 录课程设计任务书I摘要1第1章 系统设计目的及其意义2第2章 方案比较32.1 方案比较3第3章 硬件电路设计43.1 SST89E516RD主控制电路43.2 时钟模块系统73.3 看门狗模块系统93.4显示模块系统103.6 响铃系统设计12第5章 软件设计13总结15参考文献16附录总体电路图17附录II元件清单18 摘要本设计是利用SST89E516RD单片机而设计的教学楼课铃系统,主要有主控模块、时钟模块、显示模块,复位模块、响铃模块、键盘接口模块等组成。该系统通过单片机来读取日历/时钟芯片DS1302的日期和时间,并且通过数码管显示出来,能够通过按键来调节日期、实时时间、响铃时间。该系统还采用了X25045芯片当程序跑飞时单片机自动复位。关键字:SST89E516RD、DS1302、X25045第1章 系统设计目的及其意义1、掌握DS1302时钟芯片的硬件电路构成原理及软件编程方法,熟悉DS1302时钟芯片的性能指标及特点。2、熟悉SST89E/V516RD2单片机的性能特点,并掌握SST89E/V516RD2单片控制DS1302读写时间、日期的硬件电路组成及软件编程方法。3、了解LED显示及按键电路的组成原理,熟悉LED动态显示原理及实现方 法。 4、此系统设计的教学楼铃装置是按照学校作息时间设定的,模拟了电子钟 显示时,分,秒。还根据学校的作息时间按时打铃,本系统用四个按键分 别用来调年、月、日、时、分、秒以保证时钟与标准时间相吻合。第2章 方案比较2.1 方案比较 方案一:采用51单片机SST89E51芯片软件定时中断实现时钟。利用89E51单片机自身的中断和定时器,通过软件产生时钟,虽然不需要外置硬件电路直接用51单片机,但是占用I/O口比较多,而且断电后时钟不能自加即再次充电(复位),程序又从初始化开始计时,不能友好的实现时钟要求。显示部分采用LCD(诺基亚5110)液晶来显示时间和闹铃,优点具有良好的人机界面,能够全面的显示日期和时间,显示字符多,缺点是价格比较高。键盘控制采用矩阵键盘。该方案优点在于减少I/O的使用,硬件电路连接麻烦,而且软件编程麻烦。方案二:采用DS1302时钟芯片实现实时时钟。利用DS1302芯片可以实现时钟,DS1302采用三线串行接口,占用引脚少。DS1302内部集成了可编程日历时钟,用户可以根据需要设置。内部集成了31个字节的静态RAM。DS1302的日历时钟可进行闰年的日历补偿。DS1302可以进行双电源供电,可以使用主电源和备用电源。DS1302芯片具有对备用电源涓电流充电功能,可有效提高备份电源的寿命。显示部分采用LED数码管显示时钟的年月日时分秒,上电显示时间利用键盘来转换成年月日。缺点是只能显示09的数字和一些简单字符,采用LED数码管优点是显示亮度高,醒目,价格便宜,寿命长。键盘控制采用独立键盘,采用独立键盘操作简单便于硬件软件设置。综上所述,采用方案二。 2-1 系统总体设计框图第3章 硬件电路设计3.1 SST89E516RD主控制电路 图3-1 主控制电路 根据课题的具体内容,任务要求,计时,校时,定时,键盘显示等功能经多方考虑,采用SST89E516RD低功耗单片机。SST89E516RD是一种高性能低功耗的采用CMOS工艺制造的8位微控制器,它提供下列标准特征:8K字节的程序存储器,128字节的RAM,32条I/O线,3个16位定时器/计数器,9个中断源4级中断优先权的中断结构,一个全双工的串行口,片上振荡器和时钟电路,单片机程序和数据存储空间分开独立寻址,有两个片内 FLASH 存储块。基本FLASH 模块(Block 0)占用64K 字节,二级FLASH 存储块Block 1 为8K 字节。图3-2 SST89E516RD单片机的片内结构图引脚说明:P07:0 I/O: P0 是一个漏极开路的8 位双向I/O 口。作为输出口,每位能驱动多 个LS 型TTL 负载。 P0 浮空,锁存器为“1”,可作为高阻抗输入。 在访问外部存储器时,P 0 口作为低8 位地址和数据总线分时复用。在 这种应用中,当转为高电平时,它用了强大的内部上拉。在外部主模式 编程状态下,P0 接收代码字节,在外部主模式校验过程中输出代码字 节。在程序校验过程中需要外部上拉电阻。P17:0 :带内部上拉的I/O:P1 是一个带内部上拉电阻的8 位准双向I/O 口。 每位能驱动 LS 型TTL负载。当P1 口作为输入口用时,向内部锁存器 写入“1”,P1 引脚被内部上拉电阻拉为高电平。由于内部上拉电阻, 被拉为低的P1 引脚能向外提供电流。P15,6,7 有16 毫安的高电 流驱动能力。当外部主模式在编程和测试时,P1 也接收低8 位地址。P10 I/O T2 :定时器 /计数器2 外部计数输入或时钟输出从定时器/计数器2。P11 I T2EX: 定时器/计数器2 捕捉/重装触发器和方向控制。P12 I EC1:PCA 定时器/计数器外部输入。P13 I/O CEX0:比较/捕捉外部输入输出模块,每个比较/捕捉模块连接到一P1 口引脚,当不用于PCA 时,这个口用作标准I/O。P14 I/O SS#:主机输入、从机输出(SPI)或CEX1:比较/捕捉外部输入输出 模块。P15 I/O MOSI:主机输出,从机输入(SPI)或CEX2:比较/捕捉外部输入输出 模块。P16 I/O MISO:主机输入,从机输出(SPI)或CEX3:比较/捕捉外部输入输出 模块。P17 I/O SCK: 主机时钟输出、从机时钟输入或CEX4:比较/捕捉外部输入输 出模块。P27:0 :带内部上拉的I/O: P2 是一个带内部上拉电阻的8 位准双向I/O 端口,当被作为输入时,向它写“1”,P2 引脚被内部上拉电阻拉为高电平。作为输入使用时,被内部上拉电阻下拉为低电平的P2 会产生电流。当从片外程序存储器取数和访问片外数据存储器时,P2 能提供高8 位地址。在此应用中,当转为VOH 时,它利用了功能极强的内部上拉电阻。当外部主模式在编程和测试时,它还接收控制信号和部分高8 位地址。P37:0 带内部上拉的I/O: P3 是一个带内部上拉电阻的8 位准双向I/O 口。P 3 的输出缓冲能驱动多个LS 型TTL 。当被作为输入时,向它写“1”,PORT 3 引脚被内部上拉电阻拉为高电平,作为输入使用时,被外部拉为低,能驱动电流。当外部主机在编程和校验时,它还能接收控制信号和部分高8 位地址。P30 I RXD :串行数据接收。P31 O TXD: 串行数据发送。P32 I INT0#:外部中断0 输入。P33 I INT1#:外部中断1 输入。P34 I T0:定时/计数器0 的外部计数输入。P35 I T1:定时/计数器1 的外部计数输入。P36 O WR#:外部数据存储器写选通。P37 O RD#:外部数据存储器读选通。P47:0 :带内部上拉的I/O: P3 是一个带内部上拉电阻的4 位准双向I/O 口。P 3 口输出缓冲能驱动多个LS 型TTL 。当被作为输入时,向它写“1”,PORT 3 引脚被内部上拉电阻拉为高电平,作为输入使用时,被外部拉为低,能驱动电流。P40 I RXD :串行数据接收。P41 O TXD: 串行数据发送。P42 I INT3#:外部中断3 输入。P43 I INT2#:外部中断2 输入。PSEN# I/O 程序存储器允许:PSEN#是外部程序存储器读选通。当从内部程序存 储器执行时,PSEN#不激活。当从外部程序存储器执行时,每个机器 周期PSEN#两次有效,除了当进入外部数据存储器时,在每个机器周 期都有一个PSEN#信号跳过。当RST 输入能持续保持高电平多于10 个机器周期时,迫使PSEN#由低到高的转换会使单片机进入主编程模 式。RST: 振荡器在工作时,此脚如能保持两个机器周期以上的高电平复位器件 复位后,当RST 输入保持高电平,PSEN#引脚被高到低的电平转换驱 动,器件将进入外部主模式,否则,器件将进入通用操作模式。EA# I: 外部访问允许:为了使单片机能从片外程序存储器取指令,EA#必为 低。 内部程序执行时,EA#必为高电平。然而,第四级加密锁将禁止EA#, 程序只能从片内程序存储器开始执行。EA#能承受12V 的高电压。(“绝 对最大承受值 )。ALE/PROG I/0: 地址允许:在访问外部存储器时,ALE 用于锁存出现在P0 口 的低8 位地址。此引脚也是外部主模式编程脉冲输入端(PROG#)。除 了访问外部数据存储器,ALE 在每个机器周期有效两次,在第二个机 器周期有一个ALE 有效被跳过。然而,如果AO 置“1“,ALE 被禁 止。XTAL1/ I/0 振荡器:输入输出来转换振荡放大器。XTAL 1 是内部时钟产生电路 的输入从外部时钟源。VDD 输入 电源输入:通用、IDLE、省电、备用模式下的电源供应。VSS 输入 接地端:电源接地端(参考电压为0V)。3.2 时钟模块系统图3-3时钟模块电路如图3-3,该系统采用了DS1302时钟芯片,DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,工作电压在2.55.5V,采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓电流充电的能力,本系统采用5V电源供电。实时时钟可提供秒、分、时、日、星期、月和年,一个月小于31天时可以自动调整,且具有闰年补偿功能。时钟芯片DS1302在任何数据传送时必须先初始化,把RST引脚置为高电平,然后把8位地址和命令装入移位寄存器,数据在SCLK的上升沿被输入,无论是读周期还是写周期开始8位指定40个寄存器中哪个将被访问到,在开始8个时钟周期,把命令字节装入揿位寄存器,在写操作时写入数据,时钟脉冲的个数在单位字节下为8加8,在多字节方式下为8加字节数,最大可达248字节数。为了提高对32个地址的寻址能力,可以把时钟或RAM寄存器规定为多字节方式,在多字节方式中,读或写从地址0的位0开始,必须按照数据传送的次序最先的8个寄存器。但是当以多个字节写RAM时,为了传送数据不必写所有31字节,不管是否写了全部31字节,所写的每个字节都将传送至RAM。时钟暂停:秒寄存器的位7定义位时钟暂停位,当它为1时,DS1302停止振荡,进入低功耗的备份方式,通常在对DS1302进行写操作时,停止振荡,当它为0时时钟将开始启动。 DS1302是SPI总线驱动方式,它不仅要向总线写入控制字,还需要读取寄存器数据。要想与DS1302通信,首先要了解DS1302的控制字,如图3-4 7 6 5 4 3 21 0 1 RAM A4 A3A2A1A0RD表3-4 DS1302的控制字控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到 DS1302中。 位 6:如果为0,则表示存取日历时钟数据,为1表示存取 RAM 数据; 位 5至位1(A4A0):指示操作单元的地址; 位 0(最低有效位):如为0,表示要进行写操作,为1表示进行读操作。 控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位。 DS1302内部的RAM分为两类,一类是单个RAM单元,共31个,每个单元为一个8位的字节,其命令控制字为COHFDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写),FFH(读)。单片机是通过简单的同步串行通讯与DS1302通讯的,每次通讯都必须由单片机发起,无论是读还是写操作,单片机都必须先向DS1302写入一个命令帧,最高位BIT7固定为1,BIT6决定操作是针对RAM还是时钟寄存器,接着的5个BIT 是RAM或时钟寄存器在DS1302的内部地址,最后一个BIT表示这次操作是读操作还是写操作。 物理上,DS1302的通讯接口由3个口线组成,即 RST,SCLK,I/O。其中RST从低电平变成高电平启动一次数据传输过程,SCLK 是时钟线,I/O 是数据线。 图 3-5 DS1302的内部结构图 图3-6 DS1302外部管脚分配如图3-6为该芯片的管脚图,各引脚的功能为:Vcc1:主电源;Vcc2:备份电源。当 Vcc2>Vcc1+0.2V 时, 由 Vcc2向 DS1302 供电,当 Vcc2< Vcc1时,由 Vcc1向 DS1302供电。 SCLK:串行时钟,输入,控制数据的输入与输出; I/O: 三线接口时的双向数据线; CE: 输入信号,在读、写数据期间,必须为高。该引脚有两个功能:第一,CE 开始控制字访问移位寄存器的控制逻辑;其次,CE 提供结束单字节或多 字节数据传输的方法。3.3 看门狗模块系统 图3-7 看门狗电路 本系统复位电路采用了X25045看门狗电路,X25045是美国Xicor公司的生产的标准化8脚集成电路,它将EEPROM、看门狗定时器、电压监控三种功能组合在单个芯片之内,大大简化了硬件设计,提高了系统的可靠性,减少了对印制电路板的空间要求,降低了成本和系统功耗,是一种理想的单片机外围芯片。 看门狗定时器的预置时间是通过X25045的状态寄存器的相应位来设定的。如表3-1所示,X25045状态寄存器共有6位有含义,其中WD1、WD0和看门狗电路有关,其余位和EEPROM的工作设置有关。 D7 D6 D5 D4 D3 D2 D1 D0 X X WD1 WD0 BL1 BL0 WEL WIP表3-8 X25045状态寄存器WD10,WD0=0,预置时间为1.4s;WD10,WD0=1,预置时间为0.6s。WD11,WD0=0,预置时间为0.2s;WD11,WD0=1,禁止看门狗工作。 看门狗电路的定时时间长短可由具体应用程序的循环周期决定,通常比系统正常工作时最大循环周期的时间略长即可。编程时,可在软件的合适地方加一条喂狗指令,使看门狗的定时时间永远达不到预置时间,系统就不会复位而正常工作。当系统跑飞,用软件陷阱等别的方法无法捕捉回程序时,则看门狗定时时间很快增长到预置时间,迫使系统复位。看门狗电路硬件连接如图3-7所示。 X25045在读写操作之前,需要先向它发出指令,指令名及指令格式如下表。指令名指令格式操作WREN00000110设置写使能锁存器(允许写操作)WRDI00000100复位写使能锁存器(禁止写操作)RDSR00000101读状态寄存器WRSR00000001写状态寄存器READ0000A8011把开始于所选地址的存储器中的数据读出WRITE0000A8010把数据写入开始于所选地址的存储器表3-9 X25045指令及其含义图3-10 X25045引脚图如图3-10外部引脚封装,其引脚功能如下:CS:片选择输入;SO:串行输出,数据由此引脚逐位输出;SI:串行输入,数据或命令由此引脚逐位写入X25045;SCK:串行时钟输入,其上升沿将数据或命令写入,下降沿将数据输出;WP:写保护输入。当它低电平时,写操作被禁止;Vss:地;Vcc:电源电压;RESET:复位输出。3.4显示模块系统 图 3-11 显示模块电路 显示部分采用普通的共阳数码管显示,采用动态扫描,以减少硬件电路,数码管分别为十时,时,十分,分,十秒,秒显示,显示时采用串行口输出段码,用74LS164来驱动数码管扫描只需7ms。74LS164内部为8个D触发器,用以实现数据的串行移位,74LS164为TTL单向8位移位寄存器,可实现串行输入并行输出,CPU为时钟输入端,可连接到串行口TXD端。每个时钟信号的上升沿加到CP端时,移位寄存器移一位,8个时钟脉冲过后8位二进制数全部移入74LS164中,MR脚为复位端,当该位为低电平时,移位寄存器各位复0。当它为高电平时时钟脉冲才起作用。Q1Q8并行输出分别接数码管的各段对应脚上,在给出8个脉冲后,最先进入74LS164的第一个字节数据到达最高位,再来1个脉冲,第一个脉冲就会从最高位移出,进入下一个74LS164的第一位。 图3-12 74LS164外部封装图引脚功能:CLOCK :时钟输入端CLEAR: 同步清除输入端(低电平有效) A,B :串行数据输入端QAQH: 输出端3.5键盘接口设计 图 3-13电路键盘设计 本设计采用独立键盘按钮,分别与单片机的P3.4,P3.5,P0.5,P3.7端口相连,P3.4来控制年月和时分的转换,P3.5来调节时间,P0.5来控制时间的加,P3.7来设置闹铃。3.6 响铃系统设计 图 3-14 响铃设计响铃采用了一个PNP三极管来驱动一个蜂鸣器,简单方便,响铃效果好。第5章 软件设计5.1 Keil软件介绍及使用KeilC51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。我们利用开发软件Keil uVision3来编写、修改所需程序并下载程序到单片机运行。Keil uVision4的使用步骤如下:应用KEIL软件的具体步骤4:1,打开KEIL4软件。双击桌面图标进入KEIL主页面。2,新建一个uVision progect。单击KEIL主页面菜单栏里的 ,选择,选择存储目录。并创建工程名称为“语音报号系统”,按确定保存工程。选择CPU类型为下的,点击OK。3,新建文本文档,并保存为*.c的文件。在菜单栏选择file->new新建文本文档,并保存为“语音报号系统.c”文档。4,工作组加载工程文档。右键点击左边选择 选择“语音报号系统.C”。5,编写c语言程序代码。按照系统程序框图编写程序源代码。6,设置生成*.hex文件。点击工具栏选择output栏,选择点击OK完成设置。7,编译文件。点击编译所有。8,将*.hex文件下载到SST89E516RD单片机中。开始初始化参数设置调用键盘子程序调用显示子程序调用控制子程序图 5-1 主程序流程图程序源代码见附录。总结 经过设计该系统达到任务要求,系统可以被学校、工厂等企事业单位应用,设计比较简单。经过我们的努力,使我对单片机有了初步的认识,了解了一些软件编程的技巧。通过本次硬件实习,使我学会了课堂上学不到的知识。对单片机又有了更深的认识,掌握单片机设计步骤,知道这门课程在工作中的重要性。在课程设计过程中也遇到了许多困难,但在老师和同学们的同共努力下都得到解决,最终看到了成果.我感谢老师这三周来对我们细心的教导,使我熟悉了一些软件方面的知识,相信定会为日后工作打下坚实基础.硬件设计加深了学生对所学理论的理解,扩展了教学中的实验内容和要求,积累了实践体验和经验,让我们提前感受到毕业设计的大致过程,进而为我们的毕业设计奠定了良好的基础,也提高学生实际应用能力。我们在课堂上掌握的仅仅是专业课的理论知识,如何去锻炼我们的实践能力?如何把我们所学的专业基础课理论知识运用到实践中去呢?我想做类似的课程设计就为我们提供了良好的实践平台。要做好一个课程设计,就必须做到:在设计程序之前,对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常的,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。总之这硬件设计让我把理论设计和工程实践相结合、巩固基础知识与培养创新意识相结合、个人作用和集体协作相结合等方面全面的培养学生的全面素质。这些在我今后的学习和工作当中都会有很大的帮助。最后我要感谢这次实习中给我帮助的各位老师。 参考文献1阎石.数字电子技术基础.北京:高等教育出版社,2009,32翟玉文.电子设计与实践.北京:中国电力出版社,2006,83龙可微.X25045芯片及其应用:电子技术应用,1999.94张毅刚.单片机原理及其应用:高等教育出版社,2003,1附录总体电路图附录II元件清单序号元件名称型号/参数数量/个1单片机SST89E516RD12数码管SDM-S02811A63晶振12M 32768KHz24按键4*445DIP座40P16整流桥2A17变压器220V/7.5V 5W18单排座2.54mm19双排座2.54mm110二极管1N4007211三极管8050412三极管9013113发光二极管5mm114电阻1K815电阻3301216电容470uf217电容22p218时钟芯片DS1302119看门狗芯片X25045120蜂鸣器无源1附录III 源程序#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define wei P2#define WREN 0x06#define WRDI 0x04#define RDSR 0x05#define WRSR 0x01#define READ 0x03#define WRITE 0x02sbit ds1302_clk=P32;sbit ds1302_io=P33;sbit ds1302_rst=P34;sbit Dat=P15; sbit CLK=P14;sbit key1=P37; /时间日期转换sbit set=P36; /设置选择键sbit up=P05; /+1sbit arm=P27; /设定闹铃sbit bing=P26; /响铃sbit SO=P10; /定义输出端口sbit CS=P11; /定义片选端口sbit SCK=P12; /定义时钟端口sbit SI=P13; /定义输入端口sbit C=ACC7; /*定义位变量*/unsigned char code tab= 0x30,0xf9,0x52,0xd0,0x99,0x94,0x14,0xF1,0x10,0x90; /0-9,unsigned char code dispbitcode=0xdf,0xef,0xf7,0xfd,0xfb,0xfe;unsigned char dispbuf8=0,0,10,0,0,10,0,0;unsigned char disp8=0,0,10,0,0,10,0,0;unsigned char hour,minute,second,year,month,day,key,room;unsigned char shi,fen,miao,nian,yue,ri;unsigned char mscnt,cont;unsigned char hor,min,sec,nn,yy,rr;unsigned char time=0x06,0x03,0x03,0x03,0x00,0x00,0x00;/初始时间数组unsigned char id;bit flag;void delay(void) int k;for(k=0;k<400;k+);void Delay(uchar tm) uchar i,j; for(i=tm;i>0;i-) for(j=110;j>0;j-); /-bdata unsigned char Com;void Tran() /*发送一字节数据子函数*/ unsigned char I; for(I=0; I<8; I+) ACC=Com; /*将数据放入A中*/ SI=C; SCK=0; /*Sck产生一个上跳变*/ SCK=1; Com=Com<<1; /*左移一位*/ return;void inputbyte(unsigned char byte1) unsigned char i; for(i=8;i>0;i-) ds1302_io=(bit)(byte1&0x01);/先进最低位 ds1302_clk=1; _nop_(); ds1302_clk=0; byte1>>=1; unsigned char outputbyte(void) unsigned char i; unsigned char temp=0; for(i=8;i>0;i-) temp=temp>>1; if(ds1302_io) temp=temp|0x80; /先出最低位 ds1302_clk=1; _nop_(); ds1302_clk=0; return(temp);void write_ds1302(unsigned char addr,unsigned char tdat) ds1302_rst=0; _nop_(); ds1302_clk=0; _nop_(); ds1302_rst=1; inputbyte(addr); _nop_(); inputbyte(tdat); ds1302_clk=1; _nop_(); ds1302_rst=0;unsigned char read_ds1302(unsigned char add) unsigned char timedata; ds1302_rst=0; _nop_(); ds1302_clk=0; _nop_(); ds1302_rst=1; inputbyte(add); _nop_(); timedata=outputbyte(); ds1302_clk=1; _nop_(); ds1302_rst=0; return(timedata);void initial_ds1302() write_ds1302(0x8e,0x00);/写保护寄存器,在对时钟或RAM写前WP一定要为0second=read_ds1302(0x81);if(second&0x80) write_ds1302(0x80,0x00); /CH=0时振荡器工作允许unsigned char bcd_dec(unsigned char x) unsigned char y; y=(x/16)*10)+(x%16); return(y);unsigned char dec_bcd(unsigned char x) unsigned char y; y=(x/10)<<4)|(x%10); return(y);void read() second=read_ds1302(0x81); minute=read_ds1302(0x83); hour=read_ds1302(0x85); year=read_ds1302(0x8d); month=read_ds1302(0x89); day=read_ds1302(0x87);void read_time(uchar sss,uchar fff,uchar mmm) dispbuf0=tabsss/16; dispbuf1=tabsss%16; dispbuf2=tabfff/16; dispbuf3=tabfff%16; dispbuf4=tabmmm/16; dispbuf5=tabmmm%16;void read_day(uchar nnn,uchar yyy,uchar rrr) disp0=tabnnn/16; disp1=tabnnn%