基于51单片机的空调温度控制系统
(仿真+程序+原理图+设计报告)
功能介绍
具体功能:
1.L298N控制电机,DS18B20测温;
2.LCD1602实时显示温度和电机转速;
3.温度越高,转速越快;
4.可以切换成手动模式,手动控制电机转速;
演示视频:
基于51单片机的空调温度控制系统—LCD1602显示
#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); //Ìø¹ý¶ÁÐòºÅÁкŵIJÙ×÷
WriteOneChar(0x44); //Æô¶¯Î¶Èת»»
Init_DS18B20();
WriteOneChar(0xCC); //Ìø¹ý¶ÁÐòºÅÁкŵIJÙ×÷
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;
}
硬件设计
使用元器件:
单片机:STC89C51;
(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)
万用板9*15;DC电源插口;
自锁开关;2.2K电阻*1;
40脚IC座;DC电源线;
L298N驱动芯片;10K排阻(103);
LCD1602液晶显示屏;按键*2;
10uF电容;10K电阻*2;
单刀双掷开关;12M晶振;
30Pf瓷片电容*2;3.3V直流电机;
DS18B20温度传感器;
导线:若干;
流程图:
设计资料
01 仿真图
本设计使用proteus8.9版本设计,资料里有安装教程,无需担心!具体如图!
02 原理图
本系统原理图采用Altium Designer19设计,具体如图!
03 程序
本设计使用软件keil5版本编程设计,资料里有安装教程,无需担心!具体如图!
04 设计报告
六千字设计报告,具体如下!
05 设计资料
全部资料包括仿真源文件 、程序(含注释)、AD原理图、参考论文、流程图、任务书、元件清单、讲解视频等。具体内容如下,全网最全! !
资料获取请观看前面演示视频!
点赞分享一起学习成长。