1、采用stm8s105系列单片机、液晶1602和ds18b20,同样可以实现温度读取和直流5v小风扇的转速控制方案比较:方案一需要耗费更多的硬件资源。因此我们直接排除方案一。方案三,如果采用44脚贴片封装的stm8s105单片,可以在很小的覆铜板上把硬件做出来,这样可以节省一些硬件资源。但是,因为温度传感器ds18b20的读取是通过单一I/O口读取的,stm8s105的I/O操作需要设置,让其是处于输入或者输出方式。操作非常麻烦。方案二需要的硬件资源相对较少,而且其I/O口兼容8051单片机,可以实现I/O口准双向操作,这样编程相对简单。综上所述,我们选择方案二。6、STC12C5A60S2单片
2、机6.1简介我们采用的单片机为STC12C5A60S2,STC12C5A60S2/AD/PWM系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快812倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S)针对电机控制,强干扰场合。其引脚与普通8051单片机基本相同。6.2PWM寄存器设置STC12C5A60S2单片机内置两路独立PWM输出,通过设置相应寄存器,可以让占空比改变。PWM0的输出口在P1.3,而PWM1的输出口在P1.4相关的设置例子如下面的程序所示
3、: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 时,输出为低电平;当寄存
4、器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工作在
5、准双向的工作状态。而PWM输出端口,LED驱动输出,端口我们将I/O口的工作方式设置分强推挽输出,输出的拉电流达到20mA,能更好的驱动负载。设置方式,通过配置相应的寄存器PxM1和PxM0,如下表1所示:PxM1 7:0PxM0 7:I/O口模式准双向口1强推挽输出高阻输入开漏表17、LCD液晶显示屏时钟的显示屏选用1602字符液晶。1602是指显示的内容为16*2,即能够同时显示两行,每行16个字符。常见的1602字符液晶有两种,一种显示的是绿色背光黑色字体,另一种显示蓝色背光白色字体,目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的。本设计所用1602液晶模
6、块,显示屏是蓝色背光白色字体。图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=
7、L,R/W=H,E=H 输出D0D7=状态字写指令 RS=L,R/W=L,D0D7=指令码,E=高脉冲输出无读数据RS=H,R/W=H,E=HD0D7=数据写数据RS=H,R/W=L,D0D7=数据,E=高脉冲无RAM地址映射图:如图2所示:图2 RAM地址映射图当我们在000F、404F,的地址中任意地写入显示数据时,液晶都可以显示,当写入1027或5067地址处时,必须通过移屏指令将它们移入可显示的区域。读、写操作时序:如图3所示:因为本设计的程序中只涉及到液晶的写操作,因此下面简单介绍写操作过程,如下:(1)通过RS确定是写数据还是写命令。(2)读写控制端设置为写模式。(3)将数据或命令
8、送达数据线上。(4)给E一个高脉冲将数据送到液晶控制器,完成写操作。图3读写操作时序图初始化设置:(1)显示模式设置,如图4:图4显示模式设置图(2)显示开/关及光标设置,如图5:图5显示开/关及光标设置图8、温度传感器DS18B20用于检测当前的温度,DS18B20测量温度范围为 55C+125C,在10+85C范围内,精度为0.5C。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。产品支持3V5.5V的电压范围,使系统设计更灵活、方便。DS18B20的引脚图如图6所示。引脚1:地;引脚2:
9、数字输入输出;引脚3:可选的5V电源;图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)先将数据线置高电平
10、“1”。(2)延时(该时间要求的不是很严格,但是尽可能的短一点)(3)数据线拉到低电平“0”。(4)延时750微秒(该时间的时间范围可以从480到960微秒)。(5)数据线拉到高电平“1”。(6)延时等待(如果初始化成功则在15到60微妙时间之内产生一个由DS18B20所返回的低电平“0”。据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时控制)。(7)若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第(5)步的时间算起)最少要480微秒。(8)将数据线再次拉高到高电平“1”后结束。8.2写操作数据线先置低电平“
11、0”。延时确定的时间为15微秒。按从低位到高位的顺序发送字节(一次只发送一位)。延时时间为45微秒。将数据线拉到高电平。重复上(1)到(6)的操作直到所有的字节全部发送完为止。最后将数据线拉高。8.3读操作(1)将数据线拉高“1”。(2)延时2微秒。(3)将数据线拉低“0”。(4)延时3微秒。(5)将数据线拉高“1”。(6)延时5微秒。(7)读数据线的状态得到1个状态位,并进行数据处理。(8)延时60微秒。9、风扇本设计采用的是由5V直流供电的小型风扇。在设计当中,我们只预置了两档速度相差明显的档位,一档的PWM占空比为30%,二档的占空比为90%。这样设计的目的主要是考虑到在档位切换时,可以
12、看到速度有非常明显的变化,让实验现象更加直观。拓展1:在主要考虑实用性方面的因素,我们还可以将控制档位细化,做成5个档位,甚至10个档位,等等。不同的速度是通过调节不同的占空比来实现的。下面我们给出温度控制风扇转5个速度不同档位的部分关键程序示例:void control (void) if(a*100+b*10+c) tem_1) CCAP0H = CCAP0L = 0xFF; 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
13、 CCAP0H = CCAP0L = 0x08; /PWM0 口输出50%占空比 CCAP0H = CCAP0L = 0x4D; /PWM0 口输出70%占空比else if (tem_2 = (a*100+b*10+c) CCAP0H = CCAP0L = 0x1A; /PWM0 口输出90%占空比拓展2:在本设计验证成功并且可靠的基础上,我们可以继续延伸,给出温度控制交流220V供电的风扇的设计方案,比如宿舍的风扇:用普通的单片机,通过温度传感器,读取外界的温度,进而控制继电器的吸合与断开。假设设置4个档位,可以用单片机接三个继电器来实现:当外界温度较低时,此时所有继电器处于断开状态,风扇
14、不转;当温度升高到一定程度时,单片机使继电器1吸合,继电器2、3断开,让风扇转一档,即较慢速度;当温度继续升高,单片机使继电器2吸合,继电器1、3断开,风扇转二档,即较快的速度。当温度再升高时,单片机使继电器3吸合,继电器1、2断开,风扇转三档,即最快的速度。10、硬件电路设计10.1原理图和部分电路PCB图图7原理图工作原理:通过P3.7端口处所接的电路的SW2的闭合或断开选择温控或键控。当SW2=1时,选择温控,通过DS18B20温度传感器获取外界温度,通过LCD显示当前温度,并且显示设定的温度控制一档和二档的值,比如设定25和30摄氏度作为控制值。外界温度较低时,比如小于25摄氏度,处于
15、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 的主要特点是
16、:工作电压高,最高工作电压可达46V;输出电流大,瞬间峰值电流可达3A,持续工作电流为2A;额定功率25W。采用标准逻辑电平信号控制;具有两个使能控制端,在不受输入信号影响的情况下允许或禁止器件工作有一个逻辑电源输入端,使内部逻辑电路部分在低电压下工作;可以外接检测电阻,将变化量反馈给控制电路。使用L298N 芯片驱动电机,该芯片可以驱动一台两相步进电机或四相步进电机,也可以驱动两台直流电机。用L298 控制直流电机很容易。用单片机端口高低就可以控制开始、停止、正反转,利用EN1,EN2 控制使能就能控制转速。其原理图,如图9:图9L298N原理图11、软件设计11.1主函数流程图图10主函数
17、流程图11.2 温度控制风扇程序流程图图11温度控制风扇程序流程图11.3 按键控制风扇程序流程图图12按键控制风扇程序流程图11.4 按键设定温度程序流程图图13按键设定温度程序流程图12、结语本设计结合生活中的实际情况,利用单片机技术设计并制作了温控风扇系统,完全达到了设计要求,其次通过独立键盘和温度传感器可以实现对应的操作,使操作更加方便灵活,所选取的单片机具有较高的抗干扰能力,也符合这个设计的稳定性要求。我们队伍的各成员在整个设计制作过程中,相互配合,相互检查,但又进行了分工,大大提高了工作效率。参考文献:1郭天祥新概念51单片机C语言教程入门、提高、开发、拓展全攻略电子工业大学出版社
18、 2李广弟, 朱月秀, 等. 单片机基础M. 北京航空航天大学出版社, .3模拟电子技术基础M. 高等教育出版社, .4数字电子技术基础M. 高等教育出版社, .附录:实物硬件图图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的使能端sb
19、it 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;/*
20、 函数名 : Delay1ms* 函数功能 : 延时函数*/void Delay1ms(uint y) /粗略延时1msuint x; for( ; y0; y) for(x=440; x x);void delay1ms(void) /误差 0us unsigned char a,b; for(b=129;bb) for(a=45;aa);void delay1us(uint x) /误差 0us for(b=x; for(a=3; Ds18b20Init 初始化* 输入 : 无* 输出 : 初始化成功返回1,失败返回0 void LcdWriteCom(uchar com) /写入命令LC
21、D1602_E = 0; /使能LCD1602_RS = 0; /选择发送命令LCD1602_RW = 0; /选择写入LCD1602_DATAPINS = com; /放入命令Delay1ms(1); /等待数据稳定LCD1602_E = 1; /写入时序Delay1ms(5); /保持时间void LcdWriteData(uchar dat) /写入数据 /使能清零LCD1602_RS = 1; /选择输入数据LCD1602_DATAPINS = dat; /写入数据void LcdInit() /LCD初始化子程序 LcdWriteCom(0x38); /开显示LcdWriteCom(
22、0x0c); /开显示不显示光标LcdWriteCom(0x06); /写一个指针加1 LcdWriteCom(0x01); /清屏LcdWriteCom(0x80); /设置数据指针起点uchar Ds18b20Init() uchar i;DSPORT = 0; /将总线拉低480us960us delay1us(642); /延时642us DSPORT = 1; /然后拉高总线,如果DS18B20做出反应会将在15us60us后总线拉低i = 0;while(DSPORT) /等待DS18B20拉低总线i+;if(i5)/等待5MS return 0;/初始化失败 delay1ms( );return 1;/初始化成功 Ds18b20WriteByte 向18B20写入一个字节void Ds18b20WriteByte(uchar dat) uint j; for(j=0; j8; j+) /每写入一位数据之前先把总线拉低1usdelay1us(1); DSPORT = dat & 0x01; /然后写入一个数据,从最低位开始delay1us(68)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1