电子万年历地设计

上传人:沈*** 文档编号:98439619 上传时间:2022-05-29 格式:DOC 页数:62 大小:462KB
返回 下载 相关 举报
电子万年历地设计_第1页
第1页 / 共62页
电子万年历地设计_第2页
第2页 / 共62页
电子万年历地设计_第3页
第3页 / 共62页
点击查看更多>>
资源描述
word学号 201225110207中州大学毕业设计论文题 目 电子万年历的设计 学 院工程技术学院 专 业应用电子技术年 级12班 级 2 学生某某xxx指导教师 孙 建 延职称 副教授时 间2014年12月4日电子万年历的设计摘要:随着电子技术的迅速开展,特别是随着大规模集成电路的出现,给人类生活带来根本性的改变。尤其是单片机技术的应用产品已走进千家万户。电子万年历的出现给人们的生活带来了诸多方便。电子万年历是一种非常广泛的日常计时工具,在现代社会越来越流行。它可以对年、月、日、周日、时、分、秒进展计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。对于电子万年历采用直观的1602液晶显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。该电路采用AT89S52单片机作为核心,功耗小,能在3V的低压工作,电压可选用35V电压供电。在设计的同时对单片机的理论根底和外围扩展知识进展了比拟全面准备。在硬件与软件设计时,没有良好的根底知识和实践经验会受到很大限制,每项功能实现时需要那种硬件,程序该如何编写,算法如何实现等,没有一定的根底就不可能很好的实现。在编写程序过程中发现以现有的相关知识要独自完成编写任务困难重重,在教师和同学的帮助下才完成了程序局部的编写。本万年历的设计采用 C语言,根据功能需求进展程序的编写与调试,保证软硬件正常工作,具有结构简单,本钱低廉,显示清晰,稳定可靠等优点。并且可进展扩大,参加闹钟的功能,更加方便于你使用。 关键词: 单片机 DS18B20 DS1302 1602液晶 PCBTheDesignOf Electronic CalendarAbstract:With the rapid development of electronic technology, especially along with large scale integrated circuit, the appearance of human life to bring fundamental change. Especially the application of single chip microputer products have already walked into the country. The emergence of electronic calendar to the life of people brought many convenient. Electronic calendar is a very wide range of daily timing tool, in modern society is more and more popular. It can be to year, month, day, Sunday, when the clock, minutes and seconds, also has a leap year pensation, etc DuoZhong function, and the DS1302 long service life and small error. For electronic calendar by using object 1602 LCD display, can also shows that year, month, day, Sunday, when, minutes and seconds and temperature, information, but also has time calibration etc. Function. This circuit AT89S52 SCM as the core, low consumption, in 3 V of low-pressure work, voltage can choose 3 5 V voltage power supply. In the design at the same time the SCM theoretical basis and peripheral expansion knowledge is pared to overall. In the hardware and software design, no good basic knowledge and practical experience is very limited, every function to a need that kind of hardware, and the program this how to write, how to realize the algorithm, not a foundation will not be very good implementation. In the process of program found that by the existing knowledge to finish writing task alone difficulties, the teachers and students of help to finish the program, and the writing of the part.The design of this calendar using C language, according to the function requirements of the procedures to write and debugging, ensure software and hardware normal work, the structure is simple, the cost is low and the show clear, stable and reliable. And can be extended, join the alarm clock function, it is more convenient to use you.Keywords: DS18B20 DS1302 1602LCD PCB SCM目录第一章绪论6本课题的研究的背景以与现实意义6本课题对于专业知识的综合应用情况6课题论述总体结构安排7第二章电子万年历的工作概述以与原理分析8电子万年历的工作概述8确保电子万年历的工作性能稳定的相关措施8系统硬件电路总体结构框图8电子万年历总体电路原理图9各局部单元电路介绍92.5.1 DS18B20温度传感器电路介绍92.5.2 DS1302电路10单片机最小系统电路102.5.4 1602液晶显示电路11第三章应用Protel实现电路原理图的绘制与PCB设计12简介12绘制电路原理图的主要步骤12人工布局、人工布线设计13第四章电子万年历C程序的编写与实现15程序流程框图15电子万年历C语言程序17键盘扫描局部程序174.2.2 DS18B20局部程序27 DS1302局部程序301602液晶显示局部程序32第五章总结36设计功能分析365.2 心得体会36参考文献37致谢38附录3961 / 62第一章绪论本课题的研究的背景以与现实意义时钟在现实生活中占有非常重要作用,目前时钟的使用已经从原来单一的机械式计时工具开展为同时具有计时、时间调节、温度显示以与相关附加功能。针对这样的开展实际情况,在完成学院的毕业设计工作中,我决定采用所学习的单片机知识以与相关的电路知识来进展电子万年历的设计。目前市场上电子万年历的开展,其功能也逐渐从单一的计时开展到事迹、日期、温度显示,甚至有的还具有闹钟、问候语显示等功能,让人能清楚地知道当前的日期、时间、温度等物理量。所以本课题的研究具有一定的现实应用意义。因为学习的知识深度的限制以与实际情况的考虑,我设计的电子万年历的功能确定为能够正确显示日期、时间、温度。显示的方式采用ATMEL公司AT89S51单片机为驱动1602LCD显示器进展显示。采用TB上购置的mini80E单片机开发电路板作为电路实现的主要功能载体。在学院三年的单片机学习过程中,我们学习单片机都是采用TB上买的单片机开发板以与C语言进展学习,TB的51单片机开发板在单片机最小系统的根底上配置了数码管显示、LCD显示区、LCD显示区、独立键盘输入区以与模拟量输入、A/D转换等资源,满足了单片机实际开发的绝大局部要求。同时开发板上的电路结构也能够较好地锻炼自己电路方面的知识。采用C语言进展编程能够综合锻炼自己的实际程序编写的能力以与程序的调试功能。本课题的选题难度适中,能够对应用电子技术专业学习的专业课程有较为全面的应用与掌握,同时也与自己的专业能力符合。课题论述总体结构安排第一章表示了电子万年历研究的背景以与现实意义第二章如此主要介绍设计工作总体概述以与产品工作的原理,按照功能电路的分别进展详细的分析讨论,最终分析电路的总体工作原理。第三章主要讨论应用Protel软件来实现电路原理图的绘制以与印制板设计第四章是电子万年历的软件实现局部,主要是利用C语言进展程序的编写,完成电路的测量功能。第五章为总结和展望,总结本课题设计的总体思路,产品的功能以与对于产品功能升级等进展情景展望。第二章电子万年历的工作概述以与原理分析电子万年历的工作概述电子万年历是由数据采集,MCU,输入输出,数据存储四个功能局部构成。其中数据的采集是由DS1302和DS18B20来完成的,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以与闰年补偿的年进展计数,而且精度高。数字式温度传感器DS18B20,仅需要一条数据线进展数据传输,易于与单片机连接,可以去除A/D模块,降低硬件本钱,简化系统电路。当数据送入AT89S51单片机后,单片机将对INT1脚的信号进展计数,当计数的脉冲达到1KM的时候,INT1申请中断,对外输出信号,输出的信号由显示局部送LCD进展显示,显示当前日期、时间、温度。其中键盘是人机交互的接口,系统设计使得键盘能够实现调节日期、时间的功能。电子万年历能实时地将所测的温度和当前时间显示出来,主要是DS1302通过串行口与单片机进展通讯,实时时钟/日历电路提供秒、分、时、日、星期、月、年的信息。每个月的天数和闰年的天数可与自动调整,时钟操作可以通过AM/PM标志位决定采用24或12小时时间格式。DS1302与单片机之间能采用简单的同步串行进展通信仅需三根I/O线。DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。其测温X围 55+125。设计应综合考虑测温精度和系统反响时间。本设计采用9位的分辨率,因而具有较高的快的计算速度。在计算环境温度的时候省去了末尾几位。为了保证系统的实时性,系统的速度转换模块和显示数据转BCD码模块都采用快速算法。另外,还应尽量保证其他子模块在编程时的通用性和高效性。本设计的里程值采用两位显示。AT89S52主控制模 块硬件电路总体结构框图LED数码管动态扫描显示模块DS1302时钟模块温度采集模块键盘模块图2-1电子万年历总体结构框图电子万年历总体电路原理图由DS1302和DS18B20电路以与单片机开发板电路三局部组成。图2-2为电路总原理图之一,单片机开发板电路的电路原理图。图2-2电子万年历电2.5.1 DS18B20温度传感器电路介绍DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进展写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。DS18B20温度传感器电路图如图2-4所示图2-4 基于运放的有源滤波器电路图2.5.2 DS1302电路DS1302采用三线接口与CPU进展同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个318的用于临时性存放数据的RAM存放器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进展涓细电流充电的能力。DS1302电路原理图如图2-5所示图2-5 基于运放的信号放大电路单片机最小系统电路由单片机、单片机复位电路、晶体振荡回路组成,能够完成单片机工作的最根本需要,单片机最小系统电路如图2-6所示图2-6 单片机最小系统电路2.5.4 1602液晶显示电路单片机将计算处理的结果采用1602液晶进展显示,显示电路的电路原理图如图2-7所示图 2-7 1602液晶显示电路第三章应用Protel实现电路原理图的绘制与PCB设计使用电脑设计电路原理图和电路板图是把电子技术从理论运用到实际的第一步。只有会设计电路原理图和电路板图才能进展电子产品的研发与开发。本软件就是从理论走向实际,掌握电子产品开发的根本技术。Protel99SE是澳大利亚ProtelTechnology公司推出的一个全32位的电路板设计软件。该软件功能强大,人机界面友好,易学易用,使用该软件设计者可以容易设计电路原理图、画元件图、设计电路板图、画元件封装图和电路仿真,是夜内人士首选的电路板设计工具。的主要步骤1、进入Protel 99SE环境2、使用菜单File/New建立新设计数据库文件3、使用菜单File/New在打开窗口选择Schematic Document图标,建立新原理图文件4、将原理图打开5、设置画图环境6、添加元件库7、将所需元件从元件库中取出来,放置在图纸上,并且调整好位置8、使用连线工具将元件连起来,设置元件属性,对元件进展编号9、进展电气规格检查(ERC)10、建立网络表,为制作电路板图做准备3.3PCB人工布局、人工布线设计人工布局就是将所有的元件一个一个放置到PCB上各个位置。操作较为繁琐,但是能够结合工艺的要求以与设计中实际要求进展,人工布局的效果一般来说效果要比自动布局好很多。在设计中,工程师根本都是采用自动布局的方案进展。这也要求作为电路板设计人员要具有丰富的经验以与长时间坚持的毅力。元件的布局与走线对产品的寿命、稳定性、电磁兼容都有很大的影响,是应该特别注意的地方。一般来说应该有以下一些原如此:在放置顺序上应该先放置与结构有关的固定位置的元器件,如电源插座、指示灯、开关、连接件之类,这些器件放置好后用软件的LOCK功能将其锁定,使之以后不会被误移动。再放置线路上的特殊元件和大的元器件,如发热元件、变压器、IC等。最后放置小器件。元件布局还要特别注意散热问题。对于大功率电路,应该将那些发热元件如功率管、变压器等尽量靠边分散布局放置,便于热量散发,不要集中在一个地方,也不要高电容太近以免使电解液过早老化。 布线原如此,每人都会有自己的体会,但还是有些通行的原如此的。高频数字电路走线细一些、短一些好,大电流信号、高电压信号与小信号之间应该注意隔离隔离距离与要承受的耐压有关,通常情况下在2kv时板上要距离2mm,在此之上以比例算还要加大,例如假如要承受3KV的耐压测试,如此上下压线路之间的距离应在3.5mm以上,许多情况下为防止爬电,还在印制线路板上的上下压之间开槽。,两面板布线时,两面的导线宜相互垂直、斜交、或弯曲走线,防止相互平行,以减小寄生耦合;作为电路的输人与输出用的印制导线应尽量避兔相邻平行,以免发生回授,在这些导线之间最好加接地线。走线拐角尽可能大于90度,杜绝90度以下的拐角,也尽量少用90度拐角同是地址线或者数据线,走线长度差异不要太大,否如此短线局部要人为走弯线作补偿。走线尽量走在焊接面,特别是通孔工艺的PCB,尽量少用过孔、跳线,单面板焊盘必须要大,焊盘相连的线一定要粗,能放泪滴就放泪滴,一般的单面板厂家质量不会很好,否如此对焊接和RE-WORK都会有问题,大面积敷铜要用网格状的,以防止波焊时板子产生气泡和因为热应力作用而弯曲,但在特殊场合下要考虑GND的流向,大小,不能简单的用铜箔填充了事,而是需要去走线,元器件和走线不能太靠边放,一般的单面板多为纸质板,受力后容易断裂,如果在边缘连线或放元器件就会受到影响;必须考虑生产、调试、维修的方便性;模拟电路来说处理地的问题是很重要的,地上产生的噪声往往不便预料,可是一旦产生将会带来极大的麻烦,应该未雨绸缎。对于功放电路,极微小的地噪声都会因为后级的放大对音质产生明显的影响;在高精度A/D转换电路中,如果地线上有高频分量存在将会产生一定的温漂,影响放大器的工作。这时可以在板子的4角加退藕电容,一脚和板子上的地连,一脚连到安装孔上去通过螺钉和机壳连,这样可将此分量虑去,放大器与AD也就稳定了。另外,电磁兼容问题在目前人们对环保产品倍加关注的情况下显得更加重要了。一般来说电磁信号的来源有3个:信号源,辐射,传输线。晶振是常见的一种高频信号源,在功率谱上晶振的各次谐波能量值会明显高出平均值。可行的做法是控制信号的幅度,晶振外壳接地,对干扰信号进展屏蔽,采用特殊的滤波电路与器件等。第四章电子万年历C程序的编写与实现程序流程框图开始初始化读、写日期、时间和温度别离日期时间温度显示值显示子程序农历自动更新子程序日期、时间修改子程序闰月子程返回定时闹铃子程序 图-A 主程序流程图 图-B计算阳历程序流程图 图-C 时间调整程序流程图 图-D 阴历程序流程图电子万年历C语言程序if(key1=0)/-key1为功能键设置键-delay(9);/延时,用于消抖动if(key1=0)/延时后再次确认按键按下 buzzer=0;/蜂鸣器短响一次 delay(20); buzzer=1;while(!key1);key1n+;if(key1n=9)key1n=1;/设置按键共有秒、分、时、星期、日、月、年、返回,8个功能循环switch(key1n)case 1: TR0=0;/关闭定时器/TR1=0;write_1602(er+0x09);/设置按键按动一次,秒位置显示光标write_1602(0x0f);/设置光标为闪烁temp=(miao)/10*16+(miao)%10;/秒数据写入DS1302write_1302(0x8e,0x00);write_1302(0x80,0x80|temp);/miao write_1302(0x8e,0x80);break;case 2: write_1602(er+6);/按2次fen位置显示光标 /write_1602(0x0f);break;case 3: write_1602(er+3);/按动3次,shi /write_1602(0x0f);break;case 4: write_1602(yh+0x0e);/按动4次,week /write_1602(0x0f);break;case 5: write_1602(yh+0x0a);/按动5次,ri /write_1602(0x0f);break;case 6: write_1602(yh+0x07);/按动6次,yue /write_1602(0x0f);break;case 7: write_1602(yh+0x04);/按动7次,nian /write_1602(0x0f);break;case 8:write_1602(0x0c);/按动到第8次,设置光标不闪烁TR0=1;/打开定时器temp=(miao)/10*16+(miao)%10;write_1302(0x8e,0x00);write_1302(0x80,0x00|temp);/miao数据写入DS1302write_1302(0x8e,0x80); break;/-加键key2-if(key1n!=0)/当key1按下以下。再按以下键才有效按键次数不等于零if(key2=0) /上调键delay(10);if(key2=0)buzzer=0;/蜂鸣器短响一次delay(20);buzzer=1;while(!key2);switch(key1n)case 1:miao+;/设置键按动1次,调秒if(miao=60)miao=0;/秒超过59,再加1,就归零write_sfm(0x08,miao);/令LCD在正确位置显示加设定好的秒数temp=(miao)/10*16+(miao)%10;/十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); /允许写,禁止写保护write_1302(0x80,temp); /向DS1302内写秒存放器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); /打开写保护write_1602(er+0x09);/因为设置液晶的模式是写入数据后,光标自动右移,所以要指定返回/write_1602(0x0b);break;case 2:fen+;if(fen=60)fen=0;write_sfm(0x05,fen);/令LCD在正确位置显示加设定好的分数据temp=(fen)/10*16+(fen)%10;/十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00);/允许写,禁止写保护write_1302(0x82,temp);/向DS1302内写分存放器82H写入调整后的分数据BCD码write_1302(0x8e,0x80);/打开写保护write_1602(er+6);/因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置break;case 3:shi+;if(shi=24)shi=0;write_sfm(2,shi);/令LCD在正确的位置显示加设定好的小时数据temp=(shi)/10*16+(shi)%10;/十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00);/允许写,禁止写保护write_1302(0x84,temp);/向DS1302内写小时存放器84H写入调整后的小时数据BCD码write_1302(0x8e,0x80);/打开写保护write_1602(er+3);/因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位break;case 4:week+;if(week=8)week=1; write_1602(yh+0x0C);/指定加后的周数据显示位置write_week(week);/指定周数据显示内容 temp=(week)/10*16+(week)%10;/十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00);/允许写,禁止写保护write_1302(0x8a,temp);/向DS1302内写周存放器8aH写入调整后的周数据BCD码write_1302(0x8e,0x80);/打开写保护 write_1602(yh+0x0e);/因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位break;case 5:ri+;if(ri=32)ri=1;write_nyr(9,ri);/令LCD在正确的位置显示加设定好的日期数据temp=(ri)/10*16+(ri)%10;/十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00);/允许写,禁止写保护write_1302(0x86,temp);/向DS1302内写日期存放器86H写入调整后的日期数据BCD码write_1302(0x8e,0x80);/打开写保护write_1602(yh+10);/因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位break;case 6:yue+;if(yue=13)yue=1;write_nyr(6,yue);/令LCD在正确的位置显示加设定好的月份数据temp=(yue)/10*16+(yue)%10;/十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00);/允许写,禁止写保护write_1302(0x88,temp);/向DS1302内写月份存放器88H写入调整后的月份数据BCD码write_1302(0x8e,0x80);/打开写保护write_1602(yh+7);/因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位break;case 7:nian+; if(nian=100)nian=0;write_nyr(3,nian);/令LCD在正确的位置显示加设定好的年份数据 temp=(nian)/10*16+(nian)%10;/十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00);/允许写,禁止写保护write_1302(0x8c,temp);/向DS1302内写年份存放器8cH写入调整后的年份数据BCD码write_1302(0x8e,0x80);/打开写保护write_1602(yh+4);/因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位break;/-减键key3,各句功能参照加键注释-if(key3=0)delay(10);/调延时,消抖动if(key3=0) buzzer=0;/蜂鸣器短响一次 delay(20); buzzer=1;while(!key3);switch(key1n)case 1:miao-;if(miao=-1)miao=59;/秒数据减到-1时自动变成59write_sfm(0x08,miao);/在LCD的正确位置显示改变后新的秒数 temp=(miao)/10*16+(miao)%10;/十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); /允许写,禁止写保护write_1302(0x80,temp); /向DS1302内写秒存放器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); /打开写保护write_1602(er+0x09);/因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置/write_1602(0x0b);break;case 2:fen-;if(fen=-1)fen=59;write_sfm(5,fen);temp=(fen)/10*16+(fen)%10;/十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00);/允许写,禁止写保护write_1302(0x82,temp);/向DS1302内写分存放器82H写入调整后的分数据BCD码write_1302(0x8e,0x80);/打开写保护write_1602(er+6);/因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置break;case 3:shi-; if(shi=-1)shi=23;write_sfm(2,shi);temp=(shi)/10*16+(shi)%10;/十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00);/允许写,禁止写保护write_1302(0x84,temp);/向DS1302内写小时存放器84H写入调整后的小时数据BCD码write_1302(0x8e,0x80);/打开写保护write_1602(er+3);/因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位break;case 4:week-;if(week=0)week=7; write_1602(yh+0x0C);/指定加后的周数据显示位置write_week(week);/指定周数据显示内容temp=(week)/10*16+(week)%10;/十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00);/允许写,禁止写保护write_1302(0x8a,temp);/向DS1302内写周存放器8aH写入调整后的周数据BCD码write_1302(0x8e,0x80);/打开写保护write_1602(yh+0x0e);/因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位break;case 5:ri-;if(ri=0)ri=31;write_nyr(9,ri);temp=(ri)/10*16+(ri)%10;/十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00);/允许写,禁止写保护write_1302(0x86,temp);/向DS1302内写日期存放器86H写入调整后的日期数据BCD码write_1302(0x8e,0x80);/打开写保护write_1602(yh+10);/因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位break;case 6:yue-;if(yue=0)yue=12;write_nyr(6,yue);temp=(yue)/10*16+(yue)%10;/十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00);/允许写,禁止写保护write_1302(0x88,temp);/向DS1302内写月份存放器88H写入调整后的月份数据BCD码write_1302(0x8e,0x80);/打开写保护write_1602(yh+7);/因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位break;case 7:nian-; if(nian=-1)nian=99;write_nyr(3,nian); temp=(nian)/10*16+(nian)%10;/十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00);/允许写,禁止写保护write_1302(0x8c,temp);/向DS1302内写年份存放器8cH写入调整后的年份数据BCD码write_1302(0x8e,0x80);/打开写保护write_1602(yh+4);/因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位break;4.2.2 DS18B20局部程序void DS18_delay(int useconds) int s;for (s=0; suseconds;s+);复位函数功能:完成单总线的复位操作。复位时间为480s,因此延时时间为(480-24)/16 = 28.5,取29s。经过70s之后检测存在脉冲,因此延时时间为(70-24)/16 = 2.875,取3s。unsigned char ow_reset(void) unsigned char presence;DQ = 0; / 将 DQ 线拉低DS18_delay(29); / 保持 480sDQ = 1; / DQ返回高电平DS18_delay(3); / 等待存在脉冲presence = DQ; / 获得存在信号DS18_delay(25); / 等待时间隙完毕return(presence); / 返回存在信号,0 = 器件存在, 1 = 无器件位写入函数功能:向单总线写入1位值:bitvalvoid write_bit(char bitval) DQ = 0; / 将DQ 拉低开始写时间隙if(bitval=1) DQ =1; / 如果写1,DQ 返回高电平DS18_delay(5); / 在时间隙内保持电平值,DQ = 1; / DS18_delay函数每次循环延时16s,因此DS18_delay(5) = 104s字节写入函数功能:向单总线写入一个字节值:valvoid ds18write_byte(char val) unsigned char i;unsigned char temp;for (i=0; ii; temp &= 0x01; write_bit(temp); DS18_delay(5);位读取函数功能:从单总线上读取一位信号,所需延时时间为15s,因此无法调用前面定义* 的DS18_delay()函数,而采用一个for()循环来实现延时。* unsigned char read_bit(void) unsigned char i;DQ = 0; /将DQ 拉低开始读时间隙DQ = 1; / then return highfor (i=0; i3; i+); / 延时15sreturn(DQ); / 返回 DQ 线上的电平值字节读取函数功能:从单总线读取一个字节的值unsigned char DSread_byte(void) unsigned char i;unsigned char value = 0;for (i=0;i8;i+) / 读取字节,每次读取一个字节if(read_bit() value|=0x01i; / 然后将其左移DS18_delay(6); return(value);读取温度函数功能:如果单总线节点上只有一个器件如此可以直接掉用本函数。如果节点上有多个器* 件,为了防止数据冲突,应使用Match ROM函数来选中特定器件。* 注: 本函数是根据DS1820的温度数据格式编写的,假如用于DS18B20,必须根据* DS18B20的温度数据格式作适当修改。unsigned int ReadTemperature(void) unsigned char get10;unsigned char temp_lsb,temp_msb;unsigned int t;unsigned char k;ow_reset();ds18write_byte(0xCC); / 跳过 ROMds18write_byte(0x44); / 启动温度转换DS18_delay(5);ow_reset();ds18write_byte(0xCC); / 跳过 ROMds18write_byte(0xBE); / 读暂存器for (k=0;k2;k+)getk=DSread_byte();temp_msb = get1; / Sign byte + lsbittemp_lsb = get0; / Temp data plus lsbt=temp_msb*256+temp_lsb;t=t&0x0ff0;if(t0xf0)t=(-1)*t;return t4;/temp_f = (int)temp_c)* 9)/5 + 32;4.2.3 DS1302局部程序void write_byte(uchar dat)/写一个字节ACC=dat;RST=1;for(a=8;a0;a-)IO=ACC0;SCLK=0;SCLK=1;ACC=ACC1;uchar read_byte()/读一个字节RST=1;for(a=8;a0;a-)ACC7=IO;SCLK=1;SCLK=0;ACC=ACC1;return (ACC);/-void write_1302(uchar add,uchar dat)/向1302芯片写函数,指定写入地址,数据RST=0;SCLK=0;RST=1;write_byte(add);write_byte(dat);SCLK=1;RST=0;uchar read_1302(uchar add)/从1302读数据函数,指定读取数据来源地址uchar temp;RST=0;SCLK=0;RST=1;write_byte(add);temp=read_byte();SCLK=1;RST=0;return(temp);uchar BCD_Decimal(uchar bcd)/BCD码转十进制函数,输入BCD,返回十进制 uchar Decimal; Decimal=bcd4; return(Decimal=Decimal*10+(bcd&=0x0F);/-void ds1302_init() /1302芯片初始化子函数(2010-01-07,12:00:00,week4)RST=0;SCLK=0;write_1302(0x8e,0x00); /允许写,禁止写保护 write_1302(0x8e,0x80); /打开写保护4.2.4 1602液晶显示局部程序 void write_temp(uchar add,uchar dat)/向LCD写温度数据,并指定显示位置uchar gw,sw;gw=dat%10;/取得个位数字sw=dat/10;/取得十位数字write_1602(er+add);/er是头文件规定的值0x80+0x40write_1602dat(0x30+sw);/数字+30得到该数字的LCD1602显示码write_1602dat(0x30+gw);/数字+30得到该数字的LCD1602显示码write_1602dat(0xdf);/显示温度的小圆圈符号,0xdf是液晶屏字符库的该符号地址码write_1602dat(0x43);/显示C符号,0x43是液晶屏字符库里大写C的地址码/时分秒显示子函数void write_sfm(uchar add,uchar dat)/向LCD写时分秒,有显示位置加、现示数据,两个参数uchar gw,sw;gw=dat%10;/取得个位数字sw=dat/10;/取得十位数字write_1602(er+add);/er是头文件规定的值0x80+0x40write_1602dat(0x30+sw);/数字+30得到该数字的LCD1602显示码write_1602dat(0x30+gw);/数字+30得到该数字的LCD1602显示码/年月日显示子函数void write_nyr(uchar add,uchar dat)/向LCD写年月日,有显示位置加数、显示数据,两个参数uchar gw,sw;gw=dat%10;/取得个位数字sw=dat/10;/取得十位数字write_1602(yh+add);/设定显示位置为第一个位置+addwrite_1602dat(0x30+sw);/数字+30得到该数字的LCD1602显示码write_1602dat(0x30+gw);/数字+30得到该数字的LCD1602显示码/-void write_week(uchar week)/写星期函数write_1602(yh+0x0c);/星期字符的显示位置switch(week)case 1:write_1602dat(M);/星期数为1时,显示 write_1602dat(O); write_1602dat(N); break;case 2:write_1602dat(T);/星期数据为2时显示 write_1602dat(U); write_1602dat(E); break;case 3:write_1602dat(W);/星期数据为3时显示 write_1602dat(E); write_1602dat(D); break;case 4:write_1602dat(T);/星期数据为4是显示 write_1602dat(H); write_1602dat(U); break;case 5:write_1602dat(F);/星期数据为5时显示 write_1602dat(R); write_1602dat(I); break;case 6:write_1602dat(S);/星期数据为6时显示 write_1602dat(T); write_1602dat(A); break;case 7:write_1602dat(S);/星期数据为7时显示 write_1602dat(U); write_1602dat(N); break;第五章总结本文在mini80E单片机开发系统的根底上,应用DS1302和DS18B20进展了电子万年历的设计,在设计中,采用了DS1302和DS18B20作为数据采集,采用单片机对信号进展处理,并通过1602液晶对信号进展了显示。电路硬件电路模块化设计,功能正确;软件局部采用了C语言编程,同样采用了模块化程序编写的理念,编写以与调用了大量的例子程序。电路软硬件实现功能良好。5.2 心得体会在本设计中我发现采用了学院的单片机开发板以与学院以与成型的滤波器电路、运算放大电路等开发典型电路板,设计开发的难度降低了很多。真的非常感谢这些根本的设计素材以与资料对自己毕业设计的帮助。在今后的工作中,将继续努力将自己的学习的知识应用到社会开展的各个方面来。参考文献1 樊明龙、任丽静. 单片机原理与应用. 化学工业出版.2005.03;2郭锁利,基于Multisim 9的电子系统设计 仿真与综合应用 人民邮政 20083X明莉,王斌,数字电子技术 机械工业 2009.06;4万新, 电力电子技术 化学工业 2009.05;5俞国亮, MCS-51单片机原理与应用 清华大学 2008.09;6陈国先,PIC单片机开发与应用 机械工业 2007.11;72004X大明. 单片微机控制应用技术. :机械工业. 2006.04;8X毅刚. 单片机原理与应用. :高等教育. 2006.11;9李维提、郭强.液晶显示应用技术.:电子工业.2003.12;10郭庭吉8051 单芯片微电脑专题制作台科大图. 2003.12;11谢自美. 电子线路设计.实验.测试M.某某:华中科技大学2005.11;12夏路易. 电路板原理图与电路板设计教程:希望电子.2002.06。致谢初定课题时自己也有些茫然,看到如此长的程序也有些担忧,害怕自己没能力弄懂,但是我很庆幸有这么多热心的教师,无论是我的毕业设计指导教师还是以前的任课教师,甚至是从未带过我们课的电子系教师,只要我有困难找到他们,他们总能帮我解决,并尽力让我真正弄明白。在本课题的整个研究设计过程中,得到了许多教师和同学的帮助,借此机会向他们一并表示诚挚的谢意。首先感谢我的指导教师孙建延教授。在整个的设计过程中,教师对我热心指导、严格要求,在选题、系统总体设计与技术方案上,给予宝贵的建议,提供了大量与设计相关的资料,帮助我建立了正确的
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划


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

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


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