配色: 字号:
多功能电子保姆机的设计与实现
2022-04-18 | 阅:  转:  |  分享 
  






本科生毕业设计说明书(毕业论文)







题目:多功能电子保姆机的设计与实现

—硬件设计

学生姓名:

学号:

专业:

班级:

指导教师:

多功能电子保姆机的设计与实现—硬件部分

摘要关键词:;;

Multi-functionalelectronicnannyMachineDesignand

Implementation-TheDesignoftheHardware

Abstract

Withtheacceleratedpaceoflife,thedemandfornanniessociety.Ifaintelligentnannymachineisdesigned,itwillbringmoreconveniencefor

people''slife.Atpresent,thenannymachinewhichisonthesaleinthemarketisalmostmechanical,hasasinglefunction,andcontrolshouseholdappliancescanaccordingtothesettingtimeonlythroughthepower.ThispaperintroducestheresearchbackgroudofthenannymachineandusestheSCMdesignschemethroughcomparing555designscheme,FPGAdesignschemeandSCMdesignscheme.Inthispaper,thenannymachine,whichisdesignedthroughusingelectrontechnology,hasmanyfunctions.ItnotonlycancontroltheHouseholdappliancesfromtimetotime,butalsocandisplaytime,temperatureandsoon.ThisdesigncompletesthehardwareandsoftwareoftheelectronicnannyMachine,debuggesapartoffunctionsontheboardandrealizesthebasicfunctionoftheelectronicnannyMachine.

ThedesignusesAtmega128asacore,controlshomeappliancesfromtimetotimethroughtheworkoftherelay,completesthebasicfunctionofclock/calendarthroughusingtheDS1302real-timeclock,measuresambienttemperaturebyusingtemperaturesensorDS18B20,andusesfourLEDdigitaltubefordisplaying.Themachinecanbeappliedtothelifeandwork,canalsobemodifiedtoimproveperformance,andcanbeaddednewfunctionssothatitbringsmoreconveniencetothepeople''slifeandwork.











KeyWord:nannymachine;;temperaturesensor;relay;



摘要 I

第一章引言 1

1.1多功能电子保姆机研究的背景和意义 1

1.2电子保姆机的功能 2

第二章电子保姆机设计方案分析 3

2.1FPGA设计方案 3

2.2NE555时基电路设计方案 3

2.3单片机设计方案 4

第三章基于单片机的电子保姆机硬件设计 6

3.1单片机的选择 7

3.1.1AVR单片机简介 7

3.1.2ATMEGA128特点 7

3.2时钟日历芯片DS1302 9

3.2.1DS1302简介 9

3.2.2DS1302引脚说明 10

3.2.3DS1302控制字和读写时序说明 10

3.2.4DS1302片内寄存器 12

3.3环境温度传感器选择 13

3.3.1常用温度传感器比较 13

3.3.2DS18B20简介 14

3.3.3DS18B20内部结构 15

3.4电子保姆机硬件电路设计 17

3.4.1时钟电路设计 17

3.4.2环境温度采集电路设计 17

3.4.3显示电路 17

3.4.4按键电路设计 19

3.4.5闹铃电路设计 20

3.4.6继电器控制电路设计 21

3.4.7温度报警电路设计 22

第四章电子保姆机软件设计 23

4.1主程序设计 23

4.2子程序设计 23

4.2.1实时时钟日历子程序设计 23

4.2.2环境温度采集子程序设计 24

4.2.3显示子程序设计 27

4.2.4闹铃控制子程序设计 28

4.2.5继电器子程序设计 28

第五章系统调试 29

5.1硬件调试 29

5.1.1单片机基础电路调试 29

5.1.2显示电路调试 30

5.1.3DS1302电路调试 33

5.1.4继电器控制电路调试 33

5.1.5DS18B20电路调试 33

5.1.6温度报警电路调试 34

5.2软件调试 34

结论 35

参考文献 36

附录A程序 37

附录B多功能电子保姆机硬件电路图 49

致谢 50

引言研究背景

20世纪末,电子技术获得了飞速的发展在其推动下,现代电子产品几乎渗透了社会的各个领域,有力推动提高了社会生产力的发展信息化程度,同时也使现代电子产品性能进一步,产品更新换代的节奏也越来越快。对人们来说,工作的忙碌性和繁杂容易使人忘记当前的时间。经常出差或偶尔出门,这时一回到家就想洗热水澡,如果一直开着热水器会不停地加热,即不安全又费电,,手表当然是一个好的选择,但是,所以,一个定时系统随时提醒容易忘记时间的人。电子保姆机是通过电子钟采用电路实现对时分秒数字显示的计时装置广泛用于个人家庭车站码头办公室等公共场所成为人们日常生活中不可少的必需品由于数字集成电路的发展和石英晶体振荡器的广泛应用使得数字钟的精度,远远超过老式钟表钟表的数字化给人们生产生活带来了极大的方便而且大大地扩展了钟表原先的报时功能诸如定时自动报警按时自动打铃定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等所有这些都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。

电子保姆机是利用电子时钟精确计时定时的特点,继电器控制电器定时开关,以达到无人看管却能自动看护的“保姆”装置。拥有时间精确、体积小、界面友好、可扩展性能强等特点,可广泛应用于生活和工作当中。

本设计电子保姆机所实现主要功能为:

(1)家用电器定时开关,控制家用电器;

(2)具有时间显示,24小时制;

(3)具有年、月、日显示;

(4)具有闹铃功能;

(5)具有环境温度采集和显示功能;

(6)掉电后无需重新设置时间和日期;

(7)温度报警。

电子保姆机设计方案分析

电子保姆机是通过扩展电子钟的功能而形成的,其核心就是数字化的电子钟、通过读取电子钟的时间和设定时间相比较,继电器控制家用电器定时工作。电子保姆机既可以通过纯硬件实现,也可以通过软硬件结合实现,其实现方案有多种,但通常有以下几种形式:

FPGA设计方案

现场可编程门阵列(FieldProgrammableGateArray,FPGA),是20世纪70年代发展起来的一种可编程逻辑器件,是目前数字系统设计的主要硬件基础。FPGA在结构上由逻辑功能块排列为阵列,并由可编程的内部连线连接这些功能块,来实现一定的逻辑功能。

可编程逻辑器件的设计过程是利用EDA开发软件和编程工具对器件进行开发的过程。由于EDA技术拥有系统的模拟和仿真功能,可读性、可重复性、可测性非常好,所以利用EDA开发FPGA是目前比较流行的方式。当然,有时根据需要,也会应用MAX+plus开发集成环境进行设计【2】。

正因为FPGA在设计过程中方便、快捷,而且FPGA技术功能强大,能够应用其制作诸如基代码发生器、数字频率计、电子琴、电梯控制器、自动售货机控制系统、多功能波形发生器、步进电机定位控制系统等。

NE555时基电路设计方案

555定时器是美国Signetics公司1972年研制的用于取代机械式定时器的中规模集成电路,因输入端设计有三个5Ω的电阻而得名。目前,流行的产品主要有4:BJT两个:555,556(含有两个555);CMOS两个:7555,7556(含有两个7555)。555定时器是一种数字与模拟混合型的集成电路,应用广泛。外加电阻、电容等元件可以构成多谐振荡器单稳电路施密特触发器等常作为定时器广泛应用于仪器仪表、家用电器、电子测量及自动控制等。式(2.1)

可通过调节式2.1中的3个参数,使输出V0的频率为精确的1Hz。



图2.1基于555的秒脉冲发生器



采用555定时器设计电子保姆机,成本低,容易实现。但是受芯片引脚数量和功能限制,不容易实现电子保姆机的多功能性。

单片机设计方案

单片机是微型机的一个主要分支,它在结构上的最大特点使把CPU、存储器、定时器和多种输入/输出接口电路集成在一块超大规模集成电路芯片上。就其组成和功能而言,一块单片机芯片就是一台计算机。

单片机具有如下特点:

(1)有优异的性能价格比;

(2)集成度高、体积小、有很高的可靠性;

(3)控制功能强;

(4)低功耗、低电压,便于生产便携式产品;

(5)外部总线增加了I2C、SPI等串行总线方式,进一步缩小了体积,简化了结构;

(6)单片机的系统扩展、系统配置较典型、规范,容易构成各种规模的应用系统。

所以单片机的应用非常广泛,在智能仪表、机电一体化、实时控制、分布式多机系统以及人们的生活中均有用武之地。单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思路和设计方法。从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。这种用软件代替硬件的控制技术,是对生产控制技术的一次革命。

利用单片机的智能性,可方便地实现具有智能的电子保姆机设计。单片机均具有时钟振荡系统,利用系统时钟借助微处理器的定时器/计数器可实现电子保姆机功能。然而系统时钟误差较大,电子钟的积累误差也可能较大,所以可以通过误差修正软件加以修正,或者在设计中加入高精度时钟日历芯片,以精确时间。另外很多功能不同的单片机是兼容的,这就更便于实现产品的多功能性。











基于单片机的电子保姆机硬件设计

在比较了以上的三种实现方案之后,考虑单片机货源充足、价格低廉,可软硬件结合使用,能够较方便的实现系统的多功能性,故采用单片机作为本设计的硬件基础。

电子保姆机包括时钟日历芯片电路、显示电路、按键电路、供电电源、闹铃电路、继电器控制电路等几部分。另外,本设计要求该电子保姆机能够采集环境温度,所以还需要温度采集电路【3】。硬件电路框图参照图3.1。

该系统使用ATmega128单片机作为核心,通过读取时钟日历芯片DS1302和温度传感器DS18B20的数据,继电器定时控制家用电器工作,完成此电子保姆机的主要功能——时钟/日历、环境温度采集以及家用电器定时工作等。使用比较通用的4位8段共阳LED数码管,做4位显示,分别显示时间、日期、年200X,以及环境温度值【4】。





图3.1多功能电子保姆机硬件系统框图



键盘是为了完成时钟/日历的校对和日历/温度的显示功能。继电器作为家用电器定时开关,控制家用电器工作。此电子保姆机还具有闹铃功能,所以设计有闹铃电路,进行声音响铃。

整个电路使用了两种电源,+5V电源将为整个电路供电。而+3V电源仅作为DS1302的备用电源。当+5V电源被切断后,DS1302启用+3V电源,可以保持DS1302继续工作。当+5V电源恢复供电,LED依旧显示当前时间,而不会因为断电使系统复位到初始化时间,避免了重新校时的麻烦。

具体电路图请参见附录A。

单片机的选择

AVR单片机简介

所谓单片机,是指用一个芯片组成的微机系统。片内包括了CPU,程序存储器、数据存储器、定时器/计数器及各种I/O口。

AVR单片机是ATMEL公司1997年推出的全新配置精简指令集(RISC)单片机系列。片内程序存储器采用Flash存储,可反复编程修改上千次,便于新产品开发;程序高度保密,避免非法窃取;速度快,大多数指令只用1个晶振周期,而MCS-51单片机单周期指令也需12个晶振周期;能采用C语言编程,从而高效快速的开发目标产品。本设计选用ATMEGA128,ATMEGA128为基于AVRRISC结构的8位低功耗CMOS微处理器。

ATMEGA128特点

(1)高性能、低功耗的AVR8位微处理器;

(2)I/O和封装

–53个可编程的I/O脚;

–64引脚TQFP与64引脚MLF封装;

(3)工作电压:4.5~5.5V(ATmega128);

(4)速度等级:0~16MHz(ATmega128);

(5)32个工作寄存器;

(6)16根地址线PAPC;

(7)8根数据线PA。

ATmega128的引脚配置如图3.2所示:



图3.2Atmega128芯片引脚图

各引脚说明如下:

VCC:数字电路的电源;

GND:地;

端口A(PA7-PA0):端口A为8位双向I/O口,并具有可编程的内部上拉电阻。其输出缓冲

器具有对称的驱动特性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使

能,则端口被外部电路拉低时将输出电流。复位发生时端口A为三态,端口A也可以用做

其他不同的特殊功能。

端口B(PB7-PB0):端口B为8位双向I/O口,并具有可编程的内部上拉电阻。其输出缓冲

器具有对称的驱动特性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使

能,则端口被外部电路拉低时将输出电流。复位发生时端口B为三态。

端口C(PC7..PC0):端口C为8位双向I/O口,并具有可编程的内部上拉电阻。其输出

缓冲器具有对称的驱动特性,可以输出和吸收大电流。作为输入使用时,若内部上拉电

阻使能,则端口被外部电路拉低时将输出电流。复位发生时端口C为三态。

端口D(PD7-PD0):端口D为8位双向I/O口,并具有可编程的内部上拉电阻。其输出缓

冲器具有对称的驱动特性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻

使能,则端口被外部电路拉低时将输出电流。复位发生时端口D为三态。

端口E(PE7-PE0):端口E为8位双向I/O口,并具有可编程的内部上拉电阻。其输出缓冲

器具有对称的驱动特性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使

能,则端口被外部电路拉低时将输出电流。复位发生时端口E为三态。

端口F(PF7-PF0):端口F为ADC的模拟输入引脚。如果不作为ADC的模拟输入,端口F

可以作为8位双向I/O口,并具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱

动特性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使能,则端口被外

部电路拉低时将输出电流。复位发生时端口F为三态。如果使能了JTAG接口,则复位

发生时引脚PF7(TDI)、PF5(TMS)和PF4(TCK)的上拉电阻使能。端口F也可以作为JTAG

接口。

端口G(PG4-PG0):端口G为5位双向I/O口,并具有可编程的内部上拉电阻。其输出缓冲

器具有对称的驱动特性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使

能,则端口被外部电路拉低时将输出电流。复位发生时端口G为三态。在ATmega103兼

容模式下,端口G只能作为外部存储器的所存信号以及32kHz振荡器的输入,并且在

复位时这些引脚初始化为PG0=1,PG1=1以及PG2=0。PG3和PG4是振荡器引脚。

RESET:复位输入引脚。超过最小门限时间的低电平将引起系统复位。低于此时间的脉

冲不能保证可靠复位。

XTAL1:反向振荡器放大器及片内时钟操作电路的输入。

XTAL2:反向振荡器放大器的输出。

AVCC:AVCC为端口F以及ADC转换器的电源,需要与VCC相连接,即使没有使用ADC也应

该如此。使用ADC时应该通过一个低通滤波器与VCC连接。

AREF:AREF为ADC的模拟基准输入引脚。

PEN:PEN是SPI串行下载的使能引脚。在上电复位时保持PEN为低电平将使件进入SPI

串行下载模式。在正常工作过程中PEN引脚没有其他功能。

时钟日历芯片DS1302

常用的实时时钟芯片有DS12887、DS1216、DS1643、DS1302。每种芯片的主要时钟功能基本相同,只是在引脚数量、备用电池的安装方式、计时精度和扩展功能等方面略有不同。DS12887与DS1216芯片都有内嵌式锂电池作为备用电池;X1203引脚少,没有嵌入式锂电池,跟DS1302芯片功能相似,只是相比较之下,X1203与ATmega128搭配使用时占用I/O口较多。DS1643为带有全功能实时时钟的8K×8非易失性SRAM,集成了非易失性SRAM、实时时钟、晶振、电源掉电控制电路和锂电池电源,BCD码表示的年、月、日、星期、时、分、秒,带闰年补偿。同样,DS1643拥有28只管脚,硬件连接起来占用微处理器I/O口较多,不方便系统功能拓展和维护。故而从性价比和货源上考虑,DS1302芯片读写靠时序控制且具有写保护位,抗干扰效果好,故本设计采用实时时钟日历芯片DS1302。

DS1302简介

DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后电源进行涓细电流充电的能力。DS1302引脚说明



图3.3DS1302芯片引脚图



其的引脚功能参照表3.1。



表3.1DS1302引脚功能说明

引脚号 名称 功能 1 VCC1 备份电源输入 2 X1 32.768KHz晶振输入 3 X2 32.768KHz晶振输出 4 GND 地 5 RST 复位 6 I/O 数据输入/输出 7 SCLK 串行时钟 8 VCC2 主电源输入

DS1302控制字和读写时序说明

在编程过程中要注意DS1302的读写时序。DS1302是SPI总线驱动方式。它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。要想与DS1302通信,首先要先了解DS1302的控制字。DS1302的控制字如控制字(即地址及命令字节)

控制字的作用是设定DS1302的工作方式、传送字节数等。每次数据的传输都是由控制字开始。控制字各位的含义和作用如下:

BIT7:控制字的最高有效位必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。

6:如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;

5至1(A4~A0):~~~~~~~~0(最低有效位):如为0,表示要进行写操作,为1表示进行读操作。

控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位。

图3.4DS1302数据读写时序。DS1302有关日历、时间寄存器 0 10 时 时 1-12

0-23 AM/PM 87H 86H 0 0 10日 日 1-31 89H 88H 0 0 10月 月 1-12 8BH 8AH 0 0 0 0 0 周日 1-7 8DH 8CH 10年 年 00-99 8FH 8EH WP 0 0 0 0 0 0 0 —

通过控制字对DS1302片内寄存器进行寻址之后,即可就所选中寄存器的各位进行操作。片内各寄存器及各位的功能定义如表3.3。

DS1302共有12个寄存器:与日历、时间的寄存器共有1个,其中小时寄存器(85、84)的位7用于定义DS1302是运行于12小时模式还是24小时模式。当为12小时时,位5在小时,位5是第二个10小时位~。?秒寄存器(81、80)的位7定义为时钟暂停标志(CH)。当该位置为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位置为0时,时钟开始运行。控制寄存器(8F、8E)的位7是写保护位(WP),其它7位均置为0。在任何时钟和RAM写操作之前,WP位必须为0当WP位为1时,写保护位防止对任一寄存器的写操作。~Ω,RS=10为4KΩ,RS=11为8KΩ,而RS=00将不允许进行充电。因此,根据慢速充电寄存器的不同编码可得到不同的充电电流。其具体计算如公式3.1:

I充电=(V0-VD-VE)/R(3.1)

式中:

V0——所接入的5.0V工作电压;

VD——二极管压降,一个按0.7V计算;

R——慢速充电控制寄存器0和1位编码决定的电阻值;

VE——VCC1脚所接入的电池电压。

RAM寄存器寻址空间一次排列的31字节静态RAM可为用户使用,备用电源位RAM提供了掉电保护功能。寄存器和RAM的操作通过命令字节的BIT6加以区别。当BIT6为“0”时对RAM区进行寻址;否则将对时钟/日历寄存器寻址。其操作方法与前述相同。具体程序见。~~~

图3.5DS18B20引脚分布图



每片DS18B20在出厂时都设有唯一的产品序列号,此序列号存放在它的内部ROM中,微处理器通过简单协议,就能识别这些序列号,因此多个DS18B20可以挂接于同一条单总线上,这允许在许多不同的地方放置温度传感器,特别适合于构成多点温度测控系统。

DS18B20的引脚分布如图3.5,管脚功能描述参见表3.5。

表3.5DS18B20引脚功能描述

序号 名称 引脚功能描述 1 GND 地信号 2 DQ 数据输入/输出引脚;开漏单总线接口引脚;当被用在寄生电源下,也可以向器件提供电源。 3 VDD 可选择的VDD引脚;当工作于寄生电源时,此引脚必须接地。

3.3.3DS18B20内部结构

DS18B20的内部结构如图3.5所示。主要由4部分组成:64位ROM温度传感器、非易失性温度报警触发器TH和TL、配置寄存器【6】。



图3.6DS18B20内部结构图



配置寄存器为高速暂存存储器中的第5个字节。DS18B20在工作时按此寄存器中的分辨率将温度转换成相应精度的数值,其各位定义如表3.6所示。其中,TM为测试模式标志位,出厂时被写入“0”,不能改变;R0、R1是温度计分辨率设置位。其对应四种分辨率如表3.7所示,出厂时R0、R1被置为“1”,默认设置是12位分辨率,用户可根据需要给写配置寄存器以获得合适的分辨率。



表3.6DS18B20配置寄存器结构表

BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0 TM R1 R0 1 1 1 1 1 MSBLSB



温度信息的低位、高位字节内容还包括了符号位S(是正温度还是负温度)和二进制小数部分,其具体形式如图3.7。

表3.7配置寄存器与分辨率关系表

R0 R1 温度计分辨率/bit 最大转换时间/ms 0 0 9 93.75 0 1 10 187.50 1 0 11 375 1 1 12 750





图3.7DS18B20温度值格式表



这是12位分辨率的情况,如果配置为低分辨率,则其中无意义位为“0”。

在DS18B20完成温度变换之后,温度值与存储在TH和TL内的告警触发值相比较。由于这些是8位寄存器,所以9~

图3.8系统时钟电路



特别需要注意X1和X2两端连接的晶振Y0,该晶振频率为32.768KHz。

3.4.2环境温度采集电路设计

本设计中使用DS18B20温度传感器进行环境温度采集和转化。如图3.9所示,ATmega128单片机的PB3脚接DS18B20的I/O脚,作为数据的读入和写出口。选4.7K的电阻作为DS18B20的I/O口的上拉电阻,在读数据结束时,I/O引脚将通过此上拉电阻拉回至高电平。



图3.9系统环境温度采集电路



3.4.3显示电路

LED数码显示是一种由LED发光二极管组合显示字符的显示器件。它使用了8段LED发光二极管,其中7个用于显示字符,1个用于显示小数点,故通常称之为7段(也有称作8段)发光二极管数码显示器。其内部结构如图3.10所示。



图3.10LED数码管内部结构图



1、LED数码显示器有两种连接方法:

共阳极接法:把发光二极管的阳极连在一起构成公共阳极,使用时公共阳极接+5V,每个发光二极管的阴极通过电阻与输入端相连。

共阴极接法:把发光二极管的阴极连在一起构成公共阴极,使用时公共阴极接地。每个发光二极管的阳极通过电阻与输入端相连。

为了显示字符,要为LED显示器提供显示段码(或称字形代码),组成一个“8”字形字符的7段,再加上1个小数点位,共计8段,因此提供给LED显示器的显示段码为1个字节。各段码位的对应关系如下:



表3.8数字、字母与7段代码关系表

字型 共阳极段码 共阴极段码 字型 共阳极段码 共阴极段码 0 C0H 3FH 9 90H 6FH 1 F9H 06H A 88H 77H 2 A4H 5BH b 83H 7CH 3 B0H 4FH C C6H 39H 4 99H 66H d A1H 5EH 5 92H 6DH E 86H 79H 6 82H 7DH F 84H 71H 7 F8H 07H 空白 FFH 00H 8 80H 7FH P 8CH 73H

2、单片机与LED数码显示器有以硬件为主和以软件为主的两种接口方法。

硬件接口方法:LED数码管与译码器相连,通过硬件译码。

软件接口方法:它是以软件查表代替硬件译码,不但省去了译码器,而且还能显示更多的字符。但是驱动器是必不可少的,因为仅靠接口提供不了较大的电流供LED显示器使用。对于以软件为主的接口电路来说,其显示方法有静态显示和动态显示两种。

动态显示:如果要在同一时刻显示不同的字符,从电路上看,这是办不到的。因此只能利用人眼对视觉的残留效应,采用动态扫描显示的方法,逐个地循环点亮各位数码管,每位显示1ms左右,使人看起来就好象在同时显示不同的字符一样。在进行动态扫描显示时,往往事先并不知道应显示什么内容,这样也就无从选择被显示字符的显示段码。为此,一般采用查表的方法,由待显示的字符通过查表得到其对应的显示段码。这种方式耗电少、硬件成本低,但需占用较多的CPU时间,故在工业控制中应用较少。

静态显示:所谓静态显示,就是在同一时刻只显示1种字符,或者说被显示的字符在同一时刻是稳定不变的。其显示方法比较简单,就是利用锁存器将各显示单元锁定,直到更新显示内容为止。它的优点是软件不必动态扫描,送出段码后可锁存,直到需更改显示字符,软件简单,占用CPU时间较少,工作可靠,同时由于始终保持显示而亮度较好。由于本系统需要对控制信号进行实时操作,故采用静态显示方式以减少CPU的负担。

本设计采用动态显示。由单片机PA口给出待显示数据的笔段码,PE0~PE3给出位选码。循环点亮各个LED数码管。电路图参见图3.11。





图3.11显示面板LED分布图



3.4.4按键电路设计

矩阵式按键键盘使用于按键数量较多的场合,它由行线和列线组成,也称行列式键盘,按键位于行、列的交叉点上,其结构如图3.12所示。本键盘2、4的行、列结构可以构成一个含有8个按键的键盘,与独立式相比,要节省很多的I/O端口。



图3.12键盘电路



其工作原理:按键设置在行、列线交点上,行、列分别连接按键开关的两端。

按键功能说明如下:

Key11:校对选择键。

根据按键按下的次数依次校对分、时、日、月、年。

Key12:显示选择键。

当此按键没有按下时,显示小时和分;当按下一次按键时,显示月和日,第二次按键按下后显示年200X;再次按下按键时显示温度。

Key13:设定键。

设定闹钟时间和电器开关时间、报警温度。

Key23:设定选择键。

设定闹钟时间和电器开关时间选择。

Key21:闹钟开关键。

Key22:确认键。

当校对时间、设定时间和温室度时按下此键便确认校对和设定的值。

Key14:加1按键。

校对和设定时按下此键,值加1。

Key24:减1按键。

校对和设定时,按下此键,值减1。

3.4.5闹铃电路设计

闹铃电路如图3.13所示。蜂鸣器接在单片机的PC6引脚上,并由一个三极管作放大,当时间到达设定的闹铃时间时,PC6给出高电平使三极管导通,蜂鸣器发出声音,PC6给出低电平,蜂鸣器不发音。闹铃电路如图3.13。



图3.13闹铃电路



3.4.6继电器控制电路设计

继电器意思:继承控制,用很小的电力和电流,驱动一个设备()带动一个负载部件去承载大电流自动调节、安全保护、转换电路等作用HRS4HSDC5V

HRS4HSDC5V特点

最大通断电压:30VDC/250VAC

最大通断电流:10A

线圈电压:5V

工作环境.温度范围:-40-+85℃

吸合时间:最大10ms

释放时间:最大5ms

当PC7引脚输出“1”时,NPN三极管导通,继电器吸合,灯泡发亮。当PC7引脚输出“0”时,三极管截止,继电器释放,灯泡灭。继电器控制电路如图3.14

由于AVR的I/O不能提供大的驱动电流,因此在外围硬件电路中要考虑使用功率驱动电路。

图3.14继电器控制电路



3.4.7温度报警电路设计

本设计中温度报警采用发光二极管发光,当温度超过程序设定值时,PB5发出高电平信号,发光二极管开始闪烁。



图3.15温度报警电路设计



电子保姆机软件设计

ATmega128单片机可以应用汇编语言和C语言进行编程。,汇编语言与机器指令一一对应所以用汇编语言编写的程序在单片机里运行起来效率较高。C语言程序可读性高,更便于理解【10】。

本设计使用C语言编程。

主程序设计

第一次上电,系统先进行初始化,LED显示初始时间“21:00”,并开始走时。初始年为“2009”,初始月、日为“0504”。

单片机端口初始化,依次开始调用DS1302子程序、DS18B20子程序、显示子程序、按键子程序、闹铃子程序,继电器子程序、温度报警子程序,返回程序开头循环运行【11】。

主程序流程图如图4.1。



图4.1多功能电子钟主程序流程图



子程序设计

实时时钟日历子程序设计

该程序主要实现对DS1302写保护,对年、月、日、时、分、秒等寄存器的读写操作。因为在串行通信时对时序要求比较高,所以在通信过程中最好保证传输的连续性,不要允许中断。其流程图如图4.2。



图4.2实时时钟日历子程序流程图



DS1302每次上电时自动处于暂停状态,必须把秒寄存器的位7置位0,时钟才开始计时。如果DS1302一直没有掉电,则不存在此问题。

在进行写操作时,需要先解除写保护寄存器的“禁止”状态。当用多字节模式进行操作时,必须写够8字节。

源程序见附录A。

环境温度采集子程序设计

DS18B20是1—wire单线器件,它在一根数据线上实现数据的双向传输,这就需要一定的协议来对读写数据提出严格的时序要求。

主机操作单线器件DS18B20必须遵循下面的顺序。

初始化

单线总线上的所有操作均从初始化开始。初始化过程如下:主机通过拉低单线480μs以上,产生复位脉冲,然后释放该线,进入RX接收模式。主机释放总线时,会产生一个上升沿。单线器件DS18B20检测到该上升沿后,延时15~~~

图4.3环境温度采集子程序流程图



首先了解写时隙。当主机将数据线从高电平拉至低电平时,产生写时隙。有2种类型的写时隙:写“1”和写“0”。所有写时隙必须在60μs以上(即由高拉低后持续60μs以上),各个写时隙之间必须保证最短1μs的恢复时间。DS18B20在DQ线变低后的15~4个共阳极的LED数码管来选择显示时间、日期、年份和温度,PA口输出笔段码,PE口的低四位输出位选码【12】。

显示子程序流程图见图4.4,源程序见附录A。



图4.4显示子程序流程图



采用数码管动态扫描方式,在任何时刻,PE0-PE3中只能有一个I/O口输出高电平,即只有一个数码管亮。而且,单片机必须循环轮流控制PE0-PE3中的一位输出“1”,同时PA口要输出该位相应的段码值。即使显示的内容没有变化,单片机也要进行不停的循环扫描处理。

闹铃控制子程序设计

闹铃子程序最主要的任务是当设定的闹铃时间和当前时间相同时,闹铃响。响铃一分钟之后自动停止。

源程序见附录A



图4.5闹铃子程序流程图



继电器子程序设计

继电器子程序设计是根据设定家用电器开关时间与当前时间是否相同,如果时间相同,继电器控制电炉子程序流程图见图4.6家用电器开始工作【13】。





图4.6继电器子程序流程图

系统调试

本设计调试工作分硬件调试和软件调试两部分,调试方法介绍如下:

首先,硬件调试主要是先搭建硬件平台,用PROTLE画出硬件原理图,然后利用万用表等工具对电路板检查,检查各个引脚是否相互对应,每根数据线能否正常导通,最后应用程序进行功能调试。硬件调试比较费时,需要细心和耐心,也需要熟练掌握电路原理。

然后,可以直接应用一些编辑或仿真软件进行软件调试,比如单片机ATmega128编辑软件icc。通过编译、运行,可以检查程序错误。在软件调试过程中要仔细耐心,即便是多写或少些一两个字符,都无法编译成功。而有时往往在icc中编译、运行无错,通过AVRFIGHTER烧录单片机,但烧录到单片机中运行起来就会出错,很可能是编程时管脚、时序编辑得不对、数据线有问题或把时钟芯片拔下来重新插到管脚上,都可以解决问题。

总之,调试过程是一个软硬件相结合调试的过程,硬件电路是基础,软件是检测硬件电路和实现其功能的关键【14】。

在调试过程中,首先必须明确调试顺序。例如:本设计是在单片机系统基础上建立起来的,所以必须先确定单片机基础电路能否正常工作。为了正确显示时间,接下来还要确定显示电路能否正常工作。硬件调试的过程,也是软件调试的过程。

然后,要准备好调试的工具。硬件调试需要万用表、电路板、下载器、数据线等,笔者根据自己实际制作该多功能电子保姆机的经验,将调试过程介绍如下:

硬件调试

单片机基础电路调试

单片机基础电路包括电源、单片机、外部时钟振荡电路、外部接口电路等。调试过程需要注意以下几点【15】:

(1)检查电源是否完好,供电是USB供电还是电源供电。

(2)使用万用表排查电路中是否存在断路或者短路情况。所以在上电以前必须先排查电路。

(3)编辑一个四位数码管显示8888程序并烧录到单片机内,上电运行,检查单片机是否正常工作,复位电路是否正确。

笔者编辑了一段数码管显示8888的程序,程序代码如下:

#include//延时子程序ms级

voiddelay_nms(unsignedintn)

{

unsignedinti,j;

for(i=0;i<1000;i++)

for(j=0;j
}

voidmain(void)

{

inti;

DDRD=0xff;//定义D口为输出

DDRC=0xff;

PORTC=0x01;

while(1)

{

delay_nms(20);

PORTD=0x80;

if(PORTC<0x10)

PORTC<<=1;

else

PORTC=0x01;

}

}

显示电路调试

本设计的显示电路使用了4位共阳LED数码管,NPN三极管作为驱动。在连接显示电路之前要明确共阳型8段LED的位选和笔端码的连接关系,然后才能开始连接。PA0-PA7接笔端码,PE0-PE4接位选。编写一段显示程序,烧录进单片机,检查好电源正负端和各引脚连接是否正确。检查无误后上电,检查显示电路是否正确。

以下是笔者编写的一段显示程序:上电后,4位数码管分别显示(5.6.7.8)。程序代码如下:

//该程序使用了定时器T0,采用循环扫描方式显示4位数据

#include

#include

//#include"seg7.h"

unsignedcharseg7[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

unsignedcharaddr=1,ldata=0,jdata=0,i=0;//定义几个变量

unsignedcharkdata[]={5,6,7,8};//需要显示的数据

voidport_init(void)

{

PORTA=0xFF;

DDRA=0xFF;

PORTB=0xFF;

DDRB=0xFF;

PORTC=0xFF;

DDRC=0xFF;

PORTD=0xFF;

DDRD=0xFF;

PORTE=0x0;

DDRE=0xFF;

PORTF=0xFF;

DDRF=0xFF;

PORTG=0x0;

DDRG=0xFF;

}

//TIMER0initialisation-prescale:8

//WGM:Normal

//desiredvalue:10KHz

//actualvalue:10.000KHz(0.0%)

voidtimer0_init(void)

{

TCCR0=0x00;//stop

ASSR=0x00;//setasyncmode

TCNT0=0xB5;//setcount

OCR0=0x4B;

TCCR0=0x02;//starttimer

}



#pragmainterrupt_handlertimer0_ovf_isr:17

voidtimer0_ovf_isr(void)

{

TCNT0=0xB5;//reloadcountervalue

PORTE=addr;//地址送如PC口

jdata=kdata[i];//取出需要显示的数据

//数据译码成7段SEG数据

PORTA=seg7[jdata];//数据送如PD口

i++;//取数地址加1

addr=addr<<1;//显示地址左移

if(i==4)//如果显示完4位后,返回到第一位

{addr=1;

i=0;

}

}

//callthisroutinetoinitialiseallperipherals

voidinit_devices(void)

{

//stoperrantinterruptsuntilsetup

CLI();//disableallinterrupts

XDIV=0x00;//xtaldivider

XMCRA=0x00;//externalmemory

port_init();

timer0_init();

MCUCR=0x00;

EICRA=0x00;//extendedextints

EICRB=0x00;//extendedextints

EIMSK=0x00;

TIMSK=0x01;//timerinterruptsources

ETIMSK=0x00;//extendedtimerinterruptsources

SEI();//re-enableinterrupts

//allperipheralsarenowinitialised

}

voidmain(void)

{

init_devices();

}

DS1302电路调试

该电路包含DS1302芯片、主电源、备用电源、晶振等部分。在与单片机连接的过程中需要注意以下几点:

(1)清楚DS1302与单片机连接的管脚。本设计定义为:DS1302的SCLK连接PB2,I/O连接PB1,RST连接PB0。

(2)注意主电源、备用电源连接。由于电路板没有买到DS1302备用电池,故再重新接主电源时要重新调整时间

(3)编写DS1302的时钟/日历程序,只要求能够正确显示时间。用AVR烧录进单片机,检查电路电源正负极连接是否正确,检查DS1302和显示电路引脚接线是否正确。检查无误后可以上电检查。

笔者编写了一段时钟/日历显示程序,设置初始时间为21:00,初始年为2009,初始月为0504。上电后LED数码管显示“2100”,之后开始走时。观察15分钟之后,数码管显示“2115”,证明DS1302电路正确。源程序见附录A

继电器控制电路调试

由于本电路板继电器外围接口不是很明确,故先用万用表测各个引脚,确定常开端,常闭端,及公共端之后,用电烙铁将起驱动作用的三极管基极接出一根引线。

本设计在调试过程中用发光二极管模拟家用电器,继电器接PC7、将程序烧录单片机,根据时钟初始显示时间为21:00,笔者设定家用电器开关时间为21:01,当21:01时,发光二极管亮;设定的关机时间为21:03,当21:03时,发光二极管自动灭。源程序见附录A

DS18B20电路调试

本电路板上无DS18B20,必须自己焊电路板,在自己制作电路板的过程中、要熟悉各个引脚。由于查阅DS18B20的资料上需要一个4.7欧姆的上拉电阻,将DS18B20电源、接地、数据输入输出端口引线焊接正确之后进行调试。

调试DS18B20过程中,将数据输入输出端口与单片机PE4相连、将程序烧录单片机中,显示当前室温。源程序见附录A

温度报警电路调试

本设计PB5接发光二极管,作为温度报警显示。将程序烧录单片机中,室温超过程序中设定温度。发光二极管亮。证明程序正确。

源程序见附录A

软件调试

在硬件调试完毕的基础上,需要进一步完善程序,也就是进入软件调试阶段。在本设计中,软件调试主要分三大部分:实时时钟日历子程序调试、环境温度采集子程序调试、继电器控制子程序调试。将这三部分调试成功,那么整个设计的软件部分也就基本完成了【16】。

在硬件调试部分,已经将实时时钟日历子程序调试完毕了,源程序见附录A,这里不再赘述。

结论

笔者设计的多功能电子保姆机,基本完成了无人看管却能自控看护的“保姆”装置的作用。对于以后的生产生活中,电子保姆机在今后的应用也会越来越广泛。

基于单片机实现电子保姆机,仅仅是众多方法之一。并且市场上的实时时钟日历芯片品类繁多,IC化的传感器各种各样,显示方式也愈趋于人性化。所以多功能电子保姆机有多种实现方案,能够实现的功能也很多,笔者已经通过单片机硬件软件的调试,实现了时间日历显示、闹铃、继电器控制家用电器等功能。本文采用AVR单片机C语言进行编程,当然也可以应用汇编语言编程。由于笔者能力有限,提供的程序还可以进一步优化,并且还可以根据需求为电子保姆机增设新功能。



参考文献

1.何宏森.多功能智能电子钟的设计[J],电子技术的研究,2004.1

2.姜煜等.基于FPGA芯片设计多功能数字钟的研究[J],应用科技,2001年1月第28卷(12)

3.卢超.基于单片机的数字电子钟的设计与制作[J],电子技术的研究,2005.6

4.鲁慧.基ATmega128单片机的控制系统的设计与实现[D],华中科技大学,2007.7

5.王明顺等.可涓流充电的串行实时时钟芯片DS1302及应用设计[J],电子技术应用,1996年(10)

6.丁金华.串行时钟芯片DS1302的应用[J],大连轻工业学院学报,1998年3月第17卷(1)

7.逢玉台等.集成温度传感器AD590及其应用[J],国外电子元器件,2002年第7期

8.马江涛.单片机温度控制系统的设计及实现[J],计算机测量与控制,2004,12(3)

9.彭小军.用单片机实现电子时钟[J],新余高专学报,2004年4月第9卷(2)

10.金春林等.AVR系列单片机C语言编程与应用实例[M],北京:清华大学出版社,2003.11

11.潘永雄.新编单片机原理与应用[M],西安:西安电子科技大学出版社,2007.2

12.刘军等.单片机原理与接口技术[M],上海:华东理工大学出版社,2006.2.

13.康光华.电子技术基础(数字部分)[M],北京:高等教育出版社,2000.6

14.付家才.单片机控制工程实践技术[M],北京:化学工业出版社,2004.3

15.张迎新.单片微型计算机原理、应用及接口技术(第二版)[M],北京:国防工业出版社,2005.9

16.沈文等.AVR单片机C语言开发入门指导[M],北京:清华大学出版社,2003.5



附录A程序

#include



#defineDS1302_RSTPB0//RST引脚接PB0

#defineDS1302_IOPB1//IO引脚接PB1

#defineDS1302_SCLKPB2//SCLK引脚接PB2

#defineSET_RST_DDR()DDRB|=0x01//RST相关定义

#defineSET_RST()PORTB|=0x01

#defineCLR_RST()PORTB&=~0x01

#defineSET_IO_DDR()DDRB|=0x02//IO相关定义

#defineCLR_IO_DDR()DDRB&=~0x02

#defineSET_IO()PORTB|=0x02

#defineCLR_IO()PORTB&=~0x02

#defineSET_SCLK_DDR()DDRB|=0x04//SCLK相关定义

#defineSET_SCLK()PORTB|=0x04

#defineCLR_SCLK()PORTB&=~0x04

#defineDS18B20_IOPB3//DS18B20数据线接PB3

#defineSET_DS18B20_IO_DDRDDRE|=0x08

#defineCLR_DS18B20_IO_DDRDDRE&=~0x08

#defineSET_DS18B20_IOPORTE|=0x08

#defineCLR_DS18B20_IOPORTE&=~0x08

#defineNao_LEDPB4//闹铃开标志灯接PB4

#defineNaoLED_liang()PORTB|=0x10

#defineNaoLED_mie()PORTB&=~0x10

#defineWenDu_YueXianPB5//温度越限报警灯接PB5

#defineSET_BJPORTB|=0x40

#defineCLR_BJPORTB&=~0x40

#defineFMPC6//蜂鸣器接PC6

#defineSET_FMPORTC|=0x40

#defineCLR_FMPORTC&=~0x40

#defineJiDianQiPC7//继电器接PC7

#defineSET_JDQPORTC|=0x80

#defineCLR_JDQPORTC&=~0x80



#defineDS1302_SECOND0x80//秒寄存器

#defineDS1302_MINUTE0x82//分寄存器

#defineDS1302_HOUR0x84//小时寄存器

#defineDS1302_MONTH0x88//月寄存器

#defineDS1302_DAY0x86//日寄存器

#defineDS1302_YEAR0x8c//年寄存器

#defineDS1302_CONTROL0x8e//控制寄存器



typedefstruct//定义日期、时间结构体

{

unsignedcharSecond;

unsignedcharMinute;

unsignedcharHour;unsignedcharDay;

unsignedcharMonth;

unsignedcharYear;

unsignedcharyearstr[4];

unsignedchardatestr[4];

unsignedchartimestr[4];

}TIME; //定义的时间类型

TIMEPresentTime;



unsignedcharKaiJi_Time[4];//家用电器开机时间

unsignedcharGuanJi_Time[4];//家用电器关机时间

unsignedcharNaoLing_time[4];//闹钟时间

unsignedintNaoLing_flag=0;

unsignedcharTC[4]={''0''};//温度

unsignedcharBaoj_T[4]={''m'',''m'',''2'',''''};

unsignedchartemp=0;



voidport_init(void)//端口初始化

{

PORTA=0xFF;

DDRA=0xFF;

PORTB=0x00;

DDRB=0xFF;

PORTC=0x00;

DDRC=0xFF;

PORTD=0x00;

DDRD=0xFF;

PORTE=0x00;

DDRE=0xF0;

PORTF=0xFF;

DDRF=0x00;

PORTG=0x1F;

DDRG=0x00;

}



voiddelay(unsignedintn)

{

unsignedinti,j;

for(i=0;i<100;i++)

for(j=0;j
}



voiddisplay(unsignedchardis_buff[])//显示子程序

{

unsignedintled[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};

unsignedcharposition=0x01;

unsignedinti,c;

for(i=0;i<4;i++)

{

switch(dis_buff[i])//字符型数据转换成整型数据

{

case''0'':c=0;break;

case''1'':c=1;break;

case''2'':c=2;break;

case''3'':c=3;break;

case''4'':c=4;break;

case''5'':c=5;break;

case''6'':c=6;break;

case''7'':c=7;break;

case''8'':c=8;break;

case''9'':c=9;break;

case''m'':c=10;break;

}

PORTA=led[c];

if(i==2)

PORTA&=0x7F;

PORTE=position;

position<<=1;

delay(1);

PORTE=0x00;

}

}



//从ds1302中读出单字节数据

unsignedcharDS1302_Read(unsignedcharreg)

{

unsignedchardata=0;//data接收从ds1302中读出的数据

unsignedchari=0;

reg+=1;//读标志,读命令字为奇数;写命令字为偶数

SET_IO_DDR();//设置P1为输出,往DS1302写命令字

CLR_RST();//RST=0

CLR_SCLK();//SCLK=0

SET_RST();//RST置1,启动数据传输

for(i=8;i>0;i--)//传输控制字,选择要读的寄存器

{

if(reg&0x01)SET_IO();

elseCLR_IO();

SET_SCLK();

CLR_SCLK();

reg>>=1;

}

CLR_IO_DDR();//设置IO为输入端口,接收数据

for(i=8;i>0;i--)

{

data>>=1;//从低到高接收

if(PINB&=0x02)data|=0x80;

SET_SCLK();

CLR_SCLK();

}

CLR_RST();

return(data);//返回读出的数}



//往时钟芯片中写入一个字节

voidDS1302_Write(unsignedcharreg,unsignedchardata)

{

unsignedchari=0;

SET_IO_DDR();//设置PB1为输出

CLR_RST();//RST置0

CLR_SCLK();//SCLK置0

SET_RST();//RST置1,启动数据传输

for(i=8;i>0;i--)//写控制字

{

if(reg&0x01)SET_IO();

elseCLR_IO();

SET_SCLK();

CLR_SCLK();

reg>>=1;

}

for(i=8;i>0;i--)//写数据

{

if(data&0x01)SET_IO();

elseCLR_IO();

SET_SCLK();

CLR_SCLK();

data>>=1;

}

CLR_RST();//终止数据传输

CLR_IO_DDR();//设置PB1为输入

}



voidInitial_DS1302(void)//时钟芯片初始化

{

DS1302_Write(DS1302_CONTROL,0x00);//写入允许

DS1302_Write(DS1302_YEAR,0x09);//写入初始化日期和时间

DS1302_Write(DS1302_MONTH,0x05);

DS1302_Write(DS1302_DAY,0x04);

DS1302_Write(DS1302_HOUR,0x21);

DS1302_Write(DS1302_MINUTE,0x00);

DS1302_Write(DS1302_SECOND,0x00);

DS1302_Write(DS1302_CONTROL,0x80);//禁止写入

}



voidGetFromDS1302(TIMETim)//获取时钟芯片的时钟数据到自定义的结构体变量中

{

unsignedcharValue;

Value=DS1302_Read(DS1302_SECOND);

Tim->Second=((Value&0x70)>>4)10+(Value&0x0F);

Value=DS1302_Read(DS1302_MINUTE);

Tim->Minute=((Value&0x70)>>4)10+(Value&0x0F);

Value=DS1302_Read(DS1302_HOUR);

Tim->Hour=((Value&0x70)>>4)10+(Value&0x0F);

Value=DS1302_Read(DS1302_MONTH);

Tim->Month=((Value&0x70)>>4)10+(Value&0x0F);

Value=DS1302_Read(DS1302_DAY);

Tim->Day=((Value&0x70)>>4)10+(Value&0x0F);

Value=DS1302_Read(DS1302_YEAR);

Tim->Year=((Value&0x70)>>4)10+(Value&0x0F);

}



voidyeartostr(TIMETim)//将年数据送到yearstr[]中

{

Tim->yearstr[0]=Tim->Year%10+''0'';

Tim->yearstr[1]=Tim->Year/10+''0'';

Tim->yearstr[2]=''0'';

Tim->yearstr[3]=''2'';

}



voiddatetostr(TIMETim)//将日期数据送datestr[]中

{

Tim->datestr[0]=Tim->Day%10+''0'';

Tim->datestr[1]=Tim->Day/10+''0'';

Tim->datestr[2]=Tim->Month%10+''0'';

Tim->datestr[3]=Tim->Month/10+''0'';

}



voidtimetostr(TIMETim)//将时,分数据timestr[]中

{

Tim->timestr[0]=Tim->Minute%10+''0'';

Tim->timestr[1]=Tim->Minute/10+''0'';

Tim->timestr[2]=Tim->Hour%10+''0'';

Tim->timestr[3]=Tim->Hour/10+''0'';

}



/DS18B20子程序/

/DS18B20延迟子函数/

voidDelay_DS18B20(unsignedinti)

{

while(i--);

}

/DS18B20初始化函数/

voidInit_DS18B20(void)

{

unsignedcharf=0;

SET_DS18B20_IO_DDR;

SET_DS18B20_IO;//IO复位

Delay_DS18B20(8);//稍做延时

CLR_DS18B20_IO;//单片机将DQ拉低

Delay_DS18B20(80);//精确延时大于480us

SET_DS18B20_IO;//拉高总线

Delay_DS18B20(14);

CLR_DS18B20_IO_DDR;

f=PINE&0x10;//稍做延时后如果x=0则初始化成功x!=0则初始化失败

Delay_DS18B20(20);

}

/DS18B20读一个字节/

unsignedcharRead_DS18B20_Char(void)

{

unsignedchari=0;

unsignedcharvalue=0;

for(i=8;i>0;i--)

{

value>>=1;

SET_DS18B20_IO_DDR;

CLR_DS18B20_IO;

SET_DS18B20_IO;

CLR_DS18B20_IO_DDR;

if(PINE&0x10)

value|=0x80;

Delay_DS18B20(4);

}

return(value);

}

/DS18B20写一个字节/

voidWrite_DS18B20_Char(unsignedcharvalue)

{

unsignedchari=0;

for(i=8;i>0;i--)

{

SET_DS18B20_IO_DDR;

CLR_DS18B20_IO;

if(value&0x01)SET_DS18B20_IO;

elseCLR_DS18B20_IO;

Delay_DS18B20(5);

SET_DS18B20_IO;

value>>=1;

}

}

/读取DS18B20当前温度/

voidRead_DS18B20(void)

{

unsignedcharTL=0;

unsignedcharTH=0;

Init_DS18B20();

Write_DS18B20_Char(0xCC); //跳过读序号列号的操作

Write_DS18B20_Char(0x44); //启动温度转换

Delay_DS18B20(100);//thismessageisveryimportant

Init_DS18B20();

Write_DS18B20_Char(0xCC); //跳过读序号列号的操作

Write_DS18B20_Char(0xBE); //读取温度寄存器等,前两个就是温度

Delay_DS18B20(100);

TL=Read_DS18B20_Char(); //读取温度值低位

TH=Read_DS18B20_Char(); //读取温度值高位

temp=TH<<4;

temp+=(TL&0xF0)>>4;

}

voidTemp_To_String(void)//温度数据转换成字符显示

{

TC[0]=temp%10+''0'';//个位

TC[1]=temp/10+''0'';//十位

TC[2]=''m'';

TC[3]=''m'';

}



//闹铃子程序



voidNaoZhong(void)

{

if(NaoLing_flag!=0)

{

if((NaoLing_time[0]==PresentTime.timestr[0])&&

(NaoLing_time[1]==PresentTime.timestr[1])&&

(NaoLing_time[2]==PresentTime.timestr[2])&&

(NaoLing_time[3]==PresentTime.timestr[3]))

SET_FM;

elseCLR_FM;

}

}



//家用电器控制子程序

voidKaiJi(void)

{

if((KaiJi_Time[0]==PresentTime.timestr[0])&&(KaiJi_Time[1]==PresentTime.timestr[1])&&

(KaiJi_Time[2]==PresentTime.timestr[2])&&

(KaiJi_Time[3]==PresentTime.timestr[3]))//判断设定时间是否与当前时间相同

SET_JDQ;//相同则开启电器

}



voidGuanJi(void)

{

if((GuanJi_Time[0]==PresentTime.timestr[0])&&(GuanJi_Time[1]==PresentTime.timestr[1])&&

(GuanJi_Time[2]==PresentTime.timestr[2])&&

(GuanJi_Time[3]==PresentTime.timestr[3]))//判断设定时间是否与当前时间相同

CLR_JDQ;//相同则关闭电器

}



voidT_YueXian(void)

{

if((TC[1]>Baoj_T[1])||((TC[1]==Baoj_T[1])&&(TC[0]>Baoj_T[0])))

SET_BJ;

elseCLR_BJ;

}



voidmain(void)

{

port_init();

Initial_DS1302();

KaiJi_Time[0]=''1'';

KaiJi_Time[1]=''0'';

KaiJi_Time[2]=''1'';

KaiJi_Time[3]=''2'';

GuanJi_Time[0]=''3'';

GuanJi_Time[1]=''0'';

GuanJi_Time[2]=''1'';

GuanJi_Time[3]=''2'';

NaoLing_time[0]=''1'';

NaoLing_time[1]=''0'';

NaoLing_time[2]=''1'';

NaoLing_time[3]=''2'';

while(1)

{

GetFromDS1302(&PresentTime);//获取时钟芯片的时间数据

yeartostr(&PresentTime);//年数据转换成显示字符

datetostr(&PresentTime);//日期数据转换成显示字符

timetostr(&PresentTime);//时间数据转换成显示字符

NaoLing_flag=1;

NaoZhong();//调用闹铃子程序

KaiJi();//家用电器控制子程序

GuanJi();

Read_DS18B20();//读取温度数据

Temp_To_String();

T_YueXian();//调用温度越限报警子程序

display(PresentTime.timestr);

}

}

附录B多功能电子保姆机硬件电路图



致谢

大学生涯如白驹过隙,回首四年的历程,仿佛就在昨日,但毕竟已成为过眼烟云。惭愧的是自己蹉跎了许多时日,许多目标尚未实现,万分感叹。笔者在完成论文之时,虽几易其稿,但总觉仓促,仍不尽人意,甚感遗憾。

本论文是在尊敬的老师的悉心指导和关心下完成的,从课题选择、方案制定、硬件电路设计、软件电路调试及论文的修改,无不渗透着她的心血。在李老师的悉心指导下,我不仅学到了扎实的专业知识,而且还学到了许多大学四年尚未接触过的;同时她对工作的积极热情、认真负责、实事求是的态度、给我留下了深刻的印象,使我受益匪浅。值此论文完成之际,谨向李老师致以最崇高的敬意和最诚挚的感谢。































I













学毕业设计说明书(毕业论文)



大学毕业设计说明书(毕业论文)



学毕业设计说明书(毕业论文)







献花(0)
+1
(本文系新用户2118e...首藏)