远程温度控制系统设计与实现(含有源码)

1. 引言

在现代工业及家庭生活中,温度控制技术扮演着关键角色。随着人们对生活质量的不断追求,温度控制系统的需求日益增加。本项目旨在设计一个基于微控制器的远程温度控制系统,主要功能包括温度监测、温度设定及无线通信。

2. 系统设计概述
2.1 设计任务

本项目的设计任务包括:

  1. 设计远程温度控制系统,电烤箱温度可由人工设定,控制范围室温至125℃。
  2. 采用PID控制算法实现温度实时控制,并能显示实际温度值。
  3. 实现无线发送、接收功能,编码、解码校验以及超限报警。
  4. 确保系统在设计指标范围内运行。

主要技术指标:

  • 温度控制误差:≤±0.5℃
  • 发射频率:≥300MHz
  • 发射距离:≥500m
  • 误码率:≤10^-6
2.2 总体设计框架

系统设计包括温度采集、数据处理、无线通信、显示控制和用户输入等模块。采用AT89S51单片机作为控制核心,使系统具备灵活性和扩展性。

3. 硬件设计
3.1 DS18B20温度传感器

DS18B20是一种数字温度传感器,采用单总线协议,其主要特点包括:

  • 测量范围:-55℃至+125℃
  • 精度:±0.5℃
  • 适配性强,可并联多个传感器
3.1.1 工作原理

DS18B20通过单总线协议与主控单片机进行通信,采用特定的时序实现数据传输。

3.1.2 硬件接口

与AT89S51单片机连接,采用寄生供电或外接供电方式。

3.2 AT89S51单片机

AT89S51是一款高性能CMOS 8位微处理器,主要特性包括:

  • 4K字节可编程闪存
  • 128字节内部RAM
  • 32个可编程I/O口及多个定时器
3.3 无线通信模块

采用PT2262和PT2272作为编码解码芯片,结合F05T和J04T无线发射接收模块,工作频率固定为433MHz。

3.4 驱动电路

驱动电路采用脉冲移相触发可控硅实现电烤箱的功率控制,确保系统安全稳定运行。

4. 软件设计
4.1 模块化设计

软件设计采用模块化结构,包括:

  • 键盘控制模块:用于输入温度设定值及其他指令。
  • 显示模块:用于显示当前温度及设定值。
  • 温度采集模块:读取DS18B20的温度数据。
  • 控制PID算法模块:实现温度控制。
4.2 PID控制算法

采用增量式PID控制算法,计算控制量以调节电烤箱的温度。PID参数通过实验进行整定,以达到最佳控制效果。

void PID() {
    e2 = e1;
    e1 = e0;
    e0 = Expect_T - Actual_T; 
    u += Ki * e0 + Kp * (e0 - e1) + Kd * (e0 - 2 * e1 + e2);
    if (u < 0) u = 0; // 限幅
    if (u > 255) u = 255;
    Pwm_H = u; // 计算PWM高电平时间
}
4.3 用户交互

键盘控制模块实现了设置温度和控制系统的功能,界面友好,易于操作。

5. 系统调试

系统调试分为硬件调试和软件调试,确保每个模块独立正常工作后进行整体联调。具体步骤如下:

  1. 硬件电路检查,确认无短路或断路现象。
  2. 分模块调试,包括控制模块、显示模块、编码解码模块等。
  3. 联合调试,无线发射接收模块的通信效果。
6. 系统性能测试
6.1 误码率测试

通过误码仪测试,系统的误码率≤10^-6,符合设计要求。

6.2 发射/接收频率测试

实际测试频率接近433MHz,表明频率稳定性良好。

6.3 数据传输速率测试

数据传输速率约为1200bps,满足系统应用需求。

7. 操作说明

用户可通过2*4键盘进行温度设定,控制电烤箱温度。系统设计简单易用,适合多种应用场景。

8. 总结

本项目成功实现了一个基于AT89S51单片机的远程温度控制系统,具备良好的实用性能。系统的设计与实现充分考虑了技术细节和用户需求,经过多次调试与测试,最终达到了设计目标。

8.1 技术优点
  • 无线远程控制的便利性
  • 高精度的温度测量
  • 稳定可靠的编码解码方案
8.2 改进建议
  • 加强对无线信号干扰的防范
  • 提高系统的响应速度和稳定性

本设计为未来相关技术的研究和开发提供了参考与基础。
远程温度控制系统设计与实现(含有源码)_第1张图片

以下代码为远程温度控制系统的主系统和副系统部分程序,其中包括了温度读取、显示、键盘输入、数据传输等功能。代码采用汇编语言编写,用于8051系列单片机。

1. 主系统程序
;*********************************************;
;*****************主系统程序******************;
;*********************************************;
TEMJ   EQU   50H                              ; 存放温度检测值的单元
TEMS   EQU   51H                              ; 存放温度设定值的单元
       ORG   0000H                            ; 程序起始地址
       LJMP  MAIN                             ; 跳转到主程序

;**********************************************主系统主程序
MAIN:  MOV   51H,#25                          ; 初始化温度设定值为25
MAIN1: NOP                                    ; 空操作(占位)
       LCALL KEYB                            ; 调用键盘扫描子程序
       LCALL BCD                             ; 调用BCD转换子程序
       LCALL DISP                            ; 调用显示子程序
       LCALL DISP                            ; 连续调用显示以更新显示内容
       LCALL DISP
       LCALL DISP
       LCALL DISP
       LCALL DISP
       LJMP  MAIN1                            ; 循环返回主程序

;----------------------------------------------
;键盘扫描程序,P2.2,P2.3为行控制口,
;P2.4,2.5,2.6,2.7为列控制口 
;----------------------------------------------
KEYB:  MOV   P2,#0F4H                         ; 设置行控制口
       JB    P2.4,PROM0                      ; 检查按键状态
       MOV   A,#10                            ; 增加设定值
       ADD   A,51H                            ; 将新设定值存储到51H
       MOV   51H,A                           ; 更新设定值
PROM0: JB    P2.5,PROM1                       ; 检查下一个按键
       INC   51H                             ; 增加设定值
PROM1: JB    P2.6,PROM2                       ; 检查下一个按键
       LCALL SEND1                            ; 发送温度设定值
PROM2: JB    P2.7,PROM3                       ; 检查下一个按键
       LCALL SEND2                            ; 发送第二个温度设定值
PROM3: MOV   P2,#0F8H                         ; 重新设置行控制口
       JB    P2.4,PROM4                       ; 检查下一个按键
       MOV   A,51H                            ; 读取设定值
       CLR   C                                ; 清除进位
       SUBB  A,#10                            ; 降低设定值
       MOV   51H,A                           ; 更新设定值
PROM4: JB    P2.5,PROM5                       ; 检查下一个按键
       DEC   51H                             ; 减少设定值
PROM5: JB    P2.6,PROM6                       ; 检查下一个按键
       LCALL SEND3                            ; 发送第三个温度设定值
PROM6: JB    P2.7,PROM7                       ; 检查下一个按键
       CLR   P3.0                             ; 清除报警声音
       CLR   P3.6                             ; 清除下限报警绿灯
       CLR   P3.7                             ; 清除上限报警红灯
PROM7: RET                                    ; 返回

;------------------------------
; 长时间延时子程序
;------------------------------
D100MS:
       MOV   R7,#0FFH                         ; 外层循环计数
LOOP0: MOV   R6,#0FFH                         ; 中层循环计数
LOOP1: MOV   R5,#0FH                          ; 内层循环计数
LOOP2: NOP                                    ; 空操作
       NOP 
       DJNZ  R7,LOOP2                         ; 外层循环
       DJNZ  R6,LOOP1                         ; 中层循环
       DJNZ  R5,LOOP0                         ; 内层循环
       RET

;-------------------------------                     
                 
;**********************************************显示子程序
DISP:                                 
       MOV   A,40H                            ; 读取显示内容
       MOV   DPTR,#TAB                       ; 指向字符映射表
       MOVC  A,@A+DPTR                        ; 从映射表中读取对应显示码
       MOV   P0,A                             ; 输出到数码管
       MOV   P2,#0DFH                         ; 控制数码管的位选
       ACALL DL1MS                            ; 延时
       MOV   A,41H                            ; 读取下一个显示内容
       MOV   DPTR,#TAB                       ; 指向字符映射表
       MOVC  A,@A+DPTR                        ; 从映射表中读取对应显示码
       MOV   P0,A                             ; 输出到数码管
       MOV   P2,#0BFH                         ; 控制数码管的位选
       ACALL DL1MS                            ; 延时
       MOV   A,42H                            ; 读取下一个显示内容
       MOV   DPTR,#TAB                       ; 指向字符映射表
       MOVC  A,@A+DPTR                        ; 从映射表中读取对应显示码
       MOV   P0,A                             ; 输出到数码管
       MOV   P2,#7FH                          ; 控制数码管的位选
       ACALL DL1MS                            ; 延时
       MOV   A,43H                            ; 读取下一个显示内容
       MOV   DPTR,#TAB                       ; 指向字符映射表
       MOVC  A,@A+DPTR                        ; 从映射表中读取对应显示码
       MOV   P0,A                             ; 输出到数码管
       MOV   P2,#0EFH                         ; 控制数码管的位选
       ACALL DL1MS                            ; 延时
       RET

;-----------------------------
; 显示10ms子程序
;-----------------------------
DL1MS: MOV   R7,#0FFH                         ; 外层循环
DL0:   MOV   R6,#0FH                          ; 中层循环
DL1:   DJNZ  R6,DL1                           ; 内层循环
       DJNZ  R7,DL0                           ; 外层循环
       RET 

;-------------------------------------------------------------
BCD:   MOV   A,51H                             ; 读取温度设定值
       MOV   B,#100                            ; 除以100
       DIV   AB                               ; 计算百位
       MOV   40H,A                            ; 存储百位
       MOV   A,B                              ; 读取余数
       MOV   B,#10                             ; 除以10
       DIV   AB                               ; 计算十位
       MOV   41H,A                            ; 存储十位
       MOV   42H,B                            ; 存储个位
       MOV   43H,#00H                         ; 末位置0(未用) 
       RET
;--------------------------------------------------------------
              
;-------------------------------------------------    
TAB:   DB 28H                                 ;0          
       DB 0EEH                                ;1
       DB 32H                                 ;2
       DB 0A2H                                ;3
       DB 0E4H                                ;4
       DB 0A1H                                ;5
       DB 21H                                 ;6
       DB 0EAH                                ;7
       DB 20H                                 ;8
       DB 0A0H                                ;9
;-------------------------------------------------      
END

2. 副系统程序

//========================================================================
//副系统接收发送程序
//========================================================================
#include 
#define uchar unsigned char
#define uint  unsigned int
sbit add1 = P3^6;                             // 地址引脚
sbit add2 = P3^7;                             // 地址引脚
//接收数据 P0.0-P0.3
sbit R_ENABLE = P0^6;	// 解码有效信号
sbit DTAT_R_PTR = P0^4;	// 接收数据高低位指示
//发送数据 P2.1-P2.4
sbit T_ENABLE = P2^0;	// 编码启动
sbit DTAT_T_PTR = P2^5;	// 发送数据高低位
bit HIGH,LOW;
uchar th,tl;                               // 温度高位和低位
uchar Expect_T,Actual_T;                   // 期望温度和实际温度

//-------------------------------------------------------------------------
// 长时间延时子程序
//-------------------------------------------------------------------------
void delay(uint i){
 uint j;
 for(j=0;j<i;j++);                        // 简单延时
}
//-----------------------------------------------------------
// 函数:发送子程序
// 功能:发送当前温度
//-----------------------------------------------------------
void transmit()
{
 uchar i;

 th = Actual_T&0xf0;                       // 获取实际温度的高四位
 th = th >> 3;                             // 处理高四位
 th = th | 0x20;                           // 设置控制位
 tl = Actual_T & 0x0f;                     // 获取实际温度的低四位
 tl = tl << 1;                             // 处理低四位
 for(i=0;i<=3;i++)                          // 发送高四位
 {
  P2 = th;                                 // 输出高四位
  delay(1500);                             // 延时
  T_ENABLE = 1;                            // 启动编码
  delay(1500);                             // 延时
 }
 for(i=0;i<=3;i++)                          // 发送低四位
 {
  P2 = tl;                                 // 输出低四位
  delay(1500);                             // 延时
  T_ENABLE = 1;                            // 启动编码
  delay(1500);                             // 延时
 }
}
//********************************************
// 主程序
//********************************************
void main()
{
	Actual_T = 123;                          // 初始化实际温度
	while(1)
	{
		transmit();                          // 循环发送温度
	}
}

3. 程序分析与注释

3.1 主系统程序
  • 常量与变量定义

    • TEMJTEMS用于存储温度值和设定值的地址。
  • 主程序结构

    • MAIN是程序的入口,初始化温度设定值为25,并不断循环调用关键子程序(键盘输入、BCD转换、显示)。
  • 键盘输入

    • KEYB子程序用于扫描键盘,处理不同按键的输入,更新温度设定值或执行其他控制动作。
  • 显示功能

    • DISP子程序负责将温度信息和其他状态信息显示在数码管上,使用了简单的查表方法来获取数码管的显示编码。
  • BCD转换

    • BCD子程序将设定的温度值转换为百位、十位和个位,并存储相应的结果,以便于显示。
3.2 副系统程序
  • 通信与数据处理

    • transmit函数用于发送当前的温度值,通过对温度值的高低位处理,将数据发送给主系统。
  • 延时函数

    • delay函数用于实现简单的延时,不同的延时长度可根据需求进行调整。

4. 总结

本程序实现了一个完整的温度控制系统的主副系统逻辑。主系统主要负责用户输入、温度处理和数据显示,而副系统负责温度的读取和无线通信。通过适当的延时和控制逻辑,确保系统的稳定性和准确性。若有需要进一步深入的具体部分,或者需要改进建议,请告知!

你可能感兴趣的:(xcode,macos,ide,单片机,嵌入式硬件)