版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 学号 201225110207中州大学毕业设计(论文)题 目 电子万年历的设计 学 院 工程技术学院 专 业 应用电子技术 年 级 12 班 级 2 学生姓名 xxx 指导教师 孙 建 延 职称 副教授 时 间 2014年12月4日 电子万年历的设计摘 要: 随着电子技术的迅速发展,特别是随着大规模集成电路的出现,给人类生活带来根本性的改变。尤其是单片机技术的应用产品已走进千家万户。电子万年历的出现给人们的生活带来了诸多方便。电子万年历是一种非常广泛的日常计时工具,在现代社会越来越流行。它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差
2、小。对于电子万年历采用直观的1602液晶显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。该电路采用AT89S52单片机作为核心,功耗小,能在3V的低压工作,电压可选用35V电压供电。在设计的同时对单片机的理论基础和外围扩展知识进行了比较全面准备。在硬件与软件设计时,没有良好的基础知识和实践经验会受到很大限制,每项功能实现时需要那种硬件,程序该如何编写,算法如何实现等,没有一定的基础就不可能很好的实现。在编写程序过程中发现以现有的相关知识要独自完成编写任务困难重重,在老师和同学的帮助下才完成了程序部分的编写。本万年历的设计采用 C语言,根据功能需求进行程序的编写
3、与调试,保证软硬件正常工作,具有结构简单,成本低廉,显示清晰,稳定可靠等优点。并且可进行扩充,加入闹钟的功能,更加方便于你使用。 关键词: 单片机 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 cha
4、nge. Especially the application of single chip microcomputer 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. I
5、t can be to year, month, day, Sunday, when the clock, minutes and seconds, also has a leap year compensation, 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
6、 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
7、 knowledge is compared 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 implementa
8、tion. 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
9、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目 录第一章 绪论61.1本课题的研究的背景以及现实意
10、义61.2本课题对于专业知识的综合应用情况61.3课题论述总体结构安排7第二章 电子万年历的工作概述以及原理分析82.1电子万年历的工作概述82.2确保电子万年历的工作性能稳定的相关措施82.3系统硬件电路总体结构框图82.4电子万年历总体电路原理图92.5各部分单元电路介绍92.5.1 DS18B20温度传感器电路介绍92.5.2 DS1302电路10单片机最小系统电路102.5.4 1602液晶显示电路11第三章 应用Protel实现电路原理图的绘制及PCB设计123.1Protel简介123.2绘制电路原理图的主要步骤123.3PCB人工布局、人工布线设计13第四章 电子万年历C程序的编
11、写与实现154.1程序流程框图154.2电子万年历C语言程序17键盘扫描部分程序174.2.2 DS18B20部分程序27 DS1302部分程序301602液晶显示部分程序32第五章 总结365.1设计功能分析365.2 心得体会36参考文献37致 谢38附录39第一章 绪论1.1本课题的研究的背景以及现实意义时钟在现实生活中占有非常重要作用,目前时钟的使用已经从原来单一的机械式计时工具发展为同时具有计时、时间调节、温度显示以及相关附加功能。针对这样的发展实际情况,在完成学院的毕业设计工作中,我决定采用所学习的单片机知识以及相关的电路知识来进行电子万年历的设计。目前市场上电子万年历的发展,其功
12、能也逐渐从单一的计时发展到事迹、日期、温度显示,甚至有的还具有闹钟、问候语显示等功能,让人能清楚地知道当前的日期、时间、温度等物理量。所以本课题的研究具有一定的现实应用意义。1.2本课题对于专业知识的综合应用情况因为学习的知识深度的限制以及实际情况的考虑,我设计的电子万年历的功能确定为能够正确显示日期、时间、温度。显示的方式采用ATMEL公司AT89S51单片机为驱动1602LCD显示器进行显示。采用TB上购买的mini80E单片机开发电路板作为电路实现的主要功能载体。在学院三年的单片机学习过程中,我们学习单片机都是采用TB上买的单片机开发板以及C语言进行学习,TB的51单片机开发板在单片机最
13、小系统的基础上配置了数码管显示、LCD显示区、LCD显示区、独立键盘输入区以及模拟量输入、A/D转换等资源,满足了单片机实际开发的绝大部分要求。同时开发板上的电路结构也能够较好地锻炼自己电路方面的知识。采用C语言进行编程能够综合锻炼自己的实际程序编写的能力以及程序的调试功能。本课题的选题难度适中,能够对应用电子技术专业学习的专业课程有较为全面的应用与掌握,同时也与自己的专业能力符合。1.3课题论述总体结构安排第一章叙述了电子万年历研究的背景以及现实意义第二章则主要介绍设计工作总体概述以及产品工作的原理,按照功能电路的分别进行详细的分析讨论,最终分析电路的总体工作原理。第三章主要讨论应用Prot
14、el软件来实现电路原理图的绘制以及印制板设计第四章是电子万年历的软件实现部分,主要是利用C语言进行程序的编写,完成电路的测量功能。第五章为总结和展望,总结本课题设计的总体思路,产品的功能以及对于产品功能升级等进行情景展望。第二章 电子万年历的工作概述以及原理分析2.1电子万年历的工作概述电子万年历是由数据采集,MCU,输入输出,数据存储四个功能部分构成。其中数据的采集是由DS1302和DS18B20来完成的,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高。数字式温度传感器DS18B20,仅需要一条数据线进行数据传输,易于与单片机连
15、接,可以去除A/D模块,降低硬件成本,简化系统电路。当数据送入AT89S51单片机后,单片机将对INT1脚的信号进行计数,当计数的脉冲达到1KM的时候,INT1申请中断,对外输出信号,输出的信号由显示部分送LCD进行显示,显示当前日期、时间、温度。其中键盘是人机交互的接口,系统设计使得键盘能够实现调节日期、时间的功能。2.2确保电子万年历的工作性能稳定的相关措施电子万年历能实时地将所测的温度和当前时间显示出来,主要是DS1302通过串行口与单片机进行通讯,实时时钟/日历电路提供秒、分、时、日、星期、月、年的信息。每个月的天数和闰年的天数可与自动调整,时钟操作可以通过AM/PM标志位决定采用24
16、或12小时时间格式。DS1302与单片机之间能采用简单的同步串行进行通信仅需三根I/O线。DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。其测温范围 55+125,固有测温分辨率0.5。设计应综合考虑测温精度和系统反应时间。本设计采用9位的分辨率,因而具有较高的快的计算速度。在计算环境温度的时候省去了末尾几位。为了保证系统的实时性,系统的速度转换模块和显示数据转BCD码模块都采用快速算法。另外,还应尽量保证其他子模块在编程时的通用性和高效性。本设计的里程值采用两位显示。AT89S52主控制模 块2.3系统硬件电路总体结构框图LED数码管动态扫描显示模块
17、DS1302时钟模块温度采集模块键盘模块图2-1电子万年历总体结构框图2.4电子万年历总体电路原理图电子万年历总体电路原理图由DS1302和DS18B20电路以及单片机开发板电路三部分组成。图2-2为电路总原理图之一,单片机开发板电路的电路原理图。图2-2电子万年历电2.5各部分单元电路介绍2.5.1 DS18B20温度传感器电路介绍 DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一
18、次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。DS18B20温度传感器电路图如图2-4所示 图2-4 基于运放的有源滤波器电路图2.5.2 DS1302电路DS1302采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。DS1302电路原理图
19、如图2-5所示图2-5 基于运放的信号放大电路2.5.3单片机最小系统电路单片机最小系统电路由单片机、单片机复位电路、晶体振荡回路组成,能够完成单片机工作的最基本需要,单片机最小系统电路如图2-6所示图2-6 单片机最小系统电路2.5.4 1602液晶显示电路单片机将计算处理的结果采用1602液晶进行显示,显示电路的电路原理图如图2-7所示图 2-7 1602液晶显示电路第三章 应用Protel实现电路原理图的绘制及PCB设计3.1Protel简介使用电脑设计电路原理图和电路板图是把电子技术从理论运用到实际的第一步。只有会设计电路原理图和电路板图才能进行电子产品的研发与开发。本软件就是从理论走
20、向实际,掌握电子产品开发的基本技术。Protel99SE是澳大利亚ProtelTechnology公司推出的一个全32位的电路板设计软件。该软件功能强大,人机界面友好,易学易用,使用该软件设计者可以容易设计电路原理图、画元件图、设计电路板图、画元件封装图和电路仿真,是夜内人士首选的电路板设计工具。3.2绘制电路原理图的主要步骤1、进入Protel 99SE环境2、使用菜单File/New建立新设计数据库文件3、使用菜单File/New在打开窗口选择Schematic Document图标,建立新原理图文件4、将原理图打开5、设置画图环境6、添加元件库7、将所需元件从元件库中取出来,放置在图纸上
21、,并且调整好位置8、使用连线工具将元件连起来,设置元件属性,对元件进行编号9、进行电气规格检查(ERC)10、建立网络表,为制作电路板图做准备3.3PCB人工布局、人工布线设计人工布局就是将所有的元件一个一个放置到PCB上各个位置。操作较为繁琐,但是能够结合工艺的要求以及设计中实际要求进行,人工布局的效果一般来说效果要比自动布局好很多。在设计中,工程师基本都是采用自动布局的方案进行。这也要求作为电路板设计人员要具有丰富的经验以及长时间坚持的毅力。元件的布局与走线对产品的寿命、稳定性、电磁兼容都有很大的影响,是应该特别注意的地方。一般来说应该有以下一些原则:在放置顺序上应该先放置与结构有关的固定
22、位置的元器件,如电源插座、指示灯、开关、连接件之类,这些器件放置好后用软件的LOCK功能将其锁定,使之以后不会被误移动。再放置线路上的特殊元件和大的元器件,如发热元件、变压器、IC等。最后放置小器件。元件布局还要特别注意散热问题。对于大功率电路,应该将那些发热元件如功率管、变压器等尽量靠边分散布局放置,便于热量散发,不要集中在一个地方,也不要高电容太近以免使电解液过早老化。 布线原则,每人都会有自己的体会,但还是有些通行的原则的。高频数字电路走线细一些、短一些好,大电流信号、高电压信号与小信号之间应该注意隔离(隔离距离与要承受的耐压有关,通常情况下在2kv时板上要距离2mm,在此之上以比例算还
23、要加大,例如若要承受3KV的耐压测试,则高低压线路之间的距离应在3.5mm以上,许多情况下为避免爬电,还在印制线路板上的高低压之间开槽。),两面板布线时,两面的导线宜相互垂直、斜交、或弯曲走线,避免相互平行,以减小寄生耦合;作为电路的输人及输出用的印制导线应尽量避兔相邻平行,以免发生回授,在这些导线之间最好加接地线。走线拐角尽可能大于90度,杜绝90度以下的拐角,也尽量少用90度拐角同是地址线或者数据线,走线长度差异不要太大,否则短线部分要人为走弯线作补偿。走线尽量走在焊接面,特别是通孔工艺的PCB,尽量少用过孔、跳线,单面板焊盘必须要大,焊盘相连的线一定要粗,能放泪滴就放泪滴,一般的单面板厂
24、家质量不会很好,否则对焊接和RE-WORK都会有问题,大面积敷铜要用网格状的,以防止波焊时板子产生气泡和因为热应力作用而弯曲,但在特殊场合下要考虑GND的流向,大小,不能简单的用铜箔填充了事,而是需要去走线,元器件和走线不能太靠边放,一般的单面板多为纸质板,受力后容易断裂,如果在边缘连线或放元器件就会受到影响;必须考虑生产、调试、维修的方便性;模拟电路来说处理地的问题是很重要的,地上产生的噪声往往不便预料,可是一旦产生将会带来极大的麻烦,应该未雨绸缎。对于功放电路,极微小的地噪声都会因为后级的放大对音质产生明显的影响;在高精度A/D转换电路中,如果地线上有高频分量存在将会产生一定的温漂,影响放
25、大器的工作。这时可以在板子的4角加退藕电容,一脚和板子上的地连,一脚连到安装孔上去(通过螺钉和机壳连),这样可将此分量虑去,放大器及AD也就稳定了。另外,电磁兼容问题在目前人们对环保产品倍加关注的情况下显得更加重要了。一般来说电磁信号的来源有3个:信号源,辐射,传输线。晶振是常见的一种高频信号源,在功率谱上晶振的各次谐波能量值会明显高出平均值。可行的做法是控制信号的幅度,晶振外壳接地,对干扰信号进行屏蔽,采用特殊的滤波电路及器件等。第四章 电子万年历C程序的编写与实现4.1程序流程框图开始初始化读、写日期、时间和温度分离日期时间温度显示值显示子程序农历自动更新子程序日期、时间修改子程序闰月子程
26、返回定时闹铃子程序 图-A 主程序流程图 图-B计算阳历程序流程图 图-C 时间调整程序流程图 图-D 阴历程序流程图4.2电子万年历C语言程序4.2.1键盘扫描部分程序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
27、;write_1602com(er+0x09);/设置按键按动一次,秒位置显示光标 write_1602com(0x0f);/设置光标为闪烁 temp=(miao)/10*16+(miao)%10;/秒数据写入DS1302 write_1302(0x8e,0x00); write_1302(0x80,0x80|temp);/miao write_1302(0x8e,0x80); break;case 2: write_1602com(er+6);/按2次fen位置显示光标 /write_1602com(0x0f);break;case 3: write_1602com(er+3);/按动3次,
28、shi /write_1602com(0x0f);break;case 4: write_1602com(yh+0x0e);/按动4次,week /write_1602com(0x0f); break;case 5: write_1602com(yh+0x0a);/按动5次,ri /write_1602com(0x0f); break;case 6: write_1602com(yh+0x07);/按动6次,yue /write_1602com(0x0f); break;case 7: write_1602com(yh+0x04);/按动7次,nian /write_1602com(0x0f)
29、; break;case 8:write_1602com(0x0c);/按动到第8次,设置光标不闪烁TR0=1;/打开定时器 temp=(miao)/10*16+(miao)%10; write_1302(0x8e,0x00); write_1302(0x80,0x00|temp);/miao数据写入DS1302 write_1302(0x8e,0x80); break; /-加键key2- if(key1n!=0)/当key1按下以下。再按以下键才有效(按键次数不等于零) if(key2=0) /上调键 delay(10); if(key2=0) buzzer=0;/蜂鸣器短响一次 dela
30、y(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
31、(0x8e,0x80); /打开写保护write_1602com(er+0x09);/因为设置液晶的模式是写入数据后,光标自动右移,所以要指定返回/write_1602com(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
32、写入调整后的分数据BCD码 write_1302(0x8e,0x80);/打开写保护write_1602com(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内写小时寄存器8
33、4H写入调整后的小时数据BCD码 write_1302(0x8e,0x80);/打开写保护write_1602com(er+3);/因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位break;case 4:week+;if(week=8)week=1; write_1602com(yh+0x0C);/指定'加'后的周数据显示位置write_week(week);/指定周数据显示内容 temp=(week)/10*16+(week)%10;/十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);/允许写,禁止写保护 write_1302
34、(0x8a,temp);/向DS1302内写周寄存器8aH写入调整后的周数据BCD码 write_1302(0x8e,0x80);/打开写保护 write_1602com(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(0x8
35、6,temp);/向DS1302内写日期寄存器86H写入调整后的日期数据BCD码 write_1302(0x8e,0x80);/打开写保护write_1602com(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(0x
36、88,temp);/向DS1302内写月份寄存器88H写入调整后的月份数据BCD码 write_1302(0x8e,0x80);/打开写保护write_1602com(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
37、_1302(0x8c,temp);/向DS1302内写年份寄存器8cH写入调整后的年份数据BCD码 write_1302(0x8e,0x80);/打开写保护 write_1602com(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
38、=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_1602com(er+0x09);/因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置/write_1602com(0
39、x0b);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_1602com(er+6);/因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置break;case 3:shi-; if(shi=-
40、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_1602com(er+3);/因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位break;case 4:week-;if(week=0)week=7; write_1602com(yh+0x0C)
41、;/指定'加'后的周数据显示位置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_1602com(yh+0x0e);/因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位break;case 5:ri-;if(ri=0)ri=31;
42、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_1602com(yh+10);/因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位break;case 6:yue-;if(yue=0)yue=12;write_nyr(6,yue);temp=(yue)/10*16+(yu
43、e)%10;/十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);/允许写,禁止写保护write_1302(0x88,temp);/向DS1302内写月份寄存器88H写入调整后的月份数据BCD码 write_1302(0x8e,0x80);/打开写保护 write_1602com(yh+7);/因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位break;case 7:nian-; if(nian=-1)nian=99;write_nyr(3,nian); temp=(nian)/10*16+(nian)%10;/十进制转换成DS1302要求的DCB
44、码 write_1302(0x8e,0x00);/允许写,禁止写保护write_1302(0x8c,temp);/向DS1302内写年份寄存器8cH写入调整后的年份数据BCD码 write_1302(0x8e,0x80);/打开写保护write_1602com(yh+4);/因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位break; 4.2.2 DS18B20部分程序void DS18_delay(int useconds) int s;for (s=0; s<useconds;s+); 复位函数功能:完成单总线的复位操作。复位时间为480s,因此延时时间为(480-24
45、)/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 = 无器件位写入函数功能:向单总线
46、写入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; i<8; i+) / 写入字节, 每次
47、写入一位 temp = val>>i; 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; i<3; i+); / 延时15sreturn(DQ); / 返回 DQ 线上的电
48、平值字节读取函数功能:从单总线读取一个字节的值unsigned char DSread_byte(void) unsigned char i;unsigned char value = 0;for (i=0;i<8;i+) / 读取字节,每次读取一个字节if(read_bit() value|=0x01<<i; / 然后将其左移DS18_delay(6); return(value);读取温度函数功能:如果单总线节点上只有一个器件则可以直接掉用本函数。如果节点上有多个器* 件,为了避免数据冲突,应使用Match ROM函数来选中特定器件。* 注: 本函数是根据DS1820的温
49、度数据格式编写的,若用于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_
50、byte(0xBE); / 读暂存器for (k=0;k<2;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(t<0xff&&t>0xf0)t=(-1)*t;return t>>4;/temp_f = (int)temp_c)* 9)/5 + 32;4.2.3 DS1302部分程序 void write_byte(uchar dat)/写一个字节ACC=dat;RST=1;for(a=8;a>0;a-)IO=ACC0;SCLK=0;SCLK=1;ACC=ACC>>1;uchar read_byte()/读一个字节RST=1;for(a=8;a>0;a-)ACC7=IO;SCLK=1;SCLK=0;ACC=ACC>>1;return (ACC);/-void write_1302(uchar
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 关于实习劳动合同协议书
- 劳务合同的个税起征点
- 2024合同情况说明(报建筑)
- 2024杂志广告夹页合同范文
- 格力中央空调销售合同模板
- 外包安全合同范本共
- 2024工程劳务施工合同范本
- 墙地砖铺贴施工合同
- 2024年度吊车租赁合同:物流搬运服务3篇
- 返聘劳动合同范本
- GB/T 17215.301-2024电测量设备(交流)特殊要求第1部分:多功能电能表
- 19物质结构式元素推断解题模型(原卷版+解析)
- (正式版)HGT 20593-2024 钢制化工设备焊接与检验工程技术规范
- 遇事如何不推诿培训课件
- 肿瘤病人临终关怀护理
- 网格员工作汇报 (第二稿)
- 国家治理现代化的理论框架及其构建
- 2024年保密法培训课件
- 应用心理学博士研究计划书
- 汶川大地震地震报告
- 骨科护士专科知识培训课件
评论
0/150
提交评论