版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
-PAGE5-基于51单片机的万年历设计摘要近些年,随着科技的发展和社会的进步,多功能数字钟不管在性能还是在样式都发生了质的变化,有电子闹钟、数字闹钟等等。由于数字集成电路的发展,使得数字钟的精度、稳定性大幅提高。本文介绍了基于STC89C51单片机的多功能电子万年历的硬件结构和软硬件设计方法。本设计由数据显示模块、温度采集模块、时间处理模块和调整设置模块四个模块组成。系统以STC89C51单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能。温度采集选用DS18B20芯片,万年历采用直观的数字显示,数据显示采用1602A液晶显示模块,可以在LCD上同时显示年、月、日、周日、时、分、秒,还具有时间校准等功能。此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,具有广阔的市场前景。关键词 :万年历STC89C51单片机数字电路1602A液晶显示器目录 TOC\o"2-3"\h\z\t"标题1,1"摘要 IAbstract II目录 III前言 11 绪论 21.1 课题研究的背景 31.2 课题解决的主要内容 32 系统的方案设计与论证 52.1 单片机芯片设计与论证 52.2 按键控制模块设计与论证 62.3 时钟模块设计与论证 62.4 温度采集模块设计与论证 62.5 显示模块模块设计与论证 73 系统的硬件设计 83.1 STC89C51单片机 83.1.1 STC89C51单片机的发展史 83.1.2 STC89C51单片机内部结构 93.2 时钟芯片DS1302设计 133.2.1 DS1302性能简介 133.2.2 DS1302接口电路设计 143.3 温度芯片DS18B20接口设计与性能分析 153.3.1 DS18B20性能简介 153.3.2 DS18B20接口电路设计 163.4 按键模块设计 163.5 复位电路的设计 173.6 闹钟电路设计 184 系统的软件设计 204.1 主程序流程图的设计 204.2 用Keil进行程序设计 214.2.1 Keil软件简介 214.2.2 Keil软件调试功能 224.2.3 DS1302读写程序设计 234.2.4 温度程序设计 255 系统的总体设计效果 275.1 系统的模块组成 275.2 原理图设计 275.3 实物仿真运行 285.3.1 实物操作设计 285.3.2 万年历使用说明 30总结 32参考文献 33附件1系统原理图 35附件2系统主程序 36前言时间的流逝,从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。时间是人类生活必不可少的重要元素,如果没有时间的概念,社会将不会有所发展和进步。从古代的水漏、天干地支,到后来的机械钟表以及当今的石英钟,都充分显现出了时间的重要,同时也代表着科技的进步。致力于万年历的研究和充分发挥时钟的作用,将有着重要的意义。想知道时间,手表当然是一个很好的选择,但是,在忙碌当中,我们还需要个“助理”及时的给我们提醒时间。所以,计时器最好能够拥有个定时系统,随时提醒容易忘记时间的人。最早能够定时、报时的时钟属于机械式钟农,但这种时钟受到机械结构、动力和体积的限制,在功能、性能以及造价上都没办法与电子时钟相比。20世纪末,电子技术获得了飞速的发展。在其推动下,现代电子产品几乎渗透到了社会的各个领域,有力的推动和提高了社会生产力的发展和信息化程度,同时也使现代电子产品性能进步提升,产品更新换代的节奏也越来越快。对于单片机的应用也备受关注,目前,单片机技术的应用产品已经走进了千家万户,成为我们生活中不可或缺的一部分。电子万年历是采用电子电路实现对时、分、秒进行数字显示的计时装置,广泛应用于个人家庭、车站、码头办公室等公共场所,成为人们日常生活中不可少的必须品。由于数字集,成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟.表原先的报时功能。诸如定时报警、按时自动打铃、定时广播、自动启闭灯箱、通断动力设备、甚至各种定时电气的自动启动等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。绪论根据具体的实际要求,我进行了合理的整理安排,REF_Ref70599451\h表11为我的设计的工作情况安排。表STYLEREF1\s1.SEQ表格\*ARABIC\s11工作安排表项目调查,资料查找制作原理图,模拟仿真Proteus,程序整理,文档制作元件清单整理、采购,设计pcb,温度、显示程序整理焊接,电路调试,按键、时钟程序整理在整个万年历设计过程中,主要分为硬件设计和软件设计两大模块。在硬件方面主要设计了STC89C51单片机系统、温度芯片DS18B20电路、时钟芯片DS1302电路、蜂鸣器定时闹钟电路及液晶LCD显示屏;在软件方面主要设计了阳历阴历变化程序、外界温度采集程序、时钟闹铃程序以及LCD显示程序;系统的调试主要是通过一块AT89C51开发板,再借助于Keil、STC以及少许自己搭建的外围电路实现的;再此过程中,分步调试时显示出了阳历的日期及时间,还有实时温度,集中调试时没有达到预期效果。此万年历具有读显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。通过这次的的设计,也让我明白了自身的许多不足之处。同时也学到了许多自己没有接触的知识,也涉足了没有接触过的领域,提高了自己的学习能力。在设计过程中也遇到了前所未有的麻烦和挑战,其主要是在电路的设计布局和软件编程过程中;在电路布局中,工作量大,走线繁琐,我们首先要做的是先分析电路组成,对布局有个好的构思,根据不同的实现功能将其分割出成每一小块,将每一部分完成后在形成整体,从而达到由点到线,由线到面的组成。对于软件编程的重难部分,我们更加不能心急,要完全理清思路,弄懂控制原理,通过对部分的控制来实现整体的控制;因此在设计中我们不能急于求成,不然就会出现大问题,最终导致设计的失败。总之,通过这次设计也学到了许多的知识,也将自己在大学学到的专业知识结合起来,做到了学以致用,整体提高了自己专业水平,这才是难能可贵的,也为我以后更好的发张打下了坚实的基础。课题研究的背景随着科技的快速发展,时间的流逝,从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息的功能,在时间模块还能自动进行时间校准。该设计采用STC89C51单片机作为核心运行部分,又通过温度传感器、时钟电路加以辅助,完成整体的布局设计。同时在设计中将能源、材料的问题也考虑其中。万年历拥有结构简单、操作方便、价格便宜等许多优点,它的出现给人们生产生活带来了极大的方便,成为人们日常生活中不可少的必须品。二十一世纪是数字化技术高速发展的时代,而单片机在数字化高速发展的时代扮演着极为重要的角色。电子万年历的开发与研究在信息化时代的今天亦是当务之急,因为它应用在学校、商场、电子产品、机关部门、公共场地等场合,可以说遍及人们生活的每一个角落。所以说电子万年历的开发是国家之所需,社会之所需,人民之所需。课题解决的主要内容本课题主要研究基于单片机的万年历设计。当程序执行后,LCD显示时间、年、月、日、星期、温度。内容包括以下几个方面:了解单片机的发展技术,熟悉万年历各模块的工作原理。分析整个电路设计,设计好万年历的逻辑原理图。分析整个电路设计,设计好万年历的逻辑原理图。分析整个电路设计,设计好万年历的逻辑原理图。选择适当的芯片和元器件,分析并确定系统电路,绘制电路原理图,特别各接口电路。电子万年历芯片系列的选取,通过对结构、功能、价格方面的比较,最终确定选取C51系列单片机芯片。设计外部电路,主要包括对时钟电路、报警电路、显示电路等接口电路的设计。了解单片机构成,熟悉其工作原理和使用方法。学习C语言程序编程的规则规则,编写出相应模块的应用程序,分别调试各模块的程序,使其能成功运行。根据硬件电路图,再将写好的各模块程序设计写入到Proteus软件中进行仿真。仿真完成后,再根据硬件电路图,在开发板上完成器件的组装和焊接。通过编程、编译、调试,把程序下载到单片机上运行,并实现本设计的功能。系统的方案设计与论证单片机电子万年历的制作有多种方法,可供选择的器件和运用的技术也有很多种。所以,系统的总体设计方案应在满足系统功能的前提下,充分考虑系统使用的环境,所选的结构要简单使用、易于实现,器件的选用着眼于合适的参数、稳定的性能、较低的功耗以及低廉的成本。按照系统设计的要求,初步确定系统由电源模块、时钟模块、显示模块、键盘接口模块、温度测量模块和闹钟模块共六个模块组成,电路系统构成框图如REF_Ref71528842\h图2.1所示:图STYLEREF1\s2.SEQ图\*ARABIC\s11电路系统结构框图单片机芯片设计与论证方案一:采用51系列单片机作为系统控制器,51系列单片机拥有高性能低价格
体积小,可靠性高,
低功耗,工作在5V低电压等许多优良的特性,从内部的硬件到软件有一套完整的按位操作系统,称作位处理器,处理对象不是字或字节而是位。不但能对片内某些特殊功能寄存器的某位进行处理,还能进行位的逻辑运算,其功能十分完备,使用起来得心应手。同时在片内RAM区间还特别开辟了一个双重功能的地址区间,使用极为灵活。方案二:采用凌阳系列单片机作为系统的控制器,凌阳系列单片机可以实现各种复杂的逻辑功能,它的功能强、效率高的指令系统,执行迅速,并且其指令结构提供了对高级语言的支持;低功耗、低电压,μ’nSPTM指令系统采用CMOS制造工艺,同时增加了软件激发的弱振方式,空闲方式和掉电方式,极大地降低了其功耗,另外,μ’nSPTM系统的工作电压范围大,能在低电压供电时正常工作,且能用电池供电;凌阳系列单片机大大的提高了系统的处理速度,适合作为大规模实时系统的控制核。综合两种方案的比较,因51单片机价格比凌阳系列低得多,且本设计不需要很高的处理速度,从经济和方便使用角度考虑,本设计选择了方案1。按键控制模块设计与论证方案一:采用矩阵键盘,由于按键多可实现数值的直接键入,但在系统中需要CPU不间断的对其端口扫描。方案二:采用独立按键,查询简单,程序处理简单,可节省CPU资源。因系统中所需按键不多,为了释放更多的CPU占有时间,操作方便,故采用方案二。时钟模块设计与论证方案一:直接通过单片机内部的计数器来提供时钟信号,再对年、月、日、星期、时、分、秒程序编写,用程序来达到对时间的控制方式来计数,采用此种方案可以将结构简单化,减少芯片的使用,节约成本,但是,显示的时间精确度不够,误差较大。方案二:DS1302为计时时钟芯片,计数时间精度高,可以用于数据记录,特别是对某些具有特殊意义的数据点的记录,能实现数据与出现该数据的时间同时记录。这种记录对长时间的连续测控系统结果的分析及对异常数据出现的原因的查找具有重要意义。传统的数据记录方式是隔时采样或定时采样,没有具体的时间记录,因此,只能记录数据而无法准确记录其出现的时间;若采用单片机计时,一方面需要采用计数器,占用硬件资源,另一方面需要设置中断、查询等,同样耗费单片机的资源,而且,某些测控系统可能不允许。方案三:采用DS12C887为计时时钟芯片,该芯片与单片机采用8位并口通信,,可计算七种日历信息并带有闰年补偿功能,自带有晶体振荡器和锂电池,在没有外部电源的情况下可以工作十年,对于一天的时间记录,有12小时制和24小时制两种模式,还拥有定闹中断、时钟更新结束中断、周期性中断三种可编程中断设置。通过对三种不同的时钟计数在时间精度、结构功能全面性和经济价格方面的比较,最终选用DS1302时钟芯片为本设计时钟模块,故采用方案二。温度采集模块设计与论证这里采用数字式温度传感器DS18B20,开始供电时,数字温度传感器处于能量关闭状态,供电之后用户通过改变寄存器分辨率使其处于连续转换温度模式或者单一转换模式。在连续转换模式下,数字温度传感器连续转换温度并将结果存于温度寄存器中,读温度寄存器中的内容不影响其温度转换;在单一转换模式,数字温度传感器执行一次温度转换,结果存于温度寄存器中,然后回到关闭模式,这种转换模式适用于对温度敏感的应用场合。在应用中,用户可以通过程序设置分辨率寄存器来实现不同的温度分辨率,其分辨率有8位、9位、10位、11位或12位五种,对应温度分辨率分别为1.0℃、0.5℃、0.25℃、0.125℃或0.0625℃,温度转换结果的默认分辨率为9位。显示模块模块设计与论证方案一:采用静态显示方法,静态显示模块的硬件制作较复杂及功耗大,要用到多个移位寄存器,但不占用端口,只需两根串口线输出。方案二:采用动态显示方法,动态显示模块的硬件制作简单,段扫描和位扫描各占用一个端口,总需占用单片机14个端口,采用间断扫描法功耗小、硬件成本低及整个硬件系统体积相对减小。方案三:采用LCD的方法,具有硬件制作简单可直接与单片机接口,显示内容多,功耗小,成本低等优点,LCM1602可显示32个字符,采用LCD的缺点是亮度不够。系统的硬件设计根据上述所确定的系统方案构想,下面进行系统硬件电路的具体设计,系统的具体设计在下面会详细介绍。STC89C51单片机STC89C51单片机的发展史单片机(Single-Chip
Microcomputer)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。单片机的发展先后经历了4位、8位、16位和32位等阶段。8位单片机由于功能强,被广泛用于工业控制、智能接口、仪器仪表等各个领域,8位单片机在中、小规模应用场合仍占主流地位,代表了单片机的发展方向,在单片机应用领域发挥着越来越大的作用。1970
年微型计算机研制成功后,随后就出现了单片机。美国Inter
公司在1971
年推出了4
位单片机4004;1972
年推出了雏形8
位单片机8008。特别是在1976
年推出MCS-48
单片机以后的三十年中,单片机的发展和其相关的技术经历了数次的更新换代。其发展速度大约每三四年要更新一代、集成度增加一倍、功能翻一番。尽管单片机出现的历史并不长,但以8
位单片机的推出为起点,那么,单片机的发展大致可分为四个阶段。第一阶段(1976
年-1978
年):初级单片机阶段。以Inter
公司MCS-48
为代表。这个系列的单片机内集成有8
位CPU、I/O
接口、8
位定时器/计数器,寻址范围不大于4K
字节,简单的中断功能,无串行接口。第二阶段(1978
年-1982
年):单片机完善阶段。在这一阶段推出的单片机其功能有较大的加强,能够应用于更多的场合。这个阶段的单片机普遍带有串行I/O
口、有多级中断处理系统、16
位定时器/计数器,片内集成的RAM、ROM
容量加大,寻址范围可达64K
字节。一些单片机片内还集成了A/D
转换接口。这类单片机的典型代表有Inter
公司的MCS-51、Motorola
公司的6801
和Zilog
公司的Z8
等。第三阶段(1982
年-1992
年):8
位单片机巩固发展及16
位高级单片机发展阶段。在此阶段,尽管8
位单片机的应用已广泛普及,但为了更好满足测控系统的嵌入式应用的求,单片机集成的外围接口电路有了更大的扩充。这个阶段单片机的代表为8051
系列。许多半导体公司和生产厂以MCS-51
的8051
为内核,推出了满足各种嵌入式应用的多种类型和型号的单片机。其主要技术发展有:(1)外围功能集成。满足模拟量直接输入的ADC
接口;满足伺服驱动输出的PWM;保证程序可靠运行的程序监控定时器WDT(俗称看门狗电路)。(2)出现了为满足串行外围扩展要求的串行扩展总线和接口,如SPI、I
2
C
Bus、单总线(1-Wire)等。(3)出现了为满足分布式系统,突出控制功能的现场总线接口,如CAN
Bus
等。(4)在程序存储器方面广泛使用了片内程序存储器技术,出现了片内集成EPROM、EEPROM、FlashROM
以及MaskROM、OTPROM
等各种类型的单片机,以满足不同产品的开发和生产的需要,也为最终取消外部程序存储器扩展奠定了良好的基础。与此同时,一些公司面向更高层次的应用,发展推出了16
位的单片机,典型代表有Inter
公司的MCS-96
系列的单片机。第四阶段(1993
年-现在):百花齐放阶段。现阶段单片机发展的显著特点是百花齐放、的应用是面对最底层的电子技术应用,从简单的玩具、小家电;到复杂的工业控制系统、智能仪表、电器控制;以及发展到机器人、个人通信信息终端、机顶盒等。因此,面对不同的应用对象,不断推出适合不同领域要求的,从简易性能到多全功能发展。STC89C51单片机内部结构图STYLEREF1\s3.SEQ图\*ARABIC\s11STC89C51单片机单片机是把微型计算机的主要组成部分CPU、存储器、输入/输出接口等集成在一块超大规模集成电路芯片上。
它是由CPU系统、程序存储器、数据存储器、各种I/O端口、基本功能单元(定时器/计数器等)组成。
1.CPU系统:CPU系统包括有CPU、时钟系统、复位、总线(BUS,即信号的公共通道)控制逻辑。
(1)CPU单片机中的CPU与微型计算机中的CPU有所不同,它的特点是,面向控制、面向嵌入系统、面向单芯片化。
(2)时钟系统时钟系统用于产生单片机工作所需的时钟信号。它必须满足CPU及单片机内各单元电路对时钟的要求。时钟振荡器的工作频率一般在1.2~12MHz。
(3)复位电路复位电路应满足上电复位、信号控制复位的要求。(4)总线控制逻辑,总线控制逻辑应满足CPU对内部总线和外部总线的控制要求。2.程序存储器程序存:储器是一种只读存储器ROM(Read
Only
Memory),用它来固化单片机的应用程序和一些表格常数。单片机生产厂家按单片机内部程序存储器的不同结构,形成单片机的不同结构类型,计有:Mask
ROM型
、EPROM型
、ROM
less型
、OTP
ROM
、Flash
ROM(MTP
ROM)型前三种程序存储器的单片机是早期的产品,目前EPROM、ROM
Less型已较少使用。3.数据存储器RAM:RAM是一种可读写的存储器,也叫随机存储器。单片机内部的RAM除了作为工作寄存器、位标志和堆栈区以外的单元都可以作为数据缓冲器使用,存放输入的数据或运算的结果。
由于单片机主要是面向测控系统,所以单片机内部的数据存储器容量较小,通常不多于256字节,而且都使用静态随机存储器SRAM。
4.各种I/O端口:I/O端口是计算机的输入、输出接口(T是输入,O是输出之意)。单片机中的I/O端口都是芯片的辅入/输出引脚。这些I/O端口,可分为以下几种类型:
(1)总线输入/输出端口
(2)用户I/O端口。由用户用于外部电路的输入/输出控制。
(3)单片机内部功能的输入/输出端口。例如,定时器/计数器的计数辅入、外部中断源辅入等。为减少单片机引脚数量,一般I/O口都有复式功能。例如不使用外部总线时,总线端口可出让给用户做辅入/辅出端口用。从I/O口的结构上还可以分为并行I/O口,即多位数据一起输出或输入,这种形式传送数据速度快但使用的引脚多。另—种I/O口称为串行I/O口,即传送数据是顺序输出或输入,这种形式可大大减少I/O口的引脚数,但传送数据较慢。
5.基本功能单元:基本功能单元是为满足单片机测控功能而设置的一些电路,是用来完善和扩大计算机功能的一些基本电路,如定时器/计数器,中断系统等。定时器/计数器在实际应用中作用非常大,如精确的定时,或者对外部事件进行计数等。6.WDT:
中文名看门狗。是一个定时器电路,一般有一个输入,叫喂狗,一个输出到MCU的RST端,MCU正常工作的时候,每隔一段时间输出一个信号到喂狗端,给
WDT
清零,如果超过规定的时间不喂狗,(一般在程序跑飞时),WDT
定时超过,就会给出一个复位信号到MCU,使MCU复位.
防止MCU死机.
看门狗的作用就是防止程序发生死循环,或者说程序跑飞。
工作原理:在系统运行以后也就启动了看门狗的计数器,看门狗就开始自动计数,如果到了一定的时间还不去清看门狗,那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。所以在使用有看门狗的芯片时要注意清看门狗。
硬件看门狗是利用了一个定时器,来监控主程序的运行,也就是说在主程序的运行过程中,我们要在定时时间到之前对定时器进行复位如果出现死循环,或者说PC指针不能回来。那么定时时间到后就会使单片机复位。软件看门狗技术的原理和这差不多,只不过是用软件的方法实现,我们还是以51系列来讲,我们知道在51单片机中有两个定时器,我们就可以用这两个定时器来对主程序的运行进行监控。我们可以对T0设定一定的定时时间,当产生定时中断的时候对一个变量进行赋值,而这个变量在主程序运行的开始已经有了一个初值,在这里我们要设定的定时值要小于主程序的运行时间,这样在主程序的尾部对变量的值进行判断,如果值发生了预期的变化,就说明T0中断正常,如果没有发生变化则使程序复位。对于T1我们用来监控主程序的运行,我们给T1设定一定的定时时间,在主程序中对其进行复位,如果不能在一定的时间里对其进行复位,T1
的定时中断就会使单片机复位。在这里T1的定时时间要设的大于主程序的运行时间,给主程序留有一定的的裕量。而T1的中断正常与否我们再由T0定时中断子程序来监视。这样就够成了一个循环,T0监视T1,T1监视主程序,主程序又来监视T0,从而保证系统的稳定运行。振荡电路:AT89S52系列单片机的内部振荡器如REF_Ref71200029\h图3.2,图STYLEREF1\s3.SEQ图\*ARABIC\s12单片机内部振荡电路由一个单极反相器组成,XTAL1是内部振荡电路反相放大器的输入端,是外接晶体的一个引脚,当采用外部振荡器时此引脚接地;XTAL2内部振荡电路反相放大器的输出端,是外接晶体的另一端,当采用外部振荡器时此引脚接外部振荡源。外接的C1,C2,LZI12M是时钟电路。一般C1、C2选值20~100pF,在60~70pF时振荡器有较高的频率稳定性。同时单片机还可以工作在外部时钟方式下,外部时钟方式较为简单,可直接向单片机XTAL1引脚输入时钟信号,而XTAL2管脚悬空。8.定时/计数器:STC89S51单片机内含有2个16位的定时器/计数器,简称为定时器T0和T1,T0和T1分别由两个8位寄存器构成,其中T0由TH0(高8位)和TL0(低8位)构成,T1由TH1(高8位)和TL1(低8位)构成。TH0、TL0、TH1、TL1都是SFR中特殊功能寄存器。它们既可用作定时器定时,又可用作计数器记录外部脉冲个数,其工作方式、定时时间、启动、停止等均用指令设定。工作前需先装入初值,利用传送指令将初值装入加1计数器TH0和TL0或TH1和TL1,高位数装入TH0或TH1,低位数装入TL0或TL1。当发出启动命令后,加1计数器开始加1计数,加到满值(各位全1)后,再加1就会产生溢出,系统将初值寄存器清0。如果需要继续计数或定时,则需要重新赋计数初值。
时钟芯片DS1302设计DS1302性能简介DS1302
是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.0V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。
DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表STYLEREF1\s3.SEQ表格\*ARABIC\s11:表STYLEREF1\s3.SEQ表格\*ARABIC\s11寄存器分配表寄存器名命令字节范围位内容写读D7D6D5D4D3D2D1D0秒寄存器80H81H00--59CH秒的十位秒的个位分寄存器82H83H00--590分的十位分的个位时寄存器84H85H01—1200--2312/2401/PHR小时的个位日寄存器86H87H01—3100日的十位日的个位月寄存器88H89H01--120000/1月的个位星期寄存器8AH8BH01—0700000星期几年寄存器8CH8DH00--99年的十位年的个位此外,DS1302
还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。
DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。DS1302接口电路设计1时钟芯片DS1302的接口电路及工作原理:图STYLEREF1\s3.SEQ图\*ARABIC\s13DS1302接口电路DS1302工作时为了对任何数据传送进行初始化,需要将复位脚(RST)置为高电平且将8位地址和命令信息装入移位寄存器。数据在时钟(SCLK)的上升沿串行输入,前8位指定访问地址,命令字装入移位寄存器后,在之后的时钟周期,读操作时输出数据,写操作时输出数据。时钟脉冲的个数在单字节方式下为8+8(8位地址+8位数据),在多字节方式下为8加最多可达248的数据。对DS1302的操作就是对其内部寄存器的操作,DS1302内部共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。
在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7位。
温度芯片DS18B20接口设计与性能分析DS18B20性能简介DS18B20采用一线通信接口。只需要一条口线通信
多点能力,简化了分布式温度传感应用无需外部元件可用数据总线供电,电压范围为3.0
V至5.5
V
无需备用电源
测量温度范围为-55
°
C至+125
℃
。华氏相当于是-67
°
F到257°
F。在摄氏度-10
°
C至+85
°
C范围内精度为±0.5
°
C。因为它是一线通信接口,必须在先完成ROM设定,否则记忆和控制功能将无法使用。主要首先提供以下功能命令之一:
读ROM、
ROM匹配、搜索ROM、跳过ROM报警检查。这些指令操作作用在没有一个器件的64位光刻ROM序列号,可以在挂在一线上多个器件选定某一个器件,同时,总线也可以知道总线上挂有有多少,什么样的设备。
温度传感器可编程的分辨率为9~12位,温度转换为12位数字格式最大值为750毫秒,用户可定义的非易失性温度报警设置,应用范围包括恒温控制、工业系统、消费电子产品温度计、或任何热敏感系统。
描述该DS18B20的数字温度计提供9至12位(可编程设备温度读数)。由于DS18B20是一条口线通信,所以中央微处理器与DS18B20只有一个一条口线连接。为读写以及温度转换可以从数据线本身获得能量,不需要外接电源。
因为每一个DS18B20的包含一个独特的序号,多个DS18B20可以同时存在于一条总线。这使得温度传感器放置在许多不同的地方。若指令成功地使DS18B20完成温度测量,数据存储在DS18B20的存储器。一个控制功能指挥指示DS18B20的演出测温。测量结果将被放置在DS18B20内存中,并可以让阅读发出记忆功能的指挥,阅读内容的片上存储器。温度报警触发器TH和TL都有一字节EEPROM
的数据。如果DS18B20不使用报警检查指令,这些寄存器可作为一般的用户记忆用途。在片上还载有配置字节以理想的解决温度数字转换。写TH、TL指令以及配置字节利用一个记忆功能的指令完成。通过缓存器读寄存器。所有数据的读,写都是从最低位开始。DS18B20接口电路设计如REF_Ref69842777\h图3.4所示,该系统中采用数字式温度传感器DS18B20,具有测量精度高,电路连接简单特点,此类传感器仅需要一条数据线进行数据传输,用P3.7与DS18B20的DQ口连接,Vcc接电源,GND接地。图STYLEREF1\s3.SEQ图\*ARABIC\s14DS18B20接口电路按键模块设计本系统用到了5个按键,其中一个用作系统手动启动电源键,另外4个采用独立按键,该种接法查询简单,程序处理简单,可节省CPU资源,按键电路如REF_Ref69842794\h图3.5所示,4个独立按键分别与AT89S51的P3.0、P3.1、P3.2、P3.3接口相连。图STYLEREF1\s3.SEQ图\*ARABIC\s15按键模块设计对以上4个按键作简要说明:S2—SET键,SET键:选择键,当按下SET键进入时间校准状态,按一下进入时间秒的调整,按两下进入时间分的调整,依此类推可分别进行时间的年、月、日、时、分、秒、以及星期的校准。S3—UP键,UP键:与DOWN键相对应,上调键,当校准状态SET键按下时,UP进行SET所选定项(如:小时)的加操作。S4—DOWN键,DOWN键:下调键,当SET键按下时,DOWN键进行SET所选定项(如:小时)的减操作。S5—OUT/STOP键,OUT键:退出键,此键功能为退出校准功能,当校准时间完成操作时,按下OUT键,就就可以进入下一模式,显示温度值和上下限的温度值。复位电路的设计对于设计中的复位电路的设计,我们通过STC89S51单片机的复位引脚RST(全称RESET)来实现的,当RST引脚上的高电平出现周期性变化时,通常是出现两个周期性的变化时,我们就认为STC89C51单片机完成了复位操作。在执行过程中,在周期时间上RST引脚出现持续高电平现象,那么复位电路就处于保持复位状态,此时STC89C51单片机的内部程序是无法正常执行的。通过晶振来解决,一个晶振51系列一般用12M或11.0592M,这里选用的是12M的晶振,通过晶振我们就可以得出一个机器往返周期的时间为1μs,复位脉冲时间为2μs,但在实际开发中,复位时间还要收到外电源稳定运行时间、系统的参数以及晶振稳定时间等诸多因素的影响,因此复位电路的设计中要保证周期时间足够大。本系统采用通过外电源提供电压,通过手动按键的方式来设计电路,设计电路如REF_Ref69842808\h图3.6所示,对于系统的上电且开关复位的操作,可以通过两种方案来设计;第一种方案是:在电源开始供电后,开始为电容充电,此时RST引脚处于保持高电平时间的状态。第二种方案是:如果单片机处于运行状态时,我们也可以通过手动按下复位键也能使RST引脚保持高电平的状态。对于复位电路中的电容和电阻的选择有一定的要求,通常电容在10~3010μF范围内,在这里我们采用的电容值为10μF的电容,电阻选择4.7K的电阻。图STYLEREF1\s3.SEQ图\*ARABIC\s16复位电路设计闹钟电路设计当单片机给蜂鸣器一个低电平时,三极管导通驱动蜂鸣器发出声音作为定时闹铃,其电路图如REF_Ref71553430\h图3.7所示:图STYLEREF1\s3.SEQ图\*ARABIC\s17蜂鸣器连接电路时间设置程序流程图如REF_Ref71553604\h图3.8所示。在开始时间设置之前程序会关闭全局中断,直至设置结束,中断又会重新开启,进入计时状态。图STYLEREF1\s3.SEQ图\*ARABIC\s18闹钟设置流程图闹钟的设置时通过S2键的按下次数来判断的如单片机检测到S5键按下一次时则进入闹钟设置界面,光标并自动跳到秒设置位置,可以对秒进行设置,当S2键依次按下1、2、3次时,则分别进入闹钟的秒、分、时关的设置。此时S4和S5调节闹钟的打开(ON)和关闭(OFF)。按键设置如REF_Ref71554614\h图3.9所示:图STYLEREF1\s3.SEQ图\*ARABIC\s19时钟按键设置系统的软件设计电子万年历的功能是在程序控制下实现的。该系统的软件设计方法与硬件设计相对应,按整体功能分成多个不同的程序模块,分别进行电路设计、设计电路的调试和软件编程,最后将各个部分的程序模块写入到主程序中来实现整体的运行。通过分别设计,不仅能够简化我们的设计,在我们后期也有利于对系统的调试和程序的修改,增强了系统的可行性和逻辑性。本系统的软件部分主要要进行公历计算程序设计,温度测量程序设计,按键的扫描输入等。程序开始运行后首先要进行初始化,把单片机的各引脚的状态按程序里面的初始化命令进行初始化,初始化完成后运行温度测量程序,读取出温度传感器测量出来的温度,然后运行时间公历计算程序,就可以得到准确的公历时间信息,得到公历时间后再通过按键扫描程序,来检测执行过程中有无按键按下,如果有按键步骤,则不能调用时间计算程序计算节日,反之没有,则可以直接调用。根据得到的公历日期信息计算出节日,如果有按键按下则更新按键修改后的变量后送给节日计算程序,由节日计算程序根据修改后的变量计算出对应的节假日,计算完成后运行显示程序,显示程序将得到的温度数据、公历信息、节假日信息送给对应的数码管让其显示。主程序流程图的设计主程序流程图如REF_Ref69842821\h图4.1:图STYLEREF1\s4.SEQ图\*ARABIC\s11主程序流程图用Keil进行程序设计Keil软件简介KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用C来开发,体会更加深刻。KeilC51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。KeilC51软件是一个基于32位Windows环境的应用程序,支持C语言和汇编语言编程,其6.0以上的版本将编译和仿真软件统一为μVision(通常称为μV2)。Keil提供包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,由以下几部分组成:μVisionIDE集成开发环境C51编译器、A51汇编器、LIB51库管理器、BL51连接/定位器、OH51目标文件生成器以及Monitor-51、RTX51实时操作系统。Keil软件调试功能应用Keil进行软件仿真开发的主要步骤为:编写源程序并保存—建立工程并添加源文件—设置工程—编译/汇编、连接,产生目标文件—程序调试。Keil使用“工程”(Project)的概念,对工程(而不能对单一的源程序)进行编译/汇编、连接等操作。工程的建立、设置、编译/汇编及连接产生目标文件的方法非常易于掌握。首先选择菜单File-New…,在源程序编辑器中输入汇编语言或C语言源程序(或选择File-Open…,直接打开已用其它编辑器编辑好的源程序文档)并保存,注意保存时必须在文件名后加上扩展名.asm(.a51)或.c;然后选择菜单Project-NewProject…,建立新工程并保存(保存时无需加扩展名,也可加上扩展名.uv2);工程保存后会立即弹出一个设备选择对话框,选择CPU后点确定返回主界面。这时工程管理窗口的文件页(Files)会出现“Target1”,将其前面+号展开,接着选择SourceGroup1,右击鼠标弹出快捷菜单,选择“AddFiletoGroup‘SourceGroup1’”,出现一个对话框,要求寻找并加入源文件(在加入一个源文件后,该对话框不会消失,而是等待继续加入其它文件)。加入文件后点close返回主界面,展开“SourceGroup1”前面+号,就会看到所加入的文件,双击文件名,即可打开该源程序文件。紧接着对工程进行设置,选择工程管理窗口的Target1,再选择Project-OptionforTarget‘Target1’(或点右键弹出快捷菜单再选择该选项),打开工程属性设置对话框,共有8个选项卡,主要设置工作包括在Target选项卡中设置晶振频率、在Debug选项卡中设置实验仿真板等,如要写片,还必须在Output选项卡中选中“CreatHexFi”;其它选项卡内容一般可取默认值。工程设置后按F7键(或点击编译工具栏上相应图标)进行编译/汇编、连接以及产生目标文件。
成功编译/汇编、连接后,选择菜单Debug-Start/StopDebugSession(或按Ctrl+F5键)进入程序调试状态,Keil提供对程序的模拟调试功能,内建一个功能强大的仿真CPU以模拟执行程序。Keil能以单步执行(按F11或选择Debug-Step)、过程单步执行(按F10或选择Debug-StepOver)、全速执行等多种运行方式进行程序调试。如果发现程序有错,可采用在线汇编功能对程序进行在线修改(Debug-InlineAssambly…),不必执行先退出调试环境、修改源程序、对工程重新进行编译/汇编和连接、然后再次进入调试状态的步骤。对于一些必须满足一定条件(如按键被按下等)才能被执行的、难以用单步执行方式进行调试的程序行,可采用断点设置的方法处理(Debug-Insert/RemoveBreakpoint或Debug-Breakpoints…等)。在模拟调试程序后,还须通过编程器将.hex目标文件烧写入单片机中才能观察目标样机真实的运行状况。DS1302读写程序设计本系统的时间读取主要来源于单片机对DS1302的操作,在硬件上时钟芯片DS1302与单片机的连接需要三条线,即SCLK(7)、I/O(6)、RST(5),具体连接图见系统硬件设计原理图。读取写程序设计如下:函数名:RTInputByte()功能:实时时钟写入一字节入口参数:d写入的数据返回值:无voidRTInputByte(uchard){uchari;ACC=d;for(i=8;i>0;i--){T_IO=ACC0;/*相当于汇编中的RRC*/T_CLK=1;T_CLK=0;ACC=ACC>>1;}}函数名:RTOutputByte()功能:实时时钟读取一字节入口参数:无返回值:ACCucharRTOutputByte(void){uchari;for(i=8;i>0;i--){ACC=ACC>>1;/*相当于汇编中的RRC*/ACC7=T_IO;T_CLK=1;T_CLK=0;}return(ACC);}函数名:W1302()功能:往DS1302写入数据说明:先写地址,后写命令/数据(内部函数)调用:RTInputByte(),RTOutputByte()入口参数:ucAddr:DS1302地址,ucData:要写的数据返回值:无voidW1302(ucharucAddr,ucharucDa){T_RST=0;T_CLK=0;T_RST=1;RTInputByte(ucAddr);/*地址,命令*/RTInputByte(ucDa);/*写1Byte数据*/T_CLK=1;T_RST=0;}函数名:R1302()功能:读取DS1302某地址的数据说明:先写地址,后读命令/数据(内部函数)调用:RTInputByte(),RTOutputByte()入口参数:ucAddr:DS1302地址返回值:ucData:读取的数据ucharR1302(ucharucAddr){ucharucData;T_RST=0;T_CLK=0;T_RST=1;RTInputByte(ucAddr);/*地址,命令*/ucData=RTOutputByte();/*读1Byte数据*/T_CLK=1;T_RST=0;return(ucData);}DS1302与微处理器进行数据交换时,首先由微处理器向电路发送命令字节,命令字节最高位MSB(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;D6=0,指定时钟数据,D6=1,指定RAM数据;D5~D1指定输入或输出的特定寄存器;最低位LSB(D0)为逻辑0即D0=0,指定写操作(输入),D0=1,指定读操作(输出)。温度程序设计单总线上最基本的操作有初始化、写和读3种,所有其它的操作都由这3种基本操作组合而成,初始化用于对总线上的器件进行状态复位,写用于主节点向总线上写入一位数据,读用于主节点从总线上读取一位数据。在这3种操作中,只有写操作是单向的,初始化操作和读操作都是双向的。具体程序设计如下:byteow_reset(void){bytepresence;DQ=0;//拉低总线delay(29);//保持480usDQ=1;//释放总线delay(3);//等待回复presence=DQ;//读取信号delay(25);//等待结束信号return(presence);//返回0:正常1:不存在}//从1-wire总线上读取一个字节byteread_byte(void){bytei;bytevalue=0;for(i=8;i>0;i--){value>>=1;DQ=0;DQ=1;delay(1);if(DQ)value|=0x80;delay(6);}return(value);}//向1-WIRE总线上写一个字节voidwrite_byte(charval){bytei;for(i=8;i>0;i--)//一次写一位{DQ=0;//DQ=val&0x01;delay(5);//DQ=1;val=val/2;}delay(5);}系统的总体设计效果系统的模块组成本设计由数据显示模块、温度采集模块、时间处理模块和调整设置模块四个模块组成。系统的核心采用的是STC89C51单片机;数据显示模块采用的是LCD液晶显示;温度采集模块用的是DS18b20温度传感器,该传感器所采用的是单总线传输,内部带有A/D转换,用起来非常方便;时间处理模块用的是DS1302时钟芯片,可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能;调整设置模块共包括四个按键:模式选择键、功能选择键、调整加按键、调整减按键。原理图设计系统原理图如REF_Ref69842834\h图5.1:图STYLEREF1\s5.SEQ图\*ARABIC\s11系统原理图实物仿真运行实物操作设计基于单片机的多功能万年历实物图如REF_Ref71528661\h图5.2REF_Ref71531532\h图5.3所示:图STYLEREF1\s5.SEQ图\*ARABIC\s12实物正面图图STYLEREF1\s5.SEQ图\*ARABIC\s13实物反面图万年历使用说明主要功能说明:此万年历主要具有:年、月、日、星期、时、分、秒,温度,整点报时,闹钟功能,农历,平润年。按键说明:按键功能分别是:set(设置),up(加),down(减),out(确认),电源开关键。操作说明:插入USB电源线,按下电源开关,时间直接运行。可以看到显示项目分别是:年、月、日、星期、时、分、秒、温度,不用时关掉电源开关键即可,时间不会停止。如需查看农历,按下out(查看农历闹钟)键,即可看到农历,同时还会显示(ping/run)平/润年,再按一次此键,可查看闹钟时间。
设置说明:设置日期时间:按下set(设置)键,时间会暂停,蜂鸣器会长响一次,显示年位置会有光标闪烁,表示此时可以调节年份,如需调节年份,按up(加),down(减)即可对年份进行调节。然后再按一次set(设置)键,显示月份位置会光标闪烁,同样的方法可以调节月,再按set键分别可设置日,时,分,秒。调整闹钟时间:将显示调至闹钟显示界面,再按下set(设置)键,即可对闹钟的时分秒进行调节。整点报时,闹钟开启与关闭:同时按下set+up键,可开启或关闭整点报时,蜂鸣器会有提示,如响一声表示开,响两声表示关闭;同时按下set+down键,可开启或关闭闹钟功能,同时蜂鸣器会有提示,响一声表示开,响两声表示关闭。系统仿真效果图如REF_Ref69842848\h图5.3:图STYLEREF1\s5.SEQ图\*ARABIC\s14仿真图总结在整个设计过程中,硬件方面主要设计了STC89C51单片机的最小系统、DS1302接口电路、DS18B20接口电路、闹钟及LCD显示;软件方面借助各个渠道的资料,主要设计了阳历数据读取程序、阳历转阴历程序、温度采集程序、闹铃程序以及LCD显示程序;系统的调试主要是通过一块AT89S52开发板,再借助于Keil、STC以及少许自己搭建的外围电路实现的;再此过程中,分步调试时显示出了阳历的日期及时间,还有实时温度,集中调试时没有达到预期效果。此万年历具有读显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。在整个设计过程中学到了许多没学到的知识,在电路焊接时虽然没什么大问题,但从中也知道了焊接在整个作品中的重要性,电路工程量大,不能心急,一个个慢慢来不能急于求成。反而达到事半功倍的效果。对电路的设计、布局要先有一个好的构思,才显得电路板美观、大方。程序编写中,由于思路不清晰,开始时遇到了很多的问题,经过静下心来思考,理清了思路,反而得心应手。在此次设计中,知道了做事要有一颗平常的心,不要想着走捷径,一步一脚印。也练就了我的耐心,做什么事都要有耐心。在本次设计中学到了很多很多东西,这是最重要的。总之,此次毕业设计使我的能力得到了全方位的提高,次设计的电子万年历也存在的不足的地方,有待于以后的改进。参考文献陈明荧.8051单片机课程设计实训教程[M].北京:清华大学出版社苏平.单片机的原理与接口技术[M].北京:电子工业出版社,2006:1-113.王忠民.微型计算机原理[M].西安:西安科技大学出版社,2003:15-55.何立民.单片机高级教程[M].北京:北京航空航天大学出版社,2003周雪.模拟电子技术[M]西安:西安电子科技大学出版社,2005:81-95.左金生.电子与模拟电子技术[M].北京:电子工业出版社,2004:105-131.新编单片机原理与应用(第二版).西安电子科技大学出版社,2007.2张萌.单片机应用系统开发综合实例[M].北京:清华大学出版社,2007.7楼然苗.单片机课程设计指导[M].北京:北京航空航天大学出版社,2007.7朱思荣.51单片机实现公历与农历、星期的转换[Z].当当电子网李广弟.单片机原理及应用[M]北京航空航天大学出版社,2004年王越明.电子万年历的设计[J].黑龙江科技信息,2004年致谢从选题之后到提交定稿的半年时间,毕业论文按照规定时间完成了,由于本人的专业知识水平有一定限度,论文和设计中有遗漏和缺陷的地方希望各位老师进行指点,学生愿意虚心听取各位老师的专业意见并加以改正。首先特别感谢我的毕业设计指导老师汪老师,在我论文撰写过程中给我全力的帮助,无论是从论文的修改还是到论文最后的定稿,每一阶段都凝注了指导老师的心血和汗水。在论文写作过程中,导师对我们学生认真负责的态度以及废寝忘食的科研精神深深的打动了我,在学习写作论文中,导师在专业知识上细致耐心的讲解让我少走了许多弯路,为我的专业知识奠定了基础,在生活上导师如同父母般的关心和呵护使我得以成长和蜕变。在这里对我的导师表以最真挚的感谢!其次感谢我的大学传道授业老师,正是有你们的存在,才为我打开了新世界的大门,让我畅游在知识的海洋,你们如同蜡烛般燃烧自我的青春,只为我照明前方的道路,我现在所拥有的全靠你们的成全,没有你们就没有今天的我,在这毕业之际,我想对你们说一声你们辛苦了。最后感谢在大学四年来陪我走过风雨的大学同学,我们从五湖四海相聚一起,一起走过人生最重要的时刻,我们彼此帮助、彼此陪伴,我们之间的友谊不仅仅只有同学情,兄弟情,更像是一个大家庭的亲人。我也祝愿你们能有一个更加为好的未来。附件1系统原理图-PAGE53-附件2系统主程序#include<reg52.h>#include<string.h>#include<intrins.h>#defineuintunsignedint#defineucharunsignedchar#definewd1 #include"eeprom52.h"#defineyh0x80#defineer0x80+0x40sbiten=P2^7;sbitrw=P2^6;sbitrs=P2^5;sbitset=P3^0;sbitadd=P3^1;sbitdec=P3^2;sbitseeNL_NZ=P3^3;sbitDQ=P3^7; sbitbuzzer=P2^0;sbitled=P2^4; bitled1=1;bitNZ_sdgb=1;unsignedchartemp_miao;unsignedcharbltime;sbitIO=P1^1;sbitSCLK=P1^0;sbitRST=P1^2;chara,miao,shi,fen,ri,yue,nian,week,setn,temp;uintflag;bitc_moon;charnz_shi,nz_fen,setNZn;ucharshangyimiao,bsn,temp_hour; ucharT_NL_NZ; bittimerOn=0; bitbaoshi=0; bitp_r=0; dataucharyear_moon,month_moon,day_moon;sbitACC0=ACC^0;sbitACC7=ACC^7;voidwrite_eeprom(){ SectorErase(0x2000); byte_write(0x2000,nz_shi); byte_write(0x2001,nz_fen); byte_write(0x2002,timerOn); byte_write(0x2060,a_a); }voidread_eeprom(){ nz_shi=byte_read(0x2000); nz_fen=byte_read(0x2001); timerOn=byte_read(0x2002); a_a=byte_read(0x2060);}voidinit_eeprom(){ read_eeprom(); if(a_a!=1) { nz_shi=12; nz_fen=30; timerOn=0; a_a=1; write_eeprom(); } }voidConversion(bitc,ucharyear,ucharmonth,ucharday){uchartemp1,temp2,temp3,month_p;uinttemp4,table_addr;bitflag2,flag_y;temp1=year/16;temp2=year%16; year=temp1*16+temp2;temp1=month/16;temp2=month%16; month=temp1*16+temp2;temp1=day/16;temp2=day%16; day=temp1*16+temp2;if(c==0){table_addr=(year+0x64-1)*0x3;}else{table_addr=(year-1)*0x3;}temp1=year_code[table_addr+2]&0x60;temp1=_cror_(temp1,5);temp2=year_code[table_addr+2]&0x1f;if(temp1==0x1){temp3=temp2-1;}else{temp3=temp2+0x1f-1;}if(month<10){temp4=day_code1[month-1]+day-1;}else{temp4=day_code2[month-10]+day-1;}if((month>0x2)&&(year%0x4==0)){temp4+=1;}if(temp4>=temp3){temp4-=temp3;month=0x1;month_p=0x1;flag2=get_moon_day(month_p,table_addr);flag_y=0;if(flag2==0)temp1=0x1d;elsetemp1=0x1e;temp2=year_code[table_addr]&0xf0;temp2=_cror_(temp2,4);while(temp4>=temp1){temp4-=temp1;month_p+=1;if(month==temp2){flag_y=~flag_y;if(flag_y==0)month+=1;}elsemonth+=1;flag2=get_moon_day(month_p,table_addr);if(flag2==0)temp1=0x1d;elsetemp1=0x1e;}day=temp4+1;}else{temp3-=temp4;if(year==0x0){year=0x63;c=1;}elseyear-=1;table_addr-=0x3;month=0xc;temp2=year_code[table_addr]&0xf0;temp2=_cror_(temp2,4);if(temp2==0) month_p=0xc;else month_p=0xd;flag_y=0;flag2=get_moon_day(month_p,table_addr);if(flag2==0)temp1=0x1d;elsetemp1=0x1e;while(temp3>temp1){temp3-=temp1;month_p-=1;if(flag_y==0)month-=1;if(month==temp2)flag_y=~flag_y;flag2=get_moon_day(month_p,table_addr);if(flag2==0)temp1=0x1d;elsetemp1=0x1e;}day=temp1-temp3+1;}c_moon=c;temp1=year/10;temp1=_crol_(temp1,4);temp2=year%10;year_moon=temp1|temp2;temp1=month/10;temp1=_crol_(temp1,4);temp2=month%10;month_moon=temp1|temp2;temp1=day/10;temp1=_crol_(temp1,4);temp2=day%10;day_moon=temp1|temp2;}ucharcodetab1[]={"20--"}; ucharcodetab2[]={"::"}; ucharcodenlp[]={"NL:--PING"}; ucharcodenlr[]={"NL:--RUN"}; ucharcodeNZd[]={"timer::"}; ucharcodeqk[]={""}; ucharcodetm[]={"time"};voidDelayns(intnum){ while(num--);} voidInit_DS18B20(void){ unsignedcharx=0; DQ=1; Delayns(8); DQ=0; Delayns(80); DQ=1; Delayns(14); x=DQ; Delayns(20);}unsignedcharReadOneChar(void{ unsignedchari=0; unsignedchardat=0; for(i=8;i>0;i--) { DQ=0; dat>>=1; DQ=1; if(DQ) dat|=0x80; Delayns(4); } return(dat);}voidWriteOneChar(unsignedchardat){ unsignedchari=0; for(i=8;i>0;i--) { DQ=0; DQ=dat&0x01; Delayns(5); DQ=1; dat>>=1; }}voidwrite_1602com(ucharcom){ rs=0; rw=0; P0=com; delay(1); en=1; delay(1); en=0;}voidwrite_1602dat(uchardat){ rs=1; rw=0; P0=dat; delay(1); en=1; delay(1); en=0;}voidlcd_init(){ write_1602com(0x38); write_1602com(0x0c); write_1602com(0x06); write_1602com(0x01); write_1602com(yh+1); for(a=0;a<14;a++) { write_1602dat(tab1[a]); } write_1602com(er); for(a=0;a<8;a++) { write_1602dat(tab2[a]); }}voidwrite_byte(uchardat){ ACC=dat; RST=1; for(a=8;a>0;a--) { IO=ACC0; SCLK=0; SCLK=1; ACC=ACC>>1; }}voidwrite_1302(ucharadd,uchardat){ RST=0; SCLK=0; RST=1; write_byte(add); write_byte(dat); SCLK=1; RST=0;}ucharread_1302(ucharadd){ uchartemp11; RST=0; SCLK=0; RST=1; write_byte(add); temp11=read_byte(); SCLK=1; RST=0; return(temp11);}ucharBCD_Decimal(ucharbcd){ return((bcd>>4)*10+(bcd&0x0F));}voidds1302_init(){ RST=0; SCLK=0; write_1302(0x8e,0x00); write_1302(0x8e,0x80);}{ uintgw,sw,bw; bw=dat/100; sw=dat%100/10; gw=dat%10; write_1602com(er+add); write_1602dat(0x30+bw); write_1602dat(0x30+sw); write_1602dat('.'); write_1602dat(0x30+gw);write_1602dat(0xdf); write_1602dat(0x43); }voidwrite_sfm(ucharadd,uchardat){ uchargw,sw; gw=dat%10; sw=dat/10; write_1602com(er+add
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 研究中心建设与规划措施讲课教案(2025-2026学年)
- 疑难病例讨论颌骨中心性血管瘤教案
- 戏剧表演课省公共课全国赛课获奖教案
- 人教版六下语文第六单元跨越百年的美丽教案
- 幼儿园小班安全火教案
- 小学信息技术质量分析试卷教案
- 书愤公开课共页教案
- 语言总结修改版教案
- 大班数学活动以内的数量守恒教案反思(2025-2026学年)
- 2026年证券分析师之发布证券研究报告业务考试题库300道及完整答案【各地真题】
- 2026年动物检疫检验员考试试题题库及答案
- 中国淋巴瘤治疗指南(2025年版)
- 2025年云南省人民检察院聘用制书记员招聘(22人)考试笔试模拟试题及答案解析
- 2026年空气污染监测方法培训课件
- 实习2025年实习实习期转正协议合同
- 疗伤旅馆商业计划书
- 购买电影票合同范本
- 2025西部机场集团航空物流有限公司招聘考试笔试备考题库及答案解析
- 2025年广西公需科目答案6卷
- 2025年鲍鱼养殖合作协议合同协议
- 2025智慧消防行业市场深度调研及发展趋势与投资前景预测研究报告
评论
0/150
提交评论