当前位置: 首页 > news >正文

基于51单片机的智能温控器设计与实现

一、前言

基于51单片机的智能温控器,使用DS18B20温度传感器来测量温度,并通过驱动风扇降温,同时使用LCD1602显示屏显示当前温度和设定温度。

二、51单片机代码

#include <reg52.h>
//显示
#include <lcd.h>

#define uchar unsigned char
#define uint unsigned int

sbit DQ = P2^7; // 温度传感器引脚

sbit fan = P3^3; // 风扇
sbit LED = P3^5; // LED指示灯


sbit Key4 = P2^1;	 // 开机/关机键



uchar Mode = 0; // 0表示确定状态,1表示设置温度上限状态,2表示设置温度下限状态
uchar MODE_OK = 0;
uchar MODE_SET_TEMP_UP = 1;
uchar MODE_SET_TEMP_DOWN = 1;

uint dat = 0; // 温度值

// 温度
char wendu;
uchar down =30; //温度下限
uchar wendu_up =50; //温度上限

uchar status_machine = 1; 
uchar status_shutdown = 1; // 关机
uchar status_power_on = 2; // 开机


// 初始化温度传感器
void init_ds18b20() {
	uint i;

	DQ = 0;			// 拉低电平
	i = 80;			// 延时约732us
	while(i > 0)
		i--;
	
	DQ = 1;			// 拉高总线
	i = 4;			// 延时约40us
	while(i > 0)
		i--;
}

// 读取一位温度传感器的数据
bit read_bit() {
	uint i;
	bit dat;
	DQ = 0;
	i++; // 延时
	DQ = 1;
	i++; // 延时
	i++;
	dat = DQ;
	i = 8;
	while(i > 0)
		i--;
	return dat;
}

// 读取一个字节温度传感器的数据
uchar read_byte() {
	uchar i, j, dat;
	dat = 0;
	for (i = 1; i <= 8; i++) {
		j = read_bit();
		dat = (j << 7) | (dat >> 1);
	}

	return dat;
}

// 向温度传感器写入一个字节
void write_byte(uchar dat) {
	uint i;
	uchar j;
	bit testbit;

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

		if (testbit) {
			DQ = 0;
			i++; // 延时
			DQ = 1;
			i = 8; // 延时
			while(i > 0)
				i--;
		} else {
			DQ = 0;
			i = 8;
			while(i > 0)
				i--;
			DQ = 1;
			i++;	// 延时
			i++;
		}
	}
}

// 读取温度
unsigned int read_temperature(void) {
	uchar a = 0;
	uchar b = 0;
	uint u_temp = 0;
	float f_temp = 0;

	init_ds18b20();
	delay(1);
	write_byte(0xCC);  //跳过读序号列号的操作
	write_byte(0x44);  //启动温度转换

	init_ds18b20();
	delay(1);
	write_byte(0xCC);  //跳过读序号列号的操作
	write_byte(0xBE);  //读取温度寄存器
	a = read_byte();   //读低8位
	b = read_byte();   //读高8位

	u_temp = b;
	u_temp <<= 8;
	u_temp = u_temp | a;
	f_temp = u_temp * 0.0625; // 获取实际温度
	u_temp = f_temp * 10;

	return u_temp;
}


// 按键控制
void Key() {

	// 开机/关机键
	if(Key4 == 0)
	{
		while(Key4 == 0);
		
		// 如果是关机状态
		if (status_machine == status_shutdown)
		{
			// 开机
			status_machine = status_power_on;
		}
		// 如果是开机状态
		else if (status_machine == status_power_on)
		{
			// 关机
			status_machine = status_shutdown;
		}

	}
}


// 主函数
void main() {

	init_lcd(); // 初始化lcd1602

	init_ds18b20(); // 初始化ds18b20
	
	// 第一次读取温度
	read_temperature();
	delay(2000);

	while(1) {
		// 获取温度
		dat = read_temperature(); 

        if (Mode == MODE_OK) {
        	// 水温显示在液晶显示屏上
        	display(dat, wendu_up, down);
	       	wendu = dat / 10; // 取温度值得整数位
        }
		


        // 按键控制
        Key();
		
		// 判断当前机器状态
		// 如果是要关机
		if (status_machine == status_shutdown)
		{
			LED = 1;
			fan =  1;
		}
		// 如果是开机状态
		else if (status_machine == status_power_on)
		{
			// 如果当前温度小于温度上限
			if (wendu < wendu_up)
			{
				fan =  1;
				LED = 1;
			} 
			else 
			{
				fan =  0;
				LED = 0;
			}
			
		}
	}
}

三、Proteus仿真

四、完整资料下载

基于51单片机的智能温控器: https://url83.ctfile.com/d/45573183-65297122-ca5848?p=7526 (访问密码: 7526)
 

相关文章:

  • 哈希算法--猜数字游戏
  • 基于AX58100 EtherCAT从站开发
  • 考研408数据结构线性表核心知识点与易错点详解(附真题示例与避坑指南)
  • llama-factory
  • 132. 分割回文串 II | 最少分割次数
  • Linux网络相关概念和重要知识(1)(网络协议、网络通信)
  • Hashmap
  • FPGA开发,使用Deepseek V3还是R1(8):FPGA的全流程(简略版)
  • Pytorch使用手册—Raspberry Pi 4 上的实时推理(30 FPS!)(专题三十六)
  • C++对象特性
  • Spring Boot分层架构的优势
  • 记忆化搜索(典型算法思想)—— OJ例题算法解析思路
  • SAP-ABAP:SAP的MM模块BAPI的详细介绍
  • 知识库ragflow和dify安装
  • Python Cookbook-2.22 计算目录间的相对路径
  • JS逆向-233网校sid参数和sign参数
  • EfficientViT模型详解及代码复现
  • upload
  • 线程状态与线程方法详解
  • 三支一扶入职体检不合格项目全解析
  • 有设计师做的装修效果图的网站/河南今日头条新闻
  • 东莞 网站建设 保健品/推广之家官网
  • 网站域名过期后续费多长时间生效/网站服务器信息查询
  • 手机网站开发培训/网络整合营销方案ppt
  • 建设学校网站的操作流程具体/网站推广优化怎么做最好
  • 做门窗的 在哪个网站跑业务跑业务/小程序开发教程全集免费