万年历时钟的设计_第1页
万年历时钟的设计_第2页
万年历时钟的设计_第3页
万年历时钟的设计_第4页
万年历时钟的设计_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

课程设计报告 题 目: 万年历时钟的设计 课 程: 单片机原理及应用课程设计 专 业: 电气工程及其自动化 班 级: 姓 名: 学 号: 1 第 一 部 分 任 务 书 2 单片机原理及应用课程设计任务书 一、课题名称 万年历时钟的设计,利用单片机周立功实验箱进行设计并调试。 二、课程设计目的 课程设计是课程教学中的一项重要内容,是达到教学目标的重要环节,是综合性较强的实践教学环节, 它对帮助学生全面牢固地掌握课堂教学内容、培养学生的实践和实际动手能力、提高学生全面素质具有很 重要的意义。 单片机原理及应用是一门理论性、实用性和实践性都很强的课程,课程设计环节应占有更加重要 的地位。单片机原理及应用课程设计的目的是让学生在理论学习的基础上,通过完成一个涉及 MCS-51 单片 机多种资源应用并具有综合功能的小系统目标板的设计与编程应用,使学生不但能将课堂上学到的理论知 识与实际应用结合起来,而且能进一步加深对电子电路、电子元器件等知识的认识与理解,同时在软件编 程、排错调试、相关软件和仪器设备的使用技能等方面得到较全面的锻炼和提高。为今后能够独立进行某 些单片机应用系统的开发设计工作打下一定的基础。通过单片机硬件和软件设计、调试、整理资料等环节 的培训,使学生初步掌握工程设计方法和组织实践的基本技能,逐步熟悉开展科学实践的程序和方法。 三、课程设计内容 设计以 89C51 单片机和外围元器件构成的单片机应用系统,并完成相应的软硬件调试。 1. 系统方案设计:综合运用单片机课程中所学到的理论知识,学生根据所选课题的任务、要求和条件 进行总体方案的设计。 2. 硬件电路设计:对方案中以单片机为核心的电路进行设计计算,包括元器件的选择和电路参数的计 算,并画出总体电路图。 3. 软件设计:根据已设计出的软件系统框图,用汇编语言或 C51 编制出各功能模块的子程序和整机软 件系统的主程序。 4. 调试:在单片机 EDA 仿真软件环境 Proteus 下进行仿真设计并调试;或在单片机周立功实验箱上进 行相关设计并调试。 四、课程设计要求 1. 学习 PCF8563T 功能与使用方法; 2. 通过按键切换 LED 上日期与时间的显示; 3. 具有日期与时间的预置功能; 4. 设计硬件原理图; 5. 编写程序。 五、进度安排 3 序号 内容 天数 1 布置任务,熟悉课题要求 0.5 2 总体方案确定,硬件电路设计 1.5 3 软件编程 1.5 4 Proteus 仿真,或在周立功实验箱上调试 2 5 总结,撰写课程设计报告 1.5 七、课程设计报告内容: 总结设计过程,写出设计报告,设计报告具体内容要求如下: 1课程设计的目和设计的内容。 2课程设计的要求。 3控制系统总框图及系统工作原理。 4控制系统的硬件电路连接图,电路的原理。 5软件设计流程图及其说明。 6电路设计,软件编程、调试中遇到的问题及分析解决方法。 7实验结果及其分析。 8体会。 4 第 二 部 分 课 程 设 计 报 告 5 目 录 1 课题简介 6 1.1 设计目的 6 1.2 设计要求 6 2 万年历时钟方案设计 6 2.1 芯片介绍 .6 2.2 AT89C51 单片机简介 10 2.3 系统工作原理 .11 3 万年历时钟硬件电路设计 .11 3.1 整体原理图 .12 3.2 分块介绍 .12 3.3 器件地址及存放单元 .13 4 万年历时钟软件编程设计 .14 4.1 程序介绍 .14 4.2 系统控制流程图 .15 5 实验与结果分析 .16 5.1 调试方法 .16 5.2 调试过程 .17 5.3 调试结果分析 .17 6 小结与体会 .18 附录 .20 6 正文 1 课题简介 1.1 设计目的 熟练掌握 I2C 总线的控制,深刻理解实时时钟 PCF8563T、ZLG7290 键盘 LED 控制的各种功能,并能把它 们相结合,组成具有实际功能的万年历时钟。 1.2 设计要求 1. 学习 PCF8563T 功能与使用方法; 2. 通过按键切换 LED 上日期与时间的显示; 3. 具有日期与时间的预置功能; 4. 设计硬件原理图; 5. 编写程序。 2 万年历时钟方案设计 2.1 芯片介绍 2.1.1 PCF8563 I2C 实时时钟日历芯片 1.概述 PCF8563 是低功耗的 CMOS 实时时钟日历芯片,它提供一个可编程时钟输出,一个中断输出和掉电 检测器,所有的地址和数据通过 I2C 总线接口串行传递。最大总线速度为 400Kbits/s,每次读写数据后, 内嵌的字地址寄存器会自动产生增量。 2特性 * 低工作电流:典型值为 0.25A(VDD=3.0V,Tamb=25时) 。 * 世纪标志 * 大工作电压范围:1.05.5 * 低休眠电流;典型值为 0.25A(VDD=3.0V,Tamb=25) * 400KHz 的 I2C 总线接口(VDD=1.85.5V 时) 。 * 可编程时钟输出频率为:32.768KHz,1024Hz,32Hz,1Hz。 * 报警和定时器。 * 掉电检测器。 * 内部集成的振荡器电容。 * 片内电源复位功能。 * I2C 总线从地址:读,0A3H;写,0A2H。 * 开漏中断引脚。 3内部结构 7 3管脚排列 PCF8563 的管脚排列及描述如下图及表所示: 4. 功能描述 PCF8563 有 16 个 8 位寄存器:一个可自动增量的地址寄存器,一个内置 32.768KHz 的 振荡器(带 有一个内部集成的电容) ,一个分频器(用于给实时时钟 RTC 提供源时钟) ,一个可编程时钟输出,一个定 时器, 一个报警器, 一个掉电检测器和一个 400KHz I2C 总线接口。 所有 16 个寄存器设计成可寻址的 8 位并行寄存器,但不是所有位都有用。前两个寄存 器(内存地 址 00H,01H)用于控制寄存器和状态寄存器,内存地址 02H08H 用于时钟计 数器(秒年计数器) ,地 址 09H0CH 用于报警寄存器(定义报警条件) ,地址 0DH 控制 CLKOUT 管脚的输出频率,地址 0EH 和 0FH 分别用于定时器控制寄存器和定时器寄存器。 秒、分钟、小时、日、月、年、分钟报警、小时报警、 日报警寄存器,编码格式为 BCD, 星期和星期报警寄存器不以 BCD 格式编码。 当一个 RTC 寄存器被读时,所有计数器的内容被锁存,因此,在传送条件下, 可以禁 止对时钟日 历芯片的错读。 8 2.1.2 ZLG7290 I2C 接口键盘及 LED 驱动器 (1)特点 * I2C 串行接口,提供键盘中断信号,方便与处理器接口。 * 可驱动 8 位共阴数码管或 64 只独立 LED 和 64 个按键 * 可控扫描位数,可控任一数码管闪烁 * 提供数据译码和循环、移位、段寻址等控制 * 8 个功能键,可检测任一键的连击次数 * 无需外接元件即直接驱 LED,可扩展驱动电流和驱动电压 * 提供工业级器件,多种封装形式 PDIP24、SO24 (2)引脚及说明 采用 24 引脚封装,引脚图见下,其引脚功能分述如下 (3)功能描述 9 1)键盘部分 ZLG7290 可采样 64 个按键或传感器,可检测每个按键的连击次数, 其基本功能如下: (1)键盘去抖动处理 当键被按下和放开时,可能会出现电平状态反复变化,称作键盘抖动,若不作处理会引起按键盘命令 错误,所以要进行去抖动处理,以读取稳定的键盘状态为准。 (2)双键互锁处理 当有两个以上按键被同时按下时,ZLG7290 只采样优先级高的按键优先顺序为 S1S2S64(如同时 按下 S2 和 S18 时采样到 S2) (3)连击键处理 当某个按键按下时,输出一次键值后,如果该按键还未释放,该键值连续有效,就像连续压按该键一 样,这种功能称为连击。连击次数计数器(RepeatCnt)可区别出单击(某些功能不允许连击如开关) 或连 击,判断连击次数可以检测被按时间以防止某些功能误操作(如连续按 5 秒经入参数设置状态)。 (4)功能键处理 功能键能实现 2 个以上按键同时按下来扩展按键数目或实现特殊功能 如 PC 机上的 Shift、Ctrl、Alt 键。 2)显示部分 在每个显示刷新周期,ZLG7290 按照扫描位数寄存器(ScanNum)指定的显示位数 N 把显示缓存 DpRam0。DpRamN 的内容按先后循序送入 LED 驱动器实现动态显示。减少 N 值可提高每位显示扫描时间的 占空比,以提高 LED 亮度,显示缓存中的内容不受影响。修改闪烁控制寄存器 FlashOnOff 可改变闪烁频 率和占空比(亮和灭的时间)。 ZLG7290 提供两种控制方式:寄存器映象控制和命令解释控制。如上述对显示部分的控制寄存器映象 控制是指直接访问底层寄存器,实现基本控制功能。这些寄存器须字节操作命令解释控制是指通过解释命 令缓冲区(CmdBuf0 CmdBuf1)中的指令,间接访问底层寄存器实现扩展控制功能。如实现寄存器的位操 作对显示缓存循环、移位、对操作数译码等操作。 10 2.2 AT89C51 单片机简介 AT89C51 单片机是一种低功耗,高性能的片内含有 4KB 可编程/擦除只读存储器(FPEROMFlash Programmable and Erasable Read Only Memory)的 8 位 COMS 微控制器,使用高密度,非易失存储技术制 造,并且与 AT89C51 引脚和指令系统完全兼容。芯片上的 FPEROM 允许在线编程或采用通用的非易失存储编 程器对存储器重复编程。 引脚说明 AT89C51 单片机采用 40 条引脚双列直插式器件,引脚除 5V(Vcc 40 脚)和电源地(Vss 20 脚)外, 其功能分为时钟电路、控制信号、输入/输出三大部分,逻辑框图及引脚图分别如图所示 AT89C51 单片机的内部硬件结构中除了程序存储器由 FPEROM 取代了 87C51 单片机的 EPROM 外,其余部 分完全相同,其管脚说明如下: (1)VCC:供电电压 (2)GND:接地 (3)时钟电路 XTAL1(19 脚)芯片内部振荡电路(单级反相放大器)输入端。 XTAL2(18 脚)芯片内部振荡电路(单级反相放大器)输出端。 (4)控制信号 RST(9 脚)复位信号: ALE(30 脚)地址锁存信号 /PSEN(29 脚)片外程序存储器读选通: /EA/Vpp(30 脚) (5)I/O 接口 P0 口:P0 口为一个 8 位漏级开路双向 I/O 口,每脚可吸收 8TTL 门电流。当 P1 口的管脚第一次写 1 时, 被定义为高阻输入。P0 能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在 FIASH 编程 11 时,P0 口作为原码输入口,当 FIASH 进行校验时,P0 输出原码,此时 P0 外部必须被拉高。 P1 口:P1 口是一个内部提供上拉电阻的 8 位双向 I/O 口,P1 口缓冲器能接收输出 4TTL 门电流。P1 口管脚 写入 1 后,被内部上拉为高,可用作输入,P1 口被外部下拉为低电平时,将输出电流,这是由于内部上拉 的缘故。在 FLASH 编程和校验时,P1 口作为第八位地址接收。 P2 口:P2 口为一个内部上拉电阻的 8 位双向 I/O 口,P2 口缓冲器可接收,输出 4 个 TTL 门电流,当 P2 口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2 口的管脚被外部拉 低,将输出电流。这是由于内部上拉的缘故。P2 口当用于外部程序存储器或 16 位地址外部数据存储器进行 存取时,P2 口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储 器进行读写时,P2 口输出其特殊功能寄存器的内容。P2 口在 FLASH 编程和校验时接收高八位地址信号和控 制信号。 P3 口:P3 口管脚是 8 个带内部上拉电阻的双向 I/O 口,可接收输出 4 个 TTL 门电流。当 P3 口写入 “1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3 口将输出电流 (ILL)这是由于上拉的缘故。 P3 口也可作为 AT89C51 的一些特殊功能口,如下表所示: 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(外部数据存储器读选通) P3 口同时为闪烁编程和编程校验接收一些控制信号。 2.3 系统工作原理 开始上电时,系统开始工作,在系统里面预设的时间日期存入 PCF8563,再由 ZLG7290 送 LED 显示,由 于一开始 CLR swich_date,所以先显示的时间,当按下键时,经过查询得到按下的是哪个键,然后跳转到 相应的程序执行,得到相应的结果。若按下的 KEY1 切换键,跳转到切换程序,显示切换到日期显示,再次 按下 KEY1 键,则切换到时间显示,如此循环显示。若按下的是 KEY2 设置键,切换到设置程序,日期的年 位闪烁显示,当再次按下设置键时,闪烁位变为月位,继续按下,则在年月日时分秒循环闪烁显示。在设 置键按下时,按下 KEY1 切换键是无效的。在切换键按下后,即有位在闪烁显示时,按下 KEY3 加一键则跳 转到加一程序,此时进行加一操作,按下 Key4 减一减则跳转到减一程序,此时进行减一操作。当设置完成 后,按下 Key5 确定键,跳转到确定程序,此时将设置的时间送到 PCF8563 时间芯片里面,再由 ZLG7290 送 LED 显示。 3 万年历时钟硬件电路设计 12 3.1 整体原理图 该电路由以下几个部分组成:AT89C51 单片机,PCF8563T 时钟芯片,ZLG7290 I2C 接口键盘及 LED 驱 动器. 其中,AT89C51 单片机是总控制器,负责启动控制 PCF8563、将得到的时钟数据进行码制转; PCF8563 负责读取时间写入芯片,在送 ZLG7290;ZLG7290 可驱动 8 位共阴数码管并让数码管显示。 3.2 分块介绍 3.2.1 AT89C51 13 SDA 接 P1.7;SCL 接 P1.6;RST 接 P1.0;INT_KEY 接 P3.2 3.2.2 LED 与 PCF8563 3.2.3 按键与 ZLG7290 3.3 器件地址及存放单元 MTD EQU 40H ;发送数据缓冲器 MRD EQU 49H ;接收数据缓冲区 ZLG7290 EQU 70H ;ZLG7290 的器件地址 PCF8563 EQU 0A2H ;PCF8563 的器件地址 ACK BIT 10H ;应答标志位 SLA DATA 50H ;器件的从地址 SUBA DATA 51H ;器件的子地址 14 NUMBYTE DATA 52H ;读/写的字节数变量 disp_buf EQU 60H set_date_buf EQU 30H ;设置的时间 7 字节 30H36H 秒分时日月年 set_date EQU 5AH ;00000000B 从低到高依次代表秒分时日月年闪烁控制位,最高两位不 可用 swich_date BIT 1AH ;时间日期显示标志位 4 万年历时钟软件编程设计 4.1 程序介绍 4.1.1 主程序 MAIN 主程序实现的功能有: (1)初始化时间日期 (2)把时间日期数据写入 PCF8563 通过 CLR swich_date 使 LED 先显示的是时间 4.1.2 主循环 MAINLOOP 主循环实现的功能有: (1)时间日期的显示 DISPLAY (2)PCF8563 的数据送 ZLG7290 使得 LED 每一秒刷新一次。 4.1.3 时间日期显示程序 display_date 与 display_time display_date 与 display_time 的显示过程相似,实现的功能主要如下 (1)判断是否在设置程序里 (2)若在设置程序里面则通过 8563 读取设置的时间进行显示 (3)若不在则直接读取 8563 的时间进行显示 4.1.4 按键处理子程序 KEY_HANDLE 按键处理子程序实现的功能有: (1)当按键按下时,通过查询方式判断按下的是哪个按键,再执行相应的程序 (2)切换键 若按下 KEY1,swich_date 会发生变化,则时间日期会切换显示。如果在有位闪烁时按下,则无效。 (3)设置键 KEY_SET 当按下此键,年位进入闪烁状态,此时可以进行加一减一操作再次按下则可以进行移位闪烁,即可加 一减一的位变化。 (4)加一键 KEY_ADD 与减一键 KEY_SUB 在设置键按下,即有位闪烁显示时,按这两个键可分别进行加一减一操作。在此段程序中有设置每年 的月数,每月的天数,每天的小时数,没小时的分钟数,每分钟的秒数。这样时间设置时才能正常进位。 (5)确定键 KEY_OK 当设置完毕后,按下此键,结束闪烁显示,将时间写入 8563 时钟芯片,并送 LED 显示。 15 4.2 系统控制流程图 主程序流程图 时间日期显示程序流程图 开始 初始化日期时间数据 读取 PCF8563T 内的时间日 期 送 ZLG7290 驱动数码管显示 按键按下 切换键 S1 按下设置键 S2 按下 设置时间 日期与时间显示的切换 设置结果送 PCF8563T 开始 判断设置键是否按下 显示 PCF8563T 的时间 设置键未按下 显示设置的时间 设置键按下 设置时间 显示 的时间 显示设置的时间 显示 的时间 显示设置的时间显示设置的时间 判断设置键是否按下 显示设置的时间 判断设置键是否按下 显示设置的时间 16 按键流程图 5 实验与结果分析 5.1 调试方法 5.1.1 Keil 调试 启动 KEIL 软件,对每个写好的主程序和子程序进行单步调试,直到程序没有错误为止。 开始 按下按键 查询判断按的是哪个键 日期与时间显示的切换 切换键 S1 按下 按需求对该位进行加一减一操作 设置键 S2 按下 按下按键 查询判断按的是哪个键 按下加减按键 查询判断按的是哪个键 进行加一操作 进行减一操作 加一键 S3 按下 减一键 S4 按下 查询判断按的是哪个键 按下按键 查询判断按的是哪个键 按下按键 查询判断按的是哪个键 设置键 S2 按下 加减按键 S3、S4 按 下 闪烁位向后进一位 年位闪烁 查询判断按的是哪个键 加减按键 、 按 下查询判断按的是哪个键 保存设置的时间到 8563 结束 确定键 S5 按下 17 5.1.2 试验箱调试 根据程序的设计在试验箱上分别连接好各个端口的连接线,用串口线把计算机和试验箱的仿真头连接 好,打开试验箱,根据要求完成接线。如下所示: 1. 系统各跳线器处在初始设置状态,SDA 接 P1.7;SCL 接 P1.6;RST 接 P1.0; INT_KEY 接 P3.2。 2. 启动 PC 机,打开 Keil uVision2 软件,加载程序,编译,下载,运行。 3. 单击 Keil 软件上的“Start/Stop Debug Session”按钮,再单击“RUN”按钮,运行程序。观察试 验箱上出现的效果,分析程序的对错,直到调试出正确的结果。 5.2 调试过程 5.2.1 Keil 调试 在编程的过程中,我有个小插曲,本来在单片机的学习上,我的成绩就是不太理想的,所以就去网上 与图书馆找了许多的资料,但是资料上面的都是与我的题目有很大出入的,所以最后还是选择了自己编程。 在编程中,遇到的难题也蛮多的,通过向老师请教与跟同学讨论,我确定了我的大体思路:用查询的 方法判断按下的按键,然后再执行相应的程序。这样的思路给我的编程也减轻了不少的负担,像加一减一 这样的程序,我只要编好加一的程序,减一的程序稍微改动就可以了;显示时间跟显示日期这样的程序, 也是只要编好一个,另一个就差不多完成了。 当然,在编程时,我也犯了许多的小错误,导致我在 Keil 调试阶段耽误了许多的时间。比如没有添加 LED 显示程序,还有就是指令的一些小错误,或者标点符号的错误。 最后,通过自己的努力和老师同学的指导,我还是顺利的完成了编程的工作。紧接着就开始了试验箱 上的调试。 5.2.2 试验箱调试 当我把接线接好,程序运行后,LED 并没有显示,经过检查,我发现了错误所在,我把程序的入口地址 写成了 8000H,修改后,显示顺利。当我按下 KEY1 键后,LED 的显示实现了切换。但是当按下 KEY2 后,并 没有实现闪烁显示,而且显示也变成了乱码,我就开始进行对程序的检查,600 多行的程序,我找了很久都 没有找到问题所在,之后我发现 LLOOP:LJMPMAINLOOP 被我写成 LLOOP:LJMP lp;修改后设置键有效,继续 按下也循环切换显示。按下加一减一键也能实现操作,但是每月的天数都是 31 天,这我才想到我的并没有 设置每月的天数。这时我又开始了变成的工作,这段程序,我采用了取月数,然后设置每月应该是多少天, 其中 2 月我统一设置成了 28 天。这样也省了我的一些时间。再次进行试验箱调试,运行后突然都不亮了, 我检查程序也没有发现错误,于是我开始怀疑是不是试验箱有问题,当我换了一个试验箱后,LED 是正常显 示的。这时候我继续一个一个调试,当我调试到秒位加一减一时,发现秒位的显示是有问题的,但是在正 常时间显示中是没有问题的,而且秒的这段程序与时分等的程序都是一样类似的,别的程序都没有问题, 只有这个问题。这时候我找来了老师,老师告诉我,秒位可以不用设置,因为在我设置的过程中,8563 中 已经不知道走了多少秒了。但在之后的调试过程中,秒位也不知道为什么又好了,所以我还是把秒位的设 置留了下来。这样,我的调试过程也就完成了。 5.3 调试结果分析 实验的结果实现了预期的效果 1. 上电时显示的是时间,当按下 KEY1 键时,切换到日期显示,再按下时,切换到时间显示。 2. 当按下 KEY2 键时,日期的年位闪烁显示,此时按 KEY3 键进行加一操作,按 KEY 键进行减一操作。 再按一次 KEY2 键,则变为月位闪烁显示,这样在年月日时分秒中循环切换闪烁,当闪烁时可以进 行加一减一操作。 3. 当按下 KEY2 设置键后,再按下 KEY1 切换键则无作用。 18 4. 当设置完毕后,可以通过 KEY5 确认键进入显示。 5. 能够在断电的情况下,通过时钟芯片中的锂电池提供电源,保证时钟能够继续计时而不丢失原来的 数据。各个时标的进位和周期频率都很没有出现错误。 6 小结与体会 通过一周半的努力,在老师同学的指导与帮助下,我顺利完成了万年历时钟的设计。 一开始,在刚刚拿到题目的时候,我看到的是一个完全没有接触过的芯片,本来我这门课的学习就不 是特别好,多汇编语言的变成也不是很熟练,所以我觉得这个题目可能我做不起来。但是当我看到大家的 题目大多数都是用没有接触过的芯片完成课程设计,我的信心也强了起来。由于之前使用 ZLG7290 做过实 验,所以对于 ZLG7290 的原理和应用还是蛮熟悉的。但是 对于 PCF8563,我一点都没有接触过,所以中午 我就开始在图书馆和网上查找关于 PCF8563 的有关资料。了解了 PCF8563 的工作原理后便开始了设计的工 作。 本次的设计基于 AT89C51 单片机的 LED 显示系统主要由 89C51 单片机处理器控制、位扫描控制电路、 端码显示驱动电路及与计算机的接口电路组成。此外还包括一些基本的电路如电源电路,晶振电路,及接 口电路。 我通过了四天的时间完成了程序的设计。在设计过程中,我们通过网络和相关图书学到了很多知识, 并通过无数遍的调试,我们完成了主程序,初始化程序,读写显示程序,设置程序,按键查询程序等等。 之后又花了两天的时间进行了实验箱上的调试,最后在自己的努力和老师的帮组下顺利完成了课程设计。 通过这一周半的课程设计,我认识到了许多东西,我自己也发现了许多的不足,首先,我最先想到的 是去网上找现成的而不是自己做,这样的想法是不对的,这样的学习态度,不管做什么事都不会有好的成 果。这一点在之后的学习生活中,我一定要改正。然后,我也发现了我粗心大意的缺点,比如入口地址写 成了 8000H,程序里面标点、指令也出现了好多错误。这个缺点我也需要多加改正。 在此次课程设计中,我一开始没有写注释,我后面去看花了好长时间去重新理解,这样让我养成了编 程过程中写注释的习惯。 在软件设计的过程中,利用了 Keil 这个软件在程序录入和调试的时候的优越性,让我能够在编写软件 的时候很方便的发现软件中的错误,现在已经能够使用 Keil 对所设计的程序进行调试。这也让我了解到, 借助一些专业的软件是多么的重要,在以后的日子里面我还要学习更多的专业软件,并且熟练应用,以便 更好的完成学习任务和以后工作里面的任务。 最后,我要感谢老师对我的指导和同学对我的帮助。没有他们的帮助我是不太可能顺利完成这次课程 设计的。在以后的学习生活中我会时时敦促自己更加努力,不辜负师长、亲人、朋友对我的期望。 19 参 考 文 献 1 张毅刚主编,单片机原理及应用,北京:高等教育出版社,2004 2 陈涛编著,单片机应用及 C51 程序设计,北京:机械工业出版社,2008 3 周润景主编,PROTEUS 入门实用教程,北京:机械工业出版社,2007 4 皮大能主编,单片机课程设计指导书,北京:北京理工大学出版社,2010 5 楼然苗主编,单片机实验与课程设计(Proteus 仿真版) ,浙江:浙江大学出版社, 2010 6 王法能主编,单片机原理及应用 科学出版社 2004 7 控制、电子技术类杂志、报刊 8 广州周立功单片机发展有限公司提供的 PCF8563 I2C 实时时钟日历芯片与 ZLG7290 I2C 接口键盘及 LED 驱动器讲解文件 20 附录 SDA BIT P1.7 ;I2C 总线引脚定义 SCL BIT P1.6 ;I2C 时钟引脚定义 RST BIT P1.0 ;I2C 复位引脚定义 KEY_INT BIT P3.2 MTD EQU 40H ;发送数据缓冲器 MRD EQU 49H ;接收数据缓冲区 ;定义器件地址 ZLG7290 EQU 70H ;ZLG7290 的器件地址 PCF8563 EQU 0A2H ;PCF8563 的器件地址 ACK BIT 10H ;应答标志位 SLA DATA 50H ;器件的从地址 SUBA DATA 51H ;器件的子地址 NUMBYTE DATA 52H ;读/ 写的字节数变量 ;00 01 02 03 04 05 06 07 ;秒 秒 分 分 时 时 ;08 09 10 11 12 13 14 15 ;日 日 月 月 年 年 disp_buf EQU 60H set_date_buf EQU 30H ;设置的时间 7 字节 30H36H 秒分时日月年 set_date EQU 5AH ;00000000B 从低到高依次代表秒分时日月年闪烁控制位 swich_date BIT 1AH ;主程序 ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV set_date,#0x00 MOV SP,#70H CLR RST ;复位 I2C LCALL DELAY SETB RST ;置位 I2C LCALL DELAY ;初始化日期时间数据 MOV MTD,#00H ;PCF8563T 的控制 REG1 MOV MTD+1,#12H ;PCF8563T 的控制 REG2 MOV MTD+2,#00H ;PCF8563T 的秒 reg MOV MTD+3,#30H ;PCF8563T 的分 reg MOV MTD+4,#15H ;PCF8563T 的时 reg MOV SLA,#PCF8563 ;指定器件地址 21 MOV SUBA,#00H ;指定子地址 MOV NUMBYTE,#05H ;发送 5 字节数据 两个控制寄存器 和秒分时 LCALL IWRNBYTE ;调用写 5 字节数据程序 LCALL DELAY MOV MTD,#30H ;日的首地址 MOV MTD+1,#04H ;周的首地址 MOV MTD+2,#05H ;月的首地址 MOV MTD+3,#14H ;年的首地址 MOV SLA,#PCF8563 ;指定器件地址 MOV SUBA,#05H ;指定子地址 日的地址 MOV NUMBYTE,#04H ;发送 4 字节数据 LCALL IWRNBYTE ;调用写 4 字节数据程序 LCALL DELAY CLR swich_date ;先显示时间 ;主循环开始 MAINLOOP: MOV A,set_date JNZ lp ;判断是否设置时间,设置就不读 PCF 中数据 MOV SLA,#PCF8563 ;指定器件地址 MOV SUBA,#02H ;指定子地址 读取时间数据 首地址 02H MOV NUMBYTE,#07H ;发送 7 字节数据 LCALL IRDNBYTE ;调用读取 7 个字节数据程序 LCALL DELAY lp: JB swich_date,display_date LJMP display_time ;显示日期 display_date: MOV A,set_date JZ disp_normal MOV A,set_date_buf+3 MOV MRD+3,A MOV A,set_date_buf+5 MOV MRD+5,A MOV A,set_date_buf+6 MOV MRD+6,A disp_normal: MOV A,MRD+3 ANL A,#0x3f MOV MRD+3,A MOV A,MRD+5 22 ANL A,#0x1f MOV MRD+5,A MOV a,set_date ;判断是否要闪烁显示 ANL a,#0x08 MOV b,#0x00 JZ ss6 ;闪烁标志位为 0 则转移 MOV b,#0x40 ss6: MOV A,MRD+3 ANL A,#0X0F ADD a,b MOV disp_buf+0,A ;日的低位送显示 MOV a,set_date ;判断是否要闪烁显示 ANL a,#0x08 MOV b,#0x00 JZ ss7 ;闪烁标志位为 0 则转移 MOV b,#0x40 ss7: MOV A,MRD+3 SWAP A ANL A,#0X0F ADD a,b MOV disp_buf+1,A ;日的高位送显示 MOV a,set_date ;判断是否要闪烁显示 ANL a,#0x10 MOV b,#0x00 JZ ss8 ;闪烁标志位为 0 则转移 MOV b,#0x40 ss8: MOV A,MRD+5 ANL A,#0X0F ADD a,b MOV disp_buf+3,A ;月的低位送显示 MOV a,set_date ;判断是否要闪烁显示 ANL a,#0x10 MOV b,#0x00 JZ ss9 ;闪烁标志位为 0 则转移 MOV b,#0x40 ss9: MOV A,MRD+5 SWAP A ;半字节取反 ANL A,#0X0F 23 ADD a,b MOV disp_buf+4,A ;月的高位送显示 MOV a,set_date ;判断是否要闪烁显示 ANL a,#0x20 MOV b,#0x00 JZ ss10 ;闪烁标志位为 0 则转移 MOV b,#0x40 ss10: MOV A,MRD+6 ANL A,#0X0F ADD a,b MOV disp_buf+6,A ;年的低位 MOV a,set_date ;判断是否要闪烁显示 ANL a,#0x20 MOV b,#0x00 JZ ss11 ;闪烁标志位为 0 则转移 MOV b,#0x40 ss11: MOV A,MRD+6 SWAP A ANL A,#0X0F ADD A,B MOV disp_buf+7,A ;年的高位 MOV disp_buf+2,#1FH MOV disp_buf+5,#1FH ;这两位数码管不显示 LJMP DISPLAY ;显示时间 display_time: MOV A,set_date JZ disp_normal0 MOV A,set_date_buf MOV MRD+0,A MOV A,set_date_buf+1 MOV MRD+1,A MOV A,set_date_buf+2 MOV MRD+2,A disp_normal0: 24 MOV A,MRD ANL A,#0x7f MOV MRD,A MOV A,MRD+1 ANL A,#0x7f MOV MRD+1,A MOV A,MRD+2 ANL A,#0x3f MOV MRD+2,A MOV a,set_date ;判断是否要闪烁显示 ANL a,#0x01 MOV b,#0x00 JZ ss0 ;闪烁标志位为 0 则转移 MOV b,#0x40 ss0: MOV A,MRD ANL A,#0X0F ADD A,B ;闪烁显示 MOV disp_buf,A MOV a,set_date ;判断是否要闪烁显示 ANL a,#0x01 MOV b,#0x00 JZ ss1 ;闪烁标志位为 0 则转移 MOV b,#0x40 ss1: MOV A,MRD SWAP A ANL A,#0X0F ADD A,B ;闪烁显示 MOV disp_buf+1,A MOV a,set_date ;判断是否要闪烁显示 ANL a,#0x02 MOV b,#0x00 JZ ss2 ;闪烁标志位为 0 则转移 MOV b,#0x40 ss2: MOV A,MRD+1 ANL A,#0X0F ADD a,b MOV disp_buf+3,A 25 MOV a,set_date ;判断是否要闪烁显示 ANL a,#0x02 MOV b,#0x00 JZ ss3 ;闪烁标志位为 0 则转移 MOV b,#0x40 ss3: MOV A,MRD+1 SWAP A ANL A,#0X0F ADD a,b MOV disp_buf+4,A MOV a,set_date ;判断是否要闪烁显示 ANL a,#0x04 MOV b,#0x00 JZ ss4 ;闪烁标志位为 0 则转移 MOV b,#0x40 ss4: MOV A,MRD+2 ANL A,#0X0F ADD a,b MOV disp_buf+6,A MOV a,set_date ;判断是否要闪烁显示 ANL a,#0x04 MOV b,#0x00 JZ ss5 ;闪烁标志位为 0 则转移 MOV b,#0x40 ss5: MOV A,MRD+2 SWAP A ANL A,#0X0F ADD a,b MOV disp_buf+7,A MOV disp_buf+2,#1FH MOV disp_buf+5,#1FH ;显示程序 DISPLAY: MOV R7,#0X08 MOV R1,#disp_buf MOV A,#0X60 DISLOOP: MOV MTD,A 26 PUSH ACC MOV 21H,R1 MOV 20H,R7 MOV MTD+1,R1 MOV SLA,#ZLG7290 ;指定器件地址 MOV SUBA,#07H ;指定子地址 MOV NUMBYTE,#02H ;发送 2 字节数据 LCALL IWRNBYTE ;调用写 2 字节数据程序 LCALL DELAY MOV R1,21H MOV R7,20H POP ACC INC R1 INC A DJNZ R7,DISLOOP LOOP1: JNB KEY_INT,KEY_HANDLE ;判断按键 按键按下则转移 KEY_HANDLE LJMP MAINLOOP ;主循环结束 ;按键处理子程序 KEY_HANDLE: MOV SLA,#ZLG7290 ;指定器件地址 MOV SUBA,#01H ;指定子地址 MOV NUMBYTE,#01H ;发送 1 字节数据 LCALL IRDNBYTE ;调用读 1 字节数据程序 LCALL DELAY MOV A, MRD CJNE A,#01H, TO_SET ;键值=1 取反键 MOV A,set_date JNZ LPP ;若设置键按下 则切换显示无用 CPL swich_date ;否则,按键按下,swich_date 取反 LPP: LJMP MAINLOOP TO_SET: CJNE A,#02H, TO_ADD LCALL KEY_SET LJMP MAINLOOP TO_ADD: CJNE A,#03H, TO_SUB LCALL KEY_ADD LJMP MAINLOOP 27 TO_SUB: CJNE A,#04H, TO_OK LCALL KEY_SUB LJMP MAINLOOP TO_OK: CJNE A,#05H,LLOOP LCALL KEY_OK LLOOP: LJMP MAINLOOP ;设置键 KEY_SET: CJNE A,#02H,KEY_ADD MOV A, set_date next0:CJNE A,#00H, next1 MOV set_date,#0x20 ;年闪烁 SETB swich_date ;用于设置时自动切换显示 RET next1:CJNE A, #20H,next2 MOV set_date,#0x10 ;月闪烁 SETB swich_date RET next2:CJNE A, #10H,next3 MOV set_date,#0x08 ;日闪烁 SETB swich_date RET next3:CJNE A, #08H,next4 MOV set_date,#0x04 ;时闪烁 CLR swich_date RET next4:CJNE A, #04H,next5 MOV set_date,#0x02 ;分闪烁 CLR swich_date RET next5:CJNE A, #02H,next6 MOV set_date,#0x01 ;秒闪烁 CLR swich_date RET next6:CJNE A, #01H,next1 MOV set_date,#0x20 SETB swich_date RET 28 ;加一键 KEY_ADD: MOV A,set_date sec:CJNE A,#01H,min MOV A,set_date_buf ;秒 INC A ; +1 DA A CJNE A,#0x60,LP001 CLR A LP001:MOV set_date_buf,A RET min:CJNE A,#02H,hour MOV A,set_date_buf+1 ;分 INC A ; +1 DA A CJNE A,#0x60,LP003 CLR A LP003:MOV set_date_buf+1,A RET hour: CJNE A,#04H,day MOV A,set_date_buf+2 ;时 INC A ; +1 DA A CJNE A,#0x24,LP005 CLR A LP005:MOV set_date_buf+2,A RET day: CJNE A,#08H,jpmonth MOV A,set_date_buf+3 ;日 INC A ; +1 DA A LCALL dayx LP007:MOV set_date_buf+3,A RET jpmonth:LCALL month dayx: MOV B,A MOV A,set_date_buf+5 ;取月数 29 m1: CJNE A,#0x01,m2 LCALL set31 RET m2: CJNE A,#0x02,m3 LCALL set28 RET m3: CJNE A,#0x03,m4 LCALL set31 RET m4: CJNE A,#0x04,m5 LCALL set30 RET m5: CJNE A,#0x05,m6 LCALL set31 RET m6: CJNE A,#0x06,m7 LCALL set30 RET m7: CJNE A,#0x07,m8 LCALL set31 RET m8: CJNE A,#0x08,m9 LCALL set31 RET m9: CJNE A,#0x09,m10 LCALL set30 RET m10: CJNE A,#0x10,m11 LCALL set31 RET m11: CJNE A,#0x11,m12 LCALL set30 RET m12: CJNE A,#0x12,m1 LCALL set31 RET set28:MOV A,B CJNE A,#0x29,d0 ;28 天 MOV A,#0x01 RET d0: JC bac28 MOV A,#0x01 bac28:RET 30 set30:MOV A,B CJNE A,#0x31,d1 ;30 天 MOV A,#0x01 RET d1: JC bac30 MOV A,#0x01 bac30:RET set31:MOV A,B CJNE A,#0x32,bac31 ;31 天 MOV A,#0x01 bac31:RET month: CJNE A,#10H,year MOV A,set_date_buf+5 ;月 INC A ; +1 DA A CJNE A,#0x13,LP009 MOV A

温馨提示

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

评论

0/150

提交评论