《[精品]温度控制系统》由会员分享,可在线阅读,更多相关《[精品]温度控制系统(124页珍藏版)》请在金锄头文库上搜索。
1、鱼缸温度控制系统实验一:温度采集与显示1实验目的掌握温度传感器的原理、工作方式和使用方法复习使用数码管进行字符的显示2实验要求使用温度传感器进行温度的采集使用数码管进行温度的显示,要求保留小数点后两位有效数字3实验需求与设计分析硬件需求温度传感器数码管温度传感器选型4温度传感器简述发展阶段分立式温度传感器模拟集成温度传感器智能温度传感器数字化、集成化、网络化5温度传感器原理(一)塞贝克热电效应两种不同电导体或半导体的温度差异而引起两种物质间的电压差的热电现象6热电效应示意图7温度传感器原理(二)热电阻导体的电阻随温度变化而改变,通过测量其阻值推算出被测量物体的温度8制造的材料:纯金属一般工作温
2、度:-200+5009其他红外测温辐射测温表面波测温.10集成温度传感器的分类模拟式温度传感器逻辑输出温度传感器数字式温度传感器温度传感器的供应商11模拟式温度传感器传统的模拟温度传感器,如热电偶、热敏电阻和电阻温度检测器(RTDS)对温度的监控,在一些温度范围内线性不好,需要进行冷端补偿或引线补偿;热惯性打,相应时间慢。集成模拟温度传感器与之相比,具有灵敏度高、线性度好、响应速度快等优点,而且它还将驱动电路、信号处理电路以及必要的逻辑控制电路集成在单片IC上,有实际尺寸小、使用方便等优点。常见的模拟温度传感器电压输出型和电流输出型两种,电压输出型有LM3911、LM335、LM45、AD22
3、103、电流输出型有AD590。12 模拟温度传感器MAX6605(电压输出型)13逻辑输出温度传感器在许多应用中,我们并不需要严格测量温度值,只关心温度是否超出一个设定范围,一旦超出所规定的范围,则发出报警信号,启动或关闭风扇、空调、加热器或其他控制设备,此时可选用逻辑输出式温度传感器。LM56、MAX6501-MAX6504、MAX6509/6510是其中的典型代表。14LM56功能和引脚15数字式温度传感器最大特点,直接输出温度的数值内含不挥发型存储器,可以设定温度值的上限或者下限可以直接通过寄存器进行设置工作方式常见数字温度传感器的数字接口:I2C、SPI、1-Wire常见代表:AD7
4、416、DS1620、DS182016DS1620SPI接口(DQ、CLK、RST#)17温度传感器的比较模拟式模拟式数字式数字式优点价格便宜输出数字信号抗干扰能力强多个设备同时工作缺点需要AD转换电路模拟信号易被干扰价格较高18温度传感器的供应商ADI公司AD74xx、AD78xx系列、ADM102x系列(数字输出型)TM35/6/7(电压输出型)MAXIM&DALLASDS16XXDS18X2XMAX6509/10NS国家半导体公司LM76/77/83/9219温度传感器选型数字型价格精度要求工作范围关键字“温度传感器”20硬件电路设计系统结构框图21DS18B20的引脚定义pin1:GN
5、Dpin2:DQ(数据通道)pin3:Vdd22引脚定义NO.PIN NAME功能功能1GND电源接地2DQ数据的I/O口;也可以为DS18B20提供电源3Vdd电源正极,在使用DQ引脚进行供电时(寄生电源供电时),Vdd必须接到地23DS18B20寄生电源电路24DS18B20的供电方式方式一:使用DQ引脚进行供电寄生电源供电25方式二:使用Vdd进行供电外部电源供电26开发板原理图设计27上拉电阻R43(容易引起误会的地方)28上拉电阻的作用:提高驱动能力寄生电源供电时供电(当DQ高电平时)29MCU上引脚连接30P3.x内部结构31P3口的每一位除了普通的I/O口外,都有第二功能,功能如
6、下图所示通道位通道位第二功能第二功能注释注释P3.0RXD串行输入口P3.1TXD串行输出口P3.2INT0#外部中断0输入P3.3INTT1#外部中断1输入P3.4T0计数器0计数输入P3.5T1计数器1计数输入P3.6WR#外部数据RAM写选通信号P3.7RD#外部数据RAM读选通信号323334 程序设计流程35DS18B20驱动分析1-Wire接口读、写操作36DS18B20的操作过程DS18B20 resetROM操作命令功能操作命令每次使用ROM命令之前都需要进行reset操作,两个ROM命令除外:SEARCH ROMF0hALARM SEARCHECh37ROM 命令集指令指令代
7、码代码READ ROM(读ROM)33HMATCH ROM(匹配ROM)55HSKIP ROM(跳过ROM)CCHSEARCH ROM(搜索ROM)F0HALARM SEARCH(警告搜索)ECH38功能命令集 指令指令指令指令WRITE SCRATCHPAD(写暂存器)4EHREAD SCRATCHPAD(读暂存器)BEHCOPY SCRATCHPAD(复制暂存器)48HCONVERT TEMPERATURE(温度转换)44HREACALL EPROM(重新调出)B8HREAD POWER SUPPLY(读电源)B4H39DS18B20通信流程图40DS18B20 RESET操作操作过程主设
8、备发送reset脉冲DS18B20发送一个应答信号presence脉冲应答信号的作用通知主设备,有从设备挂载在1-Wire总线上表明从设备已经准备好接受数据411-Wire 信号信号的分类reset 信号presence 信号写0信号读0信号写1信号读1信号42Reset 信号& Presence 信号43unsigned char ow_reset(void) unsigned char presence;DQ = 1; DQ = 0;/pull DQ line low;delay(250);/ leave it low for 600usdelay(100);DQ = 1; / allow
9、 line to return highdelay(30); / wait for presence40uspresence = DQ;/ get presence signaldelay(100);/ wait for end of timeslot 200us return presence;/ presence signal returned 44写0信号&写1信号45void write_bit(char bitval)DQ = 1;DQ = 0;/ pull DQ low to start timeslotdelay(2);if(bitval = 1) DQ = 1;/ return
10、 DQ high if write 1delay(30);/ hold value for remainder of timeslot 65usDQ = 1;/ Delay provides 16us per loop, plus 24us. Therefore delay(5) = 104us46读0信号&读1信号47unsigned char read_bit(void)unsigned char i;DQ = 1;DQ = 0;/ pull DQ low to start timeslot;DQ = 1;/ then return highdelay(1);/delay 7usi = D
11、Q;return(i);/ return value of DQ line48void write_byte(char val)unsigned char i;unsigned char temp;for (i = 0; i i; / shifts val right i spacestemp &= 0x01; / copy that bit to tempwrite_bit(temp); / write bit in temp intodelay(30);49unsigned char read_byte(void)unsigned char i;unsigned char value =
12、0;for (i = 0; i 8; i+)if(read_bit() value|= 0x01 0; times -)/Delay times second.for (onescd = 5;onescd 0; onescd -)/Delay one second.delayms(200);59延迟函数2 void delayms (unsigned char times)void delayms (unsigned char times)unsigned char onems = CLK;unsigned char ms = 200;for (; times 0; times -)for (
13、onems = CLK; onems 0; onems -)ms = 200;while (ms -);60温度采集1-Wire总线工作方式61温度采集分为两个步骤发指令,要求DS18B20采集温度进行转化主设备读取温度寄存器(2byte)中的数据62控制DS18B20进行温度转换ow_reset(); /resetwrite_byte(0xcc); /ROM命令 write_byte(0x44); /功能命令读取温度ow_reset();write_byte(0xcc); write_byte(0xbe); temp_lsb=read_byte(); temp_msb=read_byte()
14、;63write_byte(0xbe); /使能读数据发送完上面这个命令之后,主设备就可以从Byte0开始连续读取数据,byte0和byte1中存放的是经过转换后的温度值18B20内存地址6418B20温度寄存器数据格式如下图所示其中:BIT11是符号位,用来区分零下或者零度以上温度BIT10BIT0存放的是转换后的温度数值65数据处理输入的数据是2byte的二进制数输出的数据是十进制数,小数点后保留两位有效数字,小数点前也是两位处理过程小数部分数据处理整数部分数据处理66原码、补码和反码机器数的表示原码:将数的真值形式中“+”号用“0”表示,“-”号用“1”表示时,叫做数的原码形式,简称原码
15、。反码:对正数来说,其反码和原码的形式相同;对负数来说,反码为其原码的数值部分各位变反。补码:对正数来说,其补码和原码的形式相同;对于负数,补码为其反码的末位加1。67举例68如何根据补码求原码?求解步骤:将补码减去一,得到反码将反码各位取反,得到原码69求原码举例测量到的温度是0.5,求发送的2byte的数据测量到的温度是-55,求发送的2byte的数据2byte的数据为0xFF5E,求现在的温度2byte的数据为0x0191,求现在的温度70数据处理步骤先判断数据的符号计算小数部分计算整数部分71数据处理代码先判断数据的符号 if(temp_msb 0x7f) temp_lsb = (te
16、mp_lsb-1); temp_msb = temp_msb; Temp_Flag= 1; 72计算小数部分 Temp_Decimal = (temp_lsb&0x0f)*6;计算整数部分 temp_lsb = temp_lsb 4; temp_msb = temp_msb 4; Temp_Integer = temp_msb|temp_lsb; 73温度的显示通过补码到原码的转换得到的是要显示数据整数部分和小数部分,还要先计算要显示的每一位,然后进行显示计算每一位数值time0 = Temp_Decimal % 10;time1 = Temp_Decimal/10;time2 = Temp_
17、Integer%10 | 0x80;time3 = Temp_Integer/10;数码管显示Write_Disp();74回顾程序设计流程75温度传感器DS18B20DS18B20是DALLAS公司生产的一线式数字温度传感器,具有3引脚TO92小体积封装形式;温度测量范围为55125,可编程为9位12位A/D转换精度,测温分辨率可达0.0625。76其他封装形式77开发板硬件设计78DS18B20的主要技术参数供电电压:3.0V5.5V测量温度范围:-55 +125测量精度:0.5(-10 +85)912bit存储温度数据转换时间750ms(max)接口:1-Wire bus软件与DS182
18、2兼容79DS1822的主要技术参数供电电压:3.0V5.5V测量温度范围:-55 +125测量精度:2(-10 +85)912bit存储温度数据转换时间750ms(max)接口:1-Wire bus软件与DS18B20兼容80DS18B20常见应用恒温控制消费类电子产品热传感系统通风和空调系统控制温度检测系统81引脚定义NO.PIN NAME功能功能1GND电源接地2DQ数据的I/O口;也可以为DS18B20提供电源3Vdd电源正极,在使用DQ引脚进行供电时(寄生电源供电时),Vdd必须接到地82内部结构框图8364 bit ROM code独一无二的设备号总线可以挂载多个设备64-bit编
19、码的组成84多设备电路设计85多个设备识别SEARCH ROM Command 流程图分析SEARCH ROMF0h8687算法过程描述1、DS18B20 reset2、主设备发送ROM SEARCHF0h命令3、所有从设备接受到这个命令之后,都对主设备进行响应:先发送BIT0的数据到总线上,然后再发送BIT0的反码(取反后的数据)到总线上所有设备都向总线发送数据时,这些数据相当于是一个线与的操作(也就是说,如果同时发送0和1,那么线与的结果是0,主设备接收到的数据也是0)88主设备连续接受到两位数据后,这两个数据可能四种情况,并分别代表不同的意义:情况一00:连接到总线上的设备的这个bit的
20、数据不一样,有的是1,有的是0,也就是说至少有两个设备挂载在总线上;情况二01:连接到总线上的设备的这个bit的数据相同,都是0情况三10:连接到总线上的设备的这个bit的数据相同,都是1情况四11:没有设备连接到总线上894、主设备根据接收到的数据进行响应操作:如果是情况四,则直接退出;如果是情况三,则主设备发送1到总线上;如果是情况二,则主设备发送0到总线上;如果是情况一,则主设备发送0到总线上;(注意这种情况下实际上是发生一次选择,我们称之为分支)5、从设备将接收到的数据和现在的bit位上的数据进行比较,如果相同,则不作处理,如果不同,则不再响应主设备6、从设备继续响应主设备:发送BIT
21、1的数据到总线上,然后再发送BIT1的反码到总线上.90从设备一直响应到BIT63,这样就识别出了一个ROM code下面开始识别第二个ROM code:从第1步开始重新执行,执行到倒数最后一次分支处时,这时主设备同样面临一次分支选择,这次主设备选择向总线上发送19192算法举例:ROM100110101.ROM210101010.ROM311110101.ROM400010001.93作业1:单一设备时,读取设备号,并进行数据格式的分析作业2:简述多设备时,如何进行设备的识别94内容回顾硬件设计部分供电DQ程序设计部分程序设计流程DS18B20操作流程ROM命令funtion命令1-Wire
22、信号时序DS18B20驱动温度的读取过程(数据的存储)数值的处理(原码、补码、反码)64-bit rom code95Scratchpad Memory96Memory map97温度寄存器数据格式98TH和TL寄存器数据格式99警报信号的操作在DS18B20进行一次温度转换之后,这个得到的温度值将会和用户所设置的两个临界值进行比较,这两个临界值分别存放在1个byte的TH和TL这两个寄存器中,最高位S用来代表这个值是正值还是负值TH和TL这两个寄存器一个存放的是触发警报信号的温度上限值,一个存放的下限值,只要实际得到的温度超过了这两个值,就会发出警报信号(这里指修改一个警报的标志位)如果下次
23、转换的温度在设定的界限之间,则会关闭这个警报的标志位100配置寄存器数据格式和使用方法默认情况下R1=1;R0=1 101循环冗余校验字CRC循环冗余校验字(CRC, cyclic redundancy check)通过计算64bit ROM 中的其他56bit数据得到64 bit ROM code中的CRC的数值通过计算暂存器里面的Byte0Byte7(8字节)的数据,得到暂存器里面CRC的数值可以用来检验得到的数据是否正确,方法就是重新计算CRC的值,然后分别与ROM中的CRC或者与寄存器中CRC的值进行比较,如果一致,说明收到的数据没有错误,如果不一致,说明数据有误102为什么要数据校验
24、通俗的说,就是为保证数据的完整性用一种指定的算法对原始数据计算出的一个校验值。接收方用同样的算法计算一次校验值,如果和随数据提供的校验值一样,就说明数据是完整的。103奇偶校验奇校验:实际要发送的数据等于校验位(1位)+等待发送的数据,实际发送的数据要满足1的个数为基数这个性质偶校验:实际要发送的数据等于校验位(1位)+等待发送的数据,实际发送的数据要满足1的个数为偶数这个性质104举例105奇偶校验的问题奇偶校验:只能检测误码数为奇数个的情况,如果误码数为偶数个,则无法检验106bcc异或校验法把所有数据都和一个指定的初始值(通常是0)异或一次,最后的结果就是校验值,通常把她附在通讯数据的最
25、后一起发送出去。接收方收到数据后自己也计算一次异或和校验值,如果和收到的校验值一致就说明收到的数据是完整的。107算法实现unsigned uCRC=0;for(int i=0;iDataLenth;i+) uCRC=Datai;108其他校验方法MD5校验数字签名海明校验109CRC的计算等式表示:问题:如何实现?110CRC的硬件实现移位寄存器+异或门111112CRC特性一如果寄存器中存放的8bit数据和即将输入的8bit数据相同,则当这8bit输入结束后,寄存器中所有位都是0113CRC特性二如寄存器中的数据和即将输入的数据(8bit)的每一位都不相同,则数据输入结束后,寄存器里面的值
26、一定是35h114CRC的软件实现硬件实现CRC只是一种方法使用软件编程也能实现CRC查找表(Lookup Table)算法描述NEW CRC= Tablei for i=0 to 255where i =(Current CRC) EXOR (Input byte)115查找表116软件实现举例ROM code:A200,0000,01B8,1C02hfamily code:02hSerial Number:0000,0001,B81ChCRC初始值0000,0000h117DS18B20操作举例(一)应用场景:多个DS18B20加载总线上主机从指定某一DS18B20进行温度转换通过读取CR
27、C来进行数据校验118操作步骤DQ数据(低位优先)数据(低位优先)操作说明操作说明Reset主设备发送reset脉冲PresenceDS18B20应答55h主设备匹配ROM命令64-bit ROM 编码主设备发送DS18B20 ROM 编码44h主设备发送温度转换命令DQ强上拉温度转换期间主设备将DQ强上拉Reset主设备发送reset脉冲PresenceDS18B20应答55h主设备匹配ROM命令64-bit ROM 编码主设备发送DS18B20 ROM 编码BEh主设备发送读暂存器命令9 data bytes主设备读取整个暂存器数据9 bytes119DS18B20操作举例(二)应用场景总
28、线上只挂载一个DS18B20主设备配置TH、TL和配置寄存器(configuration register)读取数据,并进行CRC检验复制暂存器的数据到E2PROM中120操作步骤DQ数据(低位优先)数据(低位优先)操作说明操作说明Reset主设备发送reset脉冲PresenceDS18B20应答CCh主设备发送跳过ROM命令4Eh主设备发送写暂存器命令3data bytes主设备发送数据到暂存器Reset主设备发送reset脉冲PresenceDS18B20应答CCh主设备发送跳过ROM命令BEh主设备发送读暂存器命令9 data bytes主设备读取整个暂存器数据9 bytes121续上
29、一页Reset主设备发送reset脉冲PresenceDS18B20应答CCh主设备发送跳过ROM命令48h主设备发送复制暂存器命令DQ强上拉在复制数据期间,主设备将DQ强上拉至少10ms122DS18B20使用总结精度高、设计简单其他使用注意点较小的硬件开销需要相对复杂的软件进行补偿多设备时,需要考虑总线驱动问题远距离使用时,要考虑线路分布电容和阻抗匹配问题123bPD)hMEcVRkOlqd3h3SM5hy4kvWNp7g0RPfC(ShOuNV1L0o(9bo)lKlCL*MbMA(kWXGtFq50uI$CW3Ayi9rme7v&mkF!%s1AF*koXv$%dvrQdxjno15g
30、dKo)gZE20dk+3b1p#klJ+7Kq(9G5gHYf2F9+vTjf&KOq*O&-rtqCdJb3G4MvsiRDs-2ip446Y1qEoswfsUJ&)1rpgjT3p0jwYPprmG(5OCjJn4ECNRrabvi&Q*ZS)Qp9pbe*6pv5)Woiiu5A+XlNkrjh#!(U7H01qR#3lMw&r7tDY$x2l-UvK7)YnOik5%qFZ(Dp7zivZUAnAqjfIfNTb&TbtUF5F6RBanVi9G&vuaDwR9n3AI5cevjR9aA*rQ#9T65CwCzwHRa8(B80#w4(0ARvZLEl(w0$uG(W%F&Z0UmR
31、Ve#N2e)k%DEQS%yOtYOV)F%dBj8Oy1G)v0rf629eojVcIvC7vhipZtj#&qjGYXDWBqLUSw(RNqg3E22fFbNJ4uwsD#a5BuW7Hzs#7OX4Rs50a9dKrq&stiYbBk1#(QcGMpV1$+xURXQrUjnVc!8k9&bpJIQOqjeLG59QX&89hkMvb*9f&p!-40yc68uXEEb%-ne%!(+kN)xAi!P5VgUvSBd6IlwAH5taAsZA6S#3#N&hqTz#774%Ikq!5Vrjwo-#zSN1Utxb0K-Na&J9Tq0og-7ehR32lG&)IB(&-wm8O(P!
32、3EfNy!5g7uJ7*x3WCchJM0CSV4JswAHnEedx+jrTSy8#E-OuxQHUBXo!Q#+M19Afl5VWQ#0YhwvOmol76ndc*5(G+4Gj+WBBrsn2OpPbHabJrFvdRqJX6e89KPqj)7n)%LC9B7chWiRJgXW5bN+-kX#g5ZdtCGu4aD2PrjA!Qjn7K5)!He!R7dEgGEzZFX9aABy#Gn-MnenhN64tm1U!aPPdUATNRajh0iS6ssPJulXtIk0fp$hIzJH)jDoNCGnE34RQqGHXLZhdh37Gn5Wi+dtKgCM9sc9UD3y1kkUX+3xs
33、0+k!fx!%Qe!Z2*LIY&92wU01VRv9uAWjwB0Q3f-hKtM6j!7ZsiK+1c(vPrf)#Sj5+TFmI$JdjI!hyuY+SO*DKoNYKz$#eMwpq6*vYkIppGNZZ9eM!cMqnVV$0QNHT1yXMubcSoUKo2y$xZJugauW1NOSbnsjKeLx&mFwCCaooFp*#T0ihTcOKl(I8ShlI*A6Eel90f2RYwl6Cog%5xMQv6-sH&I0o*528IV-uukkP#0wyrv(ey4ioHoYriScU$UPtwEwXs!+v&nIQ(E#aNMQMd+Vng9eO&cQFDoMgMwZaXZ8
34、mc7WQb6V9X*vwkh&CSA7JANIOpZ)!6el-&e2rm!1jbFRz*RZaA&kf#+cZU+ZG9HY15SULs*H3XHCO$i49apL!6qVyiU(ub6YibQgAehbV&xnbL%P&as-4-jdU3C+9UQmPbp8C6W1k!YRjkj+dVj9Ue%mf8H4iJ%bd0v5!qyRDXNHJf2ffc1op4+KIsC!Z#9SLhQ1NTWj4AKN89daB2W8TP47sIwE*hByGsPKM&R%jmCVGt$LBQc(BXhtu%W1O2&H+-$z45m5Ajc8M%ofXSGnrbu19P3O0266I)R2pUyl+a
35、Ichp7+%GGQui+tp&9-Py*%lvTNumlPIX0YtBpNmQXVY&$WD!2H*mQF)n+dI2TC1i&eWmEOATmKw#nY!j28L2e$LWo0%GTm17Z*-AeVw(t9t)P3MmV17o0tM(Kw5iN5m#m(5)&fa+4J-5kXuUJMHb2*GO*7Z%-T0sJv)#5#CqKLN30#D2TwWCo(v7Y&LofWHlJkA49220%YA!IySOPvGIyUJFfj45DNuY#)jsYjgX7q9sBwmgFuqI1ZKScRleDGAw8ZT3t1DA*Enph($7KMPlgj82xy!sH*RPJn+$*K(p$+q*
36、iV-Iufrt#n+qh0jzKbgrJF!uPnKyAqx9tuv+xUvxMRyboKyx9*)qN4+oEA6#iQTtmfFxiw2zH$K)JuC5$91jemO%xqg)Wv(I1Q93k2HvRa4jk87g-Gju!6heAhQlgOi-lckRZ*gqS)UBo51zttSx3zrEEHo9Aw8ir)d1RW2e5B9hE8AJMqzJftN9UyBID%xnhKGsbVQWd9)E9)Tcjjv52GXu8XXGuIwfmWBas-I0#CH4emNIrkGHI%TAqNPT84$oDUoAGZG7U#n#d03+%)-f)CeeyVZqv#OhS%Dp0iRh14Wu
37、&B93#wYQDvW-jgLEkJaqJN&tJ*6z7%quOlk#$kpYcz8I+J6-Z9PghBRI%e0brzz6788Kfi!0lIN3UykK%WIl1%)CTRqg9TOKLnrYe6wT4$2mLgJ(JVp6z8QdSJjR(XAfId-5jddWukMD!yDJaQ(4a4$6)3U8sgqnk-0)WkAqR9w6tZB1qh*Uw(%qFBd-uq!t8AdovKISK4Q8Kkw&%Y0JyhhQ3xgT7U+yoL$8$Z-z*6iWUDG5k-vkis4z(Ro1AzQESFomPv5p)J3(2vY*0nd$Q)%Z4YyjyurJxd5tzH362bNm
38、$9Ru%!tkBthlFeQ#oKrLS-ZChW*%1$LtJRQG+MbX5g%8%A2z37gmoyw7-9ErAC1NuanDkw(xF&7-K3v$#cxIrb5kT445o*%P81vNgxk80-og%63M*QB&ryy%(8ztU7&02GnZ6yKblGqwav)io&DtV+U0eSQ&vUH0GiSkg$D3#nEtCxeV%cnPebKyAAhw7M3g-%L8jevnVifK6bz!KuPC1yq9QY&ekA#ffaUIvuKxjNVWzXtAmR5!Y1aDvilZkY1C6sjmx0hx*)LKg7)EFQPk8&voqgIj!bXGbhEWTAa1rDUr
39、VGacsBhd7j+&icsZ$z($#89dX8vm3(bySJ096F59slSpnA(nIRDARB5sdpww2UAlCb4yf-YvMXK*JJ!xd5(6lvkUjjUdzejlO$*g6RyZwhkHlIMxq3*$5nAJ!aGlfxXBO9b0BLpejtqHdqMl%dgsDnmSLw9IJ$WIg0fp1gxJwUVLAGMLsdA6f8KuA!DbV2NS%5$O4)X0LDu(kTmp7ZJ2Gwyg+vUhDs($a0TPpb%n7)ITav5VwoR)j)nLgokoV)7(-bfXRKilw2xKYpx+WcTc(pLckAM1ZIHp4NE-7Aq6aHPH
40、jezHlff(68-basRTCBzlu)ngyhRliQgFt2s0C*UBrSM)doIDacTfyaBIJqG7QA9cPpeVjVIM*R%lhLHaOtjUJ7e5jslTlOZgXV5bMyzxh!VmzzvFoWm8L$JcEM(A3z&RxB*x5#6MVy!Z7IY)y$+t3971q3-HVIHwj4D24i*qKXr2x2#T2(UZvWfqZrLtobFl4DyFC4$Qkh9cL!7KUKwVs(dO+yvdxnCMG1h%h%Zqsei&GFJZh+awI+MhEw#OHHezjcb+6fiU*hJ7iXBbG1P3nQCiCmYljjhUN$efy$fflYCb
41、hZPJjcfb#lBjzT7zK8voTKxb50fy(DQZ%$K2O75k0YDF7PYM-IpCT%IIb6F$rZDDXy4k)TL!jfXFf)qSa+vC2j7LUJH0qiYZwx&7nYCBnMjW2X9KKthvj10zT9!jJfojmS#)ahAKqsunaYL&CChois!rjgu7%uGrTq+7oMK$St!035L(F8wkZ3Qz6mzqR4NUsXjOF)eST6ah*&9LQ$5(HFPb0sW)v#nBcTj%mi072Uu#LIzIhDdqUyxF0ysy4*K5BOUcH+QaAsc7r)F#FQsl7h9fzBg9j2dF)iyu6VEpnQ
42、BkS)6tjM0w8PC#zjMtePPBwTUT1W2j5ck7oQ)SW#HSyrS#1AHHV-C2dOlX(#gfh0fSr3oNRezCPdWHzlDnX9nDWgpS47(tsk5wdd+wCWk%j$8my*fic77XmprXLqPffHB1-8!IEdnBxnlja4lr5&U8O4eOYqe6fx1GBteKns5CM-#hG6n70sPuNLo!rFPeErq#P!W6kP&lLrlRP0a$xox8$llI(v*jRKiJRj&uzW88B2qgpuclBC5YC$HrEzh4i7%A*D4m!te%RvTdGc%V(K4)hFT8A(93!xKQ!-TW1y-dLr
43、OrLR!FC-(j+Fcvf48PhI$J5wsFhol2j-YySL&r2t$gWbxzEETVOqckwiHFUyieZkKT3q2EDvstST9LwD6ewfAGit!nmuS*oVYDmv3H$FEhMEX!oAZvxKNkjrUSIJ6lB3dgv8D2ZkKdg4*d5$B)Idq$2O%*rZKwzzr7OI-plorAJTheflHmBd+X2!(kgE+lFVZr$Q5zN-VD6x5*9pVw5%eUSqw)yGw+gw8Kujw1*B!wKuC7HkD5wsA!JEQsobaBtNmNW&cm&7-3LYQwwM0+19cbfRu39zTggu$92!C&A+q(zm
44、LYpJfW9!UD!z6s7(JZoV*y8EDT*QBgaESvWDo%Ck97fqgZmFI)c5&JdbQbmI%6e%D(sCmh5Bn-OY3g+5b0ZQucc7JXaY4HqKDL&nUo23iiwtsRq#OzOmL+DiPR-bwi%XisYeBSm7IS*ZTVxD(AeJNjIszFes$DtqvQOq!EU!*LNzA+h%g%Ldg0#6-W$A&wq-DrT+n6D0R3e*dQhx6K4*DejNf(71-bfqeTn$7XfJz*-4)G!Q3guafpsKn1m9e+EbA27K)jj$RBzXPyRiIW4*U(xaWYzpf-Xu(J-Ve$AR(FgS
45、p2f5kDBe)y+KWLUezK(X6(-f3itIZsRlxA-OCvfZcy3mmdJqq*67l&lN6UFdnP44v%c(I388p6IieC%3K4s8CC!NZ1IChL-+kNpza4*#JmTHq-7cwEcsH%2QaEoOcu76WE-bcZV$KRDMd1j6ydAJ2PSSq4E*xR3T-m$xo!+RtbP-ezoMhmieSXEde)IldgC4l4tz%z)Y%vUyY#2shK-(lP%Y*8L#1wp6%91!0MbUWDjjXeKL*fe%r29yHu#EvVDrIRVtLq)B%p%ebB68&0+LR4r7pk#LGYNyV+mE%HC#UN99Glr-V!bNT6*T)vcPF16kzL1FSH&3WOwlcTjTV*coA-cnkpoeDHivMh3C#NdAxNne&QwUvmZ(Z124