基于单片机的恒温箱温度控制系统毕业论文带pid控制_第1页
基于单片机的恒温箱温度控制系统毕业论文带pid控制_第2页
基于单片机的恒温箱温度控制系统毕业论文带pid控制_第3页
基于单片机的恒温箱温度控制系统毕业论文带pid控制_第4页
基于单片机的恒温箱温度控制系统毕业论文带pid控制_第5页
已阅读5页,还剩85页未读 继续免费阅读

下载本文档

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

文档简介

1、第1章 绪 论1.1研究的目的和意义温度是工业生产中主要被控参数之一,温度控制自然是生产的重要控制过程。工业生产中温度很难控制,对于要求严格的的场合,温度过高或过低将严重影响工业生产的产质量及生产效率,降低生产效益。这就需要设计一个良好温度控制器,随时向用户显示温度,而且能够较好控制。单片机具有和普通计算机类似的强大数据处理能力,结合PID,程序控制可大大提高控制效力,提高生产效益。本文采用单片机STC89C52设计了温度实时测量及控制系统。单片机STC89C52 能够根据温度传感器DS18B20所采集的温度在LCD1602液晶屏上实时显示,通过PID控制从而把温度控制在设定的范围之内。通过本

2、次课程实践,我们更加的明确了单片机的广泛用途和使用方法,以及其工作的原理。1.2国内外发展状况温度控制采用单片机设计的全数字仪表,是常规仪表的升级产品。温度控制的发展引入单片机之后,有可能降低对某些硬件电路的要求,但这绝不是说可以忽略测试电路本身的重要性,尤其是直接获取被测信号的传感器部分,仍应给予充分的重视,有时提高整台仪器的性能的关键仍然在于测试电路,尤其是传感器的改进。现在传感器也正在受着微电子技术的影响,不断发展变化。恒温系统的传递函数事先难以精确获得,因而很难判断哪一种控制方法能够满足系统对控制品质的要求。但从对控制方法的分析来看,PID控制方法最适合本例采用。另一方面,由于可以采用

3、单片机实现控制过程,无论采用上述哪一种控制方法都不会增加系统硬件成本,而只需对软件作相应改变即可实现不同的控制方案。因此本系统可以采用PID的控制方式,以最大限度地满足系统对诸如控制精度、调节时间和超调量等控制品质的要求。现在国内外一般采用经典的温度控制系统。采用模拟温度传感器对加热杯的温度进行采样,通过放大电路变换为 05V 的电压信号,经过A/D 转换,保存在采样值单元;利用键盘输入设定温度,经温度标度转换转化成二进制数,保存在片内设定值单元;然后调显示子程序,多次显示设定温度和采样温度,再把采样值与设定值进行 PID 运算得出控制量,用其去调节可控硅触发端的通断,实现对电阻丝加热时间的控

4、制, 以此来调节温度使其基本保持恒定。1.3温度控制系统的设计内容本系统从硬件和软件两方面来讲述恒温箱温度自动控制过程,在控制过程中主要应用STC89C52、LCD1602液晶显示器,而主要是通过 DS18B20数字温度传感器采集环境温度,以单片机为核心控制部件,并通过LCD1602显示实时温度的一种数字温度计。软件方面采用C语言来进行程序设计,使指令的执行速度快,节省存储空间。而系统的过程则是:首先,通过设置按键,设定恒温运行时的温度值,并且用LCD1602显示这个温度值.然后,在运行过程中将DS18B20采样的温度经过处理后的数字量用LCD1602进行显示,结合PID控制得出的信号传给单片

5、机,用单片机的相应引脚来控制加热器,进行加热或停止加热,直到能在规定的温度下恒温加热,如果温度超过了恒温设定值,用单片机控制制冷片对恒温箱进行降温,最后保证恒温箱在设定的温度下运行。第2章 总体方案设计2.1 方案一测温电路的设计,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。 2.2 方案二考虑使用温度传感器,结合单片机电路设计,温度传感器的选择,采用温度芯片DS18B20测量温度,该芯片的物理化学性能很稳定,它能用做工

6、业测温元件,且此元件线性较好。在0-100摄氏度时,最大线性偏差小于1摄氏度。该芯片直接向单片机传输数字信号,便于单片机处理及控制。本制作的最大特点之一是直接采用温度芯片对为温度进行测量,使数据传输和处理简单化,直接读取被测温度值,之后进行转换,依次完成设计要求。比较以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计容易实现,故实际设计中拟采用方案二。电路设计方框图如图2-1所示,它主要由五部分组成:控制部分主芯片采用单片机STC89C52;显示部分采用LCD1602液晶显示;温度设定部分采用按键设定;温度温度采集部分采用DS18B20温度传感器;加温部分采用光电可控硅MOC3061

7、控制制大功率加热器;降温部分采用继电器控制TEC1-12706半导体制冷片。STC89C52晶振电路复位电路按键电路DS18B20温度采集LCD1602显示电路光电双向可控硅控制加热器工作半 导 体制冷片工作图21 温度控制系统的总体设计方案第3章 温度控制系统的器件和模块选用3.1单片机的选择3.1.1 STC89C52简介STC89C52单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周期可以任意选择。主要特性如下:(1)增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意选择,指令代码完全兼容

8、传统8051。 (2)工作电压:5.5V3.3V(5V单片机)/3.8V2.0V(3V单片机)。(3)工作频率范围:040MHz,相当于普通8051的080MHz,实际工作频率可达48MHz。(4)用户应用程序空间为8K字节,片上集成512字节RAM。(5)通用I/O口(32个),复位后为:P1/P2/P3/P4是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。(6)具有EEPROM功能,具有看门狗功能。(7)共3个16位定时器/计数器,即定时器T0、T1、T2。(8)外部中断4路,下降沿中断或低电平触发电路,Power Down模式可

9、由外部中断低电平触发中断方式唤醒。(9)通用异步串行口(UART),还可用定时器软件实现多个UART。(10)工作温度范围:-40+85(工业级)/075(商业级)。3.1.2 STC89C52单片机的工作模式(1)掉电模式:典型功耗1us60us15us15-45us图3-5 (a)写0时序15usT1T015-45us60us1us图3-5 (b)写1时序写时序包括写0时序和写1时序。所有写时序至少需要60us,且在2次独立的写时序之间至少需要1us的恢复时间,都是以总线拉低开始。写1时序,主机输出低电平,延时2us,然后释放总线,延时60us。写0时序,主机输出低电平,延时60us,然后

10、释放总线,延时2us。 读时序图36 读时序总线器件仅在主机发出读时序是,才向主机传输数据,在主机发出读数据命令后,必须马上产生读时序,以便从机能够传输数据。所有读时序至少需要60us,且在2次独立的读时序之间至少需要1us的恢复时间。每个读时序都由主机发起,至少拉低总线1us。主机在读时序期间必须释放总线,并且在时序起始后的15us之内采样总线状态。主机输出低电平延时2us,然后主机转入输入模式延时12us,然后读取总线当前电平,然后延时50us。DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同DS18B20 为9位12位A/D转换精度,而DS1820

11、为9位A/D转换,虽然我们采用了高精度的芯片,但在实际情况上由于技术问题比较难实现,而实际精度此时温度寄存器中的数值即为所测温度。斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。如下3-7的测温原理图不同,且温度转换时的延时时间由2s减为750ms。 DS18B20测温原理如图3-7所示。 图3-7 DS18B20的测温原理框图3.3液晶显示屏输出液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机

12、、PDA移动通信工具等众多领域。3.3.1 LCD1602的基本参数及引脚功能LCD1602分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图3-8所示。图3-8 LCD1602尺寸图LCD1602参数:显示容量:162个字符芯片工作电压:4.55.5V工作电流:2.0mA(5.0V)模块最佳工作电压:5.0V字符尺寸:2.954.35(WH)mm引脚功能说明LCD1602采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表3-3所示。表3-3 引脚接口说明编号符号引脚说明编号符号引脚说明1VSS电源

13、地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16BLK背光源负极第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令

14、或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第714脚:D0D7为8位双向数据线。第15脚:背光源正极。第16脚:背光源负极。3.3.2 LCD1602的指令说明及时序1602液晶模块内部的控制器共有11条控制指令,如表3-4所示:表3-4 控制命令表序号指令RSR/WD7D6D5D4D3D2D1D01清显示00000000012光标返回000000001*3置输入模式00000001I/DS4显示开/关控制0000001DCB5光标或字符移位000001S/CR/L

15、*6置功能00001DLNF*7置字符发生存贮器地址0001字符发生存贮器地址8置数据存贮器地址001显示数据存贮器地址9读忙标志或地址01BF计数器地址10写数到CGRAM或DDRAM)10要写的数据内容11从CGRAM或DDRAM读数11读出的数据内容1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)指令1:清显示,指令码01H,光标复位到地址00H位置。指令2:光标复位,光标返回到地址00H。指令3:光标和显示模式设置 I/D,光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。指令4

16、:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。指令7:字符发生器RAM地址设置。指令8:DDRAM地址设置。指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电

17、平表示不忙。指令10:写数据。指令11:读数据。与HD44780相兼容的芯片时序表3-5如下:表3-5 基本操作时序表读状态输入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=高脉冲输出无读写操作时序如图3-9和3-10所示:图3-9读操作时序图3-10 写操作时序第4章 系统的硬件设计4.1 复位电路计算机在启动运行的时候都需要复位,使中央处理器CPU和系统中的其他部件都处于一个确定的初始状态,并且从这个初始状态开始工作

18、。单片机的复位是靠外部电路实现的,STC89C52单片机有一个复位引脚RST,高电平有效。STC89C52单片机通常采用上电自动复位和按钮复位两种。复位电路的基本功能是系统上电时,RC电路充电,RST引脚出现正脉冲,提供复位信号直至系统电源稳定后,撤销复位信号,为可靠起见,电源稳定后还要经一定的延时,才撤销复位信号,以防电源开关或电源插头分合过程中引起的抖动而影响复位。RC复位电路可以实现上述基本功能4。调整RC常数会令对驱动能力产生影响。复位电路如下图4-1所示。图4-1 复位电路4.2 晶振电路晶振电路提供单片机的时钟控制信号,单片机时钟产生方式有内部时钟方式和外部时钟方式。最常用的内部时

19、钟方式是采用外接晶振和电容组成,时钟振荡电路如图4-2所示。图4-2 时钟震荡电路单片机内部有一个用于构成振荡器的高增益反向放大器,引脚XTAL1和引脚XTAL2分别是反相放大器的输入端和输出端,由这个放大器与作为反馈元件的片外晶体或陶瓷谐振器一起构成一个自己振荡器,这种方式形成的时钟信号称为内部时钟方式。系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。内部方式时,时钟发生器对振荡脉冲二分频,如晶振为12MHz,时钟频率就为6MHz。晶振的频率可以在1MHz-24MHz内选择。电容取30PF左右。因此,此系统电路的晶体振荡器的值为11.05926MHz,电容应尽可能的选择陶瓷电容

20、,电容值为30F。在焊接刷电路板时,晶体振荡器和电容应尽可能安装得与单片机芯片靠近,以减少寄生电容,更好地保证震荡器稳定和可靠地工作。XTAL1是片内振荡器的反相放大器输入端,XTAL2则是输出端,使用外部振荡器时,外部振荡信号应直接加到XTAL1,而XTAL2悬空。4.3供电系统与下载通信供电部分采用220V转12V的变压器,将输入的交流电降成12V,在利用桥式全波整流电路把交流电转变成脉动的直流电,利用滤波电路出去脉动的直流电的交流成分,接着通过设计二个三段稳压电路,选用7812把电压转化为12V,选用7805将12V转变成5V给单片机供电。串行通信的主要功能是实现单片机与PC机的数据交换

21、,当需要进行数据记录、数据统计、数据分析的时候,可以把数据发送给上位机,使用上位机进行数据处理,并且将数据处理的结果又发送给单片机。这样可以大大提高系统数据处理速度,还可以方便的对单片机进行控制。计算机与外界的数据传送大部分都是串行的,其传送距离可以从几米到几千米。 程序的烧录通过CH430芯片与单片机相连进行通信。其供电电路如4-3图所示,USB供电和下载通信电路如图4-4。图 4-3 电源供电电路图4-4 USB供电和下载通信4.4 温度采集单元在本系统要采用一条总线上挂单个DS18B20器件。在P3.7口接DS18B20温度传感器。由于只采用单个传感器,故无需读出DS18B20温度传感器

22、的序列号,在程序中直接跳过ROM。其温度采集电路如图4-5所示。图4-5 温度采集电路4.5显示电路的设计LCD1602液晶显示部分,采用与单片机相连接,将温度传感器采集到的信息迅速转化为可视温度,硬件设计简单,增加了可读性,其示电路如图4-6所示。 图4-6 LCD1602液晶温度显示电路4.6按键电路按键是现阶段电子设计中最常用、最实用的输入设备。按键能够成为最普遍的输入设备,主要是其具备了以下几个优点:工作原理、硬件电路连接简单、操作实用性强、价格便宜,程序编写简单。缺点:机械抖动比较严重、外型不够美观。按键部分实现的主要原理是单片机读取与按键相连接的I/O口状态,来判定按键是否按下,达

23、到系统参数设置的目的。键盘在单片机应用系统中的作用是实现数据输入、命令输入,是人工干预的主要手段。各按键开关均需要采用了上拉电阻,是为了保证在按键断开时,各I/O有确定的高电平。当输入口线内部已有上拉电阻,外电路的上拉电阻可省去。因此,通过检测输入线的电平状态就可以很容易判断是哪个按键被按下了。优点:电路配置灵活,软件结构简单。缺点:每个按键需占用一根I/O口线,在按键数量较多时,I/O口浪费大,电路结构显得复杂。因此,此键盘适用于按键较少或操作速度较高的场合。在本设计当中,由于只需要三个按键,所以采用独立式键盘结构,电路连接图如图4-7所示。 图4-7 按键电路当用手按下一个键时,往往按键在

24、闭合位置和断开位置之间跳几下才稳定到闭合状态的情况;在释放一个键时,也回会出现类似的情况。这就是抖动。抖动的持续时间随键盘材料和操作员而异,不过通常总是不大于10ms。很容易想到,抖动问题不解决就会引起对闭合键的识别。用软件方法可以很容易地解决抖动问题,这就是通过延迟10ms来等待抖动消失,再读入键盘码。按键控制电路分别接在单片机P1.0P1.2口。它由3个按键构成,直接与单片机I/O口相连。当用于温度调节时,按键S2用于控制设定温度的使能,当按下S2,显示出了设定温度,然后按S3键可增加设定温度,按S3键可减少设定温度,当再次按下S2键时,不显示设定温度,则S2,S3键处于屏蔽状态,无法设定

25、温度。4.7降温电路本设计中,采用NPN三极管驱动继电器,并且带有一发光二极管作为指示灯,系统中采用了电阻代替半导体制冷片。降温系统接到单片机P2.0口上,当高电平时,三极管饱和导通,+5V电源分压加到继电器线圈两端,继电器吸合,同时状态指示的发光二极管也点亮,继电器的常开触点闭合,相当于开关闭合。当单片机的P2.0脚为低电平时,三极管截止,继电器线圈两端没有电位差,继电器衔铁释放,同时状态指示的发光二极管也熄灭,继电器的常开触点释放,相当于开关断开。在三极管截止的瞬间,由于线圈中的电流不能突变为零,继电器线圈两端会产生一个较高电压的感应电动势,线圈产生的感应电动势则可以通过二极管释放,从而保

26、护了三极管免被击穿,也消除了感应电动势对其他电路的干扰,这就是二极管的保护作用,降温控制模块的电路图如图4-8。图4-8降温控制模块4.8升温电路 MOC3061系列光电双向可控硅驱动器是一种新型的光电耦合器件,它可用直流低电压、小电流来控制交流高电压、大电流。单片机引脚P3.4接与非门到红外发光二极管阴极,当P3.4为高电平时红外发光二极管导通发射红外光,光控双向可控硅触发导通,进而控制电阻丝加热。图中R16为限流电阻,使LED工作在所需电流内,R17是双向可控硅的门极电阻,当可控硅灵敏度较高时,门极阻抗也很高,并上R17可提高抗干扰能力,R19是触发功率双向可控硅的限流电阻,另外R18和C

27、12电容组成浪涌吸收电路,防止浪涌电压损坏双向可控硅。升温控制模块如图4-9所示。图4-9 升温控制模块4.9 部分PCB设计及布线规则2005年年底,ProtelHYPERLINK /view/37.htm t _blank 软件的原厂商 Altium公 司推出了Protel系列的最新高端版本Altium Designer 6.0。 Altium Designer 6.0,它是完全一体化电子产品开发系统的一个新版本,也是业界第一款也是唯一一种完整的板级设计解决方案。Altium Designer 是业界首例将设计流程、HYPERLINK /view/2236379.htm t _blank

28、集成化 PCB 设计、可编程器件(如 FPGA)设计和基于处理器设计的HYPERLINK /view/2517315.htm t _blank 嵌入式软件开发功能整合在一起的产品,一种同时进行PCB和FPGA设计以及嵌入式设计的解决方案,具有将设计方案从概念转变为最终成品所需的全部功能。本设计采用PCB双层板对温控系统的电路设计,其布线规则如下:(1) 按电路模块进行布局,实现同一功能的相关电路称为一个模块,电路模块中的元件应采用就近集中原则,同时数字电路和模拟电路分开。(2)螺钉等安装孔周围3.5mm(对于M2.5)、4mm(对于M3)内不得贴装元器件。 卧装电阻、电感(插件)、电解电容等元

29、件的下方避免布过孔,以免波峰焊后过孔与元件壳体短路。元器件的外侧距板边的距离为5mm, 贴装元件焊盘的外侧与相邻插装元件的外侧距离大于2mm,贴片焊盘上不能有通孔,以免焊膏流失造成元件虚焊。重要信号线不准从插座脚间穿过,贴片单边对齐,字符方向一致,封装方向一致。(3)画定布线区域距PCB板边1mm的区域内,以及安装孔周围1mm内,禁止布线。电源线尽可能的宽,不应低于18mil,本设计采用20mil。信号线宽不应低于12mil,本设计采用15mil,信号线之间应尽可能的平行走线,顶层与底层信号线应垂直走线,以便减少信号干扰。CPU入出线不应低于10mil(或8mil);线间距不低于10mil,正

30、常过孔不低于30mil。 (4)注意电源线与地线应尽可能呈放射状,以及信号线不能出现回环走线。整体PCB设计图如图4-8所示:图4-8 整体温控系统PCB设计4.10 数字PID算法PID调节的一般步骤:(1)确定比例增益P:确定比例增益P时,首先去掉PID的积分项和微分项,一般是令Ti=0、Td=0(具体见PID的参数设定说明),使PID为纯比例调节。输入设定为系统允许的最大值的60%70%,由0逐渐加大比例增益P,直至系统出现振荡;再反过来,从此时的比例增益P逐渐减小,直至系统振荡消失,记录此时的比例增益P,设定PID的比例增益P为当前值的60%70%。比例增益P调试完成。(2)确定积分时

31、间常数Ti比例增益P确定后,设定一个较大的积分时间常数Ti的初值,然后逐渐减小Ti,直至系统出现振荡,之后在反过来,逐渐加大Ti,直至系统振荡消失。记录此时的Ti,设定PID的积分时间常数Ti为当前值的150%180%。积分时间常数Ti调试完成。(3)确定积分时间常数Td积分时间常数Td一般不用设定,为0即可。若要设定,与确定P和Ti的方法相同,取不振荡时的30%。(4)系统空载、带载联调,再对PID参数进行微调,直至满足要求。温控系统采用数字PID算法,并由软件实现,所谓PID控制就是按设定值与测量值之间偏差的比例、偏差的积累和偏差变化的趋势进行控制。它根据采样时刻的偏差值计算控制量。因此P

32、ID控制律的实现,必须用数值逼近法。当采样周期相当短时,可以用求和代替积分,用差商代替微分,即做如下近似变换: (4-1)式中,k为采样序号,k=l,2,3,;T为采样周期。显然,上述离散化过程中,采样时间T必须足够短,才能保证有足够的精度。为了书写方便,将e(kT)简化表示成e(k)等,即省去T。可以得到离散的PID表达式为: (4-2)式中,k为采样序号,k=1,2,3,;u(k)为第k次采样时刻的计算机输出值;e(k)为第k次采样时刻输入的偏差值;e(k-1)为第(k-1)次采样时刻输入的偏差值;KI为积分系数;KD为积分系数。本系统采用增量式PID控制算法,是指数字控制器输出只是控制量

33、的增量,该算法编程简单,数据可以递推使用,占用存储空间少,运算快。根据递推原理可得: (4-3)用式(4-2)减去式(4-3),可得增量式PID控制算法如下: (4-5)第 5 章 系统软件设计5.1 设计思路本部分详细介绍基于STC89C52单片机的恒温箱温度控制系统的软件设计。根据系统功能,可以将系统设计分为若干个子程序进行设计,如温度采集子程序,数据处理子程序、显示子程序、PID控制子程序。采用Keil uVision3集成编译环境和C语言来进行系统软件的设计。本章从设计思路、软件系统框图出发,先介绍整体的思路,再逐一分析各模块程序算法的实现,最终编写出满足任务需求的程序,流程图如图5-

34、1所示。开 始 调取温度子程序 调取温度子程序 显示当前温度 调取键盘子程序 输入设定值测量设定测量0;i-) DATA = 0; / 给脉冲信号 dat=1; DATA = 1; / 给脉冲信号 if(DATA) dat|=0 x80; delay(8); return(dat); /写一个字节 WriteOneChar(uchar dat) uchar i=0; for (i=8; i0; i-) DATA = 0; DATA = dat&0 x01; delay(10); DATA = 1; dat=1; delay(8); /读取温度int ReadTemperature(void)

35、uchar a=0; uchar b=0; int t=0; float tt=0; Init_DS18B20(); WriteOneChar(0 xCC); / 跳过读序号列号的操作 WriteOneChar(0 x44); / 启动温度转换 Init_DS18B20(); WriteOneChar(0 xCC); /跳过读序号列号的操作 WriteOneChar(0 xBE); /读取温度寄存器等(共可读9个寄存器)前两个就是温度 a=ReadOneChar();/低位 b=ReadOneChar();/高位 t=b; t=8; t=t|a; if(b&0 x80) t=t+1; flag

36、_Negative_number = 1; else flag_Negative_number = 0; tt=t*0.0625; /DS18B20温度传感器的分辨率t= tt*10+0.5;tt=tt+0.05; return(t); /*LCD1602液晶显示函数*/ void Delayms_1602(unsigned int x) /延时函数 unsigned int i; while(x-)for (i=0;i200;i+); uchar Busy_Check_1602() /忙检测 uchar LCD_Status;RS = 0;RW = 1;EN = 1;Delayms_1602

37、(1); LCD_Status = P0;EN = 0;return LCD_Status;void Write_LCD_Command_1602(uchar cmd) /1602写命令 while(Busy_Check_1602()&0 x80)=0 x80);RS = 0;RW = 0;EN = 0;P0 = cmd;EN = 1;Delayms_1602(1);EN = 0;void Write_LCD_Data_1602(uchar dat) /1602写数据 while(Busy_Check_1602()&0 x80)=0 x80);RS = 1;RW = 0;EN = 0;P0 =

38、 dat;EN = 1;Delayms_1602(1);EN = 0;void Initialize_LCD_1602() /初始化LCD1602 Write_LCD_Command_1602(0 x38); /显示模式设置Delayms_1602(1); Write_LCD_Command_1602(0 x01); /显示清屏Delayms_1602(1);Write_LCD_Command_1602(0 x06); /显示光标移动设置Delayms_1602(1);Write_LCD_Command_1602(0 x0c); /显示开/关及光标设置Delayms_1602(1);void

39、ShowString_1602(uchar x,uchar y,uchar *str) uchar i = 0;if(y = 0)Write_LCD_Command_1602(0 x80 | x);if(y = 1)Write_LCD_Command_1602(0 xc0 | x);for(i=0;iSetPoint - NextPoint; / 偏差 pp-SumError += Error; / 积分 dError = pp-LastError - pp-PrevError; / 当前微分 pp-PrevError = pp-LastError; pp-LastError = Error;

40、 return (pp-Proportion * Error;比例+ pp-Integral * pp-SumError;/积分项+ pp-Derivative * dError); / 微分项 /*温控系统主函数*/#include #include #include #include sbit K1=P10;sbit K2=P11;sbit K3=P12;#define uchar unsigned char#define uint unsigned int#define Time_5ms (0 x10000-100) uchar table = . C K= ;uchar table1

41、=set C ;uchar qian,bai,shi,ge; /定义变量 uchar qian1,bai1,shi1,ge1; /定义变量uchar qian2,bai2,shi2,ge2; /定义变量uchar h1,h2,h3,h4;int temp;uchar m=0;uchar set_temper=50; void keyscan() /按键处理函数 if (K1=0) m+; if(m=1) if(K2=0) set_temper+;else if(K3=0) set_temper-; if(m=2) m=0; void display () int h; if(m=1) qian

42、1=set_temper%10000/1000; bai1=set_temper%1000/100;/显示百位 shi1=set_temper%100/10;/显示十位 ge1=set_temper%10;/显示个位 table1 4=T; table1 5=; table1 6=qian1 +0; table1 7=bai1 +0; table1 8=shi1 +0; table1 9=ge1 +0; if(m=0) table1 4= ; table1 5= ; h=high_time; h1=h/1000; table 10=h1+0; h2=h/100%10; table 11=h2+

43、0;h3=h/10%10;table 12=h3+0;h4=h%10;table 13=h4+0; temp=ReadTemperature();/读温度 qian=temp%10000/1000; bai=temp%1000/100;/显示百位 shi=temp%100/10;/显示十位 ge=temp%10;/显示个位 table 0=qian +0; table 1=bai +0; table 2=shi +0; table 4=ge +0; int redtemper(void)int h=0;int w=0; h=ReadTemperature(); qian2=h%10000/10

44、00; bai2=h%1000/100;/显示百位 shi2=h%100/10;/显示十位 ge2=h%10;/显示个位 w=qian2*1000+bai2*100+shi2*10+ge2; return(w); void warm() uint t,a; unsigned char i; t=set_temper; t=t*10;a=bai*100+shi*10+ge; if(ta) if (t-a50) /如果设定温度高于测定值5度 high_time=100; low_time=0; else for (i=0;i10;i+) rin=redtemper(); rout = PIDCal

45、c ( &spid,rin ); if (high_time=100) high_time=(unsigned char)(rout/800);else high_time=100; low_time= (100-high_time); else if(t0) high_time=0; low_time=100; else for(i=0;i10;i+) rin=redtemper(); rout = PIDCalc ( &spid,rin ); if (high_time100) high_time=(unsigned char)(rout/10000); else high_time=0;

46、 low_time= (100-high_time); / else / void main () TMOD=TMOD|0 x01; TMOD=TMOD&0 xF1; ET0=1; /定时器0的中断控制位 EX0=1; /外部的中断0控制位 IT0=1; /外部中断0为下降沿触发方式 EA=1;high_time=50; low_time=50; PIDInit ( &spid ); / Initialize Structure spid.Proportion = 10; / Set PID Coefficients spid.Integral = 8; spid.Derivative =6;

47、 Init_DS18B20(); /温度传感器初始化 Initialize_LCD_1602();/LCD1602初始化 while (1) spid.SetPoint = set_temper; / Set PID Setpoint keyscan(); display (); warm(); ShowString_1602(0,0,table); ShowString_1602(0,1,table1); /* T0中断服务子程序,用于控制电平的翻转 ,40us*100=4ms周期 */ void Time0() interrupt 1 if(+count=(high_time) outpu

48、t=1; _nop_();_nop_();_nop_();_nop_();else if(count 1. 在.h/.cpp的开头应有一段格式统一的说明,内容包括: a. 文件名 (FileName); b. 创建人 (Creater); c. 文件创建时间 (Date); d. 简短说明文件功能、用途 (Comment)。好习惯 2. 除非极其简单,否则对函数应有注释说明。内容包括:功能、入口/出口参数,必要 时还可有备注或补充说明。还是好习惯 3. 每列代码的长度推荐为 80列,最长不得超过120列;折行以对齐为准。太宽了,我的限制是60列,因为文本方式下屏幕一共80列,如果你用BC这一类

49、的编辑器,窗口边框等又要占据一定空间,所以80列太宽 4. 循环、分支代码,判断条件与执行代码不得在同一行上。很对 5. 指针的定义,* 号既可以紧接类型,也可以在变量名之前。 例:可写做:int*pnsize; 也可写做:int*pnsize; 但不得写做:int*pnsize;建议采用第二种,除非附加另外一条规定:一次只声明一个变量,否则就会让人混淆,比如:int* a, b;看起来b好像也是个指针,其实不是。 6. 在类的成员函数内调用非成员函数时,在非成员函数名前必须加上:。这一条我倒觉得并不是必需的,我的看法是决不要让你的类成员函数和全局函数的名称相同(或类似) 7. 函数入口参数有

50、缺省值时,应注释说明。 例:BOOL CWpsDib:PaintDIB(CDC* pDC, CRect& rc,int nBrightness, file:/*=0*/BOOL bGrayScale file:/*=FALSE*/ )每个变量写一行,必要时加上/*in, out*/注释 8. elseif 必须写在一行。应该尽量避免else if这样的结构 9. 与、有关的各项规定:9.1、应独占一行。在该行内可有注释。 9.2 必须另起一行, 之后的代码必须缩进一个Tab。与必须在同 一列上。 9.3 在循环、分支之后若只有一行代码,虽然可省略、,但不推荐这么 做。若省略后可能引起歧义,则必

51、须加上、。持保留意见,因为GNU的代码规范是这样的:if ( NULL = ptr )/ do something here或者if ( NULL = ptr ) / do something here争论哪个更好并没有意义,关键是统一,如果用VC当然你的办法最方便,可是如果你用emacs或者vi,就不是这样了。 10. 与空格有关的各项规定。 10.1 在所有两目、三目运算符的两边都必须有空格。在单目运算符两端不必空格。但 在、:、.、等运算符前后,及&(取地址)、* (取值)等运算符之后不得有空格。 10.2for、while、if 等关键词之后应有1个空格,再接(,之后无空格;在结尾 的

52、)前不得有空格。我认为在括号两端加空格并不是什么错误,尤其是在一个条件十分复杂的if语句里 10.3 调用函数、宏时,(、)前后不得有空格。 10.4类型强制转换时,()前后不得有空格同上 11. 与缩进有关的各项规定 11.1 缩进以 Tab 为单位。1 个 Tab 为 4 个空格我认为这个值应该更大,我自己使用8个空格,如果你的代码因为缩进幅度太大而导致折行,那么几乎可以肯定你的程序设计方案有问题。 11.2 下列情况,代码缩进一个 Tab: 1. 函数体相对函数名及、。 2. if、else、for、while、do 等之后的代码。 3. 一行之内写不下,折行之后的代码,应在合理的位置进

53、行折行。若有 + - * / 等运 算符,则运算符应在上一行末尾,而不应在下一行的行首。这一条我反对,运算符应该放在下一行行首,以使人能清楚的知道这一行是续上一行的,比如if ( something& somethingelse& otherthings )如果写做if ( something &somethingelse &otherthings )反而看不清楚 11.3 下列情况,不必缩进:switch 之后的 case、default。编程规范与范例目 录1 排版 62 注释 113 标识符命名 184 可读性 205 变量、结构 226 函数、过程 287 可测性 368 程序效率 4

54、09 质量保证 4410 代码编辑、编译、审查 5011 代码测试、维护 5212 宏 53 1 排版1-1:程序块要采用缩进风格编写,缩进的空格数为4个。说明:对于由开发工具自动生成的代码可以有不一致。1-2:相对独立的程序块之间、变量说明之后必须加空行。示例:如下例子不符合规范。if (!valid_ni(ni) . / program coderepssn_ind = ssn_dataindex.repssn_index;repssn_ni = ssn_dataindex.ni;应如下书写if (!valid_ni(ni) . / program coderepssn_ind = ssn

55、_dataindex.repssn_index;repssn_ni = ssn_dataindex.ni;1-3:较长的语句(80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。示例:perm_count_msg.head.len = NO7_TO_STAT_PERM_COUNT_LEN + STAT_SIZE_PER_FRAM * sizeof( _UL );act_task_tableframe_id * STAT_TASK_CHECK_NUMBER + index.occupied = stat_poii

56、ndex.occupied;act_task_tabletaskno.duration_true_or_false = SYS_get_sccp_statistic_state( stat_item );report_or_not_flag = (taskno MAX_ACT_TASK_NUMBER) & (n7stat_stat_item_valid (stat_item) & (act_task_tabletaskno.result_data != 0); 1-4:循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首。示例:

57、if (taskno max_act_task_number) & (n7stat_stat_item_valid (stat_item) . / program codefor (i = 0, j = 0; (i BufferKeywordword_index.word_length) & (j NewKeyword.word_length); i+, j+) . / program codefor (i = 0, j = 0; (i first_word_length) & (j ),后不应加空格。说明:采用这种松散方式编写代码的目的是使代码更加清晰。由于留空格所产生的清晰性是相对的,所以

58、,在已经非常清晰的语句中没有必要再留空格,如果语句已足够清晰则括号内侧(即左括号后面和右括号前面)不需要加空格,多重括号间不必加空格,因为在C/C+语言中括号已经是最清晰的标志了。在长语句中,如果需要加的空格非常多,那么应该保持整体清晰,而在局部不加空格。给操作符留空格时不要连续留两个以上空格。示例:(1) 逗号、分号只在后面加空格。int a, b, c; (2)比较操作符, 赋值操作符=、 +=,算术操作符+、%,逻辑操作符&、&,位域操作符= MAX_TIME_VALUE) a = b + c;a *= 2;a = b 2;(3)!、+、-、&(地址运算符)等单目操作符前后不加空格。*p

59、 = a; / 内容操作*与内容之间flag = !isEmpty; / 非操作!与内容之间p = &mem; / 地址操作& 与内容之间i+; / +,-与内容之间(4)-、.前后不加空格。p-id = pid; / -指针前后不加空格(5) if、for、while、switch等与后面的括号间应加空格,使if等关键字更为突出、明显。if (a = b & c d) 1-1:一行程序以小于80字符为宜,不要写得过长。 2 注释2-1:一般情况下,源程序有效注释量必须在20以上。说明:注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁

60、。2-2:说明性文件(如头文件.h文件、.inc文件、.def文件、编译说明文件.cfg等)头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。示例:下面这段头文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。/* Copyright (C), 1988-1999, Huawei Tech. Co., Ltd. File name: / 文件名 Author: Version: Date: / 作者、版本及完成日期 Description: / 用于详细说明此程序文件完成的主要功能

温馨提示

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

评论

0/150

提交评论