温室恒温控制系统单片机51电子设计报告

更新时间:2024-05-18 02:29:02 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

26.温室恒温控制系统设计 - 1 -

一、 二、

1. 2. 三、

1. 2. 四、

3.

4.

5.

6. 五、

1.

2.

六、

1. 2.

引言 .............................................................................................................................. - 2 - 实验的主要目的和要求分析 ...................................................................................... - 2 - 目的: .......................................................................................................................... - 2 - 实验要求: .................................................................................................................. - 2 - 设计说明 ...................................................................................................................... - 3 - 设计原理 ...................................................................................................................... - 3 - 系统目标 ...................................................................................................................... - 3 - 硬件设计 ...................................................................................................................... - 3 - 温度传感器电路 .......................................................................................................... - 4 - 1) 温度传感器DSl8B20 .......................................................................................... - 4 - 2) DS18B20的性能特点 ......................................................................................... - 5 - 3) DS18B20的工作原理 ......................................................................................... - 5 - 7289工作电路 ............................................................................................................. - 8 - 1) 7289A特性 .......................................................................................................... - 8 - 2) 引脚功能说明 .................................................................................................. - 8 - 3) 指令控制 .............................................................................................................. - 9 - 4) 7289电路图 ....................................................................................................... - 11 - 键盘与显示 ................................................................................................................ - 11 - 1) 键盘单元 ............................................................................................................ - 11 - 2) 显示单元 ............................................................................................................ - 12 - 3) 键盘与显示电路 ................................................................................................ - 12 - 驱动电路 .................................................................................................................... - 13 - 软件设计 .................................................................................................................... - 15 - 温度测量 .................................................................................................................... - 17 - 1) 读取温度 ............................................................................................................ - 17 - 2) 显示温度 ............................................................................................................ - 17 - 显示与修改参数 ........................................................................................................ - 18 - 1) 显示参数 ............................................................................................................ - 19 - 2) 修改参数 ............................................................................................................ - 20 - 附录 ............................................................................................................................ - 21 - 附录A ........................................................................................................................ - 21 - 附录B ........................................................................................................................ - 22 -

26.温室恒温控制系统设计 - 2 -

一、 引言

温度是工业中主要被控参数之一,与之相关的各种温度控制系统广泛应用于冶金,化工,机械,食品等领域。温度控制是工业生产过程中经常遇到的过程控制,有些工艺过程对温度的控制效果直接影响到产品的质量,因而设计一种较为理想的温度控制系统是非常有价值的。本设计就是在单片机基础上通过外加传感器等,实现室内温度的测量及控制,主要利用单片机的信息采集及处理能力。本设计同时可利用于各种温控环境中,例如蔬菜大棚温度控制,养殖场孵化环境温度控制等,旨在采用低成本器件实现较高精度的温度控制,具有一定的实用性。

二、 实验的主要目的和要求分析

1. 目的:

(1) 通过查阅相关资料,深入了解采集的原理 (2) 学习有关电子技术知识 (3) 掌握可视化操作界面设计

(4) 设计温室恒温控制系统的原理图,构建硬件平台 (5) 制作出样机并测试达到功能和技术指标要求

2. 实验要求:

功能说明:

1. 恒温范围20摄氏度,误差正误一度,调节时间5分钟. 2. 测量精度0.1°C,最多可达4位有效数字.

3. 通过继电器和小灯泡,小风扇的配合,当温度低于预定界限时,便启动加热装置(用灯泡模拟),当温度 高到预定范围后,停止加热装置:当温度高于预定界限时,便启动降温装置(用小风扇代替),当温度降低到预定范围后,便停止降温装置.

26.温室恒温控制系统设计 - 3 -

三、 设计说明

1. 设计原理

本系统通过传感器DS18B20采样温度值,将采得的十六进制温度值转换为精度为0.1°的十进制温度,并显示。当温度高于或低于用户设定的报警上下限值是,蜂鸣器响。当温度高于控制值时开启风扇,低于控制值时开启灯泡。采用7289A作为智能显示驱动芯片,单片机即可完成LED现实,键盘接口的全部功能。

2. 系统目标

温度控制器采用温度传感器DS18B20,每隔一定时间或实时采集室内温度,在屏幕上显示并与设定值相比较,在设定的温度允许范围内对室内的温控系统(空调系统、暖气系统)进行调控, 使室内温度始终保持在一个合适的范围内,根据不同的工作环境设定温差允许的精度,以便于满足生活工作及生产环境需要。

该温度控制器配制一些键(类似于空调机的控制面板:0~9数字输入、功能选择键),提供给用户来进行温度的增减及初始值的设定等。温控器同时配制LED数码显示,实时显示室内的温度。温控器在检测到室内的温度超过上下限(max,min),并已经超出温控系统的调控范围时,能够通过声音报警提示人们注意并作出相应的调整以满足温度要求。当低于设定值(lower)时加热装置开启,当高于设定值(upper)时风扇开启。

整个温控器的设计包括硬件系统与软件系统的设计。

四、 硬件设计

设计基于DS18B20的数字式温度控制系统,控制电路主要包括,led显示电路、按键电路、温度检测电路及控制电路。总体设计框图如图1:

26.温室恒温控制系统设计 - 4 -

LED 7289 P1.0~P1.3 按钮 DS18B20 加热 风扇 报警 晶阵 P1.4,P1.5 P1.6, P1.7 P3.2,P3.3 P3.6

图1 温度控制系统原理硬件结构框图

3. 温度传感器电路

1)

温度传感器DSl8B20

由美国DALLAS半导体公司生产的DSl8B20型单线智能温度传感器,属于新

一代适配微处理器的智能温度传感器,可广泛用于工业、民用、军事等领域的温度测量及控制仪器、测控系统和大型设备中,例如多路温度测控仪、中央空调、大型冷库、恒温装置等。DSl8B20的电源电压范围均扩展到+3~+5.5V,DSl8B20还能对温度分辨力进行编程,选择9位~12位模式下工作,在12位模式下的最高分辨力可达0.0625℃, 被测温度用符号扩展的16位数字量方式串行输出,其工作电源既可在远端引入,业可采用寄生电源方式产生,多个DS18B20可以并联到三根或者两根线上,CPU只需一根端口线就能与多个DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。从而可以看出DS18B20可以非常方便的被用于远距离多点温度检测系统。

综上,在本系统中我采用温度芯片DS18B20测量温度。该芯片的物理化学性很稳定,它能用做工业测温元件,且此元件线形较好。在0—100摄氏度时,最大线形偏差小于1摄氏度。该芯片直接向单片机传输数字信号,便于单片机处理及控制。

26.温室恒温控制系统设计 - 5 -

2) DS18B20的性能特点

(1)DSl8B20采用DALLAS公司独特的“单线(1-Wire)总线”专有技术,与

单片机通信只要一根I/O线;

(2)在测温范围是-55~+125℃时,测量误差不超过±2℃,在-10~+85℃范围内,可确保测量误差不超过±0.5℃;

(3)在构成大型温控系统时,允许在单线总线上挂接多片DSl8B20; (4) 低压供电,电源范围从3~5V,也可以直接从数据线上窃取电源; (5) 数据位可编程9~12位,转换12位实践为750ms(最大); (6) 用户可自设定报警上下限温度;

(7)报警搜索命令可识别和寻址哪个器件的温度超过预定值; 3)

DS18B20的工作原理

DSl8B20的原理与DS1820的原理是一样的。DS18B20继承了DS1820的所有

优点。DS18B20采用3脚PR—35封装或8脚SOIC封装,引脚排列如图2所示。I/O为数据输入/输出端(即单线总线),它属于漏极开路输出,外接上拉电阻后,常态下呈高电平。UDD是可供选用的外部+5V电源端,不用时需接地。GND为地,NC为空脚。

(a) PR—35封装 (b) SOIC封装

图2 DS1820/DS18B20的引脚排列

26.温室恒温控制系统设计 - 6 -

(1)DSl8B20原理

DSl8B20内部测温电路框图如图3 所示。低温度系数振荡器用于产生稳定的频率?0,高温度系数振荡器则相当于T/?转换器,能将被测温度t转换成频率信号?0图中还隐含着计数门,当计数门打开时,DSl8B20就对低温度系数振荡器产生的时钟脉冲?0进行计数,进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定。每次测量前,首先将-55℃所对应的基数分别置入减法计数器、温度寄存器中。在计数门关闭之前若计数器已减至零,温度寄存器中的数值就增加0.5℃。然后,计数器依斜率累加器的状态置入新的数值,再对时钟计数,然后减至零,温度寄存器值又增加0.5℃。只要计数门仍未关闭,就重复上述过程,直至温度寄存值达到被测温度值。这就是DSl8B20的测温原理。斜率累加器能对振荡器的非线性予以补偿,提高测量准确度。

需要指出,温度值本应为9位(其中,符号占一位),但因符号位又被扩展成高8位,故实际以16位补码的形式读出。其中,高8位代表符号,“0”表示t>0℃,“1”表示t<0℃;低8位则以0.5℃/LSB。

图3 内部测温电路框图

低八位 23 高八位 S 21 20 2-1 2-2 2-3 S S S S 26 25 表1-1 DS18B20中温度字节中的位定义:

22 2-4 24

26.温室恒温控制系统设计 - 7 -

DSl8B20型单线智能温度传感器典型的测温误差在0~70℃范围内,DSl8B20的上、下限测温误差分别为+0.5℃、-0.5℃,而典型产品的误差仅为±0.25℃。 (2) DS18B20读温度流程 1.总线上只有一个器件

复位 发CCH SIP ROM命令 发44H开始转换 延时 复位 发CCH SIP ROM命令 发读存储器命令 连续读出两个字节数据(温度) 结束

2.总线上挂有多个器件

复位 发55H MATCH ROM命令 发64位地址 发44H开始转换 延时 复位 发55H MATCH ROM命令 发64位地址 发0BE读存储器命令 连续读出两个字节数据(温度) 复位 结束

(3)测温电路图

图4 测温电路图

分析:如图4所示。本系统多路次采集温度值,故使用两个DS18B20,分别与单片机的P1.4和P1.5管脚相连。采用集中外部供电的方式。采集获得的信息由P1.4和P1.5管脚送入单片机。

26.温室恒温控制系统设计 - 8 -

4. 7289工作电路

7289A是广州周立功单片机发展有限公司自行设计、具有SPI串行接口功能、可同时驱动8位共阴式数码管智能显示驱动芯片该芯片同时可连接多达64键键盘矩阵。单块芯片即可完成LED显示以及键盘接口全部功能7289A内部含有译码器,可直接接收BCD码或16进制码,并同时具有2种译码方式,此外还具有多种控制指令,如消隐、闪烁、左移、右移、段寻址等,通过7289A自身所具有片选信号,可以方便地实现多于8位显示或多于64 键键盘接口。

图5 7289管脚图

1) 7289A特性

该芯片主要特性如下:

? 带有串行接口,无需外围元件即可直接驱动LED; ? 各位可独立控制译码/不译码及消隐和闪烁属性; ? 具有(循环)左移/(循环)右移指令;

具有段寻址指令,可方便地控制独立LED显示器; ? 内含64键键盘控制器以及去抖动电路;

2) 引脚功能说明

? VDD(12) +5v电源 ? NC(35) 不连接,必须悬空

26.温室恒温控制系统设计 - 9 -

? VSS(4) 接地

? CS(6) 片选输入。此脚为低电平时,可向芯片发送指令及读取键盘数据 ? CLK(7) 同步时钟输入端。向芯片发送数据及读取键盘数据时,此引脚电平

上升沿表示数据有效

? DATA(8) 串行数据输入/输出端。当芯片接收指令时,此引脚为输入端;当

读取键盘数据时,此引脚在读指令最后一个时钟下降沿变为输出端。 ? KEY(9) 按键有效输出端。平时为高电平,当检测到有效按键时,此引脚变

为低电平

? SG~SA(10~16) 段ga驱动输出 ? DP(17) 小数点驱动输出

? DIG0~DIG7 (18~25) 数字0~7驱动输出 ? Osc2(26) 振荡输出端 ? Osc1(27) 振荡器连接端

? RESET(28) 复位端。低电平有效,当RESET端由低电平变为高电平后,7289A

大约经过18~25ms时间才会进入正常工作状态

3) 指令控制

? 下载数据但不译码

第一字节 D7 1 第二字节 D7 DP D6 A D5 B D4 C D3 D D2 E D1 F D0 G D6 1 D5 0 D4 0 D3 1 D2 a2 D1 a1 D0 a0 其中,a2,a1,a0为为地址,A~G和DP为显示数据,分别对应7段LED数码管的各段.当相应的数据位”1”时,该段亮,否则不亮。

? 闪烁控制

第一字节 D7 1

D6 0 D5 0 D4 0 D3 1 D2 0 D1 0 D0 0

26.温室恒温控制系统设计 - 10 -

第二字节 D7 d8 D6 d7 D5 d6 D4 d5 D3 d4 D2 d3 D1 d2 D0 d1 此命令控制各个数码管的消隐属性.d1~d8分别对应数码管1~8,0=闪烁,1=不闪烁.开机后缺省的状态为各位均不闪烁。

? 消隐控制

第一字节: D7 1

第二字节: D7 d8 D6 d7 D5 d6 D4 d5 D3 d4 D2 d3 D1 d2 D0 d1 D6 1 D5 0 D4 0 D3 1 D2 0 D1 0 D0 0 此命令控制各个数码管的消隐属性.d1~d8分别对应数码管1~8,0=显示,1=消隐.当某一位被赋予消隐属性后,7289A再扫描时将跳过该位,因此再这种情况下,无论对该位写入何值均不会显示.但写入的值将被保留,再该位重新设置为显示状态后,最后一次写入的数据将被显示出来.

注意:至少应有一位保持显示状态,若全部为0,该指令不被接受,7289A保持原来的消隐状态不变。

? 读键盘指令

第一字节: D7 0

第二字节: D7 d8 D6 d7 D5 d6 D4 d5 D3 d4 D2 d3 D1 d2 D0 d1 D6 0 D5 0 D4 1 D3 0 D2 1 D1 0 D0 1 该指令从7289A读出当前的按键代码.与其他指令不同,此命令的前一个字节0001010B为单片机传送到7289A的指令,而后一个字节d0~d7则为7289A返回的按键代码,其范围是0~3FH(无键按下时为0Xff).

当7289A检测到有效的按键时,KEY引脚从高电平变为低电平,并一直保持到按键结束.在此期间,如果7289A收到”读键盘数据指令”则输出当前按键的键盘代码,如果收到”读键盘指令”时没有有效按键,则输出为FFH.。

26.温室恒温控制系统设计 - 11 -

4) 7289电路图

显示

键盘 图6 7289工作电路图

分析:7289A的6号管脚CS连接单片机的P1.0,作为片选输入端,此引脚为低电平的时候可向芯片发送指令及读取键盘数据。它的7号管脚CLK连接单片机的P1.1,作为同步时钟输入端。它的8号管脚DIO连接单片机的P1.2,作为串行数据输入/输出端。它的9号管脚KEY连接单片机的P1.3,作为按键有效输出端。

7289A和按键及数码管共同构成它的应用电路。

7289A需要外接晶体振荡电路供系统工作。F=11.0592MHz,C=15pF。

5. 键盘与显示 1) 键盘单元

单片机应用系统中除了复位按键有专门的复位电路,以及专一的复位功能外,其它的按键或键盘都是以开关状态来设置控制功能或输入数据。

键开关状态的可靠输入 :它是在检测到有键按下时,执行一个10ms的延时

26.温室恒温控制系统设计 - 12 -

程序后,再确认该键电平是否仍保持闭合状态电平,如保持闭合状态电平则确认为真正键按下状态,从而消除了抖动影响

在这种行列式矩阵键盘非编码键盘的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。当确认有按键按下后,下一步就要识别哪一个按键按下。对键的识别通常有两种方法:一种是常用的逐行扫描查询法;另一种是速度较快的线反转法。

键盘共有16个按键,用于方便设定温度。 S1 1路 S9 2 S2 2路 S10 3 S3 确定 S11 4 S4 修改 S12 5 S5 S13 6 S6 S14 7 S7 0 S15 8 S8 1 S16 9 表1 键盘功能表

S1 0x3F S9 0x1F

S2 0x3E S10 30x1E S3 0x37 S11 0x17 S4 0x36 S12 0x16 S5 0x2F S13 0x0F S6 0x2E S14 0x0E S7 0x27 S15 0x07 S8 0x26 S16 0x06 表2 键盘键值表

2) 显示单元

本系统为8位显示,使用8个LED管。

前四个用于显示1路的温度,后四个用于显示2路的温度。

修改参数时8个一起使用,顺次显示报警上限值,报警下限值,风扇开启值和灯泡开启值。

3) 键盘与显示电路

7289A和键盘,显示共同构成7289A的典型应用电路。

分析:上电后,所有显示均为空。所有显示位的显示属性都为“显示”和“不闪烁”。当有键按下时,KEY引脚输出为低电平,此时如果接受到“读键盘”的指令,7289A将输出所按键的代码。

26.温室恒温控制系统设计 - 13 -

电路中接入8只10K的电阻和8只100K的下拉电阻。采用循环扫描的方式,如果用一般的数码管可能亮度不够,故采用高亮或者超高亮的数码管型号。

图7 键盘与显示工作电路图

6. 驱动电路

通过继电器驱动加热装置、风扇和报警器。电路图如下:

26.温室恒温控制系统设计 - 14 -

图6 加热驱动电路图

图7 风扇驱动电路图

26.温室恒温控制系统设计 - 15 -

图8 报警器驱动电路图

分析:1路的加热电路与P1.7相连,风扇与P3.3相连。2路的加热电路与P1.6相连,风扇与P3.2相连。报警电路与P3.6相连。I/O口输出后与继电器连接,产生较大的功率驱动各种设备。

五、 软件设计

温度控制器采用温度传感器DS18B20,每隔一定时间或实时采集室内温度,在屏幕上显示并与设定值相比较,在设定的温度允许范围内对室内的温控系统进行调控, 使室内温度始终保持在一个合适的范围内,根据不同的工作环境设定温差允许的精度,以便于满足生活工作及生产环境需要。

多点采集温度

该温度控制器配制一些键(类似于空调机的控制面板:0~9数字输入、功能选择键),提供给用户来进行温度的增减及初始值的设定等。温控器同时配制LED数码显示,实时显示室内的温度。温控器在检测到室内的温度超过上下限(max,min),并已经超出温控系统的调控范围时,能够通过声音报警提示人们注意并作出相应的调整以满足温度要求。当低于设定值(upper)时加热装置开启,当低于设定值(lower)时风扇开启。

26.温室恒温控制系统设计 - 16 -

开始 1ms延时 读取温度F1/F2 温度显示 Y 是否有键按下? N 与报警上下限比较 Y 超出范围? N 与控制上下限比较 报警 按键处理 超出范围? 启动

图9 系统设计主程序框图

26.温室恒温控制系统设计 - 17 -

1. 温度测量

温度测量包括通过DS18B20将温度转化为16进制数,再将这个十六进制数转化为有符号的十进制数。再与比较设定值比较进行控制。过程中,可以修改参数值,也可以选择哪一路工作。

温度测量包括:读取温度、显示温度。

1) 读取温度

读取温度 Y 是否为负数 N 分离整数与小数部分 取反加1 计算温度

图10 读取温度部分程序框图

将十六进制温度转化为有符号的十进制数,保存在temperature中。

2) 显示温度

26.温室恒温控制系统设计 - 18 -

显示温度 判断0路工作? N Y LED0显示F1符号LED4显示F2符号LED1显示F1十位 LED5显示F2十位 LED2显示F1个位 LED6显示F2个位 LED3显示F1小数LED7显示F2小数

图11 显示温度程序框图

1路工作时,前四个LED显示1路的温度。 2路工作时,后四个LED显示2路的温度。

2. 显示与修改参数

参数有四个:max.min,upper,lower。依次显示在8个LED上。

26.温室恒温控制系统设计 - 19 -

1) 显示参数

显示参数 判断0路工作? N LED0:max2十位 LED1:max2个位 LED2:min2十位 LED3:min2个位 LED4:upper2十位 LED5:upper2个位 LED6:lower2十位 LED7:lower2个位 图12 参数显示程序框图

Y LED0:max1十位 LED1:max1个位 LED2:min1十位 LED3:min1个位 LED4:upper1十位 LED5:upper1个位 LED6LED6:lower1显示F2十位个位 LED7:lower1个位

26.温室恒温控制系统设计 - 20 -

2) 修改参数

按下S4,进入参数修改的界面。

修改参数 key=7 key+1 Y key>7? N Key=0 输入数字 显示修改的参数

图12 系统设计主程序框图

依次输入各个参数的十位、个位。

26.温室恒温控制系统设计 - 21 -

赋值 修改十位?个位? 十位 个位 MAX=NUM*10+MAX MAX=(MAX/10)*10+NUM

图13 赋值子程序框图

六、 附录

1. 附录A

考 文 献

1王建校主编. 51系列单片机及C51程序设计.科学出版社,2007

2王建校,张虹,金印彬编. 电子系统设计与实践实验指导书 西安交通大学出版社

26.温室恒温控制系统设计 - 22 -

2. 附录B

程序清单:

#include #include #include

#define uchar unsigned char sbit TMDAT = P1^4;

//两个DS18B20的I/O口

sbit TMDAT1 = P1^5; sbit CS=P1^0; sbit CLK=P1^1; sbit DIO=P1^2; sbit KEY=P1^3; sbit HEAT=P1^7; sbit COLD=P3^3; sbit HEAT1=P1^6; sbit COLD1=P3^2; sbit ALARM=P3^6;

int num; //保存输入的数字 int key=7; //保存数码管号

int qiehuan=0; //控制屏幕显示温度或者参数 int choose=0; //保存正在使用的DS18B20号 int max1=23; //一号通道的报警上下限值 int min1=5;

int upper1=22; //一号通道的预定温度值 int lower1=18;

int max2=23; //二号通道的报警上下限值 int min2=5;

int upper2=22; //二号通道的预定温度值

26.温室恒温控制系统设计 - 23 -

int lower2=18; unsigned char

buffer1[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};//控制符,用于显示不带小数点的数字 unsigned char

buffer2[16]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f};//控制符,用于显示带小数点的数字

unsigned char turn[8]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87};//控制符,用于选定数码管号

unsigned int result,result1;//保存十六进制的温度值 unsigned char a,b; uchar data rebuf,sebuf; uchar bdata com_data; sbit mos_bit=com_data^7; sbit low_bit=com_data^0; void send(uchar sebuf); void delay_50us(); void receive(); void reset();

void dmsec (unsigned int count); void tmreset (void); void tmstart (void); void tmreset1 (void); void tmstart1 (void);

void fuzhi(void);//用于修改参数值 void xianshi(void);//将修改的参数值显示 unsigned char tmrtemp (void); unsigned char tmrtemp1 (void); main()

26.温室恒温控制系统设计 - 24 -

{

unsigned int zhengshu,dot;

unsigned char temperature;

unsigned int symbol; int shiwei;

int gewei; unsigned int zhengshu1,dot1; unsigned char temperature1;

unsigned int symbol1; int shiwei1;

int gewei1;

while(1) {

if(choose==0) //通道一工作 {dmsec(1);

tmstart (); dmsec(1000); tmrtemp (); reset();

if(result>0xf800) //将通道一的温度转换为十进制

{ symbol=1; result=~result+1; }

zhengshu=result/16; dot=result&0x000f; dot=(dot*10)/16;

shiwei=(zhengshu/10); gewei=(zhengshu);

temperature=zhengshu+dot*0.1; //通道一的十进制温度

26.温室恒温控制系统设计 - 25 -

if(temperature>upper1) //通道一温度控制

{ COLD=1; HEAT=0;

} //超过预定温度的上限,启动小风扇 else if(temperature

HEAT=1;} 灯泡 else { COLD=0; HEAT=0;}

if(temperature>max1|temperature

{ ALARM=0;} 限,则报警 else

{ ALARM=1;}

} else{

dmsec(1); //通道二工作 tmstart1 (); dmsec(1000); tmrtemp1 (); reset();

if(result1>0xf800) //将通道二的温度转换为十进制 { symbol1=1; result1=~result1+1; }

zhengshu1=result1/16; dot1=result1&0x000f;

dot1=(dot1*10)/16;

//低于预定温度的下限,启动小

//高于或低于设定温度的上下

26.温室恒温控制系统设计 - 26 -

shiwei1=(zhengshu1/10); gewei1=(zhengshu1);

temperature1=zhengshu1+dot1*0.1; //通道二的十进制温度 if(temperature1>upper2) //通道二温度控制

{ COLD1=1; HEAT1=0;

} //超过预定温度的上限,启动小风扇

else if(temperature1

HEAT1=1;} //低于预定温度的下限,启动小灯泡 else { COLD1=0; HEAT1=0;}

if(temperature1>max2|temperature

{ ALARM=0;} //高于或低于设定温度的上下限,则报警 else

{ ALARM=1;}

} //屏幕的显示:

if(qiehuan==0) //显示温度 {if(choose==0) { send(0x80);

delay_50us();

if(symbol==1){send(0x0a);}

else{send(0x0f);}

delay_50us();

send(0x81);

delay_50us();

send(buffer1[shiwei]);

delay_50us();

26.温室恒温控制系统设计 - 27 -

send(0x82); delay_50us();

send(buffer2[gewei]);

delay_50us();

send(0x83);

delay_50us();

send(buffer1[dot]);

delay_50us();}

else {send(0x84);

delay_50us();

if(symbol1==1){send(0x0a);}

else{send(0x0f);}

delay_50us();

send(0x85);

delay_50us();

send(buffer1[shiwei1]);

delay_50us(); send(0x86); delay_50us();

send(buffer2[gewei1]);

delay_50us();

send(0x87);

delay_50us();

send(buffer1[dot1]); }

else{if(choose==0) //显示参数值 {

send(0x80);

delay_50us(); }

26.温室恒温控制系统设计 - 28 -

delay_50us();

send(buffer1[max1/10]); send(0x81); delay_50us();

send(buffer1[max1]); send(0x82); delay_50us();

send(buffer1[min1/10]); send(0x83); delay_50us();

send(buffer1[min1]); send(0x84); delay_50us();

send(buffer1[upper1/10]); send(0x85); delay_50us();

send(buffer1[upper1]); send(0x86); delay_50us();

send(buffer1[lower1/10]); send(0x87); delay_50us();

send(buffer1[lower1]); delay_50us(); }

if(choose==1) {

send(0x80); delay_50us();

send(buffer1[max2/10]);

26.温室恒温控制系统设计 - 29 -

send(0x81); delay_50us();

send(buffer1[max2]); send(0x82); delay_50us();

send(buffer1[min2/10]); send(0x83); delay_50us();

send(buffer1[min2]); send(0x84); delay_50us();

send(buffer1[upper2/10]); send(0x85); delay_50us();

send(buffer1[upper2]); send(0x86); delay_50us();

send(buffer1[lower2/10]); send(0x87); delay_50us();

send(buffer1[lower2]);}} CS=1;

while(KEY);

send(0x15); delay_50us(); receive(); delay_50us(); switch(rebuf){

case 0x3F: //按键S1,选择一路 {

//第一个字节,读取键值命令字

//第二个字节,读取键值,存放在变量rebuf中

26.温室恒温控制系统设计 - 30 -

choose=0; send(0x88); delay_50us(); send(0xF0); CS=1; } break;

case 0x3E://按键S2, 选择二路 { choose=1; send(0x88); delay_50us(); send(0x0F); CS=1; } break;

case 0x36: //按键S4,开始修改 {qiehuan=1; key=7; CS=1; } break;

case 0x37://选择确定 { qiehuan=0; CS=1; } break;

case 0x27: //输入数字\{key++;

//第一个字节,闪烁控制命令字

//第二个字节,设置为闪烁

//第一个字节,闪烁控制命令字

//第二个字节,设置为闪烁

26.温室恒温控制系统设计 - 31 -

num=0; fuzhi(); xianshi(); CS=1; } break;

case 0x26: //输入数字\ {key++; num=1; fuzhi(); xianshi(); CS=1; } break;

case 0x1F: //输入数字\ {key++; num=2; fuzhi(); xianshi(); CS=1; } break;

case 0x1E: //输入数字\ {key++; num=3; fuzhi(); xianshi(); CS=1; } break;

26.温室恒温控制系统设计 - 32 -

case 0x17: //输入数字\ {key++; num=4; fuzhi(); xianshi(); CS=1; } break;

case 0x16: //输入数字\{key++; num=5; fuzhi(); xianshi(); CS=1; } break;

case 0x0F: //输入数字\ {key++; num=6; fuzhi(); xianshi(); CS=1; } break;

case 0x0E: //输入数字\ {key++; num=7; fuzhi(); xianshi(); CS=1;

26.温室恒温控制系统设计 - 33 -

} break;

case 0x07: //输入数字\ {key++; num=8; fuzhi(); xianshi(); CS=1; } break;

case 0x06: //输入数字\ {key++; num=9; fuzhi(); xianshi(); CS=1; } break;

default: break;

}

while(!KEY); KEY=1; } }

/********** FUNCTION **********/ void dmsec (unsigned int count) { unsigned int i;

while (count--) { for (i=0;i<125;i++){}

// mSec Delay 11.0592 Mhz // 1MS 延时

26.温室恒温控制系统设计 - 34 -

} }

void tmreset (void) { // Reset TX unsigned int i; TMDAT = 0;

i = 103; while (i>0) i--; TMDAT = 1; i = 4; while (i>0) i--; }

void tmreset1 (void) { unsigned int i; TMDAT1 = 0;

i = 103; while (i>0) i--; TMDAT1 = 1; i = 4; while (i>0) i--; }

void tmpre (void) { unsigned int i; while (TMDAT); while (~TMDAT); i = 4; while (i>0) i--; }

void tmpre1 (void) { unsigned int i; while (TMDAT1); while (~TMDAT1);

// Approx 900 uS

// Reset TX // Approx 900 uS

// Wait for Presence RX // Wait for Presence RX 26.温室恒温控制系统设计 - 35 -

i = 4; while (i>0) i--; }

bit tmrbit (void) { // read one bit unsigned int i; bit dat;

TMDAT = 0; i++; TMDAT = 1; i++; i++; dat = TMDAT;

i = 8; while (i>0) i--; return (dat); }

unsigned char tmrbyte (void) { unsigned char i,j,dat; dat = 0;

for (i=1;i<=8;i++) { j = tmrbit ();

dat = (j << 7) | (dat >> 1); }

return (dat); }

void tmwbyte (unsigned char dat) { unsigned int i; unsigned char j; bit testb;

for (j=1;j<=8;j++) { testb = dat & 0x01;

// read one byte // write one byte

26.温室恒温控制系统设计 - 36 -

dat = dat >> 1; if (testb) {

TMDAT = 0; // Write 1 i++; i++; TMDAT = 1; i = 8; while (i>0) i--; } else {

TMDAT = 0; i = 8; while (i>0) i--; TMDAT = 1;

i++; i++; } } }

void tmstart (void) { tmreset (); tmpre (); dmsec (1);

tmwbyte (0xcc); tmwbyte (0x44); }

unsigned char tmrtemp (void) { tmreset (); tmpre (); dmsec (1);

tmwbyte (0xcc); tmwbyte (0xbe);

// Write 0 // ds1820 start convert // skip rom // convert // read temp // skip rom // convert

26.温室恒温控制系统设计 - 37 -

a = tmrbyte (); // LSB b = tmrbyte (); // MSB result=a+b*256; return(result);

}

bit tmrbit1 (void) { unsigned int i; bit dat;

TMDAT1 = 0; i++; TMDAT1 = 1; i++; i++; dat = TMDAT1;

i = 8; while (i>0) i--; return (dat); }

unsigned char tmrbyte1 (void) { unsigned char i,j,dat; dat = 0;

for (i=1;i<=8;i++) { j = tmrbit1 ();

dat = (j << 7) | (dat >> 1); }

return (dat); }

void tmwbyte1 (unsigned char dat) { unsigned int i; unsigned char j;

// read one bit // read one byte // write one byte 26.温室恒温控制系统设计 - 38 -

bit testb;

for (j=1;j<=8;j++) { testb = dat & 0x01; dat = dat >> 1; if (testb) {

TMDAT1 = 0; // Write 1 i++; i++; TMDAT1 = 1; i = 8; while (i>0) i--; } else {

TMDAT1 = 0; i = 8; while (i>0) i--; TMDAT1 = 1;

i++; i++; } } }

void tmstart1 (void) { tmreset1 (); tmpre1 (); dmsec (1);

tmwbyte1 (0xcc); tmwbyte1 (0x44); }

unsigned char tmrtemp1 (void) {

tmreset1 ();

// Write 0 // ds1820 start convert // skip rom // convert // read temp 26.温室恒温控制系统设计 - 39 -

tmpre1 (); dmsec (1);

tmwbyte1 (0xcc); // skip rom tmwbyte1(0xbe); // convert a = tmrbyte1 (); // LSB b = tmrbyte1(); // MSB }

void delay_50us() //延时50us,不同的晶振,有差异,读者可根据实际情况自定参数

{

result1=a+b*256; return(result1);

uchar i; for(i=0;i<6;i++){;}

void delay_8us() {

uchar i; for(i=0;i<1;i++){;} }

void delay_50ms() {

uchar i,j; for(j=0;j<50;j++) for(i=0;i<125;i++){;} }

void send(uchar sebuf)

}

//延时8us

//延时50ms

//发送一个字节结束时,7289的CS继续使能

26.温室恒温控制系统设计 - 40 -

{ uchar i; com_data=sebuf; CS=0;

CLK=0;

delay_50us(); for(i=0;i<8;i++)

{

delay_8us();

DIO=mos_bit; CLK=1; delay_8us();

com_data=com_data<<1; CLK=0; } DIO=0; }

void receive() { uchar i; CLK=1; delay_50us(); for(i=0;i<8;i++) {

com_data=com_data<<1; low_bit=DIO; CLK=1; delay_8us(); CLK=0;

//改为应该更好;

//接收一个字节结束时,7289的CS不使能

本文来源:https://www.bwwdw.com/article/1re7.html

Top