在现代工业及家庭生活中,温度控制技术扮演着关键角色。随着人们对生活质量的不断追求,温度控制系统的需求日益增加。本项目旨在设计一个基于微控制器的远程温度控制系统,主要功能包括温度监测、温度设定及无线通信。
本项目的设计任务包括:
主要技术指标:
系统设计包括温度采集、数据处理、无线通信、显示控制和用户输入等模块。采用AT89S51单片机作为控制核心,使系统具备灵活性和扩展性。
DS18B20是一种数字温度传感器,采用单总线协议,其主要特点包括:
DS18B20通过单总线协议与主控单片机进行通信,采用特定的时序实现数据传输。
与AT89S51单片机连接,采用寄生供电或外接供电方式。
AT89S51是一款高性能CMOS 8位微处理器,主要特性包括:
采用PT2262和PT2272作为编码解码芯片,结合F05T和J04T无线发射接收模块,工作频率固定为433MHz。
驱动电路采用脉冲移相触发可控硅实现电烤箱的功率控制,确保系统安全稳定运行。
软件设计采用模块化结构,包括:
采用增量式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高电平时间
}
键盘控制模块实现了设置温度和控制系统的功能,界面友好,易于操作。
系统调试分为硬件调试和软件调试,确保每个模块独立正常工作后进行整体联调。具体步骤如下:
通过误码仪测试,系统的误码率≤10^-6,符合设计要求。
实际测试频率接近433MHz,表明频率稳定性良好。
数据传输速率约为1200bps,满足系统应用需求。
用户可通过2*4键盘进行温度设定,控制电烤箱温度。系统设计简单易用,适合多种应用场景。
本项目成功实现了一个基于AT89S51单片机的远程温度控制系统,具备良好的实用性能。系统的设计与实现充分考虑了技术细节和用户需求,经过多次调试与测试,最终达到了设计目标。
以下代码为远程温度控制系统的主系统和副系统部分程序,其中包括了温度读取、显示、键盘输入、数据传输等功能。代码采用汇编语言编写,用于8051系列单片机。
;*********************************************;
;*****************主系统程序******************;
;*********************************************;
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
//========================================================================
//副系统接收发送程序
//========================================================================
#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(); // 循环发送温度
}
}
常量与变量定义
TEMJ
和TEMS
用于存储温度值和设定值的地址。主程序结构
MAIN
是程序的入口,初始化温度设定值为25,并不断循环调用关键子程序(键盘输入、BCD转换、显示)。键盘输入
KEYB
子程序用于扫描键盘,处理不同按键的输入,更新温度设定值或执行其他控制动作。显示功能
DISP
子程序负责将温度信息和其他状态信息显示在数码管上,使用了简单的查表方法来获取数码管的显示编码。BCD转换
BCD
子程序将设定的温度值转换为百位、十位和个位,并存储相应的结果,以便于显示。通信与数据处理
transmit
函数用于发送当前的温度值,通过对温度值的高低位处理,将数据发送给主系统。延时函数
delay
函数用于实现简单的延时,不同的延时长度可根据需求进行调整。本程序实现了一个完整的温度控制系统的主副系统逻辑。主系统主要负责用户输入、温度处理和数据显示,而副系统负责温度的读取和无线通信。通过适当的延时和控制逻辑,确保系统的稳定性和准确性。若有需要进一步深入的具体部分,或者需要改进建议,请告知!