版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第一章绪论1.1本研究课题的背景随着近年来人们生活的日益改善,早期的家用电器已经不能满足大家日常生活的使用了。方便、快捷、智能、安全、绿色显然已经成为现在大家追求的主流生活。传统的家用或者共用加热取暖设备不仅加热效果差,而且还存在众多的安全隐患,消耗能源更是浪费。几年来随着电子科技技术发展突飞猛进,微控制器已经深入到各个领域了,在军用设备、工厂设施、公共场合、到家用电器方面等领域中运用普遍。自动加热取暖器采用AT89C51为控制处理器为核心,温度传感器DS18B20由有单片机随时采集温度值,反馈给MCU,让液晶屏显示出来从而可以实时测量温度,达到控制效果。通过这样一系列的设计,能够形成良好的人机操作。由于现代电力电子技术,计算机技术,控制理论已经成熟,采用单片机控制技术是实现家电智能化重要且流行的一部分。单片机具有体积微小,重量轻,能耗低,效率高,控制功能强、操作简单以及价格便宜等特点,因而成为温控,报警控制系统的首选微控制器。这也是未来家用电器的流行趋势,目前已应用于多个领域。1.2本课题的研究意义 取暖器的历史已经发展了好多年了,并且广泛的应用于生活、公共场合当中。目前市面上流行的自动取暖器种类非常多,在温度控制、和人机交流方面都有非常良好的性能。不管是工业,民用,和军用上面有着出色的表现。随着社会的发展,各方面的技术越来越好,大众对自动取暖器也提出了更高的要求,采用微控制器进行控制温度加热设备不仅在操作过程中更智能,它还体现在节能、安全等细节上,在自动控制和电子领域依然被广泛使用。在今天的社会中,伴随着与自动控制系统的不同要求的生产工艺的改进,通过改变用微控制器的智能设备便应运而生,并得到了更快更好的发展。微控制器智能加热系统需要较少的元件,电路结构简单,控制灵活,坚固耐用,应用范围广,各种不同的控制通道,和数字信号兼容的通信,因此得到了业界的广泛应用,推动产业化发展,使得今后我们工作学习研究物联网智能家用系统变得非常重要。采用单芯片作为主控制装置,实现了“智能自动取暖器”的主题,通过这样的设计,我们可以进一步加深我们理解和运用理论知识能力,而且对我们今后的工作学习和研究具有重要的意义。1.3单片机微控制技术 单片机,全称单片微型计算机,又称微控制器,是把中央处理器CPU、存储器(RAM/ROM)、多种I/O口、定时/计数器和中断系统等功能集成在一块集成电路芯片上的微型计算机系统,采用了超大规模集成技术,广泛应用于工业控制领域。单片的使用要追溯到从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。本款采用的是AT89C51芯片设计,以下单片机外部引脚的分布:电源和时钟引脚。如Vcc、GND、XTAL1、XTAL2。编程控制引脚。如RST、PSEN、ALE/PROG、EA/VppI/O口引脚。如P0、P1、P2、P3,四组8位I/O口。各引脚的功能如下:Vcc(第40引脚)、GND(第20引脚)它们是单片机的一对电源引脚。不同型号的单片机对应的电压源也不同,AT89C81对电源的需求范围比较宽,最低可以是+3.3V,最高为5V都可以,对电源兼容性很强。XTAL1(第19引脚)和XTAL2(第18引脚)是单片机对外的时钟引脚,其中XTAL1是单片机片内振荡电路的输入端,XTAL2为单片机片内振荡的输出端,AT89C51的时钟选择方式有两种,一种是片内振荡方式,需要将这两个引脚接石英晶振加上瓷片电容,这里我们选用的是12MHZ的晶振和33PF的瓷片电容作为时钟振荡源。一种是外部时钟方式,将XTAL1接地,外部时钟信号从XTAL2脚输入。图1-1时钟振荡电路源RST(第9脚)为单片机复位引脚。改引脚需要连续从外部输入两个机器周期以上的高电平才有效,一般启动单片机复位有两种方式,一种为自动上电复位,一种为按键复位,本次设计为按键复位方式。不管哪种方式当单片机复位后,无论出于什么状态,都将从头开始执行程序。图1-2按键复位电路AT89C51一共有4个I/O口,这些I/O口又分别有8位,总共32个。 P0口(第39脚32引脚)它是双向的8位三态I/O,每一位都可以单独控制,由于P0口内部没有上拉电阻,默认时为高阻态,不能正常的输出高低电平,因此在使用P0口时一定要外接上拉电阻,在本次设计中,我们采用10K的电阻。 P1口(第1脚—8引脚)它是准双向8位I/O口,跟P0一样,每个口都可独立控制,由于内带上拉电阻,所以输出是没有高阻态。之所以称他为准双向,是因为改口在输入使用前,要进行写1,这是才能读取外部信号。也就是说要有个“准备”的过程。 P2口(第21脚—28引脚)该口和P1口使用一样,这里不再细说。 P3口(第10引脚—17脚)该口与P1相式,但是值得注意的是该口有复用功能,作为第二功能时如图所示:标号引脚第二功能说明P3.010RXD串行输入口P3.111TXD串行输出口P3.212INT0外部中断0P3.313INT1外部中断1P3.414T0定时器/计数器0外部输入端P3.515T1定时器/计数器1外部输入端P3.616WR外部数据存储器写脉冲P3.717RD外部数据存储器读脉冲表1-1P3口引脚复用功能1.4课题内容本产品设计了八级加热功能,八个加热器分别有八个继电器控制,这八个继电器由AT89C51单片机的P1口控制。当环境温度与设定温度相差10度时,8路加热器同时工作,相差5度时,4路加热器工作,相差2度时2路加热器工作,相差1度时只有1路加热器工作,当环境温度大于设定温度时,所有加热器停止工作。这样不仅升温速度快,而且节能,更重要的是安全,绝不会引发火灾。系统设有数码显示模块,能显示环境的温度和设计的温度。系统设有蜂鸣器模块,可进行提示或报警。系统设有按键模块,其由三个按键组成,分别是温度加、温度减和定时。系统设有定时指示模块,其由八个条形LED指示灯组成,能进行0.5~4小时的定时恒温控制。
第二章系统设计2.1系统整体设计思路取暖器首先必须考虑安全问题,为此加入DS18B20温度传感器。首先由温度传感器采集当前环境温度,再根据用户设定的温度控制加热器,当环境温度达到设定温度时,停止加热。传统的取暖器升温慢,因此该系统设计了八级加热功能,八个加热器分别有八个继电器控制,这八个继电器由AT89C51单片机的P1口控制。当环境温度与设定温度相差10度时,8路加热器同时工作,相差5度时,4路加热器工作,相差2度时2路加热器工作,相差1度时只有1路加热器工作,当环境温度大于设定温度时,所有加热器停止工作。这样不仅升温速度快,而且节能,更重要的是安全,绝不会引发火灾。最后通过显示模块将环境的温度和设计的温度显示出来。系统设有定时指示模块和蜂鸣器模块,定时指示模块由八个条形LED指示灯组成,能进行0.5~4小时的定时恒温控制。蜂鸣器模块在定时时间到达之后启动报警。整个系统的设计主要以单片机为核心,由温度采集模块、按键模块、加热模块、蜂鸣器报警模块、液晶显示模块和定时显示模块所组成。电路整体设计原理图如图所示:图2-1系统框图2.2温度采集模块该模块由数字温度传感器DS18B20和上拉电阻组成。DS18B20的数据输入输出端DQ引脚接在AT89C51的P2.3口,负责采集环境的温度。经过DQ端,将温度信号传递给微控芯片,经单片机处理将数据传送给LCD显示模块显示数据。具体电路图如图2-2所示,DQ短接STC89C52的P2.3端口。图2-2温度检测原理图DS18B20温度传感器是DALLAS美国半导体公司最新模型的智能温度传感器,与传统热敏电阻的温度测量设备相比,它可以直接读出所测量的温度,并且可以基于通过简单的编程实现要求9-12位数字读数模式。DS18B20具有如下所示的性能:(1)独特的接口方式只需要用一个引脚在通信上;(2)多个DS18B20可以被并联连接在独有的一条三线上,达到多点组网的功能;(3)不需要其他的外部元器件;(4)能通过外接数据线来提供电源,电压的范围:3.0~5.5V;(5)测温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃;(6)零待机功耗;(7)温度用9位或12位的数字量读出;(8)可用于用户定义的非易失性温度报警设置;(9)报警搜索命令识别并且标志出超过程序限定的温度(温度报警条件)的元器件;(10)负电压特性,电源极性反向,温度计将不会烧毁,但不会正常工作。DS18B20采用8脚SOIC的封装或3脚PR-35的封装。DS18B20内部存储器还包括温度传感器暂存RAM和非易失性电可擦除EERAM。暂存RAM配置为8字节的存储器,在表3.4.1中所示的结构中。前两个字节包含测得的温度信息,第3和第4字节TH和TL是挥发性的,每次上电复位刷新。其中的第5个字节的配置寄存器,其内容温度值被用来确定数字转换的分辨率。DS18B20工作寄存器中的分辨率转换为相应精度的温度值。在图中所示的字节。成员的定义如下。低5位一直设置为1,TM是工作模式位,设置温度计为工作模式或在测试模式。DS18B20工厂初始设置被设置为0,用户要改变,R1和R0决定温度转换的精度位数,设置这两位来决定分辨率。DS18B20高速暂存器共9个存存单元,如表2-1所示。表2-1寄存功能序号寄存器名称作用序号寄存器名称0温度低字节以16位补码形式存放4、5保留字节1、21温度低字节6计数器余值2TH用户字节1存放温度上限7计数器℃3TH用户字节2存放温度上限8CRC用12位的转化为例说明温度高低字节的存放形式以及计算12位的转化后所得到的12位数据,18B20的两个高低8位的RAM中存放数据,在二进制中符号位是最前面的5位数字。所测得到的温度如果大于0℃,那这5位就设置为0,只需将所得的数值乘以0.0625就可以得到实际的温度;如果所测得到的温度小于0℃,那就将这5位数字设置为1,将测到的数值取反再加1,然后乘以0.0625才能得到实际的温度。表2-2转换时间R1R0转换精度(16进制)转换精度(10进制)转换时间009bit0.593.75ms0110bit0.25187.5ms1011bit0.125375ms1112bit0.0625750ms当S(符号位)等于0时,说明所测得的温度值为正数,能够直接将得到的二进制位转换为十进制数;当S(符号位)等于1时,说明所测得的温度值为负数,需要先将得到的补码转换成原码,再计算十进制数。表3.3是温度值对应于二进制温度数值。表2-3温度转换表温度/℃二进制表示十六进制表示+125000001111101000007D0H+8500000101010100000550H+25.062500000001100100000191H+10.125000000001010000100A2H+0.500000000000000100008H000000000000010000000H-0.51111111111110000FFF8H-10.1251111111101011110FF5EH-25.06251111111001101111FE6FH-551111110010010000FC90H2.3液晶显示模块 该模块由LCD1602液晶屏和10K的排阻组成。液晶屏的8个数据端口D0-D7分别连接到P0的8个I/O口,加上10K的上拉电阻,另外LCD的RS、RW和E分别与微控芯片的P2.0、P2.1、P2.2相连,主要是显示温度传感器返回的示数。电路图如图2-4所示。图2-4液晶显示电路1602液晶显示器是工业字符型液晶,能够同时显示32个字符。(16列2行)液晶显示模块可以分为字段,字符点阵,图形点阵3种。一般情况下,只有后者可以显示汉字和图形。LCD1602液晶显示器是最常见的16×2行,6×8字符的点阵液晶显示模块,其广泛用于智能仪表、办公设备和通信中。其字符发生器ROM中自带数字和英文字母及特殊符号的字符库,没有汉字。表2-4LCD引脚表编号符号引脚说明编号符号引脚说明1VCC电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15VDD电源正极8D1数据16VCC电源地第1脚:VSS为接地电源。第2脚:VDD接5V正电源。第3脚:VL为液晶显示器调整对比度的端口,当接入为正电源时其对比度最弱,在接地时其对比度为最高,一旦对比度过高时,就会产生“鬼影”,使用时可以由一个10K大小的电位器进行对比度的调整。第4脚:RS端口作为寄存器的选择端,要选用数据寄存这一功能时就将端口置为高电平、用指令寄存这一功能时就将端口置为低电平。第5脚:R/W是用于读或写的信号线,执行读操作需将其置为高电平,执行写操作需将其置为低电平。在将R/W和RS都设置为低电平时就可以显示地址或者写入指令,在R/W设为高电平、RS设为低电平时就显示读忙信号,在RS为高电平、R/W设为低电平就可用于写入数据。第6脚:E端口作为使能端,当E端口从高电平变为低电平时,液晶模块开始执行命令。第7~14脚:D0~D7为8位双向的数据线。2.5加热模块为了实现分级加热功能,系统设计了8个加热模块,这八个加热模块由AT89C51的P3口的八个引脚控制。1个加热模块主要由1个继电器、1个三极管和1个加热电阻丝组成。图1中继电器RL1由三极管Q1驱动,Q1的基极链接在AT89C51的P1.0口,当该端口输出低电平时,三极管Q1导通,继电器RL1闭合,加热电阻丝L1工作,当该端口输出高电平时,三极管Q1截止,继电器RL1断开,加热电阻丝L1停止工作。图2-5继电器加热电路图2.4按键模块 为了简化系统的操作控制,我们只设计了三个按键,分别是温度加、温度减和定时,通过前面两个按键我们可以改变取暖器的目标工作温度,通过后者我们可以设定取暖器恒温定时的时间。 电路图如图2-5所示,K1、K2、K3分别接单片机的P2.5、P2.6和P2.7口。图2-5按键电路图2.6定时显示模块 该模块由八个条形LED灯U3和限流排阻RP2组成,链接在AT89C51的P3口的八个引脚上,恒温定时的时间等于亮的LED灯的个数乘以0.5小时。图2-6定时显示电路图2.7蜂鸣器报警模块该模块主要由蜂鸣器、PNP三极管和一些外围元件组成。蜂鸣器由PNP三极管Q5驱动,Q5的基极链接在AT89C51的P2.4口,当该端口输出低电平时,三极管Q5导通,蜂鸣器发声,当该端口输出高电平时,三极管Q5截止,蜂鸣器停止发声。由于蜂鸣器位感性元件,故并联了一个反向的二极管。电路图如图2-3所示。三极管PNP的基极连接在单片机的P2.4口。图2-3蜂鸣器报警电路
第三章软件设计开发环境本次程序代码的编写是在keil软件的环境下完成,在ProteusIsis7软件环境下进行仿真。3.1.1Keiluvision4软件使用1、首先在桌面打开keiluvision4软件图标。2、选择Project,点击NewuvisionProject新建项目工程,保存。图3-1打开keil软件3、选择File,点击New…,新建文本,保存文本,后缀名为“.C”文件。图3-2新建文本编写C程序,编译、生成Hex文件。3.1.2ProteusIsis7的使用1、打开proteusIsis7软件。图3-3新建仿真文件2、选择File,点击NewDesign,新建文本,保存。3、在弹出的PickDevices对话框中,选择需要的元器件。图3-4选取元器件4、最后连接元器件,完成仿真图的绘制。图3-5绘制仿真原理图3.2系统主流程设计本程序包含主程序、DS18B20驱动程序、LCD1602液晶驱动程序、加热控制程序、按键扫描程序等。主程序采用模块化编程方案,包含延时、温度数据转换为字符串、1602显示等函数,系统主流程如下图4.1所示。开始开始LCD1602初始化LCD1602初始化DS18B20初始化DS18B20初始化温度数据扫描温度数据扫描继电器加热继电器加热温度的显示温度的显示蜂鸣器报警蜂鸣器报警延时10ms延时10ms图3-6主程序流程图液晶屏显示程序当为产品通上电时,即启动该温度控制模式,温度传感器会采集周边的环境,然后将其通过P2.3引脚将数据传送到单片机,通过液晶显示屏显示当前的温度。具体程序框架如下图:开始开始温度数据采集温度数据采集单片机数据处理单片机数据处理液晶屏显示液晶屏显示图3-7温度模块流程图通过温度传感器,将采集的温度数据传送到单片机上,然后不断更新当下温度的状态,且在液晶显示屏上显示出来,实现其功能的主要程序如下:voidDs18b20ReadTempCom(){ Ds18b20Init(); Delay1ms(1); Ds18b20WriteByte(0xcc); Ds18b20WriteByte(0xbe); }intDs18b20ReadTemp(){ inttemp=0; unsignedchartmh,tml; Ds18b20ChangTemp(); Ds18b20ReadTempCom(); tml=Ds18b20ReadByte(); tmh=Ds18b20ReadByte(); temp=tmh; temp<<=8; temp|=tml; returntemp;}按键扫描程序该模块由三个按键K1、K2、K3组成,分别于单片机的P2.5,92.6,P2.7相时,用户可以通过按下K1、K2键分别进行温度加和温度减,每次温度变化1度。按下K3键对加热的时间进行设置。每次增加0.5个小时,最多定时4小时。具体程序流程图如下:开始开始否K1是否按下否K1是否按下是是温度加1温度加1否K2是否按下否K2是否按下是是温度减1温度减1否K3是否按下否K3是否按下是是改变定时状态改变定时状态继续继续图3-8按键扫描程序流程图在手动设置模式下,当用户按下按键就会启动按键扫描函数,将扫描后的数据传送到单片机,通过液晶屏显示返回值。具体程序如下:if(k1==0) //判断按键操作{Delay1ms(10); a++; while(!k1); } if(k2==0) //判断按键操作 { Delay1ms(10); a--; while(!k2); } if(k3==0) //判断按键操作 { Delay1ms(10); i++; if(i==9) i=1; while(!k3); }加热控制程序 当温度传感器将环境的温度采集发送到单片机,用户通过按键自定义来设置加热温度的上限值,程序自动会执行相应程序,当环境温度与设定温度相差10度时,8路加热器同时工作,相差5度时,4路加热器工作,相差2度时2路加热器工作,相差1度时只有1路加热器工作,当环境温度大于设定温度时,所有加热器停止工作。程序执行流程图如下:开始开始判断温度判断温度环境设计相差10度环境设计相差1度环境设计相差2度环境设计相差5度环境设计相差10度环境设计相差1度环境设计相差2度环境设计相差5度2路加热2路加热4路加热8路加热 2路加热2路加热4路加热8路加热继续继续图3-9加热控制程序流程图
第四章系统测试4.1系统仿真测试在完成电路设计和程序设计,我们再用PROTEUS仿真软件进行仿真,仿真的结果与我们所设定的电路和程序几乎一致,达到了自动、智能的要求。仿真图如下:图4-1电路仿真原理图通过该图可以看出当环境的温度超过了预设置的温度时,8路加热管均不加热,同时蜂鸣器报警。图4-21路加热通过该图我们可以看出当设定的温度大于环境温度1时,只有一个加热管启动加热。图4-32路加热通过该图我们可以看出当设定的温度大于环境温度2时,有两个加热管启动加热。图4-44路加热通过该图我们可以看出当设定的温度大于环境温度5时,有四个加热管启动加热。图4-58路加热通过该图我们可以看出当设定的温度大于环境温度10时,8个加热管全部启动。4.2实物测试本次产品用万能板焊接,由于产品功能丰富,外围电路较多,因此采用两块万能板焊接,一块板焊接好主要电路,另一块板焊接继电器加热模块。焊接过程中要注意各个引脚不能焊错,在焊接LCD1602过程中将引脚接错,导致无法正常显示,由于条件有限,将图中的发热管替换成发光二极管代替,最后经过硬件调试,确实能实现预期功能,完成了本次毕业设计的要求。以下是各个模块具体调试过程中的实物图:(由于材料原因,本产品用发光二极管代替发热管)图4-6一个加热管工作如上图所示,当液晶屏上环境温度与自定义温度相差1度时,继电器启动1根加热管,进行升温加热,当环境温度大于等于自定义温度时,加热管停止加热。图4-7两个加热管工作如上图所示,当液晶屏上环境温度与自定义温度相差2度时,继电器启动2根加热管,进行升温加热,当环境温度大于等于自定义温度时,加热管停止加热。图4-8四个加热管工作如上图所示,当液晶屏上环境温度与自定义温度相差5度时,继电器启动4根加热管,进行升温加热,当环境温度大于等于自定义温度时,加热管停止加热。图4-9一个加热管工作如上图所示,当液晶屏上环境温度与自定义温度相差10度时,继电器启动8根加热管,进行升温加热,当环境温度大于等于自定义温度时,加热管停止加热。实物测试都能符合毕业设计的要求,并且性能稳定,实现了仿真的预期功能。
第五章总结与展望本次论文是设计一个基于51单片机新型智能自动取暖器。本产品是通过AT89c51单片机为微控制器处理中心的,外围电路有温度传感器DS18B20来采集环境温度,LCD1602液晶屏用于人机交换界面显示当前温度和预先设置温度,蜂鸣器报警电路当环境温度超过了预先设置的温度蜂鸣器报警,还提供了3个按键按键1用来加温度;按键2用来减温度;按键3用来定时加热时间的长短;继电器加热管模块用于加热升温,共有8路,可以根据用户自己的需求分别来启动,到达节能的效果。8个发光二极管LED分别表示定时时间的长短,每个LED代表半个小时,最长定时时间可达到4小时。通过了本次的论文设计我学到了很多的东西,主要可以分为以下几个方面:(1)在大学前三年多的时间里都是在课上学习理论基础知识,并没有机会真正地去应用和实践。但是由于这次毕业设计,给了我一个理论与实践相结合的机会,特别是在设计硬件电路时,学习了许多的知识,也请教了很多人,这次经历也为我将来从事电子设计方面的工作有了重新的认识。(2)此次设计由于要用到电路原理图的绘制,程序代码的编写,电路仿真图的设计。我学会了protel99se软件的使用,用于绘制原理图;keil软件的使用,程序的调试都是在该软件下执行的;PROTEUS是用来画电路仿真原理图的,本次使用的元件都能找到,最后在KEIL软件中生成的HEX文件调入仿真图中,就能实现电路图的仿真了。(3)本次本业设计中很多都是大学课堂上没有学到的,有的也不是理解的特别深入,所以如何快速学习入门一个知识点,是我本次设计中得到最大的收获,如何学一个软件,如何使用传感器等,通过这些问题的解决,收获了很多解决问题的方法,也认识了一些单片机专业知识很深的人,请教了他们的学习经验和专业知识。(4)大学的毕业设计是对每一个大学生的一次综合能力的考核,在最初接到任务时,我不知道该从哪方面的着手,也是身边的同学,老师和朋友们热情的帮助我,分享了他们的经验,本次毕业论文设计才可以完成,但是,不管是硬件电路还是程序设计中还是有点缺陷的,并不是很完美,还需改进。
参考文献[1]曾岐,彭楚武,刘辉.单片机原理与应用(第二版)[M].长沙:中南大学出版社,2009.[2]郭天祥.新概念51单片机C语言教程[M].北京:电子工业出版社,2009.[3]朱定华,黄松,蔡苗.Protel99SE原理图和印制板设计[M].北京:清华大学出版社,2007.[4]沈红卫.基于单片机的智能系统设计与实现[M].北京:电子工业出版社,2005.[5]元增民.单片机原理与应用[M].长沙:国防科学大学出版社,2006.[6]刘仁宇.单片微型计算机原理及应用[M].西安:西安电子科技大学出版社,2003.[7]马忠梅.单片机外围电路设计[M].北京:北京航空航天大学出版社,2005.[8]尹勇,王洪成.单片机开发环境μVision2的使用指南[M].北京:北京航空航天大学出版社,2004.[9]范立南.PROTUES仿真软件实例使用指南[M].北京:电子工业出版社,2004.[10]李全利.单片机原理及接口技术[M].北京:北京航空航天大学出版社,2004.[11]焦玉朋.基于51单片机的PWM直流电机调速系统.内蒙古大学硕士论文,2013.[12]徐爱钧,彭秀华.单片机高级语言C51应用程序设计[M].北京:北京航空航天大学出版社,2006.[13]楼然苗.51系列单片机设计实例[M].北京:北京航空航天大学出版社,2006.[14]AT89C51DATASHEEPPhilipsSemiconductors1999.dec.
致谢三个多月的毕业设计已经完美结束了,在做毕业设计的过程中,非常感谢梅老师的悉心指导。从最初的选题开始,梅老师多次询问研究进度,并且为我指点迷津,精心点拨了我的研究思路。梅老师以其精益求精的工作作风,严肃的教学态度,深深的鼓励和激励着我,使得我对于所学的知识有了一个更为深入的了解。对梅老师的感激之情是无法用言语来表达的。另外,感谢我的同学和朋友,在我写论文的过程中给予我了很多有用素材,还在论文的撰写和排版过程中提供热情的帮助。向帮助和指导我的各位老师表示最衷心的感谢!四年的学习生涯就要到此划上句号,时光荏苒,青春不再,在学校的时光永远是那么的让人怀念。在学校里面不仅学到了书本上的知识,更重要的是学会了生活上的其他知识。当然,学无止境,在什么时候都不能停下学习的脚步,活到老学到老,这是我们生活的目标,也是做一个四有青年的关键因素。感谢这篇论文所涉及到的各位学者,本文引用了数位学者的文献,如果没有各位学者的研究成果的帮助和启发,我将很难完成本篇论文的写作。最后,向在百忙之中抽出时间对本文进行评审并提出宝贵意见的各位专家表示衷心的感谢!附录附录一:电路原理图
附录二:电路仿真原理图附录三:源程序主函数:#include<reg51.h>#include"lcd.h"#include"temp.h"voidLcdDisplay(int);uinta=27,b,c,d,e,f,g,h,i=1,j,h;voidmain(){ LcdInit(); //初始化LCD1602 LcdWriteCom(0x8a); //写地址80表示初始地址 LcdWriteData('C');LcdWriteCom(0xc2); //写地址80表示初始地址 LcdWriteData('S'); LcdWriteCom(0xc3); //写地址80表示初始地址 LcdWriteData('e'); LcdWriteCom(0xc4); //写地址80表示初始地址 LcdWriteData('t'); LcdWriteCom(0xc6); //写地址80表示初始地址 LcdWriteData('U'); LcdWriteCom(0xc7); //写地址80表示初始地址 LcdWriteData('p'); TMOD=0x00; TH0=(8192-4607)/32; TL0=(8192-4607)%32; EA=1; ET0=1; TR0=1; while(i) { LcdDisplay(Ds18b20ReadTemp()); //显示操作 if(k1==0) //判断按键操作 { Delay1ms(10); a++; while(!k1); } if(k2==0) //判断按键操作 { Delay1ms(10); a--; while(!k2); } if(k3==0) //判断按键操作 { Delay1ms(10); i++; if(i==9) i=1; while(!k3); } if(i==1) P3=0xfe; if(i==2) P3=0xfc; if(i==3) P3=0xf8; if(i==4) P3=0xf0; if(i==5) P3=0xe0; if(i==6) P3=0xc0; if(i==7) P3=0x80; if(i==8) P3=0x00; e=a-d; if(d>=a) { //继电器控制 P1=0xff; } else{ if(e>=10) P1=0x00; else { if(e>=5) P1=0xf0; else{ if(e>=2) P1=0xfc; else { if(e>=1) P1=0xfe; } } } } }}voidT0_time()interrupt1{TH0=(8192-4607)/32;TL0=(8192-4607)%32;f++; if(f==10){ if(d>=a) buzz=~buzz;}if(f==200){f==0;g++;} if(g==60) { g==0; h++; } if(h==30) { h=0; i--; }}voidLcdDisplay(inttemp) //lcd显示{ unsignedchardatas[]={0,0,0,0,0};//定义数组 floattp; if(temp<0) //当温度值为负数 { LcdWriteCom(0x80); //写地址80表示初始地址 LcdWriteData('-'); //显示负 temp=temp-1; temp=~temp; tp=temp; temp=tp*0.0625*100+0.5; } else { LcdWriteCom(0x83); //写地址80表示初始地址 LcdWriteData('+'); //显示正 tp=temp; temp=tp*0.0625*100+0.5; } datas[0]=temp/10000; datas[1]=temp%10000/1000; datas[2]=temp%1000/100; datas[3]=temp%100/10; datas[4]=temp%10; b=a/10; c=a%10; LcdWriteCom(0x84); //写地址80表示初始地址 LcdWriteData('0'+datas[0]);//百位 LcdWriteCom(0x85); //写地址80表示初始地址 LcdWriteData('0'+datas[1]);//十位 LcdWriteCom(0x86); //写地址80表示初始地址 LcdWriteData('0'+datas[2]);//个位 LcdWriteCom(0x87); //写地址80表示初始地址 LcdWriteData('.'); //显示‘.’ LcdWriteCom(0x88); //写地址80表示初始地址 LcdWriteData('0'+datas[3]);//显示小数点 LcdWriteCom(0x89); //写地址80表示初始地址 LcdWriteData('0'+datas[4]);//显示小数点 d=temp/100;LcdWriteCom(0xcb); //写地址80表示初始地址 LcdWriteData('0'+b); LcdWriteCom(0xcc); //写地址80表示初始地址 LcdWriteData('0'+c);}LCD显示函数:#include"lcd.h"/********************************************************************************函数名:Lcd1602_Delay1ms*函数功能 :延时函数,延时1ms*输入:c*输出:无*说名:该函数是在12MHZ晶振下,12分频单片机的延时。*******************************************************************************/voidLcd1602_Delay1ms(uintc)//误差0us{uchara,b; for(;c>0;c--) { for(b=199;b>0;b--) { for(a=1;a>0;a--); } }}/********************************************************************************函数名:LcdWriteCom*函数功能 :向LCD写入一个字节的命令*输入:com*输出:无*******************************************************************************/#ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时voidLcdWriteCom(ucharcom) //写入命令{ LCD1602_E=0;//使能 LCD1602_RS=0; //选择发送命令 LCD1602_RW=0; //选择写入 LCD1602_DATAPINS=com;//放入命令 Lcd1602_Delay1ms(1); //等待数据稳定 LCD1602_E=1; //写入时序 Lcd1602_Delay1ms(5); //保持时间 LCD1602_E=0;}#elsevoidLcdWriteCom(ucharcom) //写入命令{ LCD1602_E=0; //使能清零 LCD1602_RS=0; //选择写入命令 LCD1602_RW=0; //选择写入 LCD1602_DATAPINS=com; Lcd1602_Delay1ms(1); LCD1602_E=1; //写入时序 Lcd1602_Delay1ms(5); LCD1602_E=0; LCD1602_DATAPINS=com<<4;//发送低四位 Lcd1602_Delay1ms(1); LCD1602_E=1; //写入时序 Lcd1602_Delay1ms(5); LCD1602_E=0;}#endif/********************************************************************************函数名:LcdWriteData*函数功能 :向LCD写入一个字节的数据*输入:dat*输出:无*******************************************************************************/ #ifndef LCD1602_4PINS voidLcdWriteData(uchardat) //写入数据{ LCD1602_E=0; //使能清零 LCD1602_RS=1; //选择输入数据 LCD1602_RW=0; //选择写入 LCD1602_DATAPINS=dat;//写入数据 Lcd1602_Delay1ms(1); LCD1602_E=1;//写入时序 Lcd1602_Delay1ms(5);//保持时间 LCD1602_E=0;}#elsevoidLcdWriteData(uchardat) //写入数据{ LCD1602_E=0; //使能清零 LCD1602_RS=1; //选择写入数据 LCD1602_RW=0; //选择写入 LCD1602_DATAPINS=dat; //由于4位的接线是接到P0口的高四位,所以传送高四位不变 Lcd1602_Delay1ms(1); LCD1602_E=1; //写入时序 Lcd1602_Delay1ms(5); LCD1602_E=0; LCD1602_DATAPINS=dat<<4;//写入低四位 Lcd1602_Delay1ms(1); LCD1602_E=1; //写入时序 Lcd1602_Delay1ms(5); LCD1602_E=0;}#endif/********************************************************************************函数名:LcdInit()*函数功能 :初始化LCD屏*输入:无*输出:无*******************************************************************************/ #ifndef LCD1602_4PINSvoidLcdInit() //LCD初始化子程序{ LcdWriteCom(0x38);//开显示 LcdWriteCom(0x0c);//开显示不显示光标 LcdWriteCom(0x06);//写一个指针加1 LcdWriteCom(0x01);//清屏 LcdWriteCom(0x80);//设置数据指针起点}#elsevoidLcdInit() //LCD初始化子程序{ LcdWriteCom(0x32); //将8位总线转为4位总线 LcdWriteCom(0x28); //在四位线下的初始化 LcdWriteCom(0x0c);//开显示不显示光标 LcdWriteCom(0x06);//写一个指针加1 LcdWriteCom(0x01);//清屏 LcdWriteCom(0x80);//设置数据指针起点}#endif环境温度采集函数:#include"temp.h"/********************************************************************************函数名:Delay1ms*函数功能 :延时函数*输入:无*输出 :无*******************************************************************************/voidDelay1ms(unsignedinty){ unsignedintx; for(y;y>0;y--) for(x=110;x>0;x--);}/***************************************************************************函数名:Ds18b20Init*函数功能 :初始化*输入:无*输出 :初始化成功返回1,失败返回0**************************************************************************/unsignedcharDs18b20Init(){ unsignedinti; DSPORT=0; //将总线拉低480us~960us i=70; while(i--);//延时642us DSPORT=1;//然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低 i=0; while(DSPORT) //等待DS18B20拉低总线 { i++; if(i>5000)//等待>5MS return0;//初始化失败 } return1;//初始化成功}/***************************************************************************函数名:Ds18b20WriteByte*函数功能 :向18B20写入一个字节*输入:com*输出 :无**************************************************************************/voidDs18b20WriteByte(unsignedchardat){ unsignedinti,j; for(j=0;j<8;j++) { DSPORT=0; //每写入一位数据之前先把总线拉低1us i++; DSPORT=dat&0x01;//然后写入一个数据,从最低位开始 i=6; while(i--);//延时68us,持续时间最少60us DSPORT=1; //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值 dat>>=1; }}/***************************************************************************函数名:Ds18b20ReadByte*函数功能 :读取一个字节*输入:com*输出 :无**************************************************************************/unsignedcharDs18b20ReadByte(){ unsignedcharbyte,bi; unsignedinti,j; for(j=8;j>0;j--) { DSPORT=0;//先将总线拉低1us i++; DSPORT=1;//然后释放总线 i++; i++;//延时6us等待数据稳定 bi=DSPORT; //读取数据,从最低位开始读取 byte=(byte>>1)|(bi<<7); i=4; //读取完之后等待48us再接着读取下一个数 while(i--); } returnbyte;}/***************************************************************************函数名:Ds18b20ChangTemp*函数功能 :让18b20开始转换温度*输入:com*输出 :无**************************************************************************/voidDs18b20ChangTemp(){ Ds18b20Init(); Delay1ms(1); Ds18b20WriteByte(0xcc); //跳过ROM操作命令 Ds18b20WriteByte(0x44); //温度转换命令}/***************************************************************************函数名:Ds18b20ReadTempCom*函数功能 :发送读取温度命令*输入:com*输出 :无**************************************************************************/voidDs18b20ReadTempCom(){ Ds18b20Init(); Delay1ms(1); Ds18b20WriteByte(0xcc); //跳过ROM操作命令 Ds18b20WriteByte(0xbe); //发送读取温度命令}/***************************************************************************函数名:Ds18b20ReadTemp*函数功能 :读取温度*输入:com*输出 :无**************************************************************************/intDs18b20ReadTemp(){ inttemp=0; unsignedchartmh,tml; Ds18b20ChangTemp(); //先写入转换命令 Ds18b20ReadTempCom(); //然后等待转换完后发送读取温度命令 tml=Ds18b20ReadByte(); //读取温度值共16位,先读低字节 tmh=Ds18b20ReadByte(); //再读高字节 temp=tmh; temp<<=8; temp|=tml; returntemp;}目录TOC\o"1-2"\h\z\u第一章总论 1一、项目概况 1二、项目所在区域简介 1三、报告编制依据 2四、编制内容 3五、简要结论 3第二章项目建设背景及必要性 5一、项目建设背景 5二、项目建设必要性 5第三章服务对象与需求分析 8第四章建设内容及规模 9一、建设内容 9二、建设规模 9第五章项目选址及建设条件 10一、项目选址 10二、什邡市概况 10三、建设条件 11第六章项目建设规划和工程方案设计 15一、项目建设规划的指导思想、基本原则和重建目标 15二、项目建设规划实施的保障措施 16三、工程方案设计原则 16四、总
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《单片机及嵌入式系统原理》 课件全套 尹勇 第1-14章 计算机基础-ARM应用开发
- 教师招聘简章范本及注意事项
- 2026四川绵阳市公安局游仙区分局招聘警务辅助人员20人备考题库(突破训练)附答案详解
- 2026湖南长沙市第一医院自主招聘备考题库及答案详解【各地真题】
- 2026广东省清远市连南瑶族自治县带编赴高校及三甲医院专项招聘医疗卫生人才22人备考题库附完整答案详解【典优】
- 2026广西桂林信息工程职业学院人才招聘备考题库及完整答案详解【易错题】
- 2026四川大学华西医院生物医学大数据研究院郭安源教授课题组博士后招聘备考题库(研优卷)附答案详解
- 2026中国电信云南公司春季校园招聘备考题库附答案详解(夺分金卷)
- 2026华润电力云南公司招聘备考题库含答案详解【a卷】
- 2026河北邯郸市中医院选聘23人备考题库含答案详解【考试直接用】
- 2026年湖北国土资源职业学院单招综合素质考试题库带答案详解
- 2026云南楚雄市司法局第一批司法协理员招聘10人考试参考题库及答案解析
- 2026年及未来5年中国铍行业市场全景监测及投资战略咨询报告
- 2026年辽宁大连市高职单招职业适应性测试试题题库(答案+解析)
- 中小学戏剧表演剧本《茶馆》第一幕
- 公司规章制度及公司规章制度汇编
- ISO22000-2018全套程序文件模板
- 芯片提取基础知识课件
- 《预防血管内导管相关血流感染过程质控工具包》解读
- JJF 1033-2023计量标准考核规范
- 《中国饮食文化》第1章 中国饮食文化的历史发展
评论
0/150
提交评论