首页 万年历毕业设计

万年历毕业设计

举报
开通vip

万年历毕业设计第1章 系统电路设计 毕业设计(论文) 设计(论文)题目: 电子万年历 指 导 教 师: 刘璟、田宝珍 学 生 专 业: 电子信息工程技术 班 级: 电信0803 学 生 姓 名: 李文俊、闫宏佳、马静 教 研室主任: 信息工程学院 二〇一0 年 11 月1 日 摘 要 电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。它可以对年、月、日、周、时、分、秒进行计时。本设计是基于51系列的单片机进行的电子万年历设计,可以显示年月日时分秒和温度信息,具有可调整日期和时间功能。该电路采用AT89c51单片机作为核...

万年历毕业设计
第1章 系统电路设计 毕业设计( 论文 政研论文下载论文大学下载论文大学下载关于长拳的论文浙大论文封面下载 ) 设计(论文) 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 目: 电子万年历 指 导 教 师: 刘璟、田宝珍 学 生 专 业: 电子信息工程技术 班 级: 电信0803 学 生 姓 名: 李文俊、闫宏佳、马静 教 研室主任: 信息工程学院 二〇一0 年 11 月1 日 摘 要 电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。它可以对年、月、日、周、时、分、秒进行计时。本设计是基于51系列的单片机进行的电子万年历设计,可以显示年月日时分秒和温度信息,具有可调整日期和时间功能。该电路采用AT89c51单片机作为核心,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。 万年历的设计过程在硬件与软件方面进行同步设计。硬件部分主要由AT89C52单片机,温度传感器电路,单片机控制电路,显示电路以及校正电路。等组成。12864液晶显示,低电压低功耗是其显著特点。由该液晶显示 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 与同类型的图形点阵液晶显示模块相比,不论硬件电路结构显示程序都要简洁得多。软件方面主要包括日历程序、时间调整程序,显示程序等。程序采用C语言编写,所有程序编写完成后,在keil软件中进行调试,确定没有问题后,在Proteus软件中嵌入单片机内进行仿真。 关键词: 12864液晶显示 ,DS18B20,单片机 目录 TOC \o "1-3" \h \z \u 第1章设计要求与方案论证 3 1.1 课题研究的背景 3 1.2课题的研究目的与意义 3 1.3 设计要求 3 1.4 课题解决的主要内容 3 1.5 设计方案选择 4 1.6 功能介绍 4 1.7工作原理 5 第2章 系统的硬件设计与实现 5 1.1系统总体设计思路 5 2.1单片机电路设计 6 2.2时钟电路设计 9 2.3 复位电路设计 10 2.4 温度传感器电路设计 11 2.5 矩阵式键盘设计 12 2.6 显示电路设计 12 第3章 系统的软件设计 15 3.3 万年历流程图 15 3.1 中断时钟流程图 16 3.2温度子程序流程图 16 第4章 操作与调试 17 4.1 KEIL uVision3简介 17 4.1.1 8051开发工具 17 4.1.2 uVision3集成开发环境 18 4.2 Proteus简介 18 4.2.2 工作界面 19 4.3 软件调试 20 附录1 21 附录2 21 附录3 22 结束语 41 致谢 41 参考文献 41 第1章设计要求与方案论证 1.1 课题研究的背景 随着科技的快速发展,时间的流逝,从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、时、分、秒和温度等信息,还具有时间校准等功能。该电路采用AT89C52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。   此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。 1.2课题的研究目的与意义 二十一世纪是数字化技术高速发展的时代,而单片机在数字化高速发展的时代扮演着极为重要的角色。电子万年历的开发与研究在信息化时代的今天亦是当务之急,因为它应用在学校、机关、企业、部队等单位礼堂、训练场地、教学室、公共场地等场合,可以说遍及人们生活的每一个角落。所以说电子万年历的开发是国家之所需,社会之所需,人民之所需。 由于社会对信息交换不断提高的要求及高新技术的逐步发展,促使电子万年历发展并且投入市场得到广泛应用。 1.3 设计要求 1.原理图设计 2.能够正确的在液晶上显示万年历,时间,星期。 3.温度传感器接受到的信号能够正确的显示在液晶上。 4.可以通过键盘分别校正年,月,日,星期,时,分,秒。 1.4 课题解决的主要内容 本课题所研究的电子万年历是单片机控制技术的一个具体应用,主要研究内容包括以下几个方面: (1)选用电子万年历芯片时,应重点考虑功能实在、使用方便、单片存储、低功耗、抗断电的器件。 (2)根据选用的电子万年历芯片设计外围电路和单片机的接口电路。 (3)在硬件设计时,结构要尽量简单实用、易于实现,使系统电路尽量简单。 (4)根据硬件电路图,在开发板上完成器件的焊接。 (5)根据设计的硬件电路,编写控制AT89C51芯片的单片机程序。 (6)通过编程、编译、调试,把程序下载到单片机上运行,并实现本设计的功能。 (7)在硬件电路和软件程序设计时,主要考虑提高人机界面的友好性,方便用户操作等因素。 (8)软件设计时必须要有完善的思路,要做到程序简单,调试方便。 1.5 设计方案选择 方案一 用EDA技术及VHDL语言控制来实现显示及测温度,且显示也可以用数码管,但是数码管屏幕有限不是很方便的显示很多的数据以及文字等。对于VHDL语言也不够了解,故不采用此方案。 方案二 用C语言编程来控制单片机让它在液晶上显示数据及文字。由于单片机结构简单、控制功能强、可靠性高、体积小、价格低等优点,以及液晶屏幕可以完整的同时显示数据及文字等内容, 综合上述方案的选择与比较,选择方案二。主要是由于电器元件的熟悉程度以及市场的供求关系。在方案二中,大部分的电器元件我们较熟悉并且更容易获得。 1.6 功能介绍 本次设计主要用单片机控制程序让它在液晶上显示年、月、日、时、分、秒及星期,同时用18B20温度传感器来接受外面的信号,让单片机来接受它,且也让它在液晶上显示测的温度。 时、分、秒的计数结果经过数据处理可直接送显示器显示。当计时发生误差的时候可以用校时电路进行校正。时计数器计满24小时后自动向日计数器进一,日计数器由平年、闰年的28/30/31对大、小月和二月的判断应与当月相应的日期相一致,当日计数器计满时,向月计数器进位,月计数器计满12月向年计数器进位,当年计数器计满100时所以计数器清零。设计采用的是年、月、日和时、分、秒、星期以及温度同时显示。 1.7工作原理 设计的电路主要由四大模块构成:温度传感器电路,单片机控制电路,显示电路以及校正电路。 当温度传感器接受到外面的信号,送入单片机,单片机将接受到的信号输出,让它在液晶上显示。 同时由单片机控制的万年历以及时间显示,当时间及秒计数计满60时就向分进位,分计数器计满60分后向时计数器进位,小时计数器按“24翻1”规律计数。时、分、秒的计数结果经过数据处理可直接送显示器显示。当计时发生误差的时候可以用校时电路进行校正。时计数器计满24小时后自动向日计数器进一,日计数器由平年、闰年的28/30/31对大、小月和二月的判断应与当月相应的日期相一致,当日计数器计满时,向月计数器进位,月计数器计满12月向年计数器进位,当年计数器计满100时所以计数器清零。设计采用的是年、月、日和时、分、秒、星期显示,所以在单片机通过对数据处理进行同时在液晶上显示。 第2章 系统的硬件设计与实现 1.1系统总体设计思路 此设计即液晶上显示年、月、日、时、分、秒及星期原理框图如图(1.1),原理图如图(2.2)。电路一般包括以下几个部分:键盘、单片机、温度传感器及显示电路。 图1.1 单片机实现液晶显示万年历以及温度总框图 单片机实现液晶显示万年历电路图 对于各部分: (1)​ 为使时钟走时与标准时间一致,校时电路是必不可少的,键盘用来校正液晶上显示的时间。 (2)​ 单片机通过输出各种电脉冲信号来驱动控制各部分正常工作。 (3)​ 温度传感器用来显示当天的确定温度值。 (4)​ 单片机发送的信号经过显示电路通过译码最终在液晶上显示出来。 2.1单片机电路设计 ①AT89S52的简介 AT89S52是一种低功耗,高性能的CMOS8位微处理器,内部有8K字节的闪速PEROM ,该芯片采用ATMEL公司高密度、非挥发性存储器工艺制成且与工业标准的MCS-51系列的引脚及指令兼容,FLASH系列存储器为快速擦写存贮器。相对于MCS-51系列芯片而言,其特点如下 : 1、可擦写1000次 2、全静态操作:0Hz.~24MHz 3、32根可编程I/O口线 4、内部RAM为256字节 5、三个16位的定时/计数器 6、8个中断源 AT89S52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89S52可以按照常规 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。 ② AT89S52芯片的管脚、引线与功能 AT89S52芯片图如图2.1所示。 (1)引脚信号介绍: P00~P07 :P0口8位双向口线 P10~P17 :P1口8位双向口线 P20~P27 :P2口8位双向口线 P30~P37 :P3口8位双向口线 (2)P1口的第二功能如表2-1: 表2-1 P1口第二功能表 引脚号 第二功能 P1.0 T2(定时器/计数器T2的外部计数输入),时钟输出 P1.1 T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制) P1.5 MOSI(在系统编程用) P1.6 MISO(在系统编程用) P1.7 SCK(在系统编程用) 访问程序存储器控制信号:当 信号为低电平时,对ROM的读操作限 定在外部程序存储器;而当 信号为高电平时,则对ROM的读操作是从内部程序存储器开始,并可延至外部程序存储器。 ALE地址锁存控制信号:在系统扩展时,ALE用于控制把P0口输出低8位地址锁存起来,以实现低位地址和数据的隔离。此外由于ALE是以晶振六分之一的固定频率输出的正脉冲,因此可作为外部时钟或外部定时脉冲作用。 外部程序存储器读选取通信号:在读外部ROM时 有效(低电平),以实现外部ROM单元的读操作。 XTAL1和XTAL2外接晶体引线端:当使用芯片内部时钟时,此二引线端用于外接石英晶体和微调电容;当使用外部时钟时,用于拉外部的时钟脉冲信号。 RST复位信号:当输入的复位信号延续2个机器周期以上高电平时即为有效,用以完成单片机的复位初始化操作。 VSS:地线 VCC:+5V电源 (3)P3口的第二功能如表2-2: 表2-2 P3口第二功能表 引脚号 第二功能 P3.0 RXD(串行输入) P3.1 TXD(串行输出) P3.2 INT0(外部中断0) P3.3 INT0(外部中断0) P3.4 T0(定时器0外部输入) P3.5 T1(定时器1外部输入) P3.6 WR(外部数据存储器写选通) P3.7 RD(外部数据存储器读选通) ③AT89S52的总线结构 AT89S52的管脚除了电源、复位、时钟接入、用户I/O口部分P3外,其余管脚都是为实现系统扩展而设置的。这些管脚构成了三总线形式,即: (1)地址总线(AB):地址总线宽度为16位,因此,其外部存储器直接地址外围为64K字节。16位地址总线由P0经地址锁存器提供低8位地址(A0~A7);P2口直接提供高8位地址(A8~A15)。 (2)数据总线(DB):数据总线宽度为8位,由P0口提供。 (3)控制总线 (CB):由部分P3口的第二功能状态和4根独立控制线RESET、 、ALE、 组成。AT89S52结构框图如图2.2所示。 图2.1 AT89S52芯片图 图2.2 AT89S52结构图 2.2时钟电路设计 时钟电路用于产生单片机工作所需要的时钟信号,而时序所研究的是指令执行中各信号之间的相互关系。单片机本身就如一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地作。 (1)时钟信号的产生 单片机内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。而在芯片的外部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器。 电容器C1和C2的作用是稳定频率和快速起振,电容值的范围在5pF∽30pF,典型值为30pF。晶振的频率通常选择两种6MHz和12MHz。只要在单片机的XTAL1和XTAL2引脚外接晶体振荡器就构成了自激振荡器并在单片机内部产生时钟脉冲信号。 (2)时钟振荡电路如图2.3所示: 2.3 复位电路设计 复位电路是使单片机的CPU或系统中的其他部件处于某一确定的初始状态,并从这上状态开始工作。 (1)单片机常见的复位电路 通常单片机复位电路有两种:上电复位电路,按键复位电路。上电复位电路:上电复位是单片机上电时复位操作,保证单片机上电后立即进入规定的复位状态。它利用的是电容充电的原理来实现的。按键复位电路:它不仅具有上电复位电路的功能,同时它的操作比上电复位电路的操作要简单的多。如果要实现复位的话,只要按下RESET键即可。它主要是利用电阻的分压来实现的 在此设计中,采用的按键复位电路。按键复位电路如图2.4所示。 (2)复位电路工作原理 上电复位要求接通电源后,单片机自动实现复位操作。上电瞬间RESET引脚获得高电平,随着电容的充电,RERST引脚的高电平将逐渐下降。RERST引脚的高电平只要能保持足够的时间(2个机器周期),单片机就可以进行复位操作。上电与按键均有效的复位电路不仅 在上电时可以自动复位,而且在单片机运行期间,利用按键也可以完成复位操作。 因此本设计选用第二种上电复位与按键均有效的各单位电路。 2.4 温度传感器电路设计 温度传感器DS18B20引脚如图2.5所示。 图2.5 温度传感器 引脚功能说明: NC(1、2、6、7、8脚):空引脚,悬空不使用; VDD(3脚):可选电源脚,电源电压范围3~5.5V。当工作于寄生电源时,此引脚必须接地。 DQ(4脚):数据输入/输出脚。漏极开路,常态下高电平。 DS18B20内部有4个主要部件:64位激光ROM、温度传感器、非易失性温度告警触发器(TH和TL)和配置寄存器。 每个DS18B20都有一个唯一的64位ROM编码,它存放在64位激光ROM中。代码的前8位是单线产品系列编码,接着的48位是唯一的产品序列号,最后8位是前面56位编码的CRC校验值,如表2-3所示。 表2-3 64位激光ROM 内容 8位CRC校验码 48位产品序列号 8位产品系列编码 MSB LSB MSB LSB MSB LSB CRC的等效多项式函数为: CRC=X8+X5+X4+1 64位激光ROM中的8位CRC值即由此多项式函数产生。主机可以通过“读ROM命令”读取64位ROM的前56位,然后也按此多项式计算出CRC值,并把它与读出的存放在DS18B20激光ROM内的CRC值进行比较,从而决定ROM的数据是否已被主机正确接受。CRC值得比较和是否继续操作都由主机决定。 2.5 矩阵式键盘设计 实现键盘控制的方法有多种,它可以用FPGA来进行控制,也可以用单片机来进行控制。在本系统中,我们采用了单片机来进行控制,因为单片机可以很好的解决键抖动。 由若干个按键组成一个键盘,其电路结构可分为独立式键盘和矩阵式键盘两种。 独立式键盘每个键单独占用一根I/O口线,每根I/O口线上的按键工作状态不会影响其他I/O口线上的状态,矩阵式键盘按键排列为行列式矩阵结构,也称行列式键盘结构。4行4列共16个键,只占用8根I/O口线,键数目较多,可节省口线。此设计的是3行3列共9个键。键盘的工作方式可分为编程控制方式和中断控制方式。CPU在一个工作周期内,利用完成其他任务的空余时间,调 图2.6 矩阵式键盘 用键盘扫描子程序,经程序查询,若无键操作,则返回;若有键操作,则进而判断是哪个键,并执行相应的键处理程序。这种方式为编程扫描方式。由于单片机在正常应用过程中,可能会经常进行键操作,因而编程控制方式使CPU经常处于工作状态, 在进行本次设计中,涉及到了启动/关闭、调时、调分、调秒,调年,月,日,星期,等很多功能个功能。因此,只采用了3行3列键进行功能设置。 如图2.6所示。 2.6 显示电路设计 12864液晶是一种具有4位/8位并行,2线或3线串行多种接口方式,内部含有国标一级,二级简体文字库的点阵图形液晶显示模块:其显示分辨率为128×64,内置128个16*16点文字,和128个16*8点ASCII字符集,利用该模块灵活的接口方式和简单,方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字,也可完成图形显示。低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构显示程序都要简洁得多。 其基本特性如下: 低电源电压(VDD:+3.0——+5.5V) 显示分辨率:128×64点 内置汉字字库,提供8192个16×16点阵汉字 内置128个16×8点阵字符 2MHZ时钟频率 显示方式:STN ,半透,正显 驱动方式:1/32DUTY,1/5BIAS 视角方向:6点 背光方式:侧部高亮白色LED,功耗仅为普通的LED的1/5—1/10 通讯方向:串行,并行可选 内置DC—DC转换电路,无需外加负压 无需片选信号,简化软件设计 工作温度:零度到55度,存储温度:负20度到60度。 而本设计将采用的是并行接口,及见图2.7所示。 图2.7 128×64液晶电路 其液晶12864的并行管脚如表2-2所示。 表2-4 液晶管脚 我们用单片机来进行控制。它可以很直观的用来显示年、月、日、时、分、秒、 星期及温度, 单片机与LCD的接口电路如图2.8所示。 图2.8 接口电路 第3章 系统的软件设计 3.3 万年历流程图 万年历流程如图3.3所示。 流程图 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 :开始既当日加一天,同时星期也就相应的加1,看星期是否加到7,若加到了7,就返回到1,若没有就返回到时钟状态,当日加到相应的最大数时,月分就相应的加1,看月份是否加到了13, 若没有到13,就一直等待,若到了13就返回1,且年份就加1,当年份到2099时就清到2005年,若没有,就一直等待,直到2099为止。 图3.3 万年历流程图 3.1 中断时钟流程图 中断服务程序流程图如图3.1所示。 流程图分析:由中断查询当有中断请求时,及进行现场保护,保护断点,将定时器赋初值,且开定时器便于计数,且赋值50000,当中断进行20次刚好一秒,当秒计数60时便向分进位,当分计数60时,向时进位,当时到24时,清零,及恢复现场。 图3.1中断流程图 3.2温度子程序流程图 温度显示流程图如图3.2所示。 流程图分析:开始进入初始化DS18B20,就是通过主机拉低单线产生复位脉冲然后释放该线,如果有应答脉冲,及发起ROM命令当成功的执行操作命令后,就使用内存操作命令,即温度转换等,当转换完后,又初始化DS18B20是否有应答脉冲,若有,就发起读时隙命令,既同时读出第1,2个字节,既为温度的数据。 图3.2 温度显示流程图 第4章 操作与调试 4.1 KEIL uVision3简介 4.1.1 8051开发工具    KEIL C51标准C编译器为8051微控制器的软件开发提供了C语言环境,同时保留了汇编代码高效,快速的特点。C51编译器的功能不断增强,使你可以更加贴近CPU本身,及其它的衍生产品。C51已被完全集成到uVision3的集成开发环境中,这个集成开发环境包含:编译器,汇编器,实时操作系统,项目管理器,调试器。uVision3 IDE可为它们提供单一而灵活的开发环境。 C51 V7版本是目前最高效、灵活的8051开发平台。它可以支持所有8051的衍生产品,也可以支持所有兼容的仿真器,同时支持其它第三方开发工具。因此,C51 V7版本无疑是8051开发用户的最佳选择。 4.1.2 uVision3集成开发环境 (1)、项目管理 工程(project)是由源文件、开发工具选项以及编程说明三部分组成的。 一个单一的uVision3工程能够产生一个或多个目标程序。产生目标程序的源文件构成“组”。开发工具选项可以对应目标,组或单个文件。 uVision3包含一个器件数据库(device database),可以自动设置汇编器、编译器、连接定位器及调试器选项,来满足用户充分利用特定 微控制器的要求。此数据库包含:片上存储器和外围设备的信息,扩展数据指针(extra data pointer)或者加速器(math accelerator)的特 性。 uVision3可以为片外存储器产生必要的连接选项:确定起始地址和规模。 (2)、集成功能 uVision3的强大功能有助于用户按期完工。 1.集成源极浏览器利用符号数据库使用户可以快速浏览源文件。用详细的符号信息来优化用户变数存储器。 2.文件寻找功能:在特定文件中执行全局文件搜索。 3.工具菜单:允许在V3集成开发环境下启动用户功能。 4.可配置SVCS接口:提供对版本控制系统的入口。 5.PC-LINT接口:对应用程序代码进行深层语法分析。 6.Infineon的EasyCase接口:集成块集代码产生。 7.Infineon的DAVE功能:协助用户的CPU和外部程序。DAVE工程可被直接输入uVision3。  4.2 Proteus简介 Proteus ISIS是英国Labcenter公司开发的电路分析与实物仿真软件。它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路,该软件的特点是:①实现了单片机仿真和SPICE电路仿真相结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。②支持主流单片机系统的仿真。目前支持的单片机类型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。③提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil C51 uVision3等软件。④具有强大的原理图绘制功能。总之,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大。本章介绍Proteus ISIS软件的工作环境和一些基本操作。 4.2.2 工作界面 Proteus ISIS的工作界面是一种标准的Windows界面,如图4.2所示。包括:标题栏、主菜单、标准工具栏、绘图工具栏、状态栏、对象选择按钮、预览对象方位控制按钮、仿真进程控制按钮、预览窗口、对象选择器窗口、图形编辑窗口。 图4.2 Proteus ISIS的工作界面 4.3 软件调试 软件调试的任务是利用ISIS开发工具进行在线仿真调试,发现和纠正程序错误,同时也能发现仿真结果故障。程序的调试应一个模块一个模块地进行,我们首先单独调试各功能子程序,检验程序是否能够实现预期的功能,接口电路的控制是否正常等;最后逐步将各子程序连接起来总调。联调需要注意的是,各程序模块间能否正确传递参数,特别要注意各子程序的现场保护与恢复。调试的基本步骤如下: (1)、修改显示缓冲区内容,屏蔽拆字程序,调试动态扫描显示功能。例如将DISP0~DISP5单元置为“012345”,应能在LCD上从左到右显示“012345”。若显示不正确,可在中断子程序相应位置设置断点调试检查。然后修改计时缓冲区内容,调用拆字程序,调试显示模块。 (2)、运行主程序调试模块,不按下任何键,检查是否能开始正确显示。若不能正确显示,则应在定时器中断服务子程序中设置断点,检查HOUR、MIN、SEC单元是否随断点运行而变化。然后屏蔽缓冲区初始化部分,用仿真器修改万年历显示缓冲区内容为2008年12月12日,运行主程序(调进位键),检验能否正确进位,以及试调时间看能否正确的进位,以及温度显示。 (3)、调试键盘扫描模块,先用延时5ms子程序代替显示子程序延时消抖,在求取键号后设置断点,中断后观察A累加器中的键号是否正确;然后恢复用显示子程序延时消抖,检验与显示模块能否正确连接。 (4)、调试时间设置模块。首先屏蔽COMB子程序,单独调试键盘设置模块,观察显示缓冲区DISP0~DISP5单元的内容是否随键入的键号改变,以及键号能否在LCD上显示。然后屏蔽子程序,单独调试合字模块。 (5)、运行主程序联调,检查能否用键盘修改当前万年历,时间,以及温度能否正确显示。 附录1 仿真电路图 附录2 元器件清单 序号 名称 规格型号 数量(单位) 1 芯片 AT89S52 1 2 按键开关 SW-PB 10 3 晶振 12MHz 1 4 液晶显示器 12864 1 5 温度传感器 18B20 1 6 排阻 RP 1 7 电解电容 CAP 1 8 瓷片电容 CAP 2 9 电阻 R 2 附录3 程序清单 #include #define uchar unsigned char #define uint unsigned int #define dataport P2 bit flagg=0; sbit E=P1^2; //使能端 sbit RW=P1^1; //读写端 sbit RS=P1^0; //数据命令端口 sbit CS1=P1^3; sbit CS2=P1^4; sbit DQ=P3^0; uchar ip; uchar temp[3]; uchar flag=0; uchar sum,setbit; uchar discode[13]; uchar year=8,month=12,week=7,day=7,hour=12,minute=0,second=0,pm; uchar code day1[]={0,32,29,32,31,32,31,32,32,31,32,31,32}; uchar code day2[]={0,32,30,32,31,32,31,32,32,31,32,31,32}; uchar code shu0[]={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10, 0x20,0x20,0x10,0x0F,0x00};/*"0",0*/ uchar code shu1[]={0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20, 0x3F,0x20,0x20,0x00,0x00};/*"1",0*/ uchar code shu2[]={0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28, 0x24,0x22,0x21,0x30,0x00};/*"2",0*/ uchar code shu3[]={0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20, 0x20,0x20,0x11,0x0E,0x00};/*"3",0*/ uchar code shu4[]={0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04, 0x24,0x24,0x3F,0x24,0x00};/*"4",0*/ uchar code shu5[]={0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21, 0x20,0x20,0x11,0x0E,0x00};/*"5",0*/ uchar code shu6[]={0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11, 0x20,0x20,0x11,0x0E,0x00};/*"6",0*/ uchar code shu7[]={0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00, 0x3F,0x00,0x00,0x00,0x00};/*"7",0*/ uchar code shu8[]={0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22, 0x21,0x21,0x22,0x1C,0x00};/*"8",0*/ uchar code shu9[]={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31, 0x22,0x22,0x11,0x0F,0x00};/*"9",0*/ uchar code dian[]={0x00,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00};/*"°",0*/ uchar code C[]={0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00};/*"C",0*/ uchar code xiao[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30, 0x00,0x00,0x00,0x00,0x00};/*".",0*/ uchar code fu[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01, 0x01,0x01,0x01,0x01,0x01}; uchar code zheng[]={0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01, 0x1F,0x01,0x01,0x01,0x00};/*"+",0*/ uchar code nian[]={0x40,0x20,0x10,0x0C,0xE3,0x22,0x22,0x22,0xFE,0x22,0x22, 0x22,0x22,0x02,0x00,0x00, 0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00};/*"年",0*/ uchar code yue[]={0x00,0x00,0x00,0x00,0x00,0xFF,0x11,0x11,0x11,0x11,0x11, 0xFF,0x00,0x00,0x00,0x00, 0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x01,0x01,0x21,0x41,0x3F,0x00,0x00,0x00,0x00};/*"月",0*/ uchar code shi[]={0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10, 0xFF,0x10,0x10,0x10,0x00, 0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00};/*"时",0*/ uchar code fen[]={0x80,0x40,0x20,0x98,0x87,0x82,0x80,0x80,0x83,0x84,0x98, 0x30,0x60,0xC0,0x40,0x00, 0x00,0x80,0x40,0x20,0x10,0x0F,0x00,0x00,0x20,0x40,0x3F,0x00,0x00,0x00,0x00,0x00};/*"分",0*/ uchar code miao[]={0x12,0x12,0xD2,0xFE,0x91,0x11,0xC0,0x38,0x10,0x00, 0xFF,0x00,0x08,0x10,0x60,0x00, 0x04,0x03,0x00,0xFF,0x00,0x83,0x80,0x40,0x40,0x20,0x23,0x10,0x08,0x04,0x03,0x00};/*"秒",0*/ uchar code xing[]={0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A, 0x2A,0x2A,0x3E,0x00,0x00,0x00, 0x00,0x48,0x46,0x41,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x49,0x41,0x40,0x00};/*"星",0*/ uchar code qi[]={0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,0x00,0xFE,0x22, 0x22,0x22,0xFE,0x00,0x00, 0x42,0x22,0x1B,0x02,0x02,0x0A,0x33,0x62,0x18,0x07,0x02,0x22,0x42,0x3F,0x00,0x00};/*"期",1*/ uchar code yi[]={0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0xC0,0x80,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/*"一",0*/ uchar code er[]={0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04, 0x06,0x04,0x00,0x00,0x00, 0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x10,0x00};/*"二",1*/ uchar code san[]={0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84, 0x84,0x84,0x04,0x00,0x00, 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00};/*"三",2*/ uchar code si[]={0x00,0xFE,0x02,0x02,0x02,0xFE,0x02,0x02,0xFE,0x02,0x02, 0x02,0x02,0xFE,0x00,0x00, 0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x22,0x7F,0x00,0x00};/*"四",3*/ uchar code wu[]={0x00,0x02,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0xC2, 0x82,0x02,0x00,0x00,0x00, 0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x30,0x20,0x00};/*"五",4*/ uchar code liu[]={0x10,0x10,0x10,0x10,0x10,0x91,0x12,0x1E,0x94,0x10,0x10, 0x10,0x10,0x10,0x10,0x00, 0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x00,0x00,0x01,0x02,0x0C,0x78,0x30,0x00,0x00};/*"六",5*/ uchar code ri[]={0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42, 0xFE,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00};/*"日",0*/ void csh(void) { TMOD=0x01; TH0=(65535-50000)/256; TL0=(65535-50000)%256; ET0=1; TR0=1; EA=1; } uchar mm() { int j; if(year%4==0) { if(year%100==0) { if(year%400==0) j=day2[month]; else j=day1[month]; } else j=day2[month]; } else j=day1[month]; return(j); } void chekbusy12864(void) { uchar dat; RS=0; //指令模式 RW=1; //读数据 do{ P0=0x00; E=1; dat=P0&0x80; E=0; }while(dat!=0x00); } /****选屏****/ void choose12864(uchar i)//i是要写的屏.0是左屏,1是右屏,2是双屏 { switch (i) { case 0: CS1=0;CS2=1;break; case 1: CS1=1;CS2=0;break; case 2: CS1=0;CS2=0;break; default: break; } } /******写命令*****/ void cmd_w12864(uchar cmd) //写命令 { chekbusy12864(); RS=0; //指令模式 RW=0; //写模式 E=1; P0=cmd; E=0; } /****写数据******/ void dat_w12864(uchar dat) { chekbusy12864(); RS=1; RW=0; E=1; P0=dat; E=0; } /*****清屏*****/ void clear12864(void) { uchar page,row; for(page=0xb8;page<0xc0;page++) { cmd_w12864(page); cmd_w12864(0x40); for(row=0;row<64;row++) { dat_w12864(0x00); } } } /***初始化****/ void init12864(void) { chekbusy12864(); cmd_w12864(0xc0); cmd_w12864(0x3f); } /**8X16字符的显示**/ void play8(uchar ch,uchar row,uchar page,uchar *adr) { uchar i; choose12864(ch); page=page<<1; row=row*8; cmd_w12864(row+0x40); cmd_w12864(page+0xb8); for(i=0;i<8;i++) { dat_w12864(*(adr+i)); } cmd_w12864(row+0x40); cmd_w12864(page+0xb9); for(i=8;i<16;i++) { dat_w12864(*(adr+i)); } } /**16X16显示**/ play16(uchar ch,uchar row,uchar page,uchar *adr) { uchar i; choose12864(ch); page=page<<1; row=row*8; cmd_w12864(row+0x40); cmd_w12864(page+0xb8); for(i=0;i<16;i++) { dat_w12864(*(adr+i)); } cmd_w12864(row+0x40); cmd_w12864(page+0xb9); for(i=16;i<32;i++) { dat_w12864(*(adr+i)); } } /*****读数据*****/ uchar dat_r12864(uchar page,uchar arrange) //page页地址.arrange列地址) { uchar dat; chekbusy12864(); cmd_w12864(page+0xb8); cmd_w12864(arrange+0x40); P0=0xff; RW=1; RS=1; E=1; E=0; E=1; dat=P0; E=0; return(dat); } clear8(uchar x,uchar y,uchar ch) { uchar i; choose12864(ch); cmd_w12864(x*8+0x40); cmd_w12864(y+0xb8); for(i=0;i<8;i++) { dat_w12864(0x00); } cmd_w12864(x*8+0x40); cmd_w12864(y+0xb9); for(i=0;i<16;i++) { dat_w12864(0x00); } } void delayfor(uchar i) { for(i;i>0;i--); } void delay11us(uint k) { while(k--); } void delay1ms(uint k) { k=k*125; while(k--); } /**ds18b20**/ void ds18b20_init(void) { DQ=1; delayfor(8); DQ=0; delayfor(70); //80改60 DQ=1; delayfor(25); } /**ds18b20读一个字节**/ uchar ds18b20_readchar(void) { uchar i=0; uchar dat = 0; for(i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; delay11us(10); } return(dat); } /**ds18b20写一个字节**/ ds18b20_writechar(uchar dat) { uchar i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay11us(10); DQ = 1; dat>>=1; } } /**读出温度**/ uint readtemperature(void) { uchar a=0; uchar b=0; uint t=0; ds18b20_init(); ds18b20_writechar(0xCC); // 跳过读序号列号的操作 ds18b20_writechar(0x44); // 启动温度转换 delay11us(100); ds18b20_init(); ds18b20_writechar(0xCC); //跳过读序号列号的操作 ds18b20_writechar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=ds18b20_readchar(); b=ds18b20_readchar(); if((b*256+a)>63488) { t=~(b*256+a)+1; t=t*25;flag=1;//取反加1 } else { t = (b*256+a)*25;flag=0; } return(t>>2); } /**温度数值处理**/ void gettemperature(void) { static uint te=0xffff; uint realtemp; realtemp=readtemperature(); if(te!=realtemp) { temp[0]=realtemp/1000; temp[1]=(realtemp/100)%10; temp[2]=(realtemp/10)%10; te=realtemp; } } uchar scan(uchar k) { uchar re; switch (k) { case 1:re=0;break; case 2:re=1;break; case 4:re=2;break; default:break; } return re; } void keyscan(void) { uchar m,n; dataport=0x07; delay11us(1); if(dataport!=0x07) { dataport=0x07; delay1ms(5); m=dataport&0x07; if(m!=0x07) { m=m^0x07; m=scan(m); dataport=0x70; delay11us(1); n=dataport&0x70; if(n!=0x70) { n=n>>4; n=n^0x07; n=scan(n); sum=3*m+n; } } dataport=0x07; while(dataport!=0x07); } } main() { uchar shour=hour+1,sminute=minute+1,ssecond=second+1; csh(); choose12864(2); init12864(); clear12864(); play8(0,0,0,shu2); //屏,列,页,地址 play8(0,1,0,shu0); play16(0,4,0,nian); play16(1,0,0,yue); play16(1,4,0,ri); play16(0,2,1,shi); play16(0,6,1,fen); play16(1,2,1,miao); play16(1,0,2,xing); play16(1,2,2,qi); while(1) { discode[0]=year/10; discode[1]=year%10; discode[2]=month/10; discode[3]=month%10; discode[4]=day/10; discode[5]=day%10; discode[6]=hour/10; discode[7]=hour%10; discode[8]=minute/10; discode[9]=minute%10; discode[10]=second/10; discode[11]=second%10; discode[12]=week/10; play8(0,2,0,(shu0+16*discode[0])); play8(0,3,0,(shu0+16*discode[1])); play8(0,6,0,(shu0+16*discode[2])); play8(0,7,0,(shu0+16*discode[3])); play8(1,2,0,(shu0+16*discode[4])); play8(1,3,0,(shu0+16*discode[5])); play8(0,0,1,(shu0+16*discode[6])); play8(0,1,1,(shu0+16*discode[7])); play8(0,4,1,(shu0+16*discode[8])); play8(0,5,1,(shu0+16*discode[9])); play8(1,0,1,(shu0+16*discode[10])); play8(1,1,1,(shu0+16*discode[11])); play16(1,4,2,(yi+32*discode[12])); gettemperature(); if(flag) { play8(0,0,2,fu); } else { c
本文档为【万年历毕业设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_938754
暂无简介~
格式:doc
大小:1MB
软件:Word
页数:43
分类:互联网
上传时间:2011-10-31
浏览量:128