版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
自动化系统创意设计大
赛作品说明书作品名称:温控风扇系统设计队员:2015年4月目录TOC\o"1-5"\h\z\o"CurrentDocument"1、引言32、背景33、意义与应用3\o"CurrentDocument"4、原理简介4\o"CurrentDocument"5、方案设计4\o"CurrentDocument"6、STC12C5A60S2单片机5\o"CurrentDocument"6.1简介5\o"CurrentDocument"PWM寄存器设置5\o"CurrentDocument"PWM占空比计算方法5\o"CurrentDocument"I/O工作方式设置6\o"CurrentDocument"7、LCD液晶显示屏6\o"CurrentDocument"8、温度传感器DS18B208\o"CurrentDocument"8.1初始化9\o"CurrentDocument"8.2写操作10\o"CurrentDocument"8.3读操作10\o"CurrentDocument"9、风扇10\o"CurrentDocument"拓展1:10拓展2:11\o"CurrentDocument"10、硬件电路设计1210.1原理图和部分电路PCB图12\o"CurrentDocument"10.2电机驱动电路13\o"CurrentDocument"11、软件设计1411.1主函数流程图1411.2温度控制风扇程序流程图1511.3按键控制风扇程序流程图1611.4按键设定温度程序流程图17\o"CurrentDocument"12、结语18\o"CurrentDocument"参考文献:18\o"CurrentDocument"附录I:实物硬件图18附录II:程序18摘要:本设计是基于STC12C5A60S2单片机技术与温度传感器测量外界温度的设计原理,进行了不同设计方案的比较,给出了设计的硬件电路,同时对各种关键硬件进行较详细的介绍,并且以流程图的方式对系统设计作出介绍。系统主要通过温度传感器控制不同的PWM占空比输出来控制风扇的档位。而出于方便、可选择性的考虑,系统也添加了辅助功能,就是直接手动控制风扇的档位。关键词:STC12C5A60S2单片机,DS18B20温度传感器,PWM1、引言温控风扇在节能环保方面具有一定的作用,其工作原理除了普通的手动档位调节,主要是通过温度传感器感应外界温度,并自主地进行档位的调节,这样在风扇开着的情况下,不需进行手动就可以根据不同的外界温度进行自主调节风力大小,达到节能目的。2、背景随着空调机在日常生活中的普遍应用,很容易想到电风扇会成为空调的社会淘汰品,其实经过市场的考验和证实,真实的并不是这样的,在空调产品的冲击下,电风扇产品仍然具有很强大的生命力,电风扇在市场的考验中并没有淡出市场,反而销售在不停的复苏中,具有强大的发展空间。据市场调查,电风扇的不停复苏主要在以下原因:一,是电风扇虽然没有空调机的强大的制冷功能,但电风扇是直接取风,风力更加温和,比较适合老年人、儿童以及体质虚弱的人使用。二,是电风扇经过多年的市场使用,较符合人们的使用习惯,而且结构简单、操作方便、安装简易。三是电风扇比起空调产品而言,其价格低廉,相对省电,更易的进入老百姓的家庭。在目前空调还没有普及,并且并不是所有的情况下空调都适合使用的情况下,智能风扇适合人体对温度的要求,智能风扇还有具有相当作用的。3、意义与应用1、普通电风扇的现状及存在的隐患:大部分只有手动调速,功能单一。长时间在高负荷工作容易损坏电器,并且造成电量的损失。2、作品可运用在家庭中,风扇的风力随温度而调节,即可以避免人因温度低吹到冷风而着凉,也可达到节能目的,可见温控风扇更具有优越性。3、其次将此系统装在产热多,急需排热的设备上,可以帮助它及时散掉大量的热。比如电脑散热器等。4、原理简介1、电源开关,控制系统处于工作还是停止状态。2、当系统上电之后,通过单片机读取外界温度,然后在液晶显示屏上显示出来。通过判断温度的范围,控制风扇的停止与转不同的速度。同时LED给出档位指示。温度控制的范围可以通过按键进行设置。3、另外,当不需要温度控制时,可以通过模式切换开关,让系统工作于手动控制模式。通过按键进行调节风扇的停止,与不同转速。5、方案设计方案一:采用两片STC89C516RD单片机、液晶1602和ds18b20,进行设计,让单片机1进行温度读取操作,另外的单片机2通过定时器,产生占空比不同的PWM。两单片机通过串口进行通信,这样单片机1可以通过读取外界的温度,然后对单片机2进行控制。这样就能在不同的温度区间内,单片机2控制直流5v小风扇不同的转速,从而实现温度自动控制风扇。方案二:采用STC12C5A60S2单片机、液晶1602和ds18b20。这也是一款51单片机,但是它的性能比STC89C516RD单片机更强大,而且有独立的双路PWM输出。这样,采用一片STC12C5A60S2单片机就能实现温度读取和直流5v小风扇的转速控制。方案三:采用stm8s105系列单片机、液晶1602和ds18b20,同样可以实现温度读取和直流5v小风扇的转速控制方案比较:方案一需要耗费更多的硬件资源。因此我们直接排除方案一。方案三,如果采用44脚贴片封装的stm8s105单片,可以在很小的覆铜板上把硬件做出来,这样可以节省一些硬件资源。但是,因为温度传感器ds18b20的读取是通过单一I/O口读取的,stm8s105的I/O操作需要设置,让其是处于输入或者输出方式。操作非常麻烦。方案二需要的硬件资源相对较少,而且其I/O口兼容8051单片机,可以实现I/O口准双向操作,这样编程相对简单。综上所述,我们选择方案二。6、STC12C5A60S2单片机6.1简介我们采用的单片机为STC12C5A60S2,STC12C5A60S2/AD/PWM系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S)针对电机控制,强干扰场合。其引脚与普通8051单片机基本相同。PWM寄存器设置STC12C5A60S2单片机内置两路独立PWM输出,通过设置相应寄存器,可以让占空比改变。PWM0的输出口在P1.3,而PWM1的输出口在P1.4相关的设置例子如下面的程序所示:CCON=0;〃初始化PCA控制寄存器//PCA计数器停止运行〃清除CF标志位〃清除所有中断标志位CL=0;〃重置PCA的16位计数器CH=0;CMOD=0x02;〃设置PCA计数器时钟源为Fosc/2〃禁止PCA计数器溢出中断CCAP0H=CCAP0L=0xff;//PWM0口输出0%占空比CCAP1H=CCAP1L=1x00;//PWM1口输出100%占空比CCAPM0=0x42;//PCA模块0工作在8位PWM模式并且没有PCA中断CR=1;〃开始计数当寄存器CL值小于[EPCnL,CAPPnL]时,输出为低电平;当寄存器CL值等于或大于[EPCnL,CAPPnL]时,输出为高电平;当寄存器CL的值由FF变为00溢出时,[EPCnHCAPPnH]的内容被装载到[EPCnL,CAPPnL]中。这样,就可以实现无干扰地实现PWM更新。PWM占空比计算方法输出的占空比乘以256后,转换为十六进制,然后进行取反,再同时赋值给寄存器CCAPxH和CCAPxLo6.4I/O工作方式设置其I/O口的工作方式有准双向/弱上拉输出,强推挽输出,高阻输入(电流不能流入也不能流出),开漏输出(若外加上拉也可以读取)等。缺省状态下,I/O的工作方式为准双向/弱上拉。本设计中,对于温度传感器的读写操作,需要I/O工作在准双向的工作状态。而PWM输出端口,LED驱动输出,端口我们将I/O口的工作方式设置分强推挽输出,输出的拉电流达到20mA,能更好的驱动负载。设置方式,通过配置相应的寄存器PxM1和PxM0,如下表1所示:PxM1[7:0]PxM0[7:0]I/O口模式00准双向口01强推挽输出10高阻输入11开漏表17、LCD液晶显示屏时钟的显示屏选用1602字符液晶。1602是指显示的内容为16*2,即能够同时显示两行,每行16个字符。常见的1602字符液晶有两种,一种显示的是绿色背光黑色字体,另一种显示蓝色背光白色字体,目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的。本设计所用1602液晶模块,显示屏是蓝色背光白色字体。图1为1602字符液晶引脚图各引脚功能为:第1脚:GND为地电源。第2脚:VCC接5V正电源。第3脚:VO为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生重影,使用一个1K的电位器调整对比度。第4脚:RS为寄存器选择,高电平时选择数据寄存器,低电平时选择指令寄存器。第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第7~14脚:DB0~DB7为8位双向数据线。第15~16脚:背光灯电源。①基本操作时序:读状态输入RS=L,R/W=H,E=H输出D0—D7=状态字写指令输入RS=L,R/W=L,D0—D7=指令码,E二高脉冲输出无读数据输入RS=H,R/W=H,E=H输出D0—D7=数据写数据输入RS=H,R/W=L,D0—D7=数据,£二高脉冲输出无②RAM地址映射图:如图2所示:LCD
16字乂2行0001102030405060703090A0B0C0D0E0F1027404142434445464748494A4B4C4D4E4F5067图2RAM地址映射图当我们在00-0F、40-4F,的地址中任意地写入显示数据时,液晶都可以显示,当写入10-27或50-67地址处时,必须通过移屏指令将它们移入可显示的区域。③读、写操作时序:如图3所示:因为本设计的程序中只涉及到液晶的写操作,因此下面简单介绍写操作过程,如下:(1)通过RS确定是写数据还是写命令。(2)读写控制端设置为写模式。(3)将数据或命令送达数据线上。(4)给E一个高脉冲将数据送到液晶控制器,完成写操作。图3读写操作时序图④初始化设置:(1)显示模式设置,如图4:1期院U011「LDG图4显示模式设置图(2)显示开/关及光标设置,如图5:隐00005bCB睚由此标:3他戒屿先标囚嫁:B=Qk标不里示000001NS当诫或写个字符后It址指HMn.HJt标如LN9与迁戒町个学符命驰:.址指*04LRJt+hWElS-t当H•个项时.塑邮驻希左HW)或器葬*以明到常虹壬步期而鲜哥秒丈的欢曝s力当与一•字符W・整果显示不誓期90■0100000V010J00_油就博_」0U0110QU000I1!0整WE尊,同亏址标虚随珏幼图5显示开/关及光标设置图8、温度传感器DS18B20用于检测当前的温度,DS18B20测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。产品支持3V〜5.5V的电压范围,使系统设计更灵活、方便。DS18B20的引脚图如图6所示。引脚1:地;引脚2:数字输入输出;引脚3:可选的5V电源;rscj图6DS18B20的引脚图DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20控制方法(DS18B20有六条控制命令):温度转换44H启动DS18B20进行温度转换读暂存器BEH读暂存器9位二进制数字写暂存器4EH将数据写入暂存器的TH、TL字节复制暂存器48H把暂存器的TH、TL字节写到E2RAM中重新调E2RAMB8H把E2RAM中的TH、TL字节写到暂存器TH、TL字节读电源供电方式B4H启动DS18B20发送电源供电方式的信号给主CPU8.1初始化(1)先将数据线置高电平“1”。(2)延时(该时间要求的不是很严格,但是尽可能的短一点)(3)数据线拉到低电平“0”。(4)延时750微秒(该时间的时间范围可以从480^U960微秒)。(5)数据线拉到高电平“1”。(6)延时等待(如果初始化成功则在15到60微妙时间之内产生一个由DS18B20所返回的低电平“0”。据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时控制)。(7)若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第(5)步的时间算起)最少要480微秒。(8)将数据线再次拉高到高电平“1”后结束。8.2写操作(1)数据线先置低电平“0”。(2)延时确定的时间为15微秒。(3)按从低位到高位的顺序发送字节(一次只发送一位)。(4)延时时间为45微秒。(5)将数据线拉到高电平。(6)重复上(1)到(6)的操作直到所有的字节全部发送完为止。(7)最后将数据线拉高。8.3读操作(1)将数据线拉高“1”。(2)延时2微秒。(3)将数据线拉低“0”。(4)延时3微秒。(5)将数据线拉高“1”。(6)延时5微秒。(7)读数据线的状态得到1个状态位,并进行数据处理。(8)延时60微秒。9、风扇本设计采用的是由5V直流供电的小型风扇。在设计当中,我们只预置了两档速度相差明显的档位,一档的PWM占空比为30%,二档的占空比为90%。这样设计的目的主要是考虑到在档位切换时,可以看到速度有非常明显的变化,让实验现象更加直观。拓展1:在主要考虑实用性方面的因素,我们还可以将控制档位细化,做成5个档位,甚至10个档位,等等。不同的速度是通过调节不同的占空比来实现的。下面我们给出温度控制风扇转5个速度不同档位的部分关键程序示例:voidcontrol(void){if((a*100+b*10+c)<tem_1){CCAP0H=CCAP0L=0xFF;//PWM0口输出0%占空比}elseif(tem_1<=(a*100+b*10+c)&&(a*100+b*10+c)<tem_2){CCAP0H=CCAP0L=0xB3;//PWM0口输出30%占空比}elseif(tem_1<=(a*100+b*10+c)&&(a*100+b*10+c)<tem_2){CCAP0H=CCAP0L=0x08;//PWM0口输出50%占空比}elseif(tem_1<=(a*100+b*10+c)&&(a*100+b*10+c)<tem_2){CCAP0H=CCAP0L=0x4D;//PWM0口输出70%占空比}elseif(tem_2<=(a*100+b*10+c)){CCAP0H=CCAP0L=0x1A;//PWM0口输出90%占空比}}拓展2:在本设计验证成功并且可靠的基础上,我们可以继续延伸,给出温度控制交流220V供电的风扇的设计方案,比如宿舍的风扇:用普通的单片机,通过温度传感器,读取外界的温度,进而控制继电器的吸合与断开。假设设置4个档位,可以用单片机接三个继电器来实现:当外界温度较低时,此时所有继电器处于断开状态,风扇不转;当温度升高到一定程度时,单片机使继电器1吸合,继电器2、3断开,让风扇转一档,即较慢速度;当温度继续升高,单片机使继电器2吸合,继电器1、3断开,风扇转二档,即较快的速度。当温度再升高时,单片机使继电器3吸合,继电器1、2断开,风扇转三档,即最快的速度。10、硬件电路设计10.1原理图和部分电路PCB图、'匚匚■pno-FWSW1旭1PJ.1.TT2F.NPOOP1.2nj.iPl.3Pfl.2PJ4P0.3PL5P04P].&lU.SPl1PTl、'匚匚■pno-FWSW1旭1PJ.1.TT2F.NPOOP1.2nj.iPl.3Pfl.2PJ4P0.3PL5P04P].&lU.SPl1PTlft监丁1WTXIXU.LALLZFINTfh'Pl2Pgl*TfhT^.4LEl^,巴,WRi'P.l^P24RUEF2JXI.2457_8用NT9业I:!14―—i5~SW17M2I3I9网口20riwi■■.~~TTnyiNT"pnr"工作原理:通过P3.7端口处所接的电路的SW2的闭合或断开选择温控或键控。当SW2=1时,选择温控,通过DS18B20温度传感器获取外界温度,通过LCD显示当前温度,并且显示设定的温度控制一档和二档的值,比如设定25和30摄氏度作为控制值。外界温度较低时,比如小于25摄氏度,处于0档时,风扇不转,LED1、2不亮。当温度较高,等于或大于25且小于30摄氏度时,处于一档,风扇转动,LED1亮、LED2灭。当温度高于30摄氏度时,处于二档,风扇高速转动,LED1、2都亮。当SW2=0;选择键控,通过P2.0处所接的独立键盘进行档位的选择。缺省状态下为空挡,液晶屏显示DW=0,LED1、2不亮,风扇不转。按一次key1,档位加一,此时为一档,液晶屏上显示DW=1,LED1亮、LED2灭,风扇转动较慢。再按一次key1键,档位加1,此时液晶屏上显示DW=2,LED1、2亮,风扇高速转动。再按一次keyl,档位归零。o温控风扇系统J2WilJISU10lololoIQloQlplo言oTngloo温控风扇系统J2WilJISU10lololoIQloQlplo言oTnglo_onuoIfigBlqglollollollollollollolglollollsOld叶庭剑何圣川*1黄应亮H黄灿莹*申启纳图8PCB图10.2电机驱动电路L298N的主要特点是:工作电压高,最高工作电压可达46V;输出电流大,瞬间峰值电流可达3A,持续工作电流为2A;额定功率25W。采用标准逻辑电平信号控制;具有两个使能控制端,在不受输入信号影响的情况下允许或禁止器件工作有一个逻辑电源输入端,使内部逻辑电路部分在低电压下工作;可以外接检测电阻,将变化量反馈给控制电路。使用L298N芯片驱动电机,该芯片可以驱动一台两相步进电机或四相步进电机,也可以驱动两台直流电机。用L298控制直流电机很容易。用单片机端口高低就可以控制开始、停止、正反转,利用EN1,EN2控制使能就能控制转速。其原理图,如图9:图9L298N原理图11、软件设计11.1主函数流程图图10主函数流程图图11温度控制风扇程序流程图图12按键控制风扇程序流程图图13按键设定温度程序流程图12、结语本设计结合生活中的实际情况,利用单片机技术设计并制作了温控风扇系统,完全达到了设计要求,其次通过独立键盘和温度传感器可以实现对应的操作,使操作更加方便灵活,所选取的单片机具有较高的抗干扰能力,也符合这个设计的稳定性要求。我们队伍的各成员在整个设计制作过程中,相互配合,相互检查,但又进行了分工,大大提高了工作效率。参考文献:郭天祥新概念51单片机C语言教程一一入门、提高、开发、拓展全攻略电子工业大学出版社2010李广弟,朱月秀,等.单片机基础[M].北京航空航天大学出版社,2001.模拟电子技术基础[M].高等教育出版社,2001.数字电子技术基础[M].高等教育出版社,2006.附录I:实物硬件图图14实物硬件图附录11:程序#include<stc12c5a60s2.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#defineLCD1602_DATAPINSP0sfrPCAPWM0=0xf2;//定义寄存器PCAPWM0sfrPCAPWM1=0xf3;//定义寄存器PCAPWM1sbitLCD1602_E=P「2;//定义lcd1602的使能端sbitLCD1602_RW=P「1;//定义lcd1602的写操作端sbitLCD1602_RS=P「0;//定义lcd1602的发送命令端sbitDSPORT=P2"7;//温度传感器读写端sbitLED0=P2"3;sbitLED1=P2"4;sbitjia_key=P2"0;//加速按钮sbitkey1=P2"1;//控制温度调节按键1、2sbitkey2=P2”2;sbitkey_sw=P3"7;//温控与键控切换开关uinta=0;uintb=0;uintc=0;uinttem_1=27;uinttem_2=30;ucharnum=0;/****个**************************************************************************函数名:Delay1ms*函数功能:延时函数""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""/个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/voidDelay1ms(uinty)//粗略延时1ms{uintx;for(;y>0;y--){for(x=440;x>0;x—);}}voiddelay1ms(void)//误差0us{unsignedchara,b;for(b=129;b>0;b—)for(a=45;a>0;a—);voiddelay1us(uintx)//误差0us{unsignedchara,b;for(b=x;b>0;b—)for(a=3;a>0;a—);}/****个**************************************************************************函数名:Ds18b20Init*函数功能:初始化*输入:无*输出:初始化成功返回1,失败返回0““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““/个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/voidLcdWriteCom(ucharcom)//写入命令{LCD1602_E=0;//使能LCD1602_RS=0;//选择发送命令LCD1602_RW=0;//选择写入LCD1602_DATAPINS=com;//放入命令Delay1ms(1);//等待数据稳定LCD1602_E=1;//写入时序Delay1ms(5);//保持时间LCD1602_E=0;}voidLcdWriteData(uchardat)//写入数据{LCD1602_E=0;//使能清零LCD1602_RS=1;//选择输入数据LCD1602_RW=0;//选择写入LCD1602_DATAPINS=dat;//写入数据Delay1ms(1);LCD1602_E=1;//写入时序Delay1ms(5);//保持时间LCD1602_E=0;}//LCD初始化子程序voidLcdInit()//LCD初始化子程序LcdWriteCom(0x38);//开显示LcdWriteCom(0x0c);//开显示不显示光标LcdWriteCom(0x06);//写一个指针加1LcdWriteCom(0x01);//清屏LcdWriteCom(0x80);//设置数据指针起点}ucharDs18b20Init(){uchari;DSPORT=0;//将总线拉低480us~960usdelay1us(642);//延时642usDSPORT=1;//然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低i=0;while(DSPORT)//等待DS18B20拉低总线{i++;if(i>5)//等待>5MS{return0;//初始化失败}delay1ms();}return1;//初始化成功}/****个**************************************************************************函数名:Ds18b20WriteByte*函数功能:向18B20写入一个字节""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""/个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/voidDs18b20WriteByte(uchardat){uintj;for(j=0;j<8;j++){DSPORT=0;//每写入一位数据之前先把总线拉低1usdelay1us(1);DSPORT=dat&0x01;//然后写入一个数据,从最低位开始delay1us(68);//延时68us,持续时间最少60usDSPORT=1;//然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值dat>>=1;/个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个*函数名:Ds18b20ReadByte*函数功能:读取一个字节""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""/个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/ucharDs18b20ReadByte(){ucharbyte,bi;uintj;for(j=8;j>0;j--){DSPORT=0;//先将总线拉低1usdelay1us(1);DSPORT=1;//然后释放总线delay1us(6);//延时6us等待数据稳定bi=DSPORT;//读取数据,从最低位开始读取/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/byte=(byte>>1)|(bi<<7);delay1us(45);}returnbyte;}*****************************************************************************函数名:Ds18b20ChangTemp*函数功能:让18b20开始转换温度""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""/个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/voidDs18b20ChangTemp(){Ds18b20Init();delay1ms();Ds18b20WriteByte(0xcc);//跳过ROM操作命令Ds18b20WriteByte(0x44);//温度转换命令}***************************************************************************函数名:Ds18b20ReadTempCom*函数功能:发送读取温度命令""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""/个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/voidDs18b20ReadTempCom(){Ds18b20Init();
delay1ms();Ds18b20WriteByte(0xcc);//跳过ROM操作命令Ds18b20WriteByte(0xbe);//发送读取温度命令/****个***********************************************************************函数名:Ds18b20ReadTemp*函数功能:读取温度""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""/个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/intDs18b20ReadTemp(){inttemp=0;uchartmh,tml;〃先写入转换命令〃然后等待转换完后发送读取温度命令〃先写入转换命令〃然后等待转换完后发送读取温度命令//读取温度值共16位,先读低字节//再读高字节Ds18b20ReadTempCom();tml=Ds18b20ReadByte();tmh=Ds18b20ReadByte();temp=tmh;temp<<=8;temp|=tml;returntemp;}/个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个*函数名:LcdDisplay()*函数功能:LCD显示读取到的温度"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""/个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/voidLcdDisplay(inttemp)//lcd显示{unsignedchardatas[]={0,0,0,0,0};//定义数组floattp;if(temp<0)//当温度值为负数{LcdWriteCom(0x80);//写地址80表示初始地址LcdWriteData('-');//显示负//因为读取的温度是实际温度的补码,所以减1,再取反求出原码temp=temp-1;temp=~temp;tp=temp;temp=tp*0.0625*100+0.5;〃留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就〃算加上0.5,还是在小数点后面。else{LcdWriteCom(0x80);//写地址80表示初始地址LcdWriteData('+');//显示正tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量//如果温度是正的那么,那么正数的原码就是补码它本身temp=tp*0.0625*100+0.5;〃留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就〃算加上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;a=datas[0];//a,b,c的作用是取温度的整数,进行温控b=datas[1];c=datas[2];LcdWriteCom(0x82);//写地址LcdWriteData('0'+datas[0]);//百位LcdWriteCom(0x83);//写地址LcdWriteData('0'+datas[1]);//十位LcdWriteCom(0x84);//写地址LcdWriteData('0'+datas[2]);//个位LcdWriteCom(0x85);//写地址LcdWriteData('.');//显示'.'LcdWriteCom(0x86);//写地址LcdWriteData('0'+datas[3]);//显示小数点LcdWriteCom(0x87);//写地址LcdWriteData('0'+datas[4]);//显示小数}/个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个温度控制电机输出占空比函数"""""""""""""""""""""""""""""""""""""""""""""""/***********************************************/voidcontrol(void){if((a*100+b*10+c)<tem_1){CCAP0H=CCAP0L=0xff;//PWM0口输出0%占空比LED0=0;LED1=0;}elseif(tem_1<=(a*100+b*10+c)&&(a*100+b*10+c)<tem_2){CCAP0H=CCAP0L=0xB3;//PWM0口输出30%占空比LED0=1;LED1=0;}elseif(tem_2<=(a*100+b*10+c)){CCAP0H=CCAP0L=0x1a;//PWM0口输出90%占空比LED0=1;LED1=1;}}/个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个*函数名:keyscan*函数功能:键盘扫描""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""/个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/voidkeyscan1(){if(0==key1)//温度下限调整按键{Delay1ms(20);if(0==key1){tem_1++;if(31==tem_1)tem_1=17;while(!key1);}}if(0==key2)//温度上限调整按键{Delay1ms(20);if(0==key2){tem_2++;if(44==tem_2)tem_2=23;while(!key2);}}if(tem_1==tem_2)tem_2++;//防止两个温度范围一样if(tem_2<tem_1)//防止温度上限比温度下限低{tem_2=tem_1+1;}}voidkeyscan2(){if(jia_key==0)//加速按键{Delay1ms(20);;if(jia_key==0){num++;if(num==3)num=0;while(jia_key==0);}}}/****个****************************************电机输出档位选择函数"""""""""""""""""""""""""""""""""""""""""""""""/***********************************************/voiddangwei(){switch(num){case0:CCAP0H=CCAP0L=0xff;//PWM0口输出0%占空比LED0=0;LED1=0;break;case1:CCAP0H=CCAP0L=0x67;//PWM0口输出60%占空比LED0=1;LED1=0;break;case2:CCAP0H=CCAP0L=0x1a;//PWM0口输出90%占空比LED0=1;LED1=1;break;}}/个**************************************************
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030年中国汽车经销行业开拓第二增长曲线战略制定与实施研究报告
- 自动排序上料工作原理解析
- 关于大学校园真善美的调查
- 2025年中国海岛旅游行业发展趋势预测及投资战略咨询报告
- 蛹虫草产业化项目可行性研究报告建议书
- 春节购房盛宴
- 年产2000万米汽车密封条生产线技术升级改造项目可行性研究报告写作模板-备案审批
- 二零二五年度房产购置专项贷款服务合同3篇
- 有机食品知识培训课件
- 2025年度数据中心EMC合同能源管理项目合同2篇
- 陕西2020-2024年中考英语五年真题汇编学生版-专题09 阅读七选五
- 多源数据融合平台建设方案
- 2023-2024学年上海市普陀区三年级(上)期末数学试卷
- 居家养老上门服务投标文件
- 浙江省宁波市鄞州区2024年七年级上学期期末数学试题【含答案】
- 浙江省杭州市钱塘区2023-2024学年四年级上学期语文期末试卷
- GB/T 44713-2024节地生态安葬服务指南
- 小班班本课程《吃饭这件小事》
- 水文气象报告
- 2022年sppb简易体能状况量表
- 锚杆、锚索框架梁施工方案
评论
0/150
提交评论