基于51单片机的智能温控风扇

2023-05-16

1.功能
本设计为一种温控风扇系统,具有灵敏的温度感测和显示功能,系统选用STC89C52单片机作为控制平台对风扇转速进行控制。可在测得温度值在高低温度之间时打开风扇弱风档,当温度升高超过所设定的温度时自动切换到大风档,当温度小于所设定的温度时自动关闭风扇,控制状态随外界温度而定。

2.硬件设计
在这里插入图片描述
硬件电路主要由:

  1. 单片机最小系统
  2. 风扇驱动电路
  3. LCD1602显示屏电路
  4. DS18B20温度采集电路

3.程序设计

(1)LCD1602驱动程序

#define LCD1602_DB  P0
sbit LCD1602_RS = P2^0;
sbit LCD1602_RW = P2^1;
sbit LCD1602_E  = P2^2;

/* 等待液晶准备好 */
void LcdWaitReady()
{
    unsigned char sta;
    
    LCD1602_DB = 0xFF;
    LCD1602_RS = 0;
    LCD1602_RW = 1;
    do {
        LCD1602_E = 1;
        sta = LCD1602_DB; //读取状态字
        LCD1602_E = 0;
    } while (sta & 0x80); //bit7等于1表示液晶正忙,重复检测直到其等于0为止
}
/* 向LCD1602液晶写入一字节命令,cmd-待写入命令值 */
void LcdWriteCmd(unsigned char cmd)
{
    LcdWaitReady();
    LCD1602_RS = 0;
    LCD1602_RW = 0;
    LCD1602_DB = cmd;
    LCD1602_E  = 1;
    LCD1602_E  = 0;
}
/* 向LCD1602液晶写入一字节数据,dat-待写入数据值 */
void LcdWriteDat(unsigned char dat)
{
    LcdWaitReady();
    LCD1602_RS = 1;
    LCD1602_RW = 0;
    LCD1602_DB = dat;
    LCD1602_E  = 1;
    LCD1602_E  = 0;
}
/* 设置显示RAM起始地址,亦即光标位置,(x,y)-对应屏幕上的字符坐标 */
void LcdSetCursor(unsigned char x, unsigned char y)
{
    unsigned char addr;
    
    if (y == 0)  //由输入的屏幕坐标计算显示RAM的地址
        addr = 0x00 + x;  //第一行字符地址从0x00起始
    else
        addr = 0x40 + x;  //第二行字符地址从0x40起始
    LcdWriteCmd(addr | 0x80);  //设置RAM地址
}
/* 在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,str-字符串指针 */
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str)
{
    LcdSetCursor(x, y);   //设置起始地址
    while (*str != '\0')  //连续写入字符串数据,直到检测到结束符
    {
        LcdWriteDat(*str++);
    }
}
/* 初始化1602液晶 */
void InitLcd1602()
{
    LcdWriteCmd(0x38);  //16*2显示,5*7点阵,8位数据接口
    LcdWriteCmd(0x0C);  //显示器开,光标关闭
    LcdWriteCmd(0x06);  //文字不动,地址自动+1
    LcdWriteCmd(0x01);  //清屏
}

(2)DS18B20驱动程序

sbit IO_18B20=P3^2;

/*软件延时函数,延时时间(t*10)us*/
void DelayX10us(unsigned char t)
{
	do{
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
	}while(--t);
}
/*复位总线,获取存在脉冲,以启动一次读写操作*/
bit Get18B20Ack()
{
	bit ack;
	
	EA=0;	   			//禁止总中断
	IO_18B20=0;			//产生500us复位脉冲
	DelayX10us(50);
	IO_18B20=1;
	DelayX10us(6);		//延时60us
	ack=IO_18B20;		//读取存在脉冲
	while(!IO_18B20);   //等待存在脉冲结束
	EA=1;				//重新使能总中断
	return ack;
}
/*向DS18B20写入一个字节,dat-待写入字节*/
void Write18B20(unsigned char dat)
{
	unsigned char mask;
	EA=0;
	for(mask=0x01;mask!=0;mask<<=1)//低位在先,依次移出8个bit
	{
		IO_18B20=0;//产生2us低电平脉冲
		_nop_();
		_nop_();
		if((mask&dat)==0)//输出该bit值
			IO_18B20=0;
		else
			IO_18B20=1;
		DelayX10us(6);//延时60us
		IO_18B20=1;//拉高通信引脚
	}
	EA=1;
}
/*从DS18B20读取一个字节,返回值-读到的字节*/
unsigned char Read18B20()
{
	unsigned char dat;
	unsigned char mask;

	EA=0;
	for(mask=0x01;mask!=0;mask<<=1)//低位在先,依次采集8个bit
	{
		IO_18B20=0;//产生2us低电平脉冲
		_nop_();
		_nop_();
		IO_18B20=1;//结束低电平脉冲,等待18B20输出数据
		_nop_(); //延时2us
		_nop_();
		if(!IO_18B20)//读取通信引脚上的值
			dat &= ~mask;
		else
			dat |= mask;
		DelayX10us(6);//再延时60us
	}
	EA=1;
	return dat;
}
/*启动一次18B20温度转换,返回值-表示是否启动成功*/
bit Start18B20()
{
	bit ack;
	ack=Get18B20Ack();//执行总线复位,并获取18B20应答
	if(ack==0)
	{
		Write18B20(0xCC);
		Write18B20(0x44);
	}
	return ~ack;
}
/*读取DS18B20转换的温度值,返回值-表示是否读取成功*/
bit Get18B20Temp(int *temp)
{
	bit ack;
	unsigned char LSB,MSB;//16bit温度值的低字节和高字节

	ack=Get18B20Ack();//执行总线复位,并获取18B20应答
	if(ack==0)
	{
		Write18B20(0xCC);//跳过ROM操作
		Write18B20(0xBE);//发送读命令
		LSB=Read18B20();//读温度值的低字节
		MSB=Read18B20();//读温度值的高字节
		*temp=((int)MSB<<8)+LSB;//合成为16bit整型数
	}
	return ~ack;
}

(3)主程序

sbit IN1=P2^7;
sbit IN2=P2^6;
sbit ENA=P2^5;

bit flag1s=0;//1s定时标志
unsigned char T0RH=0;
unsigned char T0RL=0;

int temp;//读取到的当前温度值
unsigned char len;
int intT,decT;//温度值的整数和小数部分
unsigned char str[12];

void Compare();
void GetTemp();
void ConfigTimer0(unsigned int ms);
unsigned char IntToString(unsigned char *str,int dat);
extern bit Start18B20();
extern bit Get18B20Temp(int *temp);
extern void InitLcd1602();
extern void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str);

void main()
{
	bit res;

	EA=1;
	ConfigTimer0(10);//T0定时10ms
	Start18B20();//启动DS18B20
	InitLcd1602();//初始化液晶

	while(1)
	{		
		if(flag1s)//每秒更新一次温度
		{
			flag1s=0;
			res=Get18B20Temp(&temp);//读取当前温度
			if(res)//读取成功时,刷新当前温度显示
			{
				GetTemp();
			
				LcdShowStr(0,0,"Welcome to use");//显示字符及温度值
				LcdShowStr(0,1,"Current T:");
				LcdShowStr(10,1,str);
					Compare();
			}
			else //读取失败时,提示错误信息
			{
				LcdShowStr(0,0,"error!");

			}
			Start18B20();//重新启动下一次转换					 
		}
	}
}
/*温度获取函数,获取当前环境温度值并保存在str数组中*/
void GetTemp()
{

	intT=temp>>4;//分离出温度值整数部分
	decT=temp &0x0F;//分离出温度值小数部分
			
	len=IntToString(str,intT);//整数部分转换成字符串
			
	str[len++]='.';
	decT=(decT*10)/16;//二进制的小数部分转换为1位十进制位
	str[len++]=decT+'0';//十进制小数位再转换为ASCII字符
	while(len<6)//用空格补齐到6个字符长度
	{
		str[len++]=' ';
	}
	str[len++]='\0';
}
/*延时函数,用于PWM控制*/
void delay(unsigned int z)
{
	unsigned int x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
} 
/*比较函数,通过温度值的比较设置电机的转速*/
void Compare()
{
	unsigned int i=0;
	unsigned char j;

	if((intT>= 24) && (intT<26))   //以两度为一个温差范围,并设温度范围索引
	{
		j=0;	
	}
	else if((intT>=26) &&(intT<28))
	{
		j=1;
	}
	else if((intT>=28) &&(intT<30))
	{
		j=2;
	}
	else if(intT>=30)
	{
		j=3;
	}
	switch(j)		  //根据温度索引设置电机转速
	{
		case 0:	IN1=1;
				IN2=0;
		  		for(i=0;i<200;i++)
	      		{
					ENA=1;
	     			delay(20);
	      		    ENA=0;
					delay(30);
				}
				break;
	
		case 1:	IN1=1;
				IN2=0;
		  		for(i=0;i<200;i++)
	      		{
					ENA=1;
	     			delay(30);
	      		    ENA=0;
					delay(30);
				}
				break;	 
	
		case 2:	IN1=1;
				IN2=0;
		  		for(i=0;i<200;i++)
	      		{
					ENA=1;
	     			delay(55);			 
	      		    ENA=0;
					delay(30);
				}
				break;	 
							
		case 3:	IN1=1;
				IN2=0;
		  	    ENA=1;
				break;

		default:break;	 	 
	}
}  

/*整型数转换为字符串,str-字符串指针,dat-待转换数,返回值-字符串长度*/
unsigned char IntToString(unsigned char *str,int dat)
{
	signed char i=0;
	unsigned char len=0;
	unsigned char buf[6];

	if(dat<0)//如果为负数,首先取绝对值,并在指针上添加负号
	{
	 	dat=-dat;
		*str++='-';
		len++;
	}
	do{	   //先转换为低位在前的十进制数组
		buf[i++]=dat%10;
		dat /=10;
	}while(dat>0);
	len += i;//i最后的值就是有效字符的个数
	while(i-->0)//将数组值转换为ASCII码反向拷贝到接收指针上
	{
		*str++=buf[i]+'0';
	}
	*str='\0';
	return len;
}
void ConfigTimer0(unsigned int ms)
{
	unsigned long tmp;

	tmp=11059200/12;
	tmp=(tmp*ms)/1000;
	tmp=65536-tmp;
	tmp=tmp+12;
	T0RH=(unsigned char)(tmp>>8);
	T0RL=(unsigned char)tmp;
	TMOD &= 0xF0;
	TMOD |= 0x01;
	TH0=T0RH;
	TL0=T0RL;
	ET0=1;
	TR0=1;
}
void InterruptTimer0() interrupt 1
{
	static unsigned char tmr1s=0;

	TH0=T0RH;
	TL0=T0RL;
	tmr1s++;
	if(tmr1s>=100)
	{
		tmr1s=0;
		flag1s=1;
	}		 

}

源码+电路图 下载:关注公众号,首页回复“温控风扇”获取资料
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于51单片机的智能温控风扇 的相关文章

  • 乌班图18.04搭建ssh服务器

    一 首先打开终端 xff0c 在终端输入以下命令安装 openssh server 如下图所示 xff1a sudo apt get install openssh server 二 安装完成以后 xff0c 启动ssh服务 xff0c 输
  • keil无法生成axf文件之解决方法

    参考 xff1a 参考 鱼鹰单片机 https blog csdn net weixin 42876465 article details 88356890 其实很简单 默认情况是生成 axf 文件的 xff0c 但有可能不能生成该文件 生
  • 用vnc实现windows远程连接linux桌面

    网络遥控技术是指由一部计算机 xff08 主控端 xff09 去控制另一部计算机 xff08 被控端 xff09 xff0c 而且当主控端在控制端时 xff0c 就如同用户亲自坐在被控端前操作一样 xff0c 可以执行被控端的应用程序 xf
  • linux find typelinux find用法(转)

    由于 find 具有健壮的功效 xff0c 所以它的选项也很多 xff0c 其中大局限选项都值得我们花时间来剖析一下 尽管体例中含有网络文件体例 NFS xff0c find 命令在该文件体例中异样有用 xff0c 只你具有相应的权限 在运
  • Find 命令之 exec 的诠释

    find是我们很常用的一个Linux命令 xff0c 但是我们一般查找出来的并不仅仅是看看而已 xff0c 还会有进一步的操作 xff0c 这个时候exec的作用就显现出来了 e xec解释 xff1a exec 参数后面跟的是 comma
  • AI深度学习模型被“骗”,研究者如何对抗攻击?

    作者 埼玉 编辑 3D视觉开发者社区 如果觉得文章内容不错 xff0c 别忘了三连支持下哦 x1f618 文章目录 我们的模型被 骗 了什么是对抗技术 xff1f 对抗攻击的方法1 FGSM Fast gradient sign metho
  • “Additional information: 您必须有许可证才能使用此 ActiveX 控件”的错误解决方法

    昨天把项目的ArcGIS从9 3升级为10 1 早上到公司 xff0c 准备提交工程代码 xff0c 编译 通过 xff0c 但运行报错 错误信息 xff1a 原本以为是自己清理中间文件导致的 xff0c 但是找来找去 xff0c 没有任何
  • ssh配合vscode免密码登陆

    整体流程 xff1a 1 在本机创建公钥和私钥 2 在本地 ssh config文件中 xff0c 设置IdentifyFile为私钥地址 3 将公钥上传到服务器 下面是每一步的详解 xff1a 1 在本机创建公钥和私钥 xff1a 在命令
  • Debian查看系统版本信息

    下一代 Debian 正式发行版的代号为 34 buster 34 发布时间尚未确定 Debian 9 xff08 34 stretch 34 xff09 当前的稳定版 Debian 8 xff08 34 jessie 34 xff09 被
  • Oracle 索引 index

    一 索引的概念 索引是数据库对象 xff0c 通过使用快速路径访问方法快速定位数据 xff0c 减少了磁盘的I O xff0c 用来加速对表的查询速度 相当于书本的目录 与表独立存放 xff0c 但需要依附于表 xff0c 是在表的基础上创
  • HX711使用教程-数字电子秤常用芯片

    1 简介 HX711是一款专为高精度称重传感器而设计的24位A D转换器芯片 与同类型其它芯片相比 xff0c 该芯片是专门为称重传感器设计的 xff0c 称重传感器只需要一个HX711芯片即可完成称重信号的处理及AD转换 xff1b 对于
  • 详解LCD1602液晶显示屏的使用

    1 简介 作为各类单片机实物设计的常用显示屏 xff0c LCD1602是一种专门用于显示字母 数字 符号等点阵式LCD xff0c 其1602是指LCD显示的内容为16X2 xff0c 即可以显示两行 xff0c 每行16个字符 xff0
  • AS608指纹模块开发教程

    一 xff0e 简介 AS608 指纹识别模块主要是指采用了杭州晟元芯片技术有限公司 Synochip 的 AS608 指纹识别芯片 而做成的指纹模块 xff0c 模块厂商只是基于该芯片设计外围电路 xff0c 集成一个可供2次开发的指纹模
  • 51单片机串口通讯详解

    串口 xff0c 作为单片机程序开发中最常用 最方便 xff0c 也是应用最广泛的程序调试方法 xff1b 无论是作为调试工具 xff0c 打印出调试信息 xff0c 还是对功能模块进行通信 xff0c 串口是每个单片机开发人员最常用的单片
  • 记录一次用VNC Server配置window电脑远程访问,并在另一台电脑上外网访问远程桌面

    记录一次用VNC Server配置window电脑远程访问 xff0c 并在另一台电脑上外网访问远程桌面 有一台window和macbook 平时带着macbook出门办公 xff08 轻便 xff0c 不用带充电线 xff09 xff0c
  • 数模转换器ADC0832使用原理及控制程序

    一 xff0e 简介 数模转换器一般分为两种 xff0c 一种为数字信号转模拟信号 xff0c xff0c 其控制器简称为DAC xff1b 另一种为模拟信号转数字信号 xff0c 其控制器简称为ADC 现在主要介绍一款很常用 入门级的AD
  • GY-30光强传感器模块的应用原理及控制程序

    1 模块介绍 GY 30模块是一款基于IIC通信的16bit的数字型传感器 模块主要是以BH1750数字型光强感应芯片为核心及一些外围驱动电路 模块整体电路如图 xff1a 其中C1 C2 为电源滤波电容 xff0c R1 R3 为 I2C
  • LED数码管结构与工作原理

    一 xff0e 什么是数码管 LED数码管 xff08 LED Segment Displays xff09 是由8个发光二极管构成 xff0c 并按照一定的图形及排列封转在一起的显示器件 其中7个LED构成7笔字形 xff0c 1个LED
  • AD在PCB设计中导入LOGO

    在设计电路板有时需要将个人或公司的LOGO印在电路板上 xff0c 所以Altium Designer软件也提供了一个导入LOGO图案的插件 LOGO CREATOR 1 制作LOGO 因为印在电路板只能印出单色图案 xff0c 所以先得将
  • 详解LCD12864显示屏的使用(并行控制)

    一 xff0e 概述 LCD12864显示屏是所说的点阵液晶显示模块 xff0c 就是由12864个液晶显示点组成的一个128列64行的阵列 xff0c 所以也就叫成了12864 每个显示点都对应着有一位二进制数 xff0c 0表示灭 xf

随机推荐

  • DS18B20温度传感器-51单片机控制程序

    一 xff0e 概述 DS18B20数字温度传感器提供9 Bit到12 Bit的摄氏温度测量精度和一个用户可编程的非易失性且具有过温和低温触发报警的报警功能 DS18B20采用的1 Wire通信即仅采用一个数据线 xff08 以及地 xff
  • 详解数据存储芯片AT24C02的应用及编程

    一 xff0e 芯片简介 AT24C02是一个2K位串行CMOS E2PROM xff0c 内部含有256个8位字节 xff0c 采用先进CMOS技术实质上减少了器件的功耗 AT24C02有一个8字节页写缓冲器 xff0c 该器件通过IIC
  • 谈谈单片机的最小运行环境--最小系统

    单片机的最小系统就是让单片机能正常工作并发挥其功能时所必须的组成部分 xff0c 也可理解为单片机正常运行的最小环境 其主要构成为四部分 xff1a 1 单片机芯片 2 系统电源 3 时钟电路 4 复位电路 这四个部分不可缺少 xff0c
  • 详解温度传感器DS18B20编程与使用

    DS18B20是由DALLAS半导体公司推出的一种的 一线总线 接口的温度传感器 与传统的热敏电阻等测温元件相比 xff0c 它是一种新型的体积小 适用电压宽 与微处理器接口简单的数字化温度传感器 1 测量温度范围 55 43 125 2
  • AD10 如何将焊盘的实心改为十字型覆铜

    焊盘实心覆铜虽然有利于电流的传输 但由于焊盘周围都覆上铜皮 对焊锡有粘附作用 不利于元器件拆除 对往后板卡调试造成不便 所以焊盘在覆铜的时候建议采用十字型覆铜 xff0c 过孔采用实心覆铜 接下来就讲解一下AD10如何设置焊盘十字覆铜 xf
  • 相机参数标定(camera calibration)及标定结果如何使用

    重要更新 xff1a 本文的第二次更新已发布 为了不破坏现有内容的结构 xff0c 故重新开始新的一篇文章 同时本文的一些内容也会涵盖进去 欢迎关注 第二更 xff0c 相机参数标定基础 xff1a 从小孔成像开始到单双目标定 关于实践部分
  • 基于51单片机的LCD1602电子时钟

    摘要 xff1a 51系列单片机是各单片机中最为典型和最有代表性的一种 由RAM ROM CPU构成 xff0c 定时 xff0c 计数和多种接口于一体的微控制器 本次设计的数字电子时钟采用了STC89C52芯片进行控制 xff0c 使用D
  • 基于51单片机的简易密码锁

    一个基于51单片机的简易密码锁 xff0c 废话不多说 xff0c 直接贴图贴代码 1 电路图 电路组成 xff1a 5V电源 43 51单片机最小系统 43 LCD1602显示屏 43 4 4矩阵键盘 2 程序分析 xff08 1 xff
  • 浅谈Android与Linux系统的差异

    最近忙于查找Linux和android平台的资料 xff0c 今天将其整理整理 xff0c 根据本人拙见分享给大家 Android和Linux作为现行主流的操作系统 xff0c 无论在消费类产品还是在工控领域 xff0c 都有广泛的应用 都
  • 基于51单片机的超声波测距

    1 超声波测距原理 超声波是利用反射的原理测量距离的 xff0c 被测距离一端为超声波传感器 xff0c 另一端必须有能反射超声波的物体 测量距离时 xff0c 将超声波传感器对准反射物发射超声波 xff0c 并开始计时 xff0c 超声波
  • 超细!详解AD13:如何从零开始画出一个PCB(电路板)

    在学电子或者单片机的小伙伴们或许有过这种念头 xff0c 就是想把自己的设计的电路或者单片机系统做成一个电路板出来 xff1b 但却不知怎样做出来 今天我就给大家详细讲解如果通过AD13电路设计软件设计出一个电路板 1 首先打开AD13 x
  • 基于51单片机液晶万年历设计

    电子万年历是一种非常广泛日常计时工具 xff0c 给人们的带来了很大的方便 xff0c 在社会上越来越流行 它可以对年 月 日 时 分 秒进行计时 xff0c 采用直观的数字显示 xff0c 可以同时显示年月日时分秒和温度等信息 xff0c
  • 基于51单片机的简易计算器

    1 简介 本计算器是以MCS 51系列AT89C51单片机为核心构成的简易计算器系统 该系统通过单片机控制 xff0c 实现对4 4键盘扫描进行实时的按键检测 xff0c 并由LCD1602显示屏将过程与结果显示出来 2 硬件原理图 硬件主
  • 基于51单片机的红外解码器

    1 简介 本红外解码器是以MCS 51系列AT89C512片机为核心 xff0c 将红外传感器接收的信号解析出来 xff0c LCD1602显示屏将解码数据显示出来 2 总体原理图 硬件组成 单片机最小系统LCD1602显示屏IR红外接收器
  • 基于51单片机的心率脉搏计检测系统

    1 功能原理 脉搏传感器采样脉搏信号 xff0c 采用STC89C51单片机作为控制器 xff0c 脉搏传感器输出方波传入单片机 xff0c 触发单片机进去外部中断函数 xff0c 每接收一个脉冲波形 xff0c 显示屏就计数一次 如果脉搏
  • 基于51单片机的智能调光台灯

    1 功能介绍 智能台灯可分成自动和手动两种模式 在自动模式下 xff0c 台灯能根据环境光的亮暗与人是否被台灯所检测到 xff08 人是否在 xff09 来自动开启台灯 当人被微机检测到 xff0c 环境光又达到某个程度的时候 xff08
  • app元素辅助定位三种方式:Appium-Inspector、uiautomatorviewer、Weditor(uiautomator2)

    xff08 1 xff09 使用Appium Desktop中Appium Inspector辅助进行元素定位 早期版本集成在Appium Desktop中 xff0c 最新版本已分开 下载地址 xff1a Releases appium
  • 俄罗斯方块游戏的算法

    1 原理 这个游戏设计 xff0c 本质上就是用一个线程或者定时器产生重绘事件 用线程和用户输入改变游戏状态 这个游戏也不例外 xff0c 启动游戏后 xff0c 就立即生成一个重绘线程 xff0c 该线程每隔50ms绘制一次屏幕 当然 x
  • 基于51单片机的俄罗斯方块游戏

    俄罗斯方块游戏算法 请参考俄罗斯方块游戏的算法 1 概述 俄罗斯方块是一款风靡全球的益智游戏 它规则简单 xff0c 容易上手 xff0c 且游戏过程变化无穷 xff0c 使用户在游戏中得到乐趣 本设计是采用单片机来实现的智能俄罗斯方块游戏
  • 基于51单片机的智能温控风扇

    1 功能 本设计为一种温控风扇系统 xff0c 具有灵敏的温度感测和显示功能 xff0c 系统选用STC89C52单片机作为控制平台对风扇转速进行控制 可在测得温度值在高低温度之间时打开风扇弱风档 xff0c 当温度升高超过所设定的温度时自