万年历的设计与制作毕业设计(论文)1_第1页
万年历的设计与制作毕业设计(论文)1_第2页
万年历的设计与制作毕业设计(论文)1_第3页
万年历的设计与制作毕业设计(论文)1_第4页
万年历的设计与制作毕业设计(论文)1_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

毕业设计(论文)毕业设计(论文) 分院:机电学院机电学院 学生姓名:楼龙飞楼龙飞 专业班级:0707 电子(电子(1 1)班)班 学号:071120114071120114 指导教师:高晓红高晓红 二二 O 一一 O 年年 五五 月月 宁波大红鹰学院毕业设计(论文) 2 万年历的设计与制作 摘摘 要要:文章首先简单的介绍了电子万年历的发展,然后介绍由 AT89 系列 单片机制作的万年历采用软件硬件结合的方法来完成年、月、日、小时、分、秒、 星期等的实现。利用 51 单片机最小系统为核心,时钟芯片 DS1302 来实现万年历 显示走时更准,功耗更低,具有很大的实用价值。 关键词:关键词:单片机、DS1302、液晶显示、PCB 设计 一、前言一、前言 随着科技的快速发展,时间的流逝,从观太阳、摆钟到现在电子钟,人类不 断研究,不断创新纪录。电子钟已成为人们日常生活中必不可少的物品,广泛用 于个人家庭以及车站、码头、剧院、办公室等公共场所,给人们的生活、学习、 工作、 娱乐带来了极大的方便。由于数字集成电路技术的发展和采用了先进的 石英技术,现代电子钟具有走时准确、性能稳定、制作维修简单等优点,弥补了 传统钟表的许多不足之处。我们利用单片机技术设计制作的电子万年历, 采用软 件硬件结合的方法,控制液晶显示屏输出,来显示年、月、日、星期、时、分、 秒、温度。其最大特点是硬件电路简单,安装方便,软件设计独特,可靠,可以 很方便的由软件编程进行功能的调整和改进。 本设计中还用到的由美国 DALLAS 公司推出的具有涓细电流充电能的低 功耗实时时钟电路 DS1302。它可以对年、月、日、星期、时、分、秒进行计时, 还具有闰年补偿等多种功能,而且 DS1302 的使用寿命长,误差小。对于数字电 子万年历采用直观的数字显示,可以同时显示年、月、日、星期、时、分、秒等 信息,还具有时间校准等功能。该电路采用 AT89S52 单片机作为核心,功耗小, 能在 3V 的低压工作,电压可选用 35V 电压供电。 二、系统基本原理二、系统基本原理 (一)单片机内部结构和功能实体介绍(一)单片机内部结构和功能实体介绍 本次设计所用的AT89S52单片机内部由CPU、 四个并行I/O口, ROM, RAM, 宁波大红鹰学院毕业设计(论文) 3 定时器/计数器,串行 I/O 口,中断系统,以及一个内部的时钟电路。CPU 主要 用来运算、控制,四个并行 I/O 口分别是 P0、P1、P2、P3,ROM,用来存放程 序 RAM 用来存放中间结果。其内部结构示意图如图 1 所示。 图 1AT89S52 单片机内部结构示意图 (二)单片机的引脚设置(二)单片机的引脚设置 1、I/O 脚:P0.0-P0.7 口 8 位双向 I/O 口线 P1.0-P1.7 口 8 位双向 I/O 口线 P2.0-P2.7 口 8 位双向 I/O 口线 P3.0-P3.7 口 8 位双向 I/O 口线,P3 口线有第二功能 2、控制脚:ALE/ _ PROG地址锁存控制信号 _ PSEN外部程序存储器读选通信号 _ EA/Vp 外部访问允许/编程电源输入端 RST/VPD 复位信号 3、晶振脚:XTAL1 和 XTAL2 外接晶体引线端 4、电源脚:Vss 引脚接地线和 Vcc 引脚接+5V 电源 三三、系统电路的设计说明、系统电路的设计说明 (一)系统设计目标(一)系统设计目标 本课题是一个采用 AT89S51 单片机为核心控制器件,通过硬件制作与软件 编程,设计制作一个简易的电子万年历。其主要的功能是实现年、月、日、星期、 宁波大红鹰学院毕业设计(论文) 4 时、分、秒、温度的显示。为实现以上功能要完成以下任务: 1、剖析本课题要实现的功能和工作原理,进行方案设计; 2、绘制原理图; 3、制作印制电路板图; 4、程序的设计与编写; 5、实物的制作; 6、实物测试与调试。 (二)系统设计思路(二)系统设计思路 本次设计包括 AT89S51 单片机及基本外围电路模块、 DS1302 时钟电路模 块、显示电路模块、按键控制电路模块、温度检测模块、电源电路模块等部分组 成,系统框架图如图 2 所示: 图 2系统框架图 (三)硬件电路原理图(三)硬件电路原理图(电路原理图如附录所示) (四四)单元电路设计)单元电路设计 本设计由复位电路、时钟电路、按键电路、LCD1602 显示电路、DS1302 时 钟电路、DS18B20 温度传感器、供电电路等各单元电路组成,以下做逐一介绍。 1、复位电路 复位电路包含电解电容 C4 电阻 R6、R5 和按键 S1,如图 3 所示。单片机要 实现复位,要求 RST 脚保持两个机器周期以上的高电平。常用的复位电路包括 上电复位电路和按键复位电路两种,考虑到调试的便利,本课题设计采用按键复 宁波大红鹰学院毕业设计(论文) 5 位电路。根据 T=R*C 2us 时间常数计算公式,电阻与电容的各参数搭配如图 3 所示: 图 3单片机复位电路 2、时钟电路 时钟电路包括晶振 Y1,电容 C1,C2 等元件,一般单片机时钟电路都选用 频率稳定度较高的石英晶体作为振荡源。 石英晶振的频率选取主要考虑单片机型 号和系统功能要求两个要素。比如本次采用的 AT89S52 单片机可以外接 024MHz 石英晶体。在本次系统中,控制周期只有普通的各器件延时小程序, 考虑到延时计算精确(1 周期为 1us) ,另一方面频率高给 PCB 设计带来一定压 力,故认为选择振荡频率为 12.0MHz 的石英晶体比较适宜。电容 C1 和 C2 主要 是起震与稳定作用,一般的电容值选取(石英晶体)为 3010pF,本设计中选用 22pF 瓷片电容(考虑到稳定性,选用大片瓷片电容) 。如图 4 所示。 图 4单片机时钟电路 3、按键电路 设置电路由 K1、K2、K3、K4 四个独立按键构成一个设置系统,如图 5 所 示。每个按键都有自己相对应的功能下面具体分析: 宁波大红鹰学院毕业设计(论文) 6 K1:功能调整键,当此按键按下首先进入年设置,年的低两位闪烁,如 2009 年 的 “09” 开始闪烁, 此时便可以调整年数据。 同理, 月、 日、 星期、 时、 分、秒 进行循环调整。 K2:加调键调,当 K1 调整到设置那个档位,按下此键相对应的数值往上加 1。 K3:减调键调,当 K1 调整到设置那个档位,按下此键相对应的数值往上加 1。 K4:退出设置画面。 图 5按键电路 4、显示电路 显示电路是由一个 LCD1602 液晶显示器和单片机的 P0 口和 P2 来实现的, 如图 6 所示: 图 6显示电路 宁波大红鹰学院毕业设计(论文) 7 采用液晶显示可以节省 PCB 布局的空间,以及布局的便利。同时相对数码 管显示,更美观,更有档次。以下是 LCD1602 引脚及功能: 1 脚 VSS,电源地 2 脚 VDD,电源正极 3 脚 VEE,液晶显示偏压信号 3 脚与 4 脚接 5V 电源 4 脚 RS,数据/命令选择端 5 脚 R/W,读/写选择端 6 脚 E,使能信号 714 脚 D0D7,Data I/O 15 脚 A,背光源正极 16 脚 K,背光源负极 5、DS1302 时钟电路 时钟模块电路是由美国 DALLAS 公司推出的具有涓细电流充电能力的低功 耗实时时钟电路 DS1302,主要特点是采用串行数据传输,可为掉电保护电源提 供可编程的充电功能,并且可以关闭充电功能。采用普通 32.768kHz 晶振 DS1302 与单片机之间能简单采用同步串行的方式进行通信,需三个口线: (1) RES(复位) , (2)I/0(数据线) , (3)SCLK(串行时钟) 。时钟/RAM 的读/写数 据以一个字节或多达 31 个字节的字符组方式通信。DS1302 工作时功耗很低, 保 护数据和时钟信号时功率小于 1mW。DS1302 时钟电路如图 7 所示: 图 7DS1302 时钟电路 宁波大红鹰学院毕业设计(论文) 8 (1)其主要的性能指标: 、工作电压:2.0V5.5V 、工作电流:2.0V 时,小于 300nA 、简单 3 线接口 、31x8 位暂存数据存储 RAM (2)DS1302 接口 、写保护寄存器操作 、时钟停止位操作 、多字节传送方式 、单字节传送方式 (3)DS1302 与 CPU 的连接 DS1302 与 CPU 的连接需要三条线,即 CLK(7)、I/O(6)、CE(5)。图 7 所示 是 DS1302 与 89S51 的连接图。其中,时钟的显示用 LCD 实际上,在调试程序 时可以不加电容器,只加一个 32.768kHz 的晶振即可。 6、温度检测电路 温度检测电路,是由美国 DALLAS 公司生产的 DS18B20 可组网数字温度 传感器芯片封装而成,具有耐磨耐碰,体积小,使用方便,封装形式多样,适用 于各种狭小空间设备数字测温和控制领域。DS18B20 内部结构主要由四部分组 成:64 位光刻 ROM,温度传感器,温度报警触发器 TH 和 TL,配置寄存器。它 与单片机的连接如图 8 所示: 图 8温度检测电路 宁波大红鹰学院毕业设计(论文) 9 其三个管脚分别为: 外接供电电源输入端 V; 数字信号输出/输入端 I/O 端; 电源地端 G1。分别代表:电源输入端、数字信号输入/输出端、地线。该电路具 有体积小,单线接口方式,硬件比较简单等优点。同时测温范围 55 125,固有测温分辨率 0.5。 7、供电电路 供电电路以 LM7805 为核心,C5、C6、C7、C8 滤波电容以及电阻和 LED 组成的电源系统。如图 9 所示: 图 9供电电路 本课程设计的元器件的工作电流分别为: 单片机30mA、DS18B20为0.2mA、 DS1302 为 0.3mA、LCD1602 为 2mA,可以得到本系统的最大功率为 0.3W 左右, 而单片机加散热器可以得到的最大工作电流为 1A,所以用一个 LM7805 足够满 足系统的要求。输入端电容 C5 、C6、C7、C8 是滤波作用。LED1 发光二极管 指示灯的作用是当 S2 按下 LED 点亮即说明了电源正常工作。 四、四、PCB 板设计板设计 (一)(一)PCB 板布局设计板布局设计 PCB 板的设计要充分考虑到产品的抗干扰性和实用性。抗干扰主要包括: 抗时钟干扰,信号线间的交叉干扰。 1、抗时钟干扰,晶振应尽量靠近核心器件;晶体下方避免走线;用地线将 时钟圈起;时钟线尽量短,以避免电源和时钟产生互感。在本次课题中,PCB 用了大面积的覆铜是为了让板图看上去更加饱满,也更能减少信号间的干扰。 2、电源部分介绍,7805 加散热片是为了让电源电流变大,使得功率变大, 这样可以更方便其他电路的驱动工作。 宁波大红鹰学院毕业设计(论文) 10 3、其它元件摆放,除了时钟电路要特别靠近单片机以外,其余的附属电路 要根据单片机的管脚顺序来摆放元气件的位置, 避免布线时走弯路, 在设置 PCB 板尺寸时,尽量让元件之间的距离远一些(但也不用过大) ,便于板子的制作。 在本次的设计中用 101mm*75mm 的大小。 (二)单面板布线(二)单面板布线 电源模块从输入的交流电变成稳压+5V 直流用于电路。 根据电路需要电源线 宽应采用 100-120mil,地线采用大面积的覆铜,这样的目的是为了让板子看上去 更加饱满,美观,也能减少信号的干扰。其余信号线采取 80mil。焊盘尽量大一 些,这样可以防止在焊接的时候把铜皮破坏掉。 (三)布线(三)布线 在设置完布线规则和元件摆放好后就可以开始布线, 布线采用手动布线在单 层板上完成,有些走线可以用 0 欧姆的电阻代替,等布线完之后可以在各信号线 手动加线,可以是线条看起来跟立体美观,同时也达到铺铜的目的。在整块 PCB 的四角放上四个定位孔用于固定 (四)(四)PCB 板设计图板设计图(PCB 板设计图如图附录所示) 五、电路的测试与调试五、电路的测试与调试 在完成万年历实物的制作后,我将万年历通电,在通电一段时间后我发现万 年历显示的时间与北京时间不同步了(误差为一分钟) 。经过分析后发现产生这 个误差的原因有很多: 1、时钟芯片本身存在的误差; 2、电路周围的干扰; 3、程序设计上存在的一定的误差。 六、软件设计六、软件设计 (一)主流程图(一)主流程图 启动电源后,程序在初始化。液晶显示初始时钟信息,年/月/日/星期以及小 时/分钟/秒,初始化结束后进入主程序判断标志位是否进入调整模式,进入调整 模式。结束在返回判断标志是否置位,如果否则判断是否进入显示模式,进入显 示模式,调用显示程序和按键扫描程序,再返回判断标志位,主程序流程如图 10 所示: 宁波大红鹰学院毕业设计(论文) 11 图 10主程序流程图 (二)初始化流程图(二)初始化流程图 各器件进行初始化比如 LCD1602 液晶,DS18B20 温度传感器,DS1302 时 钟芯片和开机画面初始化,开机显示 “07/1 loulongfei”,初始化流程图如 11 图所 示: 宁波大红鹰学院毕业设计(论文) 12 图 11初始化流程图 (三)显示程序(三)显示程序 显示程序主要由四部分组成:写命令、写数据、检查忙、读数据。首先给 LCD1602 初始化写入相关的命令,接着写入数据,检查是否忙,如果检查未忙 则读取显示数据,具体流程图如图 12 所示: 宁波大红鹰学院毕业设计(论文) 13 图 12显示流程图 (四)源程序(四)源程序(如附录所示) 六、系统自评与改进方向六、系统自评与改进方向 (一)系统自评(一)系统自评 本次课题的特点 1、电子万年历是电子类的小设计以实用型,方便型,美观型,精巧型为主。 2、硬件电路简单,安装方便易于实现,软件设计独特、可靠。 3、实物实现了对年、月、日、星期、时、分、秒、温度的现实,达到预期 的效果。 (二)不足与改进(二)不足与改进 宁波大红鹰学院毕业设计(论文) 14 由于时间所限,产品的功能尚未完善,其中主要包括: 1、除了有时间、日期、温度显示功能外,还要具有报时,报警功能,这样 能更加广泛的用于家庭或公共场所。 2、产品抗干扰能力不够强 3、设计的外观,要适当的添加些装饰,这样看上去更加美观更加符合一个 实用型产品的特点。 七、心得体会七、心得体会 毕业设计是对我们在大学期间所学专业知识以及自身动手能力的一次综合 性测验。它是理论与实践教学的最后一个环节,也是我们这些毕业生从学生向工 作过渡的一次具体实践,将大学三年的所学,通过动手设计,制作实物和理论的 辑写来充分展示。所以做好毕业设计对于即将走上工作岗位的学生而言,显得特 别重要。经历几次课程设计,尤其是单片机课程设计后,为了更好的检测自己的 水平,进一部巩固知识,增强应用能力,我选定此次论文的课题为基于单片机的 电子万年历的设计。 从八月中旬开始, 我就开始从图书馆, 网上收集相关的资料, 为论文的辑写做好充分的准备,到九月初顺利完成开题报告。接下去的时间也一 直在为写论文,答辩做准备,并且,最终将万年历的实物作出来。 本次自选的毕业课题万年历的设计与制作, 目的在于利用所学知识和电子领 域的生产实践相结合起来,认识到产品的原理,硬件制作流程,进一步熟练语言 编程水平。上学期末我们做过一个数字钟的实训课程,从硬件到软件的设计,最 后实现了时间的跳变。现在进行基于单片机的电子万年历的毕业设计,是很有现 实意义和指导意义的。 要完成此次课题我要从分析系统的基本原理,系统的电路设计,系统的原理 图,PCB 设计,软件设计一步步实现,还要结合这个课题所用到的核心芯片的应 用,最后作出实物,实物的制作从锯板,画板,打孔,最后焊接调试,经过自己 的努力和老师指导,终于顺利完成。 经过此次课题的制作,不仅在理论上学到了很多,而且更多的是学习到了怎 样合理的安排时间更有效率的去完成一件事情。 参考文献参考文献 1 李广弟, 朱月秀, 王秀山 单片机基础M 北京: 北京航空航天大学出版社, 2001.7 宁波大红鹰学院毕业设计(论文) 15 2 清源计算机工作室原理图与 PCB 及仿真M北京:机械工业出版社,2004.1 3 马忠梅,张凯,马岩单片机的 C 语言应用程序设计M北京:北京航空航天大 学出版社,2003.11 4 张洪润,兰清华单片机应用技术教程M北京:清华大学出版社,1997.11 5 李华 MCS-51系列单片机实用接口技术M 北京: 北京航空航天大学出版社, 1993.8 6 陈景初单片机应用系统设计与实践M北京:北京航空航天大学出版社,1996.8 7 马家辰 MCS-51单片机原理与接口技术M 哈尔滨: 哈尔滨工业大学出版社, 1994.8 8 刘守义单片机应用技术M西安:西安电子科技大学出版社,1996.8; 9 李朝青单片机学习指导M北京:北京航空航天大学出版社,2005.10 10 李建忠主编单片机原理及应用M西安电子科技大学出版社,2004 宁波大红鹰学院毕业设计(论文) 16 附件附件:系统:系统电路电路原理图原理图 宁波大红鹰学院毕业设计(论文) 17 附件附件:PCB 板设计图板设计图 宁波大红鹰学院毕业设计(论文) 18 附件附件:源程序:源程序 #include #include #define uint unsigned int #define uchar unsigned char sbitDS1302_CLK = P15;/实时时钟时钟线引脚 sbitDS1302_IO= P16;/实时时钟数据线引脚 sbitDS1302_RST = P17;/实时时钟复位线引脚 sbitwireless_1 = P20; sbitwireless_2 = P21; sbitwireless_3 = P22; sbitwireless_4 = P23; sbitACC0 =ACC0; sbitACC7 =ACC7; char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;/秒, 分,时到日,月,年位闪的计数 sbit Set = P32;/模式切换键 sbit Up = P33;/加法按钮 sbit Down = P34;/减法按钮 sbit out = P35;/立刻跳出调整模式按钮 sbit DQ = P36;/温度传送数据 IO 口 char done,count,temp,flag,up_flag,down_flag; uchar temp_value;/温度值 uchar TempBuffer5,week_value2; void show_time();/液晶显示程序 /*1602 液晶显示部分子程序*/ 宁波大红鹰学院毕业设计(论文) 19 /Port Definitions* sbit LcdRs= P25;/控制端口 sbit LcdRw= P26; sbit LcdEn= P27; sfrDBPort= 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; /向LCD写入命令或数据 * #define LCD_COMMAND0/ Command #define LCD_DATA1/ Data #define LCD_CLEAR_SCREEN 0 x01/ 清屏 #define LCD_HOMING0 x02/ 光标返回原点 void LCD_Write(bit style, unsigned char input) /选写命令还读数据 LcdEn=0; 宁波大红鹰学院毕业设计(论文) 20 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 宁波大红鹰学院毕业设计(论文) 21 #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); 宁波大红鹰学院毕业设计(论文) 22 /将字符输出到液晶显示 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 charYear; unsigned char DateString11; unsigned char TimeString9; SYSTEMTIME;/定义的时间类型 SYSTEMTIME CurrentTime; #defineAM(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 宁波大红鹰学院毕业设计(论文) 23 #define DS1302_MONTH0 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; 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; DS1302_CLK = 0; 宁波大红鹰学院毕业设计(论文) 24 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 宁波大红鹰学院毕业设计(论文) 25 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_yearDateString0 = 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; 宁波大红鹰学院毕业设计(论文) 26 else Time-DateString5 = ; Time-DateString6 = ; Time-DateString7 = /; if(hide_dayDateString8 = Time-Day/10 + 0; 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 ,判断结束字符 宁波大红鹰学院毕业设计(论文) 27 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; 宁波大红鹰学院毕业设计(论文) 28 else Time-TimeString6 = ; Time-TimeString7 = ; Time-DateString8 = 0; void Initial_DS1302(void)/时钟芯片初始化 unsigned char Second=Read1302(DS1302_SECOND); if(Second /写入允许 Write1302(0 x8c,0 x09); /以下写入初始化时间 日期:09/11/25.星期: 3. 时 间: 23:59:55 Write1302(0 x88,0 x11); Write1302(0 x86,0 x24); Write1302(0 x8a,0 x02); Write1302(0 x84,0 x6); Write1302(0 x82,0 x6); Write1302(0 x80,0 x6); Write1302(0 x8e,0 x80); /禁止写入 /*ds18b20 子程序*/ /*ds18b20 延迟子函数(晶振 12MHz )*/ 宁波大红鹰学院毕业设计(论文) 29 void delay_18B20(unsigned int i) while(i-); /*ds18b20 初始化函数*/ void Init_DS18B20(void) unsigned char x=0; DQ = 1;/DQ 复位 delay_18B20(8);/稍做延时 DQ = 0;/单片机将 DQ 拉低 delay_18B20(80); /精确延时 大于 480us DQ = 1;/拉高总线 delay_18B20(14); x=DQ;/稍做延时后 如果 x=0 则初始化成功 x=1 则初始化失 败 delay_18B20(20); /*ds18b20 读一个字节*/ unsigned char ReadOneChar(void) uchar i=0; uchar dat = 0; for (i=8;i0;i-) 宁波大红鹰学院毕业设计(论文) 30 DQ = 0; / 给脉冲信号 dat=1; DQ = 1; / 给脉冲信号 if(DQ) dat|=0 x80; delay_18B20(4); return(dat); /*ds18b20 写一个字节*/ void WriteOneChar(uchar dat) unsigned char i=0; for (i=8; i0; i-) DQ = 0; DQ = dat delay_18B20(5); DQ = 1; dat=1; /*读取 ds18b20 当前温度*/ void ReadTemp(void) unsigned char a=0; 宁波大红鹰学院毕业设计(论文) 31 unsigned char b=0; unsigned char t=0; Init_DS18B20(); WriteOneChar(0 xCC);/ 跳过读序号列号的操作 WriteOneChar(0 x44);/ 启动温度转换 delay_18B20(100);/ this message is wery important Init_DS18B20(); WriteOneChar(0 xCC);/跳过读序号列号的操作 WriteOneChar(0 xBE);/读取温度寄存器等(共可读 9 个寄存器) 前两个 就是温度 delay_18B20(100); a=ReadOneChar();/读取温度值低位 b=ReadOneChar();/读取温度值高位 temp_value=b4; void temp_to_str()/温度数据转换成液晶字符显示 TempBuffer0=temp_value/10+0;/十位 TempBuffer1=temp_value%10+0;/个位 TempBuffer2=0 xdf;/温度符号 TempBuffer3=C; TempBuffer4=0; void Delay1ms(unsigned int count) 宁波大红鹰学院毕业设计(论文) 32 unsigned int i,j; for(i=0;i0 x59)/超过 59 分,清零 temp=0; break; case 3: temp=Read1302(DS1302_HOUR);/ 读 取小时数 宁波大红鹰学院毕业设计(论文) 34 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: 宁波大红鹰学院毕业设计(论文) 35 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) case 1: temp=Read1302(DS1302_SECOND);/ 读取秒数 temp=temp-1;/秒数 减 1 down_flag=1;/数据调整后更新 宁波大红鹰学院毕业设计(论文) 36 标志 if(temp=0 x7f)/小于 0 秒,返回 59 秒 temp=0 x59; break; case 2: temp=Read1302(DS1302_MINUTE);/ 读取分数 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: 宁波大红鹰学院毕业设计(论文) 37 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); 宁波大红鹰学院毕业设计(论文) 38 void Setkey()/模式选择按键,一直被调用 Set=1;/进入设置画面按键,现给它一个高电平,在判断是否有低 电平,起到防消跺作用 if(Set=0|wireless_4=1)/ mdelay(8); count=count+1;/Setkey 按一次,count 就加 1 done=1;/进入调整模式 while(Set=0); while(wireless_4=1); void keydone()/按键功能执行 uchar Second; if(flag=0)/关闭时钟,停止计时 Write1302(0 x8e,0 x00); /写入允许 temp=Read1302(0 x80); Write1302(0 x80,temp|0 x80); Write1302(0 x8e,0 x80); /禁止写入 flag=1; Setkey(

温馨提示

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

评论

0/150

提交评论