51单片机的智能空调控制系统设计仿真+代码+原理图+报告+视频
基于51单片机的智能空调控制系统
1 开发环境
仿真图:proteus8.9以上
程序代码:KEIL4/KEIL5
原理图/PCB:AD
设计编号:A0003
讲解演示视频
视频
基于51单片机的智能空调控制系统视频讲解
2 功能说明介绍
基于51单片机的空调温度控制系统
由STC89C51单片机 LCD1602液晶显示屏 L298N控制模块 直流电机 DS18B20温度传感器构成
具体功能:
(1)实现L298N对电机的控制,利用LCD1602直接、清晰明了的显示温度;
(2) 基于测得的温度实现对电机转速的控制(利用电机模拟空调变频系统);
(3)在自动模式下,温度越高,占空越高,转数越快。手动模式下,通过按键可以实现电机转速的控制。
3 仿真图
4 程序
4.1 工程文件
4.2 代码
主函数
#include<REG52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar num=0;
bit flang;
sbit IN1=P3^5;
sbit IN2=P3^6;
sbit PWM1 =P3^7;//风扇控制引脚
uchar xianshi1[] ="TEMP 00.0C";// 内容
uchar xianshi2[] ="000% ";// 内容
uint wendu=0;
uchar count;
uchar jd=5;
bit work; //开关标志
sbit k1=P1^0; //
sbit k2=P1^1; //
sbit k3=P1^2; //
sbit DQ=P2^0; //定义DS18B20总线I/O
//Port Definitions**********************************************************
sbit LcdRs = P2^5;
sbit LcdRw = P2^6;
sbit LcdEn = P2^7;
sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
void delay(uint z)
{
uint a,b;
for(a=z;a>0;a--)
for(b=120;b>0;b--);
}
//向LCD写入命令或数据************************************************************
#define LCD_COMMAND 0 // Command
#define LCD_DATA 1 // Data
#define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光标返回原点
void LCD_Write(bit style, unsigned char input)
{
LcdEn=0;
LcdRs=style;
LcdRw=0; _nop_();
DBPort=input; _nop_();//注意顺序
LcdEn=1; _nop_();//注意顺序
LcdEn=0; _nop_();
delay(1);
}
//设置显示模式************************************************************
#define LCD_SHOW 0x04 //显示开
#define LCD_HIDE 0x00 //显示关
#define LCD_CURSOR 0x02 //显示光标
#define LCD_NO_CURSOR 0x00 //无光标
#define LCD_FLASH 0x01 //光标闪动
#define LCD_NO_FLASH 0x00 //光标不闪动
void LCD_SetDisplay(unsigned char DisplayMode)
{
LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
}
//设置输入模式************************************************************
#define LCD_AC_UP 0x02
#define LCD_AC_DOWN 0x00 // default
#define LCD_MOVE 0x01 // 画面可平移
#define LCD_NO_MOVE 0x00 //default
void LCD_SetInput(unsigned char InputMode)
{
LCD_Write(LCD_COMMAND, 0x04|InputMode);
}
//初始化LCD************************************************************
void LCD_Initial()
{
LcdEn=0;
LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵
delay(5);
LCD_Write(LCD_COMMAND,0x38);
delay(5);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标
delay(5);
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
delay(5);
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动
delay(5);
}
//液晶字符输入的位置************************
void GotoXY(unsigned char x, unsigned char y)
{
if(y==0)
LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));
}
//将字符输出到液晶显示
void Print(unsigned char *str)
{
while(*str!='\0')
{
LCD_Write(LCD_DATA,*str);
str ;
delay(1);
}
}
void init()// 定时器初始化
{
TMOD=0x01;
TH0=TL0=(256-200);
ET0=1;//开定时器0中断
TR0=1;
EA=1;//开总中断
}
void Delay_DS18B20(int num);
/*****初始化DS18B20*****/ //探头1
void Init_DS18B20()
{
unsigned char x;
DQ=1; //DQ复位
Delay_DS18B20(8); //稍做延时
DQ = 0; //单片机将DQ拉低
Delay_DS18B20(80); //精确延时,大于480us
DQ = 1; //拉高总线
Delay_DS18B20(14);
x = DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
Delay_DS18B20(20);
}
/*****延时子程序*****/
void Delay_DS18B20(int num)
{
while(num--) ;
}
/*****写一个字节*****/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
Delay_DS18B20(5);
DQ = 1;
dat>>=1;
}
}
/*****读一个字节*****/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
Delay_DS18B20(4);
}
return(dat);
}
/*****读取温度*****/
unsigned int ReadTemperature(void) //读取温度并转换
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
unsigned int tempb20;
float f_temp=0;
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0x44); //启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器
a=ReadOneChar(); //读低8位
b=ReadOneChar(); //读高8位
tempb20=b;
tempb20<<=8;
tempb20=tempb20|a;
if((b&0xfc)==0xfc)//负温度
{
flang=1;
tempb20=((~tempb20) 1);
f_temp=tempb20*0.0625;
tempb20=f_temp*10 0.5;
}
else//正温度
{
flang=0;
f_temp=tempb20*0.0625;
tempb20=f_temp*10 0.5;
}
return tempb20;
}
main()
{
uchar k;
LCD_Initial();
PWM1=0;
IN1=0;
IN2=1;
init();
while(1)
{
if(k==0)
{
EA=0;
wendu=ReadTemperature();//读取温度数据
EA=1;
}
if(k >25) k=0;
if(k1)
{
if(wendu>=270)
{
jd=(wendu/10)-27;
}
else jd=0;
}
else
{
if(k2==0)//PWM
{
delay(10);
jd ;
if(jd>=10)jd=10;
while(k2==0);
}
if(k3==0)//PWM-
{
delay(10);
if(jd>0) jd--;
while(k3==0);
}
}
if(flang==1)
xianshi1[10]='-';
else
xianshi1[10]=' ';
xianshi1[11]=wendu/100 0x30;
xianshi1[12]=wendu/10 0x30;
xianshi1[14]=wendu 0x30;
xianshi2[0]=jd/10 0x30;
xianshi2[1]=jd 0x30;
GotoXY(0,0);
Print(xianshi1);
GotoXY(0,1);
Print(xianshi2);
}
}
5 原理图
原理图由AD绘制,原理图和仿真图有出入,原理图需要电源,电源开关模块。此设计资料详细,硬件手册资料图片详细,不对硬件调试负责,做实物需要一定的基本功。
6 元器件清单
-
万用板9*15
-
DC电源插口
-
自锁开关
-
2.2K电阻*1
-
STC89C51单片机
-
40脚IC座
-
DC电源线
-
L298N驱动芯片
-
LCD1602液晶显示屏
-
10K排阻(103)
-
10K电阻*2
-
10uF电容
-
按键*2
-
单刀双掷开关
-
12M晶振
-
30Pf瓷片电容*2
-
3.3V直流电机
-
导线
-
焊锡
-
DS18B20温度传感器
-
万用板一块
7 视频讲解
代码讲解 仿真讲解 仿真演示 原理图讲解
8 资料清单
下载地址:看文章最上面的视频。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgkafaj
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13