温控风扇系统设计_第1页
温控风扇系统设计_第2页
温控风扇系统设计_第3页
温控风扇系统设计_第4页
温控风扇系统设计_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

自动化系统创意设计大赛作品说明书作品名称:温控风扇系统设计队员:2023年4月目录1、引言 32、背景 33、意义与应用 34、原理简介 45、方案设计 46、STC12C5A60S2单片机 56.1简介 56.2PWM寄存器设立 56.3PWM占空比计算方法 56.4I/O工作方式设立 67、LCD液晶显示屏 68、温度传感器DS18B20 88.1

初始化 98.2

写操作 108.3

读操作 109、风扇 10拓展1: 10拓展2: 1110、硬件电路设计 1210.1原理图和部分电路PCB图 1210.2电机驱动电路 1311、软件设计 1411.1主函数流程图 1411.2温度控制风扇程序流程图 1511.3按键控制风扇程序流程图 1611.4按键设定温度程序流程图 1712、结语 18参考文献: 18附录Ⅰ:实物硬件图 18附录Ⅱ:程序 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单片机基本相同。6.2PWM寄存器设立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更新。6.3PWM占空比计算方法输出的占空比乘以256后,转换为十六进制,然后进行取反,再同时赋值给寄存器CCAPxH和CCAPxL。6.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字符液晶引脚图图11602字符液晶引脚图各引脚功能为:第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=数据,E=高脉冲

输出

无②RAM地址映射图:如图2所示:图2RAM地址映射图当我们在00-0F、40-4F,的地址中任意地写入显示数据时,液晶都可以显示,当写入10-27或50-67地址处时,必须通过移屏指令将它们移入可显示的区域。③读、写操作时序:如图3所示:由于本设计的程序中只涉及到液晶的写操作,因此下面简朴介绍写操作过程,如下:(1)通过RS拟定是写数据还是写命令。(2)读写控制端设立为写模式。(3)将数据或命令送达数据线上。(4)给E一个高脉冲将数据送到液晶控制器,完毕写操作。图3读写操作时序图④初始化设立:(1)显示模式设立,如图4:图4显示模式设立图(2)显示开/关及光标设立,如图5:图5显示开/关及光标设立图8、温度传感器DS18B20

用于检测当前的温度,DS18B20测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。产品支持3V~5.5V的电压范围,使系统设计更灵活、方便。

DS18B20的引脚图如

图6所示。引脚1:地;引脚2:数字输入输出;引脚3:可选的5V电源;图6DS18B20的引脚图DS18B20内部结构重要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20控制方法(DS18B20有六条控制命令):

温度转换

44H

启动DS18B20进行温度转换

读暂存器

BEH

读暂存器9位二进制数字

写暂存器

4EH

将数据写入暂存器的TH、TL字节复制暂存器

48H

把暂存器的TH、TL字节写到E2RAM中

重新调E2RAM

B8H

把E2RAM中的TH、TL字节写到暂存器TH、TL字节

读电源供电方式

B4H

启动DS18B20发送电源供电方式的信号给主CPU

8.1

初始化

(1)

先将数据线置高电平“1”。

(2)

延时(该时间规定的不是很严格,但是尽也许的短一点)

(3)

数据线拉到低电平“0”。

(4)

延时750微秒(该时间的时间范围可以从480到960微秒)。

(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图图7原理图工作原理:通过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亮,风扇高速转动。再按一次key1,档位归零。图8PCB图10.2电机驱动电路L298N的重要特点是:工作电压高,最高工作电压可达46V;输出电流大,瞬间峰值电流可达3A,连续工作电流为2A;额定功率25W。采用标准逻辑电平信号控制;具有两个使能控制端,在不受输入信号影响的情况下允许或严禁器件工作有一个逻辑电源输入端,使内部逻辑电路部分在低电压下工作;可以外接检测电阻,将变化量反馈给控制电路。使用L298N芯片驱动电机,该芯片可以驱动一台两相步进电机或四相步进电机,也可以驱动两台直流电机。用L298控制直流电机很容易。用单片机端口高低就可以控制开始、停止、正反转,运用EN1,EN2控制使能就能控制转速。其原理图,如图9:图9L298N原理图11、软件设计11.1主函数流程图开始开始初始化温度控制风扇模式按键控制风扇模式Key_sw==1?是否图10主函数流程图11.2温度控制风扇程序流程图开始开始读取环境温度达成设定温度Ⅰ?风扇不转LED1、2不亮达成设定温度Ⅱ风扇转一档LED1亮LED2不亮风扇转二档LED1、LED2亮液晶显示当前温度显示设定温度Ⅰ、Ⅱ值是否是否图11温度控制风扇程序流程图11.3按键控制风扇程序流程图开始开始液晶显示档位0LED1、2不亮num=0num==1?num==2?液晶显示档位1LED1亮LED2灭液晶显示档位2LED1、LED2亮是否是否图12按键控制风扇程序流程图11.4按键设定温度程序流程图开始读取I/O电平变化是否有按键被按下开始读取I/O电平变化是否有按键被按下延时10ms否是档位加1Key1==0?Key2==0?Key3==0?档位==2?档位归0Tem1==31?Tem2==44?Tem1=17Tem1++Tem2=23Tem2++是是是是是是否否否备注:本设计只设立两档风扇的不同转速Tem1为温控档位的温度下限Ten2为温控档位的温度上限结束12、结语本设计结合生活中的实际情况,运用单片机技术设计并制作了温控风扇系统,完全达成了设计规定,另一方面通过独立键盘和温度传感器可以实现相应的操作,使操作更加方便灵活,所选取的单片机具有较高的抗干扰能力,也符合这个设计的稳定性规定。我们队伍的各成员在整个设计制作过程中,互相配合,互相检查,但又进行了分工,大大提高了工作效率。参考文献:[1]郭天祥新概念51单片机C语言教程——入门、提高、开发、拓展全攻略电子工业大学出版社2023[2]李广弟,朱月秀,等.单片机基础[M].北京航空航天大学出版社,2023.[3]模拟电子技术基础[M].高等教育出版社,2023.[4]数字电子技术基础[M].高等教育出版社,2023.附录Ⅰ:实物硬件图图14实物硬件图附录Ⅱ:程序#include<stc12c5a60s2.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#defineLCD1602_DATAPINSP0sfrPCAPWM0=0xf2;//定义寄存器PCAPWM0sfrPCAPWM1=0xf3;//定义寄存器PCAPWM1sbitLCD1602_E=P1^2; //定义lcd1602的使能端sbitLCD1602_RW=P1^1; //定义lcd1602的写操作端sbitLCD1602_RS=P1^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;}voidLcdInit() //LCD初始化子程序{ LcdWriteCom(0x38);//开显示 LcdWriteCom(0x0c);//开显示不显示光标 LcdWriteCom(0x06);//写一个指针加1 LcdWriteCom(0x01);//清屏 LcdWriteCom(0x80);//设立数据指针起点}ucharDs18b20Init(){ uchari; DSPORT=0; //将总线拉低480us~960us delay1us(642); //延时642us DSPORT=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; //每写入一位数据之前先把总线拉低1us delay1us(1); DSPORT=dat&0x01;//然后写入一个数据,从最低位开始 delay1us(68);//延时68us,连续时间最少60us DSPORT=1; //然后释放总线,至少1us给总线恢复时间才干接着写入第二个数值 dat>>=1; }}/********************************************************************************函数名:Ds18b20ReadByte*函数功能 :读取一个字节******************************************************************************/ucharDs18b20ReadByte(){ ucharbyte,bi; uintj; for(j=8;j>0;j--) { DSPORT=0;//先将总线拉低1us delay1us(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; Ds18b20ChangTemp(); //先写入转换命令 Ds18b20ReadTempCom(); //然后等待转换完后发送读取温度命令 tml=Ds18b20ReadByte(); //读取温度值共16位,先读低字节 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; }}/*****************************************************************************函数名:displayx()*函数功能 :LCD显示读取到的键盘的数值*****************************************************************************/voiddisplay1(intp){unsignedchardatas[]={0,0}; datas[0]=p/10;datas[1]=p%10; LcdWriteCom(0x8b); LcdWriteData('0'+datas[0]); L

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论