基于51单片机的智能风扇控制系统Protues仿真设计

目录

一、设计背景

二、实现功能

三、仿真演示

四、源程序(部分)


一、设计背景

      在当今这个科技日新月异的时代,家电产品正以前所未有的速度向智能化、自动化迈进,旨在为用户带来更加便捷、舒适的生活体验。电风扇,作为夏季不可或缺的家用电器,其传统功能已逐渐显得力不从心,尤其是在面对用户对于精准温控、节能高效以及操作便捷性的更高要求时。因此,开发一款基于51单片机的智能风扇控制系统,成为了家电行业创新发展的重要方向。

       传统电风扇主要通过机械换挡或人工设定档位来调节风速,这种方式不仅风速变化不连续,难以精确满足用户的舒适度需求,还容易造成能源浪费。基于51单片机的智能风扇控制系统不仅提升了风扇的智能化水平,还实现了节能环保和安全可靠的目标。通过自动控制风扇,系统能够在保证散热效果的同时降低能耗,减少能源浪费。

        总之,基于51单片机的智能风扇控制系统是家电行业智能化发展的一个重要成果。它不仅解决了传统风扇存在的诸多问题,还为用户带来了更加舒适、便捷、节能的使用体验。随着科技的不断进步和人们生活水平的持续提高,相信这种智能风扇控制系统将在未来的家电市场中占据更加重要的地位,为人们的生活带来更多便利和舒适。

二、实现功能

        本设计以51单片机为控制核心,设计一种智能风扇控制系统。整个系统包括MCU、晶振电路、时钟电路、DS18B20测温电路、风扇控制电路、风速测量电路以及OLED显示电路。可具体实现以下功能:

    (1)本设计通过检测外部环境的风速和温度来控制电风扇运不运行。
    (2)当风速较低(低于20km/h)或者是温度较高(高于35度)时电风扇转动,否则电风扇不转动。

三、仿真演示

完整仿真图如下:

采用VSPD虚拟串口软件和XCOM串口调试助手,模拟风速传感器,默认风速传感器传来三个字节的数据,0xbb为帧头,0x10为第一路风速测量值,0x06为第二路风速测量值,本次仿真仅用到第二路,因此通过改变第二路的值来模拟风速的变化。当第二路值为0x06时,风速为6km/h,此时温度为32度,由于风速低于风速阈值20km/h,风扇转动。 

当第二路值为0x10时,风速为16km/h时,此时温度为32度,由于风速低于风速阈值20km/h,风扇转动。 

当第二路值为0x16时,风速为22km/h时,此时温度为32度,风扇不转动。 

当温度为36度,风速为22km/h时,此时温度超过温度阈值35度,风扇转动。 

当温度为38度,风速为22km/h时,此时温度超过温度阈值35度,风扇转动。  

四、源程序(部分)

main.c文件

#include "oled.h"#define uchar unsigned char
#define uint unsigned int		 //宏定义uchar dat[3];      //接收缓存 sbit Fan=P1^0;//风扇继电器控制接口
sbit DQ=P1^4;//温度传感器接口uint wen_du;						//温度变量  
uint shang,xia; //对比温度暂存变量
uchar j=0,js=0,m=0;
uchar RecFlag=0; //接收标志位
/***********ds18b20延迟子函数(晶振12MHz )*******/ 
void delay_18B20(uint i)
{while(i--);
}
/**********ds18b20初始化函数**********************/
void Init_DS18B20() 
{uchar x=0;DQ=1;          //DQ复位delay_18B20(8);  //稍做延时DQ=0;          //单片机将DQ拉低delay_18B20(80); //精确延时 大于 480usDQ=1;          //拉高总线delay_18B20(14);x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败delay_18B20(20);
}
/***********ds18b20读一个字节**************/  
uchar ReadOneChar()
{uchar i=0;uchar dat=0;for (i=8;i>0;i--){DQ=0; // 给脉冲信号dat>>=1;DQ=1; // 给脉冲信号if(DQ)dat|=0x80;delay_18B20(4);}return(dat);
}
/*************ds18b20写一个字节****************/  
void WriteOneChar(uchar dat)
{uchar i=0;for (i=8;i>0;i--){DQ=0;DQ=dat&0x01;delay_18B20(5);DQ=1;dat>>=1;}
}
/**************读取ds18b20当前温度************/
void ReadTemperature()
{uchar a=0;uchar b=0;uchar t=0;Init_DS18B20();WriteOneChar(0xCC);    	// 跳过读序号列号的操作WriteOneChar(0x44); 	// 启动温度转换delay_18B20(100);       // this message is wery importantInit_DS18B20();WriteOneChar(0xCC); 	//跳过读序号列号的操作WriteOneChar(0xBE); 	//读取温度寄存器等(共可读9个寄存器) 前两个就是温度delay_18B20(100);a=ReadOneChar();    	//读取温度值低位b=ReadOneChar();   		//读取温度值高位wen_du=((b*256+a)>>4);    //当前采集温度值除16得实际温度值
}
void Timer0init()		   //定时器初始化函数
{TMOD=0x01;	   //定时器0工作方式1TH0=0xf8;TL0=0x30;	   //定时器初值5msET0=1;		   //打开定时器0中断允许TR0=1;		   //打开定时器0定时器开关EA=1;		   //打开中断系统总开关
}void uart_init()
{TMOD=0x21;          //定时器1工作于方式2,八位自动重装TR1=1; TH1=0xfd;TL1=0xfd;  //波特率9600SCON=0x50;          //串口工作于方式1,10位uart	ES=1;EA=1;            //开串口中断,总中断,串口中断优先
}unsigned int i=0;
void main()		  //主函数
{for(j=0;j<80;j++)	  //先读取温度值,防止开机显示85ReadTemperature();Timer0init();OLED_Init();  //OLED初始化OLED_Clear();  //清屏,下同 uart_init();while(1)			  //进入while循环{	if(js>=200)			//当js在定时器里加到50次时(js加一次是20ms,加到50次就是1000ms,也就是1秒读取一次温度){ReadTemperature();	//读取温度值EA=0;SBUF=0xaa;while(!TI);TI=0;EA=1;OLED_ShowString(3,0,"Wind Rate:",10);OLED_ShowNum(95,0,dat[2],3,12);//显示脉搏数据OLED_ShowString(3,2,"Temp Data:",10);//第二行显示存储数据OLED_ShowNum(95,2,wen_du,3,12);if((wen_du>35)||(dat[2]<20)){Fan=0;}else{Fan=1;}}	}
}
void T0_TIME() interrupt 1		  //定时器工作函数,用于PWM工作
{TH0=0xf8;TL0=0x30;					  //定时器赋初值5msm++;						  //5ms,m加一if(js<200) js++;
}void uart_interrupt()interrupt 4
{if(RecFlag==0){		while(!RI);RI=0;dat[0]=SBUF;//接收头字节if(dat[0]==0xbb){RecFlag=1;			}	}else if(RecFlag==1){while(!RI);RI=0;dat[1]=SBUF;//接收头字节RecFlag=2;			}else{while(!RI);RI=0;dat[2]=SBUF;   //2#风速值	RecFlag=0;		}
}

 oled.c文件 

#include "oled.h"
#include "oledfont.h"  	 
//OLED的显存
//存放格式如下.
//[0]0 1 2 3 ... 127	
//[1]0 1 2 3 ... 127	
//[2]0 1 2 3 ... 127	
//[3]0 1 2 3 ... 127	
//[4]0 1 2 3 ... 127	
//[5]0 1 2 3 ... 127	
//[6]0 1 2 3 ... 127	
//[7]0 1 2 3 ... 127 			   
/**********************************************
//IIC Start
**********************************************/
void IIC_Start()
{OLED_SCLK_Set() ;OLED_SDIN_Set();OLED_SDIN_Clr();OLED_SCLK_Clr();
}/**********************************************
//IIC Stop
**********************************************/
void IIC_Stop()
{OLED_SCLK_Set() ;//OLED_SCLK_Clr();OLED_SDIN_Clr();OLED_SDIN_Set();}void IIC_Wait_Ack()
{OLED_SCLK_Set() ;OLED_SCLK_Clr();
}
/**********************************************
// IIC Write byte
**********************************************/void Write_IIC_Byte(unsigned char IIC_Byte)
{unsigned char i;unsigned char m,da;da=IIC_Byte;OLED_SCLK_Clr();for(i=0;i<8;i++)		{m=da;//	OLED_SCLK_Clr();m=m&0x80;if(m==0x80){OLED_SDIN_Set();}else OLED_SDIN_Clr();da=da<<1;OLED_SCLK_Set();OLED_SCLK_Clr();}
}
/**********************************************
// IIC Write Command
**********************************************/
void Write_IIC_Command(unsigned char IIC_Command)
{IIC_Start();Write_IIC_Byte(0x78);            //Slave address,SA0=0IIC_Wait_Ack();	Write_IIC_Byte(0x00);			//write commandIIC_Wait_Ack();	Write_IIC_Byte(IIC_Command); IIC_Wait_Ack();	IIC_Stop();
}
/**********************************************
// IIC Write Data
**********************************************/
void Write_IIC_Data(unsigned char IIC_Data)
{IIC_Start();Write_IIC_Byte(0x78);			//D/C#=0; R/W#=0IIC_Wait_Ack();	Write_IIC_Byte(0x40);			//write dataIIC_Wait_Ack();	Write_IIC_Byte(IIC_Data);IIC_Wait_Ack();	IIC_Stop();
}
void OLED_WR_Byte(unsigned dat,unsigned cmd)
{if(cmd) {Write_IIC_Data(dat);}else {Write_IIC_Command(dat);}
}//坐标设置
void OLED_Set_Pos(unsigned char x, unsigned char y) 
{ OLED_WR_Byte(0xb0+y,OLED_CMD);OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);OLED_WR_Byte((x&0x0f),OLED_CMD); 
}   	  //清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!	  
void OLED_Clear(void)  
{  u8 i,n;		    for(i=0;i<8;i++)  {  OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA); } //更新显示
}//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//mode:0,反白显示;1,正常显示				 
//size:选择字体 16/12 
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size)
{      	unsigned char c=0,i=0;	c=chr-' ';//得到偏移后的值			if(x>Max_Column-1){x=0;y=y+2;}if(Char_Size ==16){OLED_Set_Pos(x,y);	for(i=0;i<8;i++)OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);OLED_Set_Pos(x,y+1);for(i=0;i<8;i++)OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);}else {	OLED_Set_Pos(x,y);for(i=0;i<6;i++)OLED_WR_Byte(F6x8[c][i],OLED_DATA);}
}
//m^n函数
u32 oled_pow(u8 m,u8 n)
{u32 result=1;	 while(n--)result*=m;    return result;
}				  
//显示2个数字
//x,y :起点坐标	 
//len :数字的位数
//size:字体大小
//mode:模式	0,填充模式;1,叠加模式
//num:数值(0~4294967295);	 		  
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2)
{         	u8 t,temp;u8 enshow=0;						   for(t=0;t<len;t++){temp=(num/oled_pow(10,len-t-1))%10;if(enshow==0&&t<(len-1)){if(temp==0){OLED_ShowChar(x+(size2/2)*t,y,' ',size2);continue;}else enshow=1; }OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2); }
} 
//显示一个字符号串
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)
{unsigned char j=0;while (chr[j]!='\0'){		OLED_ShowChar(x,y,chr[j],Char_Size);x+=8;if(x>120){x=0;y+=2;}j++;}
}//初始化SSD1306					    
void OLED_Init(void)
{ 	OLED_WR_Byte(0xAE,OLED_CMD);//--display offOLED_WR_Byte(0x00,OLED_CMD);//---set low column addressOLED_WR_Byte(0x10,OLED_CMD);//---set high column addressOLED_WR_Byte(0x40,OLED_CMD);//--set start line address  OLED_WR_Byte(0xB0,OLED_CMD);//--set page addressOLED_WR_Byte(0x81,OLED_CMD); // contract controlOLED_WR_Byte(0xFF,OLED_CMD);//--128   OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverseOLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 dutyOLED_WR_Byte(0xC8,OLED_CMD);//Com scan directionOLED_WR_Byte(0xD3,OLED_CMD);//-set display offsetOLED_WR_Byte(0x00,OLED_CMD);//OLED_WR_Byte(0xD5,OLED_CMD);//set osc divisionOLED_WR_Byte(0x80,OLED_CMD);//OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode offOLED_WR_Byte(0x05,OLED_CMD);//OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge PeriodOLED_WR_Byte(0xF1,OLED_CMD);//OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartionOLED_WR_Byte(0x12,OLED_CMD);//OLED_WR_Byte(0xDB,OLED_CMD);//set VcomhOLED_WR_Byte(0x30,OLED_CMD);//OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enableOLED_WR_Byte(0x14,OLED_CMD);//OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
}  

仿真源文件及源程序百度网盘链接:https://pan.baidu.com/s/1i3V_uHmDF2ODFe9VvU2dzw?pwd=b1r6 
提取码: b1r6 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1536978.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

一次RPC调用过程是怎么样的?

注册中心 RPC&#xff08;Remote Procedure Call&#xff09;翻译成中文就是 {远程过程调用}。RPC 框架起到的作用就是为了实现&#xff0c;调用远程方法时&#xff0c;能够做到和调用本地方法一样&#xff0c;让开发人员更专注于业务开发&#xff0c;不用去考虑网络编程等细节…

数据库基础(MySQL)

目录 1. 概述 2. MySQL安装准备 3. SQL概述 3.1 什么是SQL 3.2 SQL通用语法 3.3 SQL分类 4. DDL 4.1 操作数据库 4.1.1 C(Create)创建 4.1.2 R(Retrieve)查询 4.1.3 U(Update):修改 4.1.4 D(Delete):删除 4.1.5 使用数据库 4.2 操作表 4.2.1 C(Create):创建 4.2…

苹果已确定9月iPhone 16系列发布会,然而这些产品不会亮相

近日&#xff0c;科技巨头苹果公司正式宣布将于9月举办一年一度的iPhone 16系列发布会。 这场备受瞩目的活动吸引了全球众多科技爱好者的目光。 然而&#xff0c;在发布会前夕&#xff0c;有消息传出&#xff0c;部分备受期待的产品将不会亮相。 究竟哪些产品会惊艳登场&…

QT + WebAssembly + Vue环境搭建

Qt6.7.2安装工具 emsdk安装 git clone https://github.com/emscripten-core/emsdk.git cd emsdk emsdk install 3.1.50 emsdk activate 3.1.50 Qt Creator配置emsdk 效果 参考 GitHub - BrockReece/vue-wasm: Vue web assembly loader Emscripten cmake多版本编译-CSDN博客 …

我的标志:奇特的头像

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>与妖为邻</title><style>figure.log…

【PHP代码审计】 PHP环境搭建

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 安装phpstudy 泥菩萨-CSDN博客 安装vscode 直接去官网下载安装包&#xff0c;然后双击安装即可。官网地址&#xff1a;htt…

re题(27)BUUFCTF-[MRCTF2020]Transform

BUUCTF在线评测 (buuoj.cn) 先到ida&#xff0c;先看一下字符串 找到主函数 int __cdecl main(int argc, const char **argv, const char **envp) {char Str[104]; // [rsp20h] [rbp-70h] BYREFint j; // [rsp88h] [rbp-8h]int i; // [rsp8Ch] [rbp-4h]sub_402230(argc, arg…

Virtuoso配置文件(virtuoso.ini)详解

目录 前言1. Virtuoso ini 文件的作用2. 如何使用 virtuoso.ini3. Virtuoso ini 文件结构详解3.1 数据库相关配置3.2 服务器参数配置3.3 网络设置3.4 内存优化3.5 复制与高可用性配置3.6 SPARQL 查询设置 4. virtuoso.ini文件示例5. 结语 前言 Virtuoso 是一款强大的通用数据集…

深度学习--------------序列模型

目录 序列数据统计工具&#xff08;方案一&#xff09;马尔可夫假设&#xff08;方案二&#xff09;潜变量模型总结 序列模型基于马尔可夫假设方式该部分总代码 单步预测多步预测k步预测该部分总代码 序列数据 实际中数据是有时序结构的。 统计工具 在时间t观察带 x t x_t xt…

git push : RPC failed; HTTP 400 curl 22 The requested URL returned error: 400

git push 出现RPC failed; HTTP 400 curl 22 The requested URL returned error: 400 问题 git push Enumerating objects: 11, done. Counting objects: 100% (11/11), done. Delta compression using up to 8 threads Compressing objects: 100% (10/10), done. error: RPC …

通用接口开放平台设计与实现——(31)API服务线程安全问题确认与修复

背景 在本系列的前面一篇博客评论中&#xff0c;有小伙伴指出&#xff0c;API服务存在线程安全问题&#xff1a; https://blog.csdn.net/seawaving/article/details/122905199#comments_34477405 今天来确认下&#xff0c;线程是否安全&#xff1f;如不安全&#xff0c;如何…

【AIGC】CFG:基于扩散模型分类器差异引导

摘要 分类器指导是最近引入的一种方法&#xff0c;在训练后在条件扩散模型中权衡模式覆盖率和样本保真度&#xff0c;在精神上与其他类型的生成模型中的低温采样或截断相同。分类器引导将扩散模型的分数估计与图像分类器的梯度相结合&#xff0c;因此需要训练与扩散模型分离的…

C#语言依然是主流的编程语言之一,不容置疑

C#语言是由微软在2000年发布的现代面向对象编程语言。尽管在编程语言市场中的占有率相对较低&#xff0c;但C#依然保持了强大的存在感&#xff0c;并未像一些其他语言那样逐渐被淘汰。C#语言不仅有其存在的独特理由&#xff0c;而且拥有许多令人无法忽视的优势。以下从多个方面…

积分电路和滤波电路的主要区别点和应用场合

文章目录 前言一、滤波电路的分类二、有源滤波器和无源滤波器的优缺点和实用范围三、积分电路3.1 无源积分电路3.2 RC充放电的电路响应3.2.1 RC电路的零状态响应3.2.2 RC电路的零输入响应3.2.3 RC电路的全响应3.2.4 选取合适的时间常数四 、无源RC低通滤波器4.3.1 截止频率推导…

kubernetes技术详解,带你深入了解k8s

目录 一、Kubernetes简介 1.1 容器编排应用 1.2 Kubernetes简介 1.3 k8s的设计架构 1.3.1 k8s各个组件的用途 1.3.2 k8s各组件之间的调用关系 1.3.3 k8s的常用名词概念 1.3.4 k8s的分层结构 二、k8s集群环境搭建 2.1 k8s中容器的管理方式 2.2 k8s环境部署 2.2.1 禁用…

VuePress搭建文档网站/个人博客(详细配置)主题配置-导航栏配置

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

针对国内AIGC市场,国内目前出台了那些法律法规?

针对国内AIGC市场&#xff0c;特别是AI生成与合成内容方面&#xff0c;中国已经出台了一系列法律法规来规范其发展和应用。 图片源自“央视新闻” 以下是一些主要的法律法规&#xff1a; 一、国家层面的法律法规 《中华人民共和国网络安全法》 施行时间&#xff1a;2017年6月…

进程监控与管理详解

一、进程的定义: 进程process是正在运行的程序,包括: 分配的内存地址空间 安全属性、包括所有权和特权 一个或多个线程 进程状态 进程的环境包括: 本地和全局变量 当前调度上下文…

java多线程编程示例

程序功能 程序展示了 Java 中如何使用多线程来并行执行任务。具体功能如下&#xff1a; 程序创建了三个线程&#xff0c;每个线程执行相同的任务类 Task。 每个线程在运行时输出自身名称&#xff0c;并模拟执行五次任务&#xff0c;每次任务间隔 1 秒。 主线程在启动这三个线程…

专业学习|系统动力学概观(方法特色、构成要素、建模步骤)

一、系统动力学概览 &#xff08;一&#xff09;系统动力学介绍 系统动力学是一门综合交叉学科&#xff0c;其基础理论涵盖了控制论、信息论和决策论等多个领域。它利用计算机仿真技术对复杂系统进行定量研究&#xff0c;尤其是那些具有非线性、高阶次和多重反馈特征的系统。这…