毕业设计(论文)-电子日历的制作51单片机的应用.doc

上传人:good****022 文档编号:116532684 上传时间:2022-07-05 格式:DOC 页数:46 大小:1.11MB
返回 下载 相关 举报
毕业设计(论文)-电子日历的制作51单片机的应用.doc_第1页
第1页 / 共46页
毕业设计(论文)-电子日历的制作51单片机的应用.doc_第2页
第2页 / 共46页
毕业设计(论文)-电子日历的制作51单片机的应用.doc_第3页
第3页 / 共46页
点击查看更多>>
资源描述
摘 要 I 摘摘 要要 随着科技的快速发展,时间的流逝,从观太阳、摆钟到现在电子钟,人类 不断研究,不断创新纪录。万年历具有读取方便、显示直观、功能多样、电路 简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场 前景。对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、 星期、时、分、秒信息,还具有时间校准等功能。 本系统以 STC89C52RC 单片机为核心,结合液晶模块 LCD1602、专用时钟芯 片 DS1302 等电路构成。时钟由美国 DALLAS 公司推出的具有涓细电流充电能的 低功耗实时时钟电路 DS1302 实现,它可以对年、月、日、星期、时、分、秒进 行计时,还具有闰年补偿等多种功能,而且 DS1302 的使用寿命长,误差小。用 LCD1602 液晶显示日历、时钟,直观且显示信息丰富;用四个键盘实现时钟正常 显示、调时及闹钟时间设置。本系统设计大部分功能由软件来实现,使电路简 单明了,系统稳定性也得到大大的提高。 关键词关键词:电子日历 单片机 STC89C52RC DS1302 目 录 III 目目 录录 摘摘 要要I 第一章第一章 绪论绪论.1 1.1 引言.1 1.2 设计的难点和可能出现的问题.1 1.2.1 设计难点.1 1.2.2 可能出现的问题.1 1.3 本设计应达到的要求1 第二章第二章 总体方案设计总体方案设计.3 2.1 电子日历设计方案论证3 2.1.1 单片机芯片的选择方案论证.3 2.1.2 显示模块的选择方案和论证.3 2.1.3 时钟芯片的选择方案和论证.3 2.2 系统框图4 第三章第三章 单元硬件设计与分析单元硬件设计与分析.5 3.1 单片机模块设计5 3.1.1 单片机的选型.5 3.1.2 单片机最小系统6 3.2 日历模块电路设计.8 3.3 显示模块设计10 3.3.1 显示器的选型10 3.3.2 LCD1602 引脚10 3.3.3 LCD1602 与单片机接口电路设计11 3.4 键盘电路设计11 3.5 闹铃模块设计12 第四章第四章 系统软件设计系统软件设计.13 4.1 主程序设计13 4.2 显示程序设计13 4.3 按键扫描子程序设计14 4.4 DS1302 日期时间数据读取显示设计14 第五章第五章 软硬件调试软硬件调试.17 5.1 硬件测试17 5.2 软件测试17 5.3 测试结果分析与结论17 5.3.1 测试结果分析.17 5.3.2 测试结论17 第六章第六章 总结与展望总结与展望.19 6.1 总结19 6.2 展望19 目 录 致致 谢谢.21 参考文献参考文献.23 附录附录 1 元器件明细表元器件明细表.25 附录附录 2 程序清单程序清单26 第一章 绪论 1 第一章第一章 绪论绪论 1.1 引言引言 随着社会的不断发展及人们生活水平的不断提高,单片机控制已经越来越 普及,它已经成为人们生活中必不可少的工具之一,它已经普及到我们生活, 工作,科研,各个领域,已经成为一种比较成熟的技术, 其中电子日历就是一 个典型的例子。 本设计采用 STC89C52RC 单片机作为电子日历的控制模块。单片机可把由 DS1302 中的数据利用软件来进行处理,从而把数据传输到显示模块,日历和闹 铃的显示。以 LCD 液晶显示器为显示模块,把单片机传来的的数据显示出来, 并且显示多样化,在显示电路中,主要靠键盘来实现各种显示要求的选择与切 换。 1.2 设计设计的的难难点和可能出点和可能出现现的的问题问题 1.2.1 设计难设计难点点 (1)LCD 显示模块的设计 (2)闹铃设计模块的实现设计 (3)单片机个功能模块的综合设计 (4)电路总体设计,元器件选择及焊接,调试 1.2.2 可能出可能出现现的的问题问题 (1)LCD 显示模块的功能显示不正常 (2)闹铃设计与其他时间功能设计冲突 (3)软件程序设计功能不完善,系统无法正常运转 1.3 本本设计应设计应达到的要求达到的要求 本课题以单片机为主控制器,采用专用日历时钟芯片或单片机内部定时器 产生时钟信号,实现年、月、日、时、分、秒计数,并通过适当的方式显示出 来,达到以下要求: 1能显示实时时钟、日历; 2允许误差:10 秒/天; 3可以通过按键设置(调整)时钟; 4显示模式:数码管或液晶显示; 第二章 总体方案设计 3 第二章第二章 总体方案设计总体方案设计 2.1 电电子日子日历设计历设计方案方案论证论证 2.1.1 单单片机芯片的片机芯片的选择选择方案方案论证论证 方案一: 采用 89C51 芯片作为硬件核心,采用 Flash ROM,内部具有 4KB ROM 存储 空间,能于 3V 的超低压工作,而且与 MCS-51 系列单片机完全兼容,但是运用于电 路设计中时由于不具备 ISP 在线编程技术, 当在对电路进行调试时,由于程序 的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片 造成一定的损坏。 方案二: 采用 STC89C52RC,片内 ROM 全都采用 Flash ROM,能以 3V 的超底压工作, 同时也与 MCS-51 系列单片机完全该芯片内部存储器为 8KB ROM 存储空间,同样 具有 89C51 的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由 于程序的错误修改或对程序的新增功能需要导入程序时,不需要对芯片多次拔 插,所以不会对芯片造成损坏,所以选择采用 STC89C52RC 作为主控制系统。 2.1.2 显显示模示模块块的的选择选择方案和方案和论证论证 方案一: 采用 LED 数码管动态扫描,LED 数码管价格适中,对于显示数字合适,采用动 态扫描法与单片机连接时,虽然占用的单片机口线少,但连线还需要花费一点时 间,所以也不用此种作为显示。 方案二: 采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成, 对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以 也不用此种作为显示。 方案三: 采用 LCD1602 液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图 形,显示多样,清晰可见,与单片机连接方便,所以在此设计中采用 LCD1602 液 晶显示屏。 2.1.3 时钟时钟芯片的芯片的选择选择方案和方案和论证论证 方案一: 直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、 时、分、秒计数。采用此种方案虽然减少芯片的使用,节约成本,但是,实现 的时间误差较大,所以不采用此方案。 方案二: 采用 DS1302 时钟芯片实现时钟,DS1302 芯片是一种高性能的时钟芯片,可 自动对秒、分、时、日、周、月、年进行计数,而且精度高,位的 RAM 做为数据 暂存区,工作电压 2.5V5.5V 范围内,2.5V 时耗电小于 300nA。 2.2 系系统统框框图图 电子日历电路设计总体设计方框图如图 2-1 所示,控制电路采用单片机 STC89C52RC,时钟电路采用 DS1302,用 LCD1602 液晶显示实现时钟显示,闹铃 模块采用电磁式蜂鸣器驱动。 单片机模块 STC89C52RC 日历模块 键盘模块 闹铃模块 显示模块 图 2-1 总体设计方框图 第三章 单元硬件设计与分析 5 第三章第三章 单元硬件设计与分析单元硬件设计与分析 整个电子时钟系统电路可分为五部分:单片机模块 STC89C52RC、显示模 块、日历模块、键盘显示、闹铃模块。 3.1 单单片机模片机模块设计块设计 3.1.1 单单片机的片机的选选型型 根据第二章单片机芯片的选择方案论证,选择采用 STC89C52RC 作为主控 制系统,STC89C52RC 引脚如图 3-1 所示。 图3-1 STC89C52RC各引脚图 (1)VCC:STC89C52RC电源正端输入,接 +5V。 (2)VSS:电源地端。 (3)XTAL1:单芯片系统时钟的反相放大器输入端。 (4)XTAL0:系统时钟的反相放大器输出端,一般在设计上只要在 XTAL1 和 XTAL2 上接上一只石英振荡晶体系统就可以动作了,此外可以在 两引脚与地之间加入一 20PF 的小电容,可以使系统更稳定,避免噪声干扰 而死机。 (5)RESET:STC89C52RC 的重置引脚,高电平动作,当要对晶片重置时, 只要对此引脚电平提升至高电平并保持两个机器周期以上的时间, STC89C52RC 便能完成系统重置的各项动作,使得内部特殊功能寄存器之内容 均被设成已知状态,并且至地址 0000H 处开始读入程序代码而执行程序。 (6)EA/Vpp:“EA“为英文“External Access“的缩写,表示存取外部程 序代码之意,低电平动作,也就是说当此引脚接低电平后,系统会取用外部 的程序代码(存于外部 EPROM 中)来执行程序。因此在 8031 及 8032 中, EA 引脚必须接低电平,因为其内部无程序存储器空间。如果是使用 8751 内部程序空间时,此引脚要接成高电平。此外,在将程序代码烧录至8751 内部 EPROM 时,可以利用此引脚来输入 21V 的烧录高压( Vpp)。 (7)ALE/PROG:端口 3 的管脚设置: P3.0:RXD,串行通信输入; P3.1:TXD,串行通信输出; P3.2:INT0,外部中断 0 输入; P3.3:INT1,外部中断 1 输入; P3.4:T0,计时计数器 0 输入; P3.5:T1,计时计数器 1 输入; P3.6:WR:外部数据存储器的写入信号; P3.7:RD,外部数据存储器的读取信号。 3.1.2 单单片机最小系片机最小系统统 (1)复位电路设计 STC89C52RC 单片机的复位是由外部的复位电路来实现的。复位引脚 RST 通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,在每个 机器周期的 S5P2,斯密特触发器的输出电平由复位电路采样一次,然后才能得 到内部复位操作所需要的信号。 上电复位:上电复位电路是种简单的复位电路,只要在 RST 复位引脚接一 个电容到 VCC,接一个电阻到地就可以了。上电复位是指在给系统上电时,复位 电路通过电容加到 RST 复位引脚一个短暂的高电平信号,这个复位信号随着 VCC 对电容的充电过程而回落,所以 RST 引脚复位的高电平维持时间取决于电容的 充电时间。为了保证系统安全可靠的复位,RST 引脚的高电平信号必须维持足够 长的时间。电路如图 3-2 所示。 图 3-2 上电复位电路 上电自动复位是通过外部复位电路的电容充电来实现的。只要 Vcc 的上升 时间不超过 1ms,就可以实现自动上电复位。 第三章 单元硬件设计与分析 7 (2)时钟电路设计 时钟电路是单片机的心脏,单片机各功能部件的运行都是以时钟频率为基 准,有条不紊的一拍一拍地工作。因此,时钟频率直接影响单片机的速度,时 钟电路的质量也直接影响单片机系统的稳定性。常用的时钟电路有两种方式: 一种是内部时钟方式,另一种为外部时钟方式。本文用的是内部时钟方式。电 路如图 3-3 所示。 图 3-3 时钟电路 STC89C52RC 单片机内部有一个用于构成振荡器的高增益反相放大器,该高 增益反向放大器的输入端为芯片引脚 XTAL1,输出端为引脚 XTAL04。这两个引 脚跨接石英晶体振荡器和微调电容,就构成一个稳定的自激振荡器。 单片机的最小系统如图 3-4 所示。 图 3-4 单片机最小系统 3.2 日日历历模模块电块电路路设计设计 根据第二章时钟芯片的选择方案和论证,选择采用 DS1302 作为日历模块电 路设计的核心。 (1)DS1302 的引脚及功能 时钟电路采用 DS1302,DS1302 是美国 DALLAS 公司推出的一种高性能、 低功耗、带 RAM 的实时时钟芯片,它可以对年、月、日、星期、时、分、秒 进行计时,且具有闰年补偿功能,工作电压为 2.55.5V。采用三线接口与 CPU 进行同步通信,并可采用突发方式一次传送多个字节的时间数据或 RAM 数据。DS1302 内部有一个 318 的用于临时性存放数据的 RAM 存储器。 DS1302 的封装和引脚功能分别如图 3-5 和表 3.1 所示。 图 3-5 DS1302 的 DIP 封装图 (2)DS1302 复位和时钟控制 DS1302 通过把 RST 输入驱动置高电平来启动所有的数据传送。RST 输入有 两种功能:首先,RST 接通控制逻辑,允许地址/命令序列送入移位寄存器;其 次,RST 提供了终止单字节或多字节数据的传送手段。当 RST 为高电平时,所有 数据传送被初始化,允许对 DS1302 进行操作。如果在传送过程中置 RST 为低电 平,则会终止此数据传送,并且 I/O 引脚变为高阻状态。上电运行时,在 VCC2.5V 之前,RST 必须保持低电平。只有在 SCLK 为低电平时,才能将 RST 置为高电平。 表 3.1 DS1302 的引脚功能 (3)DS1302 的控制字节 管脚号管脚名称功能 1Vcc2 主电源 2、3X1、X2 32.768HZ 4GND 地 5RST 复位/片选断 6I/O 串行数据输入/输出 7SCLK 串行时钟输入端 8Vcc1 后备电源 第三章 单元硬件设计与分析 9 DS1302 的控制字如表 3.2 所示。控制字节的高有效位(位 7)必须是逻辑 1,如果它为 0,则不能把数据写入 DS1302 中,位 6 如果 0,则表示存取日历时 钟数据,为 1 表示存取 RAM 数据;位 5 至位 1 指示操作单元的地址;最低有效 位(位 0)如为 0 表示要进行写操作,为 1 表示进行读操作,控制字节总是从最 低位开始输出。DS1302 的控制字格式如表 3.2 所示。 表 3.2 DS1302 的控制字格式 DS1302 有 12 个寄存器,其中有 7 个寄存器与日历、时钟相关,存放的数据 位为 BCD 码形式,其日历、时间寄存器及其控制字如表 3.3 所示。 表 3.3 DS1302 寄存器日历、时间寄存器及其控制字 写寄存 器 读寄存 器 Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0 80H81HCH 10 秒秒 82H83H 10 分分 10 84H85H12/24 10 AM/PM 时时 86H87H00 10 日日 88H89H00 10 月月 8AH8BH00000 星期 8CH8DH 10 年年 8EH8FHWP0000000 (4)DS1302 的性能指标 a.实时时钟具有能计算 2100 年之前的秒分时日日期星期月年的能力还有闰 年调整的能力; b.31 8 位暂存数据存储 RAM; c.串行 I/O 口方式使得管脚数量最少; d.宽范围工作电压 2.05.5V; e.工作电流 2.0V 时,小于 300nA; f.读/写时钟或 RAM 数据时有两种传送方式单字节传送和多字节传送字符组 方式; g.8 脚 DIP 封装或可选的 8 脚 SOIC 封装根据表面装配; h.简单 3 线接口; i.与 TTL 兼容 Vcc=5V; j.可选工业级温度范围-40 +85; 76543210 RAMRD 1 CK A4A3A2A1A0 WR k.对 Vcc1 有可选的涓流充电能力; l.双电源管用于主电源和备份电源供应; m.备份电源管脚可由电池或大容量电容输入; 3.3 显显示模示模块设计块设计 3.3.1 显显示器的示器的选选型型 显示电路可以用数码管或液晶显示,显示方便,易于读数。本次设计采用 1602 液晶显示器,可以较直观的动态显示实时时钟,数据显示(误差限制在 10 秒每天)。 3.3.2 LCD1602 引脚引脚 显示电路采用 LCD1602 液晶显示器,引脚排列如图 3-6 所示,引脚功能如表 3.4 所示。 图 3-6 1602 引脚图 表 3.4 LCD1602 引脚功能表 第三章 单元硬件设计与分析 11 3.3.3 LCD1602 与与单单片机接口片机接口电电路路设计设计 以 P0、P1 口为 1602 字符点阵液晶显示模块的接口进行设计,接口电路如 图 3-7 所示。 引脚引脚符号符号功能说明功能说明 1VSS 一般接地 2VDD 接电源(+5V) 3V0 液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度 最高(对比度过高时会产生“鬼影”,使用时可以通过一个 10K 的电位 器调整对比度)。 4RS RS 为寄存器选择,高电平 1 时选择数据寄存器、低电平 0 时选择指令寄 存器。 5R/W R/W 为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。 6E E(或 EN)端为使能(enable)端,下降沿使能。 7DB0 底 4 位三态、 双向数据总线 0 位(最低位) 8DB1 底 4 位三态、 双向数据总线 1 位 9DB2 底 4 位三态、 双向数据总线 2 位 10DB3 底 4 位三态、 双向数据总线 3 位 11DB4 高 4 位三态、 双向数据总线 12DB5 高 4 位三态、 双向数据总线 5 位 13DB6 高 4 位三态、 双向数据总线 6 位 14DB7 高 4 位三态、 双向数据总线 7 位(最高位)(也是 busy flag) 15BLA 背光电源正极 16BLK 背光 电源负极 图 3-7 LCD1602 与单片机连接电路 3.4 键盘电键盘电路路设计设计 键盘的开关状态通过一定的电路转换为高、低电平状态。键盘闭合过程在 相应的 I/O 端口形成一个负脉冲。闭合和释放过程都要经过一定的过程才能达 到稳定,这一过程是处于高、低电平之间的一种不稳定状态,称为抖动。抖动 持续时间的常长短与开关的机械特性有关,一般在 5-10ms 之间。为了避免 CPU 多次处理键盘的一次闭合,应采用措施消除抖动。本设计采用的是独立式按键, 如直接用 I/O 口线构成单个按键电路,每个按键占用一条 I/O 口线,每个按键 的工作状态不会产生互相影响。如图 3-8 所示为 4 个键盘的独立式按键接口电 路。 第三章 单元硬件设计与分析 13 图 3-8 独立式键盘接口电路结构图 SB0 表示功能移位键,按键选择要调整的时十位、时个位、分十位或分个位。 SB1 表示数字“+“键,按一下则对应的数字加 1。 SB2 口表示数字“-”键,按一下则对应的数字减 1。 SB3 口表示时间表的切换,程序默认为日常时间表,当按下该开关,使输入 为低电平时,表示当前执行的是考试时间表,并有绿发光二极管显示。再按键, 使键抬起,输入维高电平时,表示当前执行的是日常作息时间表,用红发光二 级管显示。 3.5 闹铃闹铃模模块设计块设计 闹铃电路采用电磁式蜂鸣器驱动,蜂鸣器发声原理是电流通过电磁线圈, 使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它, 单片机 IO 引脚输出的电流较小,单片机输出的 TTL 电平基本上驱动不了蜂鸣器, 因此需要增加一个电流放大的电路。S51 增强型单片机实验板通过一个三极管 C8550 来放大驱动蜂鸣器,电磁式蜂鸣器驱动电路如图 3-9 所示。 图 3-9 电磁式蜂鸣器驱动电路 蜂鸣器的正极接到 VCC(5V)电源上面,蜂鸣器的负极接到三极管的发射 极 E,三极管的基级 B 经过限流电阻 R1 后由单片机的 P3.7 引脚控制,当 P3.7 输出高电平时,三极管 T1 截止,没有电流流过线圈,蜂鸣器不发声;当 P3.7 输出低电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。 第四章 系统软件设计 15 第四章第四章 系统软件设计系统软件设计 系统程序主要包括主程序、读出时钟子程序、1602 液晶显示程序、DS1302 时钟部分子程序等。 4.1 主程序主程序设计设计 系统进行过相关的初始化指令之后即开始执行万年历部分的程序:读取 DS1302 的日期时间数据信息、查询有无功能键按下。若有,则根据相应的按键 进行对应的处理;若无,则显示。主程序框图如图 4-1 所示。程序清单见附录 二。 开始 初始化 是否有按键按下? 读取时间数据并转换成液晶字符 读取日期数据并转化成液晶字符 通过液晶显示时间、日期、星期 Y N 进入时间调整 模式 图 4-1 主程序流程图 4.2 显显示程序示程序设计设计 显示程序主要将时钟芯片产生的日历信息显示出来,主要包含 LCD1602 的 初始化、在指定位置显示信息,其流程图如图 4-2 所示。 LCD1602 初始 化 设定数据位置 输入显示数据 开始 结束 图 4-2 显示程序流程图 4.3 按按键扫键扫描子程序描子程序设计设计 调整时间用 4 个调整按钮,1 个作为移位、控制用,另外 3 个分别作为加调 整、减调整和复位用。在调整时间过程中,要调整的位与其他位应该有区别, 所以增加了闪烁功能,即调整的位一直在闪烁,直到调整下一位示值给该位。 时间调整程序流程图 4-3 所示。 N Y N Y 开始 计时停止 对应位闪烁 加键按下减键按下 对应位时间加 1对应位时间减 1 显示子程序 返回,进入主循 环 是否按键 盘 0次数7 次 图 4-3 时间调整程序流程图 4.4 DS1302 日期日期时间时间数据数据读读取取显显示示设计设计 对于时钟芯片 DS1302,公历日期时间显示只需从 DS1302 各寄存器读出年、 月、日、时、分、秒、星期,再加处理即可。在首次对 DS1302 进行操作之前, 必须进行初始化,然后从中读出数据,经过处理后,送给显示缓冲单元。其程 序框图如图 4-4 示。 第四章 系统软件设计 17 DS1302 开始振荡 从 DS1302 中读出电子日历 初始化 DS1302 读出的数据都为 BCD 码,将 其高低位分离,送显示缓冲单 元 开始 图 4-4 时间读取程序框 第五章 软硬件调试 19 第五章第五章 软硬件调试软硬件调试 5.1 硬件硬件测试测试 电子万年历的电路系统较大,对于焊接方面更是不可轻视,庞大的电路系 统中只要出于一处的错误,则会对检测造成很大的不便,而且电路的交线较多, 对于各种锋利的引脚要注意处理,否则会刺被带有包皮的导线,则会对电路造 成短路现象。 在本成电子万年历的设计调试中遇到了很多的问题。回想这些问题只要认 真多思考都是可以避免的,以下为主要的问题: (1)串口下载芯片 232 发烫,单片机晶振不起振 (2)LCD1602 在显示时间时出现黑格子,遮挡了时间 (3)对万年历修改时间或日期时,有时时间改变 2 次。 解决:根据仪器的测试,发现电路引脚有接错的现象,重新焊接后晶振, 复位正常,程序能够下载。LCD1602 出现黑格子是由于在其第三引脚没加电阻分 压导致,加上 5K 电阻后正常。键盘延时较短致使按键次数多加。 5.2 软软件件测试测试 电子成年历是多功能的数字型,可以看当前日期、时间。电子成年历功能 很多,所以对于它的程序也较为复杂,所以在编写程序和调试时出现了相对较多 的问题。最后经过多次的模块子程序的修改,一步一步的完成,最终解决了软 件。在软件的调试过程中主要遇到的问题如下: (1)LCD1602 显示的时间不完整,最后在液晶初始化程序中给加上该显示 的数字即可。 (2)在调整时间时光标闪烁不规律,原因的由于错用 DS1302 停振指令所 致,最后加上一个变量进行控制即可。 5.3 测试结测试结果分析与果分析与结论结论 5.3.1 测试结测试结果分析果分析 (1)在测试中遇到单片机晶振不起振、232 芯片发烫,首先使用试测仪对电 路进行测试,观察是否存在漏焊,虚焊,或者元件损坏. (2)LCD1602 液晶有黑色背景出现,首先使用试测仪对电路进行测试,观察 电路是否存在短路现象。查看烧写的程序是否正确无误,对程序进行认真修改。 5.3.2 测试结论测试结论 经过多次的反复测试与分析,可以对电路的原理及功能更加熟悉,同时提高 了设计能力与及对电路的分析能力.同时在软件的编程方面得到更到的提高,对 编程能力得到加强.同时对所学的知识得到很大的提高与巩固. 第六章 总结与展望 21 第六章第六章 总结与展望总结与展望 6.1 总结总结 本项目已经经过调试运行最终实现了功能要求,通过多次测试表明,电子 日历的各项性能完全达到设计要求。对电子日历的发展具有实际推广价值。在 未来的几年中电子日历装置一定会被广泛的应用各种场所,人们对这种电子日 历系统一定会倍加青睐。 电子日历制造成本低,环保,方便,省电,安全。总控制单元的硬件电路 中多采用简易芯片,简化了电路设计,系统开发容易,在日常生活中都具有很 强的适用性,具有实际推广价值;采用模块化设计,易于维护。 6.2 展望展望 本项目研究的 51 单片机电子日历设计功能还较简单,还可以进行功能的扩 展,具体如下: (1)可以用声控控制,如果没人可以自动关断,目前还不能实现这一功能。 (2)可以测量房间的温度,温度低于一定的数值可以自动打开空调,温度 高于一定的数值可以自动关闭空调。 (3)可以测量房间的湿度参数。 (4)本次做的项目主要是控制数字量,还可以对模拟量进行控制。 致 谢 23 致致 谢谢 在论文完成之际,我首先向关心帮助和指导我的指导老师冯成龙表示衷心 的感谢并致以崇高的敬意! 在论文工作中,遇到了不少困难,一直得到冯成龙老师的亲切关怀和悉心 指导,使我学到了许多平时学不到的知识,让我明白了理论联系实际,不能好 高骛远。冯成龙老师以其渊博的学识、严谨的治学态度、求实的工作作风和他 敏捷的思维给我留下了深刻的印象,我将终生难忘老师对我的教导。再一次向 他表示衷心的感谢,感谢他为学生营造的浓郁学术氛围,以及学习、生活上的 无私帮助! 值此论文完成之际,谨向冯成龙老师致以最崇高的谢意! 在学校的学习生活即将结束,回顾两年多来的学习经历,面对现在的收获, 我感到无限欣慰。为此,我向热心帮助过我的所有老师和同学表示由衷的感谢! 特别感谢我的师兄,以及师姐,老师,及班主任,对我的学习和生活所提 供的大力支持和关心!还要感谢一直关心帮助我成长的室友! 在我即将完成学业之际,我深深地感谢我的家人给予我的全力支持! 最后,衷心地感谢在百忙之中评阅论文和参加答辩的各位专家、教授! 致 谢 参考文献 25 参考文献参考文献 1谢自美.电子线路设计、实验、测试M.武汉:华中理工大学出版社,2000 2何书森,何华斌.实用数字电路原理与设计速成M.福州:福建科学技术出版 社,2000.6 3白驹衍.单片计算机及应用M.北京:电子工业出版社, 1999.2 4王洪君.单片机原理及应用M.济南:山东大学出版社, 2009.2 5阎 石 .数字电子技术基础M.第五版,北京:高等教育出版社,2008.12 6李朝青.单片机原理及接口技术(简明修订版).杭州:北京航空航天大学出 版社,1998 7李广弟.单片机基础M.北京:北京航空航天大学出版社,1994 8谢嘉奎.电子线路(线形部分) ,第四版.北京:高等教育出版社,1999. 9. 童诗白,华成英. 模拟电子技术基础M. 北京:北京高等教育出社.2001 10. 何立民.MCS-51 系列单片机应用系列设计M.航空航天大学出版社,2004 参考文献 附录 27 附录附录 1 1 元器件明细表元器件明细表 元器件名称参数备注 单片机STC89C52RC(12MHZ)1 晶体DRYSTAL 12MHZ1 晶体DRYSTAL 32.768MHZ1 时钟模块DS13021 存储器模块AT24C021 LCD 显示模块LCD16021 三极管PNP90121 闹铃1 电容47F1 电容22pF2 电容10F1 按键BUTTON7 电阻(上拉电阻)10K15 电阻1K15 滑动变阻器47K2 限流电阻0.1K8 排阻RESPACK-8/10K1 发光二极管(红/绿) 10 电源接口 1 开关 5 附录 附录附录 2 2 程序清单程序清单 软件总程序: #include #include #include “LCD1602.h“ #include “DS1302.h“ #define uint unsigned int #define uchar unsigned char sbit DS1302_CLK = P17; /实时时钟时钟线引脚 sbit DS1302_IO = P16; /实时时钟数据线引脚 sbit DS1302_RST = P15; /实时时钟复位线引脚 sbit wireless_1 = P30; sbit wireless_2 = P31; sbit wireless_3 = P32; sbit wireless_4 = P33; sbit ACC0 = ACC0; sbit ACC7 = ACC7; char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; /秒,分,时到日,月,年位闪的计数 sbit Set = P20; /模式切换键 sbit Up = P21; /加法按钮 sbit Down = P22; /减法按钮 sbit out = P23; /立刻跳出调整模式按钮 char done,count,temp,flag,up_flag,down_flag; uchar TempBuffer5,week_value2; void show_time(); /液晶显示程序 /*1602 液晶显示部分子程序*PortDefinitions* sbit LcdRs = P25; sbit LcdRw = P26; sbit LcdEn = P27; sfr DBPort=0 x80;/P0=0 x80,P1=0 x90,P2=0 xA0,P3=0 xB0.数据端口内部等待函 数 unsigned char LCD_Wait(void) LcdRs=0;LcdRw=1;_nop_();LcdEn=1;_nop_(); LcdEn=0;return DBPort; 附录 29 /*向 LCD 写入命令或数据* #define LCD_COMMAND0 / Command #define LCD_DATA1 / Data #define LCD_CLEAR_SCREEN 0 x01 / 清屏 #define LCD_HOMING 0 x02 / 光标返回原点 void LCD_Write(bit style, unsigned char input) LcdEn=0; LcdRs=style;LcdRw=0; _nop_(); DBPort=input; _nop_();/注意顺序 LcdEn=1;_nop_();/注意顺序 LcdEn=0;_nop_();LCD_Wait(); /*设置显示模式* #define LCD_SHOW0 x04 /显示开 #define LCD_HIDE0 x00 /显示关 #define LCD_CURSOR0 x02 /显示光标 #define LCD_NO_CURSOR0 x00 /无光标 #define LCD_FLASH0 x01 /光标闪动 #define LCD_NO_FLASH0 x00 /光标不闪动 void LCD_SetDisplay(unsigned char DisplayMode) LCD_Write(LCD_COMMAND, 0 x08|DisplayMode); /*设置输入模式* #define LCD_AC_UP0 x02 #define LCD_AC_DOWN0 x00 / default #define LCD_MOVE0 x01 / 画面可平移 #define LCD_NO_MOVE0 x00 /default void LCD_SetInput(unsigned char InputMode) LCD_Write(LCD_COMMAND, 0 x04|InputMode); /*初始话 LCD* void LCD_Initial() LcdEn=0; LCD_Write(LCD_COMMAND,0 x38); /8 位数据端口,2 行显示,5*7 点 阵 LCD_Write(LCD_COMMAND,0 x38); LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); /开启显示, 无光标 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); /清屏 LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); /AC 递增, 画面不动 /*液晶字符输入的位置* 附录 void GotoXY(unsigned char x, unsigned char y) if(y=0) LCD_Write(LCD_COMMAND,0 x80|x); if(y=1) LCD_Write(LCD_COMMAND,0 x80|(x-0 x40); /将字符输出到液晶显示 void Print(unsigned char *str) while(*str!=0) LCD_Write(LCD_DATA,*str); str+; /*DS1302 时钟部分子程序*/ typedef struct _SYSTEMTIME_ unsigned char Second; unsigned char Minute; unsigned char Hour; unsigned char Week; unsigned char Day; unsigned char Month; unsigned char Year; unsigned char DateString11; unsigned char TimeString9; SYSTEMTIME;/定义的时间类型 SYSTEMTIME CurrentTime; #define AM(X) X #define PM(X) (X+12) / 转成 24 小时制 #define DS1302_SECOND0 x80 /时钟芯片的寄存器位置,存放时间 #define DS1302_MINUTE0 x82 #define DS1302_HOUR0 x84 #define DS1302_WEEK0 x8A #define DS1302_DAY0 x86 #define DS1302_MONTH 0 x88 #define DS1302_YEAR0 x8C void DS1302InputByte(unsigned char d) /实时时钟写入一字节(内部函数) unsigned char i; ACC = d; for(i=8; i0; i-) DS1302_IO = ACC0; /相当于汇编中的 RRC DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC 1; 附录 31 unsigned char DS1302OutputByte(void) /实时时钟读取一字节(内部函数) unsigned char i; for(i=8; i0; i-) ACC = ACC 1; /相当于汇编中的 RRC ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0; return(ACC); void Write1302(unsigned char ucAddr, unsigned char ucDa)/ucAddr: DS1302 地址, ucData: 要写的数据 DS1302_RST = 0;/ Write1302(0 x8e,0 x00); DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr); / 地址,命令 DS1302InputByte(ucDa); / 写 1Byte 数据 DS1302_CLK = 1; DS1302_RST = 0; unsigned char Read1302(unsigned char ucAddr) /读取 DS1302 某地址的数 据 unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr|0 x01); / 地址,命令 ucData = DS1302OutputByte(); / 读 1Byte 数据 DS1302_CLK = 1; DS1302_RST = 0; return(ucData); void DS1302_GetTime(SYSTEMTIME *Time) /获取时钟芯片的时钟数据到自定 义的结构型数组 unsigned char ReadValue; ReadValue = Read1302(DS1302_SECOND); Time-Second = (ReadValue /高 三位取出读出乘 ReadValue = Read1302(DS1302_MINUTE); Time-Minute = (ReadValue ReadValue = Read1302(DS1302_HOUR); Time-Hour = (ReadValue 附录 ReadValue = Read1302(DS1302_DAY); Time-Day = (ReadValue ReadValue = Read1302(DS1302_WEEK); Time-Week = (ReadValue ReadValue = Read1302(DS1302_MONTH); Time-Month = (ReadValue ReadValue = Read1302(DS1302_YEAR); Time-Year = (ReadValue void DateToStr(SYSTEMTIME *Time) /将时间年,月,日,星期数据转换成液晶 显示字符串,放到数组里 DateString if(hide_year2 就不显示,输出字符串为 2007/07/22 Time-DateString0 = 2; Time-DateString1 = 0; Time-DateString2 = Time-Year/10 + 0; Time-DateString3 = Time-Year%10 + 0; else Time-DateString0 = ; Time-DateString1 = ; Time-DateString2 = ; Time-DateString3 = ; Time-DateString4 = /; if(hide_monthDateString5 = Time-Month/10 + 0; Time-DateString6 = Time-Month%10 + 0; else Time-DateString5 = ; Time-DateString6 = ; Time-DateString7 = /; if(hide_dayDateString8 = Time-Day/10 + 0; 附录 33 Time-DateString9 = Time-Day%10 + 0; else Time-DateString8 = ; Time-DateString9 = ; if(hide_weekWeek%10 + 0; /星期的数据另外放到 week_value数组里,跟年,月,日的分开存放,因为等一下要在最后显示 else week_value0 = ; week_value1 = 0; Time-DateString10 = 0; /字符串末尾加 0 ,判断结束字符 void TimeToStr(SYSTEMTIME *Time) /将时,分,秒数据转换成液晶显示字符 放到数组 TimeString; if(hide_hourTimeString0 = Time-Hour/10 + 0; Time-TimeString1 = Time-Hour%10 + 0; else Time-TimeString0 = ; Time-TimeString1 = ; Time-TimeString2 = :; if(hide_minTimeString3 = Time-Minute/10 + 0; Time-TimeString4 = Time-Minute%10 + 0; else Time-TimeString3 = ; Time-TimeString4 = ; Time-TimeString5 = :; 附录 if(hide_secTimeString6 = Time-Second/10 + 0; Time-TimeString7 = Time-Second%10 + 0; else Time-TimeString6 = ; Time-TimeString7 = ; Time-DateString8 = 0; void Initial_DS1302(void) /时钟芯片初始化 unsigned char Second=Read1302(DS1302_SECOND); if(Second /写入允许 Write1302(0 x8c,0 x07); /以下写入初始化时间 日期:07/07/25.星 期: 3. 时间: 23:59:55 Write1302(0 x88,0 x07); Write1302(0 x86,0 x25); Write1302(0 x8a,0 x07); Write1302(0 x84,0 x23); Write1302(0 x82,0 x59); Write1302(0 x80,0 x55); Write1302(0 x8e,0 x80); /禁止写入 void Delay1ms(unsigned int count) unsigned int i,j; for(i=0;i0;delay-) for(i=0;i0 x59)/超过 59 秒,清零 temp=0; break; case 2:temp=Read1302(DS1302_MINUTE)/读取分数 temp=temp+1; /分数加 1 up_flag=1; if(temp0 x59) /超过 59 分,清零 temp=0;break; case 3:temp=Read1302(DS1302_HOUR);/读取小时数 temp=temp+1; /小时数加 1 up_flag=1; if(temp0 x23)/超过 23 小时,清零 temp=0;break; case 4:temp=Read1302(DS1302_WEEK);/读取星期 数 temp=temp+1; /星期数加 1 附录 up_flag=1; if(temp0 x7) temp=1; break; case 5:temp=Read1302(DS1302_DAY);/读取日数 temp=temp+1; /日数加 1 up_flag=1; if(temp0 x31) temp=1; break; case 6:temp=Read1302(DS1302_MONTH);/读取月 数 temp=temp+1; /月数加 1 up_flag=1; if(temp0 x12) temp=1; break; case 7:temp=Read1302(DS1302_YEAR); /读取年 数 temp=temp+1; /年数加 1 up_flag=1; if(temp0 x85) temp=0;break; default:break; while(Up=0); while(wireless_2=1); void Downkey()/降序按键 Down=1; if(Down=0|wireless_3=1) mdelay(8); switch(count) case1:temp=Read1302(DS1302_SECOND);/读取秒数 temp=temp-1; /秒数减 1 down_flag=1; /数据调整后更新标志 if(temp=0 x7f)/小于 0 秒,返回 59 秒 temp=0 x59;break; case 2:temp=Read1302(DS1302_MINUTE); /读取分 附录 37 数 temp=temp-1; /分数减 1 down_flag=1; if(temp=-1) temp=0 x59; /小于 0 秒,返回 59 秒 break; case 3:temp=Read1302(DS1302_HOUR) /读取小时数 temp=temp-1; /小时数减 1 down_flag=1; if(temp=-1) temp=0 x23;break; case 4:temp=Read1302(DS1302_WEEK); /读取星期 数 temp=temp-1; /星期数减 1 down_flag=1; if(temp=0) temp=0 x7;break; case 5:temp=Read1302(DS1302_DAY); /读取日数 temp=temp-1; /日数减 1 down_flag=1; if(temp=0) temp=31;break; case 6:temp=Read1302(DS1302_MONTH); /读取月数 temp=temp-1; /月数减 1 down_flag=1; if(temp=0) temp=12; break; case 7:temp=Read1302(DS1302_YEAR);/读取年数 temp=temp-1; /年数减 1 down_flag=1; if(temp=-1) temp=0 x85; break; default:break; while(Down=0);while(wireless_3=1); 附录 void Setkey()/模式选择按键 Set=1; if(Set=0|wireless_4=1) mdelay(8); count=count+1; /Setkey
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 金融资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!