温控风扇系统设计.doc

上传人:xin****828 文档编号:6640665 上传时间:2020-03-01 格式:DOC 页数:29 大小:1.09MB
返回 下载 相关 举报
温控风扇系统设计.doc_第1页
第1页 / 共29页
温控风扇系统设计.doc_第2页
第2页 / 共29页
温控风扇系统设计.doc_第3页
第3页 / 共29页
点击查看更多>>
资源描述
自动化系统创意设计大赛作品说明书作品名称:温控风扇系统设计 队 员 : 2015年 4月目录1、引言32、背景33、意义与应用34、原理简介45、方案设计46、STC12C5A60S2单片机56.1简介56.2 PWM寄存器设置56.3 PWM占空比计算方法56.4 I/O工作方式设置67、LCD液晶显示屏68、温度传感器DS18B2088.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.2 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溢出时, EPCnH CAPPnH的内容被装载到 EPCnL, CAPPnL 中。这样,就可以实现无干扰地实现PWM更新。6.3 PWM占空比计算方法输出的占空比乘以256后,转换为十六进制,然后进行取反,再同时赋值给寄存器CCAPxH 和CCAPxL。6.4 I/O工作方式设置其I/O口的工作方式有准双向/弱上拉输出,强推挽输出,高阻输入(电流不能流入也不能流出),开漏输出(若外加上拉也可以读取)等。缺省状态下,I/O的工作方式为准双向/弱上拉。本设计中,对于温度传感器的读写操作,需要I/O工作在准双向的工作状态。而PWM输出端口,LED驱动输出,端口我们将I/O口的工作方式设置分强推挽输出,输出的拉电流达到20mA,能更好的驱动负载。设置方式,通过配置相应的寄存器PxM1和PxM0,如下表1所示:PxM1 7:0PxM0 7:0I/O口模式00准双向口01强推挽输出10高阻输入11开漏表17、LCD液晶显示屏 时钟的显示屏选用1602字符液晶。1602是指显示的内容为16*2,即能够同时显示两行,每行16个字符。常见的1602字符液晶有两种,一种显示的是绿色背光黑色字体,另一种显示蓝色背光白色字体,目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的。本设计所用1602液晶模块,显示屏是蓝色背光白色字体。图1为1602字符液晶引脚图图1 1602字符液晶引脚图 各引脚功能为: 第1脚:GND为地电源。 第2脚:VCC接5V正电源。 第3脚:VO为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生重影,使用一个1K的电位器调整对比度。 第4脚:RS为寄存器选择,高电平时选择数据寄存器,低电平时选择指令寄存器。 第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。 第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 第714脚:DB0DB7为8位双向数据线。第1516脚:背光灯电源。基本操作时序:读状态 输入RS=L,R/W=H,E=H 输出D0D7=状态字写指令 输入RS=L,R/W=L,D0D7=指令码,E=高脉冲 输出无读数据 输入RS=H,R/W=H,E=H 输出D0D7=数据写数据 输入RS=H,R/W=L,D0D7=数据,E=高脉冲 输出无RAM地址映射图:如图2所示:图2 RAM地址映射图当我们在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测量温度范围为 -55C+125C,在-10+85C范围内,精度为0.5C。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。产品支持3V5.5V的电压范围,使系统设计更灵活、方便。DS18B20的引脚图如图6所示。引脚1:地;引脚2:数字输入输出;引脚3:可选的5V电源;图 6 DS18B20的引脚图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到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个速度不同档位的部分关键程序示例:void control (void) if(a*100+b*10+c) tem_1) CCAP0H = CCAP0L = 0xFF; /PWM0 口输出 0%占空比 else if (tem_1 = (a*100+b*10+c)&(a*100+b*10+c)tem_2 ) CCAP0H = CCAP0L = 0xB3; /PWM0 口输出30%占空比 else if (tem_1 = (a*100+b*10+c)&(a*100+b*10+c)tem_2 ) CCAP0H = CCAP0L = 0x08; /PWM0 口输出50%占空比 else if (tem_1 = (a*100+b*10+c)&(a*100+b*10+c)tem_2 ) CCAP0H = CCAP0L = 0x4D; /PWM0 口输出70%占空比 else if (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,档位归零。图8 PCB图10.2 电机驱动电路L298N 的主要特点是:工作电压高,最高工作电压可达46V;输出电流大,瞬间峰值电流可达3A,持续工作电流为2A;额定功率25W。采用标准逻辑电平信号控制;具有两个使能控制端,在不受输入信号影响的情况下允许或禁止器件工作有一个逻辑电源输入端,使内部逻辑电路部分在低电压下工作;可以外接检测电阻,将变化量反馈给控制电路。使用L298N 芯片驱动电机,该芯片可以驱动一台两相步进电机或四相步进电机,也可以驱动两台直流电机。用L298 控制直流电机很容易。用单片机端口高低就可以控制开始、停止、正反转,利用EN1,EN2 控制使能就能控制转速。其原理图,如图9:图9 L298N原理图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电平变化是否有按键被按下延时10ms否是档位加1Key1=0?Key2=0?Key3=0?档位=2?档位归0Tem1=31?Tem2=44?Tem1=17Tem1+Tem2=23Tem2+是是是是是是否否否备注:本设计只设置两档风扇的不同转速Tem1为温控档位的温度下限Ten2 为温控档位的温度上限结束图13按键设定温度程序流程图12、结语本设计结合生活中的实际情况,利用单片机技术设计并制作了温控风扇系统,完全达到了设计要求,其次通过独立键盘和温度传感器可以实现对应的操作,使操作更加方便灵活,所选取的单片机具有较高的抗干扰能力,也符合这个设计的稳定性要求。我们队伍的各成员在整个设计制作过程中,相互配合,相互检查,但又进行了分工,大大提高了工作效率。参考文献:1郭天祥 新概念51单片机C语言教程入门、提高、开发、拓展全攻略 电子工业大学出版社 20102李广弟, 朱月秀, 等. 单片机基础M. 北京航空航天大学出版社, 2001.3模拟电子技术基础M. 高等教育出版社, 2001.4数字电子技术基础M. 高等教育出版社, 2006.附录:实物硬件图图14实物硬件图附录:程序#include#include #define uchar unsigned char#define uint unsigned int#define LCD1602_DATAPINS P0sfr PCAPWM0 = 0xf2; /定义寄存器PCAPWM0sfr PCAPWM1 = 0xf3; /定义寄存器PCAPWM1sbit LCD1602_E=P12; /定义lcd1602的使能端sbit LCD1602_RW=P11;/定义lcd1602的写操作端sbit LCD1602_RS=P10;/定义lcd1602的发送命令端sbit DSPORT=P27; /温度传感器读写端sbit LED0 = P23;sbit LED1 = P24;sbit jia_key=P20;/加速按钮sbit key1 = P21; /控制温度调节按键1、2sbit key2 = P22;sbit key_sw = P37;/温控与键控切换开关 uint a=0; uint b=0; uint c=0; uint tem_1=27; uint tem_2=30; uchar num=0; /* 函 数 名 : Delay1ms* 函数功能 : 延时函数*/void Delay1ms(uint y) /粗略延时1msuint x;for( ; y0; y-)for(x=440; x0; x-);void delay1ms(void) /误差 0us unsigned char a,b; for(b=129;b0;b-) for(a=45;a0;a-);void delay1us(uint x) /误差 0us unsigned char a,b; for(b=x;b0;b-) for(a=3;a0;a-);/* 函 数 名 : Ds18b20Init* 函数功能 : 初始化* 输 入 : 无* 输 出 : 初始化成功返回1,失败返回0*/ void LcdWriteCom(uchar com) /写入命令LCD1602_E = 0; /使能LCD1602_RS = 0; /选择发送命令LCD1602_RW = 0; /选择写入LCD1602_DATAPINS = com; /放入命令Delay1ms(1);/等待数据稳定LCD1602_E = 1; /写入时序Delay1ms(5); /保持时间LCD1602_E = 0;void LcdWriteData(uchar dat)/写入数据LCD1602_E = 0;/使能清零LCD1602_RS = 1;/选择输入数据LCD1602_RW = 0;/选择写入LCD1602_DATAPINS = dat; /写入数据Delay1ms(1);LCD1602_E = 1; /写入时序Delay1ms(5); /保持时间LCD1602_E = 0;void LcdInit() /LCD初始化子程序 LcdWriteCom(0x38); /开显示LcdWriteCom(0x0c); /开显示不显示光标LcdWriteCom(0x06); /写一个指针加1LcdWriteCom(0x01); /清屏LcdWriteCom(0x80); /设置数据指针起点uchar Ds18b20Init()uchar i;DSPORT = 0; /将总线拉低480us960usdelay1us(642);/延时642usDSPORT = 1;/然后拉高总线,如果DS18B20做出反应会将在15us60us后总线拉低i = 0;while(DSPORT)/等待DS18B20拉低总线i+;if(i5)/等待5MSreturn 0;/初始化失败delay1ms( );return 1;/初始化成功/* 函 数 名 : Ds18b20WriteByte* 函数功能 : 向18B20写入一个字节*/void Ds18b20WriteByte(uchar dat)uint j;for(j=0; j= 1;/* 函 数 名 : Ds18b20ReadByte* 函数功能 : 读取一个字节*/uchar Ds18b20ReadByte()uchar byte, bi;uint j;for(j=8; j0; j-)DSPORT = 0;/先将总线拉低1us delay1us(1); DSPORT = 1;/然后释放总线delay1us(6); /延时6us等待数据稳定bi = DSPORT; /读取数据,从最低位开始读取/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/byte = (byte 1) | (bi 7); delay1us(45);return byte;/* 函 数 名 : Ds18b20ChangTemp* 函数功能 : 让18b20开始转换温度*/void Ds18b20ChangTemp()Ds18b20Init();delay1ms( );Ds18b20WriteByte(0xcc);/跳过ROM操作命令 Ds18b20WriteByte(0x44); /温度转换命令 /* 函 数 名 : Ds18b20ReadTempCom* 函数功能 : 发送读取温度命令*/void Ds18b20ReadTempCom()Ds18b20Init();delay1ms( );Ds18b20WriteByte(0xcc); /跳过ROM操作命令Ds18b20WriteByte(0xbe); /发送读取温度命令/* 函 数 名 : Ds18b20ReadTemp* 函数功能 : 读取温度*/int Ds18b20ReadTemp()int temp = 0;uchar tmh, tml;Ds18b20ChangTemp(); /先写入转换命令Ds18b20ReadTempCom();/然后等待转换完后发送读取温度命令tml = Ds18b20ReadByte();/读取温度值共16位,先读低字节tmh = Ds18b20ReadByte();/再读高字节temp = tmh;temp = 8;temp |= tml;return temp;/* 函数名 : LcdDisplay()* 函数功能 : LCD显示读取到的温度*/void LcdDisplay(int temp) /lcd显示 unsigned char datas = 0, 0, 0, 0, 0; /定义数组 float tp; 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,还是在小数点后面。datas0 = temp / 10000;datas1 = temp % 10000 / 1000;datas2 = temp % 1000 / 100;datas3 = temp % 100 / 10;datas4 = temp % 10; a = datas0;/a,b,c的作用是取温度的整数,进行温控b = datas1;c = datas2;LcdWriteCom(0x82); /写地址 LcdWriteData(0+datas0); /百位 LcdWriteCom(0x83); /写地址 LcdWriteData(0+datas1); /十位LcdWriteCom(0x84);/写地址 LcdWriteData(0+datas2); /个位 LcdWriteCom(0x85);/写地址 LcdWriteData(.); /显示 .LcdWriteCom(0x86); /写地址 LcdWriteData(0+datas3); /显示小数点 LcdWriteCom(0x87); /写地址 LcdWriteData(0+datas4); /显示小数 /* 温度控制电机输出占空比函数*/void control (void) if(a*100+b*10+c) tem_1) CCAP0H = CCAP0L = 0xff; /PWM0 口输出 0%占空比 LED0 = 0; LED1 = 0; else if (tem_1 = (a*100+b*10+c)&(a*100+b*10+c)tem_2 ) CCAP0H = CCAP0L = 0xB3; /PWM0 口输出30%占空比 LED0 = 1; LED1 = 0; else if (tem_2 = (a*100+b*10+c) CCAP0H = CCAP0L = 0x1a; /PWM0 口输出90%占空比 LED0 = 1; LED1 = 1; /* 函数名 : keyscan* 函数功能 : 键盘扫描*/void keyscan1 () 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; void keyscan2 () if(jia_key=0) /加速按键Delay1ms(20);if(jia_key=0)num+;if(num=3)num=0;while(jia_key=0); /* 电机输出档位选择函数*/void dangwei()switch(num) case 0: CCAP0H = CCAP0L = 0xff; /PWM0 口输出 0%占空比 LED0 = 0; LED1 = 0; break; case 1: CCAP0H = CCAP0L = 0x67; /PWM0 口输出60%占空比 LED0 = 1; LED1 = 0; break;case 2: CCAP0H = CCAP0L = 0x1a; /PWM0 口输出90%占空比 LED0 = 1; LED1 = 1; break; /* 函数名 : displayx ()* 函数功能 : LCD显示读取到的键盘的数值*/void display1 (int p) unsigned char datas = 0, 0; datas0 = p / 10; datas1 = p % 10;LcdWriteCom(0x8b); LcdWriteData(0+datas0); LcdWriteCom(0x8c); LcdWriteData(0+datas1); void display2 (int t) unsigned char datas = 0, 0; datas0 = t / 10; datas1 = t % 10;LcdWriteCom(0x8e); LcdWriteData(0+datas0); LcdWriteCom(0x8f); LcdWriteData(0+datas1); /* 电机输出寄存器初始化函数*/void init_dianji() CCON = 0; /初始化 PCA控制寄存器 /PCA计数器停止运行 /清除CF标志位 /清除所有中断标志位 CL = 0; /重置PCA的16位计数器 CH = 0; CMOD = 0x02; /设置 PCA 计数器时钟源为 Fosc/2 /禁止PCA 计数器溢出中断 CCAPM0 = 0x42; /PCA模块0工作在8位PWM模式并且没有PCA中断 CR = 1; /PCA 计数器开始运行/* 函数名 : main* 函数功能 : 主函数*/void main()LED0=0;LED1=0;CCAP0H = CCAP0L = 0xff;P1M1 = 0x00;P1M0 = 0x08; /把P1.3口定义为强推挽输出,驱动电机P2M1 = 0x00;P2M0 = 0x18; /把P2.3和P2.4定义为强推挽输出,驱动LEDLcdInit(); /初始化LCD1602init_dianji(); /电机PWM驱动初始化while(1) if(1 = key_sw) /温控模式 LcdWriteCom(0x88);/写地址 88 LcdWriteData(C); LcdDisplay(Ds18b20ReadTemp();/温度读取显示 control (); /温度控制电机占空比keyscan1 (); /键盘扫描display1 (tem_1); /控制温度数字显示display2 (tem_2); if(0 = key_sw) /键控模式 LcdWriteCom(0xc2); LcdWriteData(D); LcdWriteCom(0xc3); LcdWriteData(W); LcdWriteCom(0xc4); LcdWriteData(:); dangwei(); /键控电机档位选择keyscan2 (); /键盘扫描LcdWriteCom(0xc5); LcdWriteData(0+num); /显示按键档位
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 中学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!