首页 基于单片机的万年历的设计与制作

基于单片机的万年历的设计与制作

举报
开通vip

基于单片机的万年历的设计与制作 基于单片机的万年历的设计与制作 摘要: 单片机应用技术飞速发展,纵观我们现在生活的各个领域,从导弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及我们生活中广泛使用的各种智能IC卡、电子宠物等,这些都离不开单片机。单片机是集CPU 、RAM 、ROM、定时、计数和多种接口于一体的微控制器。它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。它可以对年、月、日、周日、时、分、秒进行计时,...

基于单片机的万年历的设计与制作
基于单片机的万年历的设计与制作 摘要: 单片机应用技术飞速发展,纵观我们现在生活的各个领域,从导弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及我们生活中广泛使用的各种智能IC卡、电子宠物等,这些都离不开单片机。单片机是集CPU 、RAM 、ROM、定时、计数和多种接口于一体的微控制器。它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周、时、分、秒和温度等信息,还具有时间校准等功能。该电路采用AT89S52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。 本设计是基于51系列的单片机进行的电子万年历设计,可以显示年月日时分秒及周信息,具有可调整日期和时间功能。在设计的同时对单片机的理论基础和外围扩展知识进行了比较全面准备。在硬件与软件设计时,没有良好的基础知识和实践经验会受到很大限制,每项功能实现时需要哪种硬件,程序该如何编写,算法如何实现等,没有一定的基础就不可能很好的实现。在编写程序过程中发现以现有的相关知识要独自完成编写任务困难重重,在老师和同学的帮助下才完成了程序部分的编写。 万年历的设计过程在硬件与软件方面进行同步设计。硬件部分主要由AT89S52单片机,LCD1602显示电路,以及调时按键电路等组成。单片机使用了AT89S52单片机,该单片机适合于许多较为复杂控制应用场合。显示由LCD1602并行输出。软件方面主要包括日历程序、时间调整程序,显示程序等。程序采用C语言编写,以便更简单地实现调整时间功能。所有程序编写完成后,在Keil软件中进行调试,确定没有问题后,在Proteus软件中嵌入单片机内进行仿真。最后在老师同学的帮助以及自己的努力下完成了此次电子万年历的设计。 关键词: 时钟电钟;DS1302;动态扫描;51单片机 Abstract SCM application technology develop rapidly, looking around us now in all spheres of life, from missiles, navigation equipment, to the various instruments on the aircraft control from a computer network communications and data transmission, industrial automation to real-time process control and data processing, and our lives extensive use of the smart card, electronic pets, which is inseparable from the microcontroller. Monolithic single-chip is the set of CPU, RAM, ROM, the timing, number and variety of interface integrated microcontrollers. Its small size, low cost, high performance, which are widely used in smart industries, and industrial automation. E-calendar day time is a very wide range of tools, increasingly popular in modern society. It can be year, month, day, Sunday, hours, minutes, seconds for time, but also has a leap year compensation to a variety of functions, and the DS1302's long life, small error. For the digital electronic calendar using an intuitive digital display can simultaneously display year, month, day, Sunday, hours, minutes, seconds, and temperature and other information, but also a time-calibration and other functions. The circuit uses AT89S52 microcontroller as the core, power consumption, low-voltage work in 3V, the voltage can choose 3 ~5V voltage supply. The design is based on 51 series of microcontrollers to the design of electronic calendar, you can display date information on when the minutes and seconds, and weeks, with adjustable date and time functions. At the same time in the design of the theoretical basis of the MCU and peripheral expansion of knowledge of the more comprehensive preparation. The hardware and software design, there is no good basic knowledge and practical experience will be greatly limited, each feature is required to achieve the kind of hardware, procedures, how to write, how to implement such algorithms, there is no certain foundation can not be good implementation. Found during the preparation process to the existing knowledge to complete the preparation of the task alone difficult,In the help of teachers and students to complete the program part of the preparation. Calendar of the design process in hardware and software to synchronize the design. Hardware mainly by the AT89S52 microcontroller, LCD1602 display circuit, and the tune composed of the circuit when the button. In the SCM choice I used the AT89S52 microcontroller, which is suitable for many of the more complex control applications. Monitor the use of LCD1602.The software includes calendar program, time to adjust procedures, display programs. Programs written in assembly language used in order to more easily adjust the time and the realization of the lunar calendar display. All programming is complete, the Keil software debugging, make sure that no problems, in the Proteus software within a microcontroller embedded in the simulation. The final overall the teacher to help students, as well as their own efforts to complete the design of the electronic calendar. Keywords: Clock electric clock:DS1302; Dynamic scan:51SCM 引言 当今社会电子技术迅速的发展,特别是随着大规模集成电路的出现,给人类生活带来了根本性的改变。尤其是单片机技术的应用产品已经走进了千家万户。电子万年历的出现给人们的生活带来诸多方便。 电子钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟相比,它具有计时准确、显示直观等优点,因而得到广泛应用。随着人们生活环境的不断改善和美化,在很多场合可以看到数字电子钟。 第1章 设计 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 论证 1.1 设计要求: (1) 具有年、月、日、星期、时、分、秒等显示功能; (2) 具有温度显示功能; (3) 具备年、月、日、星期、时、分、秒校准、调整功能。 1.2 系统基本方案选择及论证 1.2.1单片机芯片的选择方案和论证 方案一: 采用89C51芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。 方案二: 采用AT89S52,片内ROM全都采用Flash ROM;能以3V的超底压工作;同时也与MCS-51系列单片机完全该芯片内部存储器为8KB ROM 存储空间,同样具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。 所以选择采用AT89S52作为主控制系统. 1.2.2 显示模块的选择方案和论证 方案一: 采用LED数码管动态扫描,LED数码管价格适中,对于显示数字很合适,但考虑本次设计中要显示多位日期数据,并且要显示温度数据,在实际电路连接时会需要很多连线,增加出问题的可能性,所以不采用此方案。 方案二: 采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以也不用此种作为显示. 方案三: 采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见,虽价格较之数码管昂贵些,但会减少设计中的很多连线。并且可以同时显示大量信息,所以在此设计中采用LCD液晶显示屏。 所以采用了LCD液晶显示屏作为显示。 1.2.3 时钟芯片的选择方案和论证 方案一: 不使用芯片,直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大。所以不采用此方案。 方案二: 采用并行接口时钟芯片 DS12887,采用单片机应用系统并行总线(三总线)扩展的接口电路,采用这种接口电路具有操作速度快,编程方便的优点。但是对于80C52单片机来说,低位地址线要通过锁存器输出,还要地址译码器,而且并行口芯片的体积相对较大。 方案三: 采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,位的RAM做为数据暂存区,工作电压2.5V~5.5V范围内,2.5V时耗电小于300nA. 所以选用DS1302作为时钟芯片。 1.2.4 温度传感器的选择方案和论证 方案一: 使用热敏电阻作为传感器,用热敏电阻与一个相应阻值电阻相串联分压,利用热敏电阻阻值随温度变化而变化的特性,采集这两个电阻变化的分压值,并进行A/D转换。此设计方案需用A/D转换电路,增加硬件成本而且热敏电阻的感温特性曲线并不是严格线性的,会产生较大的测量误差。 方案二: 采用数字式温度传感器DS18B20,此类传感器为数字式传感器而且仅需要一条数据线进行数据传输,易于与单片机连接,可以去除A/D模块,降低硬件成本,简化系统电路。另外,数字式温度传感器还具有测量精度高、测量范围广等优点。 所以选用DS18B20作为温度采集部分的传感器。 1.2.5 编程语言的选择方案和论证 方案一: 使用汇编语言,汇编语言是一种面向机器的计算机低级编程语言,通常是为特定的计算机或系列计算机专门设计的。汇编语言能充分地发挥指令系统的功能和效率,可获得最简练的目标程序,但可读性却不强,复杂一点的程序就更难读懂了,而本设计的软件设计部分必然是需要大篇幅的程序作为支持的,所以不采用汇编语言作为此次设计的编程语言。 方案二: 使用C语言(C51),C语言程序本身不依赖于机器硬件系统,基本上不作修改就可将程序从不同的单片机中移植过来。C语言提供了很多函数,并支持浮点运算,开发效率高,故可缩短开发时间,增加程序可读性和可维护性。而且C语言可以嵌入汇编语言来解决高时效性的代码编写问题。相比汇编语言,C51对单片机的指令系统不要求了解,仅要求对MCS-51的存储结构有初步了解,无须懂得单片机的具体硬件,也能编出符合硬件实际的专业水平的程序。 所以此次设计选用C语言编写程序。 1.3 电路设计与最终方案 综上各方案所述,对该万年历设计方案的最终选定: 采用AT89S52作为主控制系统;DS1302提供时钟; DS18B20作为数字式温度传感器;LCD1602液晶屏作为显示;以C语言作为编程语言。 第2章 主要硬件描述 2.1单片机AT89S52 2.1.1 单片机简介 单片微型计算机(Single—Chip Microcomputer),简称单片机,就是将微处理器(CPU)、存储器ROM和RAM、定时器/计数器、中断系统、输入/输出接口(I/O接口)、总线和其他多功能器件集成在一块芯片上的微型计算机。由于单片机的重要应用领域为智能化电子产品,一般需要嵌入式仪器设备内,故又称为嵌入式微控制器。 单片机的主要特点如下。 (1) 可靠性高 单片机的系统软件都固化在ROM中,不易受病毒破坏。许多信号的通道均集成在一个芯片内,所以运行时系统稳定可靠。 (2) 便于扩展 单片机片内具有计算机正常运行所必需的部件,片外有很多供扩展用的引脚(总线、并行I/O接口和串行I/O接口),很容易构成各种规模的计算机应用系统。 (3) 控制功能强 具有丰富的控制指令,可以对逻辑功能比较复杂的系统进行控制。 (4) 低电压、低功耗 低电压、低功耗对便携式产品和家用消费类产品是非常重要的。许多单片机可以在3V,甚至更低的电压下运行,有些单片机的工作电流已降至 (5) 片内存储容量较小  单片机内部ROM的存储容量一般小于8KB,RAM的存储容量一般小于256B,但可以在外部扩展。通常,ROM和RAM的存储容量都可扩展至64KB。 除此之外,单片机还具有集成度高、体积小、性价比高、应用广泛、易于产品化。 2.1.2 MCS-51单片机外部引脚 AT89S52单片机为40个引脚的双列直插式(DIP)封装,共分为电源线、端口线和控制线三类。如图1所示即为该单片机的引脚封装形式。 图1. AT89S52引脚图 1) 电源线    ①GND(20脚):接地引脚。    ②Vcc(40脚):正电源引脚。正常工作时,接+5V电源。 2) 端口线 AT89S52片内有4个8位并行I/O接口P0,P1,P2和P3。它们可以双向使用。 ①P0口 32~39脚为P0.0~P0.7输入/输出引脚。P0口为双向8位三态I/O接口。它既可以作为通用I/O接口,又可以作为外部扩展时的数据总线及低8位地址总线的分时复用口。 ②P1口 1~8脚为P2.0~P2.7输入/输出引脚。P1口为8位准双向I/O接口。 ③P2口 21~28脚为P2.0~P2.7输入/输出引脚。P2口为8位准双向I/O接口。 ④P3口 10~17脚为P3.0~P3.7输入/输出引脚。P3口为8位准双向I/O接口,它是双功能复用口,作为通用I/O接口时,功能与P1口相同,常使用第二功能。作为第二功能使用时,各位的作用见表1。 表1 P3口的第二功能 P3口 第二功能 信号名称 P3.0 RXD 串行数据接收口 P3.1 TXD 串行数据发送口 P3.2 外部中断0请求输入 P3.3 外部中断1请求输入 P3.4 T0 定时器/计时器0的外部输入口 P3.5 T1 定时器/计时器1的外部输入口 P3.6 外部RAM写选通信号 P3.7 外部RAM读选通信号 3) 控制线 ①RST/Vpd(9脚):复位信号/备用电源线引脚。该引脚的第二功能是作为备用电源输入线。 ②ALE/ EQ (30脚):地址锁存允许/编程引脚。该引脚的第二功能是对EPROM型芯片进行编程和校验时,此引脚传送52ms宽的负脉冲选通信号,程序计数器PC的16位地址数据将出现在P0和P2口上,外部程序存储器则把指令码放在P0口上,由CPU写入并执行。 ③ /Vpp(31脚):允许访问片外程序存储器/编程电源线。其第二功能是片内EPROM编程/校验时的电源线,在编程时, /Vpp脚需要加上21V的编程电压。 ④XTAL1和XTAL2(18,19脚):XTAL1脚为片内振荡电路的输入端, XTAL2脚为片内振荡电路的输出端。 ⑤ (29脚):片外ROM选通线。在执行访问片外ROM的指令MOVC时,8051自动在 线上产生一个负脉冲,用于对片外ROM的选通。在其他情况下, 线均为高电平封锁状态。 2.2 LCD1602液晶显示屏 2.2.1 LCD1602液晶显示屏简介  字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。一般1602字符型液晶显示器实物如图2所示。 图2.LCD1602实物图 2.2.2 引脚功能说明 LCD1602采用 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 的14脚(无背光)或16脚(带背光)接口,各引脚接口如图3所示,引脚说明如表2。 图3.LCD1602引脚图 表2 LCD1602各引脚功能 编号 符号 引脚说明 编号 符号 引脚说明 1 Vss 电源地 9 D2 数据 2 Vdd 电源正极 10 D3 数据 3 Vo 液晶显示偏压 11 D4 数据 4 RS 数据/命令选择 12 D5 数据 5 R/W 读/写选择 13 D6 数据 6 E 使能信号 14 D7 数据 7 D0 数据 15 BLA 背光源正极 8 D1 数据 16 BLK 背光源负极 2.3 DS1302时钟芯片 2.3.1 DS1302简介 DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。 2.3.2 引脚功能说明 图4示出DS1302的引脚排列,其中Vcc1为后备电源,Vcc2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768KHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RSTS置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电动行时,在Vcc大于等于2.5V之前,RST必须保持低电平。只有在SCLK 为低电平时,才能将RST置为高电平,I/O为串行数据输入端(双向)。SCLK始终是输入端。 图4. DS1302引脚图 2.4 DS18B20温度芯片 2.4.1 DS18B20简介 DS18B20是由Dallas半导体公司生产的数字化温度传感器,是世界上第一个支持“一线总线”接口的温度传感器,“一线总线”接口芯片独特芯片而且经济,使用户可以轻松地组建传感器网络,为测量系统的构建引入了全新概念。DS18B20“一线总线”数字化温度传感器的测量温度范围-55℃~+125℃,在-10~+85℃范围内,精度为±0.5℃。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。适合在恶劣环境的现场进行温度测试,可应用于环境控制,过程控制、测温类消费电子产品中。 DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等。 2.4.2 引脚功能说明 DS18B20具有3引脚TO-92小体积封装形式,其实物及引脚图如图5所示。 图5.DS18B20实物图及引脚图 各引脚说明如下: 引脚1(GND):地。 引脚2(DQ):数据输入/输出引脚,漏极开路单总线接口引脚。当工作于寄生电源时,也可以向器件提供电源。 引脚3(Vcc):可选择的外接供电电源输入引脚。当工作于寄生电源时,此引脚必须接地。 第3章 系统的硬件设计与实现 3.1 电路设计框图 图6.电路设计框图 3.2 系统硬件概述 本电路是由AT89S52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31*8的用于临时性存放数据的RAM寄存器。可产生年、月、日、周日、时、分、秒,具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能;温度的采集由DS18B20构成;显示部份由液晶显示屏LCD1602提供。 3.3 主要单元模块的设计及原理 3.3.1 单片机主控制模块的设计 系统主控制部分原理图如图7所示。 图7.主控制系统 3.3.2 时钟模块的设计及原理 (1)模块设计 系统时间部分原理图如图8所示。 图8.DS1302的引脚图 (2)原理说明 ①DS1302的控制字节 DS1302的控制字如表3所示。控制字节的高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中;位6如果0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作。 输出时。控制字节总是从最低有效位开始输出。 表3 DS1302的控制字 格式 pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载 位: 7 6 5 4 3 2 1 0 RAM RD 1 A4 A3 A2 A1 A0 ②数据输入输出(I/O) 在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。如下图9所示 图9.DS1302读/写时序图 ③DS1302的寄存器 DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表2。 表4 DS1302的日历、时间寄存器 写寄存 器 读寄存 器 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 80H 81H CH 10秒 秒 82H 83H 10分 分 84H 85H 12/24 0 10 时 时 AM/PM 86H 87H 0 0 10日 日 88H 89H 0 0 0 10月 月 8AH 8BH 0 0 0 0 0 星期 8CH 8DH 10年 年 8EH 8FH WP 0 0 0 0 0 0 0 普通时钟寄存器(包括秒、分、时等七种寄存器)用于表示普通时钟数据内容,而其他三种寄存器用于只是CPU对DS1302进行状态的控制或设置。 控制寄存器是用于程序初始运行时,将DS1302设置为读或写状态而提供给用户的。当此寄存器内容设置好以后,普通时钟数据才能进行后续的读/写操作。 除了寄存器特殊状态位以外,普通时钟寄存器中的其他数据是按照BCD码的形式来存储数据的。也就是使用0~9这10个数值的二进码来表示各位的数字。比如秒寄存器的取值范围是00~59,存储位为bit0~bit6。bit6~bit4为十位数的BCD码,而bit3~bit0为个位的BCD码。假设现有数据为31s,那么其存储情况应为bit6~bit4=011,bit3~bit0=0001。后面几个时钟寄存器中数据存储情况基本和秒寄存器数据的存储情况相同。可从表4依次分析得出。 此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。 DS1302的数据传送有单字节传送和多字节传送两种。当命令字节为BE或BF时,DS1302工作在多字节顺序传送模式。8个时钟/日历寄存器从RAM寄存器0开始,依次由地址0~地址7顺序读/写数据。当命令字节为FE或FF时,DS1302工作在多字节连续传送模式,31个RAM寄存器从0地址开始,连续读/写从0位开始的数据。 ④时钟芯片DS1302的工作原理 DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置 “0”,接着把 端置“1”,最后才给予SCLK脉冲;读/写时序如下图11所示。表1为DS1302的控制字,此控制字的位7必须置1,若为0则不能把对DS1302进行读写数据。对于位6,若对程序进行读/写时RAM=1,对时间进行读/写时, =0。位1至位5指操作单元的地址。位0是读/写操作位,进行读操作时,该位为1;该位为0则表示进行的是写操作。控制字节总是从最低位开始输入/输出的。表3为DS1302的日历、时间寄存器内容:“CH”是时钟暂停标志位,当该位为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位为0时,时钟开始运行。“WP” 是写保护位,在任何的对时钟和RAM的写操作之前,WP必须为0。当“WP”为1时,写保护位防止对任一寄存器的写操作。 3.3.3 温度采集模块的设计及原理 (1)模块设计 系统温度采集部分原理图如图10所示。 图10. DS18B20温度采集 (2)原理说明 ①DS18B20测温原理 DS18B20的具体测温原理如图11所示。其中,低温度系数晶振的振荡频率受温度的影响很小,用于固定频率的脉冲信号送给减法计数器1;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数,进而完成温度的测量。计数门的开启时间由高温度系数振荡器来确定,每次测量前,首先将-55℃所对应的一个计数分别置入减法计数器1、温度寄存器,减法计数器1和温度寄存器被预置在-55℃所对应的一个基数值。 图11.DS18B20测温原理 减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当预置数值减到0时,温度计数器的值将加1,然后减法计数器1的预置值重新被装入且重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值就是所测温度值。斜率累加器则用于补偿和修正测温过程中的非线性,其输出用于修正减法计数器的预置值;只要计数门仍未关闭就重复上述过程,直到温度寄存器值达到被测温度值。 ②DS18B20温度测量值输出原理 DS18B20读出的温度结果数据为两字节,用16位符号扩展的二进制补码读数的形式提供。因此,系统编程时必须将得到的温度值进行格式转换。DS18B20温度数据输出格式如表5所列。 表5 DS18B20温度数据输出格式 位 Bit15 Bit14 Bit13 Bit12 Bit11 Bit10 Bit9 Bit8 高8位 S S S S S 位 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 低8位 其中,Bit15~Bit11所示的S是符号位用以表示温度是零上还是零下。当测得的温度大于0时,这5位为0;当测得的温度小于0时,这5位为1。后面的Bit10~Bit4部分则构成温度数据的整数部分,而Bit3~Bit0部分则构成温度数据的小数部分。 几种温度数据输出举例如表6所列。 表6 DS18B20温度数据举例 温度值/℃ 数据输出(二进制) 数据输出(16进制) +125 0000 0011 1101 0000 07D0H +85 0000 0101 0101 0000 0550H +25.0625 0000 0001 1001 0001 0191H +10.125 0000 0000 1010 0010 00A2H +0.5 0000 0000 0000 1000 0008H 0 0000 0000 0000 0000 0000H -0.5 1111 1111 1111 1000 FFF8H -10.125 1111 1111 0101 1101 FF5EH -25.0625 1111 1110 0101 1110 FE6FH -55 1111 1100 1001 0000 FC90H ③DS18B20温度转换的时序 根据DS18B20的通信 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 ,主机控制DS18B20完成温度转换必须经过这几个步骤:初始化DS18B20(发复位脉冲),接着ROM功能命令,发存储器操作命令,最后处理数据。 在每一次的读/写操作之前都必须对DS18B20进行复位,复位要求主CPU将数据线下拉500 s然后释放;DS18B20收到信号后等待16~60 s,然后发出60~240 s的存在低脉冲,主CPU收到此信号表示复位成功。DS18B20上电复位时的温度值固定为0550H,即85℃。DS18B20复位时序如图12(a)所示。DS18B20的读时序分为读0时序和读1时序两个过程,如图12(b)所示。 (a)DS18B20的复位时序图 (b)DS18B20的读时序图 图12 DS18B20的工作时序 对于DS18B20的读时隙是从主机把单总线拉低之后,在15s之内就得释放单总线,让DS18B20把数据传输到但总线上。DS18B20要完成一个读时序过程,至少需要60 s才能完成。 表7 DS18B20 ROM命令 命令 描述 协议 此命令发出后总线上的活动 SEARCH ROM 识别总线上挂着的所有DS18B20的ROM F0H 所有DS18B20向主机传送ROM码 READ ROM 当只有一个DS18B20挂在总线上时,可用此命令读取ROM 33H DS18B20向主机传送ROM码 MATCH ROM 主机用ROM码来指定某一个DS18B20,只有匹配的DS18B20才会响应 55H 主机向总线传送一个ROM码 SKIP ROM 用于指定总线上所有的器件 CCH ALARM SEARCH 与SEARCH ROM命令相似,但只有温度超过警报线的DS18B20才会响应 ECH 超过警报线的DS18B20向主机传送ROM码 表8 DS18B20 RAM功能命令 命令 描述 协议 此命令发出后总线上的活动 Convert T 开始温度转换 44H DS18B20向主机传送转换状态 Read Scratchpad 读暂存器完整的数据 BEH DS18B20向主机传送总共9字节的数据 Write Scratchpad 向寄存器的2、3和4字节写入数据(TH、TL和精度) 4EH 主机向DS18B20传送3字节的数据 Copy Scratchpad 将TH、TL和配置寄存器的数据复制到EEPROM 48H DS18B20向主机传送调用状态 Recall E2 将TH、TL和配置寄存器的数据从EEPROM中调到暂存器中 B8H Read Power Supply 向主机示意电源供电状态 B4H DS18B20向主机传送供电状态 3.3.4 按键处理模块的设计 系统按键部分原理图如图13所示。 图13.按键处理 其中图13示出的三个按键,由上向下分别第一位键1、键2、键3,对应于系统的功能分别是:时钟的模式选择键、加键、减键。 3.3.5 显示模块的设计 (1)模块设计 系统显示部分原理图如图14所示。 图14.LCD 1602液晶显示 (2)原理说明 ①LCD1602控制字节 1602液晶模块的读写操作,屏幕和光标的操作都是通过指令编程来实现的。(说明1为高电平,0为低电平)指令集如表9所示。 指令1:清显示,指令码01H,光标复位到地址00H位置 指令2:光标复位,光标返回到地址00H 指令3:光标和显示位置设置I/D,光标移动方向,高电平右移,低电平左移,S:屏幕上所有文字是否左移或右移,高电平表示有效,低电平表示无效。 指令4:显示开关控制。D:控制整体的显示开与关,高电平表示开显示,低电平表示关显示。C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。 指令5:光标或显示移位 S/C :高电平时显示移动的文字,低电平时移动光标 指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时为双行显示,F:低电平时显示5X7的点阵字符,高电平时显示5X10的显示字符。 指令7:字符发生器RAM地址设置。 指令8:DDRAM地址设置。 指令9:读忙信号和光标地址 BF:忙标志位,高电平表示忙,此时模块不能接收命令或数据,如果为低电平表示不忙。 表9 LCD1602的控制命令 序号 指令 RS R/W D7 D6 D5 D4 D3 D2 D1 D0 1 清显示 0 0 0 0 0 0 0 0 0 1 2 光标返回 0 0 0 0 0 0 0 0 1 * 3 置输入模式 0 0 0 0 0 0 0 1 I/D S 4 显示开/关控制 0 0 0 0 0 0 1 D C B 5 光标或字符移位 0 0 0 0 0 1 S/C R/L * * 6 置功能 0 0 0 0 1 DL N F * * 7 置字符发生存储器地址 0 0 0 1 字符发生存贮器地址 8 置数据存储器地址 0 0 1 显示数据存贮器地址 9 读忙标志或地址 0 1 BF 计数器地址 10 写数到RAM 1 0 要写的数据内容 11 从RAM读数 1 1 读出的数据内容 ②LCD1602的读写时序 如图15(a)(b)分别为LCD1602的读时序和写时序。 (a) LCD1602读时序 (b) LCD1602写时序 图15 LCD1602的时序图 ③ LCD1602的RAM地址映射及标准字库表 液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在,哪里显示字符,图16是LCD1602的内部显示地址。 图16. LCD1602内部显示地址 例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。 在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。每次输入指令前都要判断液晶模块是否处于忙的状态。 1602液晶模块内部的字符发生存储器(ROM)已经存储了160个不同的点阵字符图形,如图10-58所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。 第4章 系统的软件设计 4.1 程序流程框图 4.1.1主程序流程图 图17.主程序流程图 4.1.2 时钟芯片数据处理子程序流程图 图18.数据处理流程图 4.1.3 按键扫描子程序流程图 图19.按键处理流程图 4.1.4 加减键处理子程序流程图 图20.按键处理程序流程图 4.2 子程序的设计 4.2.1 DS18B20温度子程序 # include "SYSTEM.H" //#include //#include #define uchar unsigned char #define uint unsigned int uint temp; // 温度变量 uint wendu; sbit DS=P1^0; //定义数据传输接口 /***************************************************** 函数功能:延时1ms (3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒 ***************************************************/ void delay1ms() { unsigned char i,j; for(i=0;i<4;i++) for(j=0;j<33;j++) ; } /***************************************************** 函数功能:延时若干毫秒 入口参数:n ***************************************************/ void delaynms(unsigned char n) { unsigned char i; for(i=0;i0) count--; } void reset(void) //送初值和初始命令 { DS=0; delay1(100); DS=1; delay1(4); delay1(200); } bit read_bit(void) //读一比特,特别注意对于18b20,要读数据时,一定要产生DS正脉冲,然后才传送数据 { bit temp; DS=0; _nop_(); DS=1; _nop_(); temp=DS; delay1(200); return temp; } uchar read_byte(void) //读一字节的数据 { uchar i,byte=0; bit j; for(i=0;i<8;i++) { byte=_cror_(byte ,1); //将byte数据向右循环一位,每次都取出最高位 j=read_bit(); //设定j为读取进来的一比特数 if(j==0) byte=byte|0x00; //当j=0时,即读取一字节数完毕,取出次字节数 else byte=byte|0x80; //每次取出最高位 } return byte; //返回字节数 } void write_byte(uchar command) //写一字节到18b20 { uchar i; for(i=0;i<8;i++) //用i来设定一字节的数据 { if((command & 0x01)==0) //取出最低位为零时,DS要产生一个负脉冲脉冲 { DS=0; delay1(8); DS=1; _nop_(); } else //否则产生一上升沿 { DS=0; _nop_(); DS=1; delay1(8); } command=_cror_(command,1); } } void tmpchange(void) //启动18b20 { reset(); write_byte(0xcc); //直接向18b20发送温度变换命令 write_byte(0x44); //启动18b20进行温度转换 } uint tmp() //获取温度 { float tt; uchar a,b; reset(); write_byte(0xcc); //直接向18b20发送温度变换命令 write_byte(0xbe); //读取温度寄存器的温度值 a=read_byte();//读低八位 b=read_byte();//读高八位 temp=b; temp<<=8; //因为18b20处理接受到的数据要进行处理,先将高八位左移4位 temp=temp|a; //在和低八位相或,整合取得的数据 tt=temp*0.0625; temp=tt*10+0.5; return temp; } /************************************************************************ 以下是DS18B20的操作程序 ************************************************************************/ sbit DQ=P1^0; unsigned char time; //设置全局变量,专门用于严格延时 /***************************************************** 函数功能:将DS18B20传感器初始化,读取应答信号 出口参数:flag ***************************************************/ bit Init_DS18B20(void) { bit flag; //储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在 DQ = 1; //先将数据线拉高 for(time=0;time<2;time++); //略微延时约6微秒 DQ = 0; //再将数据线从高拉低,要求保持480~960us for(time=0;time<200;time++) //略微延时约600微秒 ; //以向DS18B20发出一持续480~960us的低电平复位脉冲 DQ = 1; //释放数据线(将数据线拉高) for(time=0;time<10;time++) ; //延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲) flag=DQ; //让单片机检测是否输出了存在脉冲(DQ=0表示存在) for(time=0;time<200;time++); //延时足够长时间,等待存在脉冲输出完毕 return (flag); //返回检测成功标志 } /***************************************************** 函数功能:从DS18B20读取一个字节数据 出口参数:dat ***************************************************/ unsigned char ReadOneChar(void) { unsigned char i=0; unsigned char dat; //储存读出的一个字节数据 for (i=0;i<8;i++) { DQ =1; // 先将数据线拉高 _nop_(); //等待一个机器周期 DQ = 0; //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序 _nop_(); //等待一个机器周期 DQ = 1; //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备 for(time=0;time<2;time++); //延时约6us,使主机在15us内采样 dat>>=1; if(DQ==1) dat|=0x80; //如果读到的数据是1,则将1存入dat else dat|=0x00;//如果读到的数据是0,则将0存入dat //将单片机检测到的电平信号DQ存入r[i] for(time=0;time<8;time++); //延时3us,两个读时序之间必须有大于1us的恢复期 } return(dat); //返回读出的十六进制数据 } /***************************************************** 函数功能:向DS18B20写入一个字节数据 入口参数:dat ***************************************************/ WriteOneChar(unsigned char dat) { unsigned char i=0; for (i=0; i<8; i++) { DQ =1; // 先将数据线拉高 _nop_(); //等待一个机器周期 DQ=0; //将数据线从高拉低时即启动写时序 DQ=dat&0x01; //利用与运算取出要写的某位二进制数据, //并将其送到数据线上等待DS18B20采样 for(time=0;time<10;time++) ;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样 DQ=1; //释放数据线 for(time=0;time<1;time++) ;//延时3us,两个写时序间至少需要1us的恢复期 dat>>=1; //将dat中的各二进制位数据右移1位 } for(time=0;time<4;time++) ; //稍作延时,给硬件一点反应时间 } /***************************************************** 函数功能:做好读温度的准备 ***************************************************/ void ReadyReadTemp(void) { Init_DS18B20(); //将DS18B20初始化 WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 delaynms(200); //转换一次需要延时一段时间 Init_DS18B20(); //将DS18B20初始化 WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位 } 4.2.2 DS1302时钟子程序 # include "SYSTEM.H" /*--------------------------------------------------------------*/ //#ifndef __DS1302_A_H__ //#define __DS1302_A_H__ /*--------------------------------------------------------------*/ //引脚及位的定义 sbit DS1302_CLK = P1^6; //时钟引脚 sbit DS1302_IO = P1^7; //数据引脚 sbit DS1302_RST = P1^5; //复位引脚 sbit ACC0 = ACC^0; sbit ACC7 = ACC^7; /*--------------------------------------------------------------*/ //函数声明 void DS1302_InputByte(unchar Data); //写入一个字节(内部函数) unchar DS1302_OutputByte(void); //读取一个字节(内部函数) void Write1302(unchar Address, unchar Data); //在指定地址写入指定的数据 unchar Read1302(unchar Address); //读取DS1302指定地址中的数据 void DS1302_SetProtect(bit Flag); //DS1302是否写入保护 void DS1302_SetTime(unchar Address, unchar Value);//设置时间函数 void DS1302_GetTime(SYSTEMTIME *Time); //读出时间 void DateToStr(SYSTEMTIME *Time); //日期转化成字符 void TimeToStr(SYSTEMTIME *Time); //时间转化成字符 void DS1302_Initial (void); //DS1302初始化 /*--------------------------------------------------------------*/ //写入一个字节(内部函数) void DS1302_InputByte(unchar Data) { unchar i; ACC = Data; for(i=8; i>0; i--) { DS1302_CLK = 0; DS1302_IO = ACC0; //由低位到高位 DS1302_CLK = 1; //上升沿写入数据 ACC >>= 1; } } /*--------------------------------------------------------------*/ //读取一个字节(内部函数) unchar DS1302_OutputByte(void) { unchar i; for(i=8; i>0; i--) { DS1302_CLK = 0; //下降沿读出DS1302的数据 ACC >>= 1; //读出由低到高位,只能移7次有效位!!! ACC7 = DS1302_IO; //第一个数据 DS1302_CLK = 1; } return (ACC); } /*--------------------------------------------------------------*/ //在指定地址写入指定的数据 void Write1302(unchar Address, unchar Data) { DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302_InputByte(Address); DS1302_InputByte(Data); DS1302_CLK = 1; DS1302_RST = 0; } /*--------------------------------------------------------------*/ //读取1302指定地址中的数据 unchar Read1302(unchar Address) { unchar Data; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; //RST拉高,启动数据传送 DS1302_InputByte(Address|0x01);//读取指定地址数据指令 Data = DS1302_OutputByte(); DS1302_CLK = 1; DS1302_RST = 0; return (Data); } /*--------------------------------------------------------------*/ //是否写入保护 void DS1302_SetProtect(bit Flag) { if(Flag) Write1302(0x8E,0x80); //0x8e控制字节地址,bit7=WP WP=1 禁止数据写入DS1302 else Write1302(0x8E,0x00); //WP=0 允许数据写入DS1302 } /*--------------------------------------------------------------*/ //设置时间函数 void DS1302_SetTime(unchar Address, unchar Value) { DS1302_SetProtect(0); Write1302(Address,((Value/10)<<4|(Value%10))); DS1302_SetProtect(1); } /*--------------------------------------------------------------*/ //读出时间 void DS1302_GetTime(SYSTEMTIME *Time) { unchar ReadValue; ReadValue = Read1302(DS1302_SECOND); Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0f); ReadValue = Read1302(DS1302_MINUTE); Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0f); ReadValue = Read1302(DS1302_HOUR); Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0f); ReadValue = Read1302(DS1302_DAY); Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0f); ReadValue = Read1302(DS1302_WEEK); Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0f); ReadValue = Read1302(DS1302_MONTH); Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0f); ReadValue = Read1302(DS1302_YEAR); Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0f); } /*--------------------------------------------------------------*/ //日期转化成字符 void DateToStr(SYSTEMTIME *Time) { Time->DateString[0] = Time->Year/10 + '0'; Time->DateString[1] = Time->Year%10 + '0'; Time->DateString[2] = '-'; Time->DateString[3] = Time->Month/10 + '0'; Time->DateString[4] = Time->Month%10 + '0'; Time->DateString[5] = '-'; Time->DateString[6] = Time->Day/10 + '0'; Time->DateString[7] = Time->Day%10 + '0'; Time->DateString[8] = '\0'; } /*--------------------------------------------------------------*/ //时间转化成字符 void TimeToStr(SYSTEMTIME *Time) { Time->TimeString[0] = Time->Hour/10 + '0'; Time->TimeString[1] = Time->Hour%10 + '0'; Time->TimeString[2] = ':'; Time->TimeString[3] = Time->Minute/10 + '0'; Time->TimeString[4] = Time->Minute%10 + '0'; Time->TimeString[5] = ':'; Time->TimeString[6] = Time->Second/10 + '0'; Time->TimeString[7] = Time->Second%10 + '0'; Time->TimeString[8] = '\0'; } /*--------------------------------------------------------------*/ //初始化DS1302 void DS1302_Initial (void) { unchar Second=Read1302(DS1302_SECOND); if(Second&0x80)//bit7=CH CH=0 振荡器允许工作,CH=1振荡器停止工作 DS1302_SetTime(DS1302_SECOND,0); } /*--------------------------------------------------------------*/ //#endif 第5章 指标测试 5.1 测试仪器 序号 名称 1 PC机 2 电源 3 通用单片机仿真器 4 数字万用表 5 ISP在线编程器 5.2 软件测试 电子万年历是多功能的数字型,可以看当前日期,时间,还有温度的仪器。电子万年历功能很多,所以对于它的程序也较为复杂,因而在编写程序和调试时出现了相对较多的问题。最后经过多次的模块子程序的修改,一步一步的完成,最终解决了软件问题。在软件的调试过程中主要遇到的问题如下: (1)烧入程序后,LCD液晶显示温度成乱码。 解决:。 (2)加入温度的程序后,进行修改时间、日期时相应的显示位没有按要求闪动。 解决:由于DS18B20是串行通信数据,只用一个口线传输,在处理采集的模拟信号时需要一定的时间,当把万年历的程序相接入时,会对延时有很大的影响。所以在调用温度子程序时,先关闭定时器1中断允许,在温度子程序反回时再打开定时器1中断允许。最终解决了此问题。 4.3 硬件测试 电子万年历的电路系统较大,对于焊接方面更是不可轻视,庞大的电路系统中只要出现一处错误,则会对检测造成很大的不便,而且电路的交线较多,对于各种锋利的引脚要注意处理,否则会被带有包皮的导线碰到,会对电路造成短路现象。 在本电子万年历的设计调试中遇到了很多的问题。回想这些问题只要认真多思考都是可以避免的,以下为主要的问题: (1) (2) 5.4 测试结果分析与结论 5.4.1 测试结果分析 (1)在测试中遇到发光二极管、LED数码管为不显示时,首先使用试测仪对电路进行测试,观察是否存在漏焊,虚焊,或者元件损坏. (2)LED 数码管显示不正常,还有亮度不够,首先使用试测仪对电路进行测试,观察电路是否存在短路现象或者是功率放大的不够。查看烧写的程序是否正确无误,对程序进行认真修改。 第6章 总结 初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf 在整个设计过程中,充分发挥主观能动性,自主学习,学到了许多之前没学到的知识。较好的完成了作品。达到了预期的目的,在最初的设计中,发挥“三个臭皮匠,顶个诸葛亮”的作用。向周围的同学学习,并与他们讨论研究,完成了最初的设想。在电路焊接时虽然没什么大问题,但从中也知道了焊接在整个作品中的重要性,电路工程量大,不能心急,一个个慢慢来不能急于求成。反而达到事半功倍的效果。对电路的设计、布局要先有一个好的构思,才显得电路板美观、大方。程序编写中,由于思路不清晰,开始时遇到了很多的问题,经过静下心来思考,和同学的讨论,理清了思路,反而得心应手。在此次设计中,知道了做任何事都要有一颗平常的心,不要想着走捷径,千里之行始于足下,一步一脚印,才能最终成功。也练就了我的耐心,做什么事都在有耐心。此次设计中学到了很多很多东西,这是最重要的。总之,这次毕业设计对我来说收获颇多。 参考文献 1.张鑫 编 单片机原理及应用【M】 电子工业出版社 2010 2.肖婧 编 单片机系统设计与仿真—基于Proteus【M】 北京航空航天大学出版社 2010 3.常敏 王涵 范红波 等编 51单片机应用程序开发与实践【M】 电子工业出版社 2009 4.杨子文 编 单片机原理及应用【M】 西安电子科技大学出版社 2006 4.王法能 编 单片机原理及应用 科学出版社 2004 6.曹琳琳.单片机原理及接口技术【M】.北京:国防科技大学出版社,2000年. 7.许惠民.单片微型计算机原理、接口及应用【M】. 北京:北京邮电大学出版社,2000年. 8.康华光.电子技术基础【M】.北京:高等教育出版社,2001年. 袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈 芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈 AT89S52 主控制模 块 键盘模块 DS18B20温度采集模块 LCD液晶显示模块 DS1302时钟模块 否 是 是 是 是 否 是 是 否 否 是 是 否 否 否 增加 停止 否 _1398964948.unknown _1398976952.unknown _1399008865.unknown _1399031026.vsd � � 开始 初始化LCD�  初始化内部定时器� 初始化DS1302� 从DS1302读取日期和时间� 移动光标并显示日期� 移动光标并显示时间� 显示温度� 重复进行按键扫描� 结束� _1399034733.vsd � � Mode键是否按下� 将mode按键次数存放 于变量mode_num中� mode_num=3?� mode_num=2?� mode_num=1?� mode_num=4?� mode_num=5?� mode_num=7?� mode_num=6?� 移动光标,并返回� _1399036892.vsd � � 判断是否为 修改模式� 判断是否 为加一键� 判断num=1?� 转减一键程序� 判断num=2?� 判断num=3?� 修改year值,并返回� 修改mouth值,并返回� 修改day值,并返回� 修改秒值,并返回� 修改分值,并返回� 修改小时值,并返回� 否 是 是 判断num=6?� 判断num=5?� 判断num=4?� 否 否 否 是 是 是 否 是 是 是 否 否 _1399032212.vsd � � � 是否调用时间获取子 程序DS1302_GetTime� 调用Read1302函数,读取各个时间 参数,并存放于ReadValue变量中� 对ReadValue数据进行转换,转换 成十进制数,并赋给Time指针中。� 调用年份转换成可供lcd显示的 字段子程序DateToStr� 时间转换成可供lcd显示的字段 子程序TimeToStr� 结束� _1399011476.unknown _1398976989.unknown _1398977006.unknown _1398976972.unknown _1398976880.unknown _1398976917.unknown _1398976933.unknown _1398976899.unknown _1398974853.vsd � 斜率累加器 预置� 计数比较器� 减法计数器1� 低温度系数晶振� 减到0� 预置� 温度寄存器� 减到0� 减法计数器2� 高温度系数晶振� _1398976852.unknown _1398976865.unknown _1398976832.unknown _1398964998.unknown _1398864660.unknown _1398864752.unknown _1398864799.unknown _1398864704.unknown _1398863658.unknown _1398864619.unknown _1398864584.unknown _1397715289.unknown _1397976161.unknown _1397715185.unknown
本文档为【基于单片机的万年历的设计与制作】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
北溟愚鱼
暂无简介~
格式:doc
大小:1010KB
软件:Word
页数:0
分类:工学
上传时间:2018-09-22
浏览量:11