基于51單片機(jī)的智能空調(diào)控制系統(tǒng)
1 開發(fā)環(huán)境
仿真圖:proteus8.9以上
程序代碼:KEIL4/KEIL5
原理圖/PCB:AD
設(shè)計(jì)編號(hào):A0003
講解演示視頻
視頻
基于51單片機(jī)的智能空調(diào)控制系統(tǒng)視頻講解
2 功能說明介紹
基于51單片機(jī)的空調(diào)溫度控制系統(tǒng)
由STC89C51單片機(jī)+LCD1602液晶顯示屏+L298N控制模塊+直流電機(jī)+DS18B20溫度傳感器構(gòu)成
具體功能:
(1)實(shí)現(xiàn)L298N對(duì)電機(jī)的控制,利用LCD1602直接、清晰明了的顯示溫度;
(2) 基于測(cè)得的溫度實(shí)現(xiàn)對(duì)電機(jī)轉(zhuǎn)速的控制(利用電機(jī)模擬空調(diào)變頻系統(tǒng));
(3)在自動(dòng)模式下,溫度越高,占空越高,轉(zhuǎn)數(shù)越快。手動(dòng)模式下,通過按鍵可以實(shí)現(xiàn)電機(jī)轉(zhuǎn)速的控制。
3 仿真圖
4 程序
4.1 工程文件
4.2 代碼
主函數(shù)
#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;//風(fēng)扇控制引腳
uchar xianshi1[] ="TEMP 00.0C";// 內(nèi)容
uchar xianshi2[] ="000% ";// 內(nèi)容
uint wendu=0;
uchar count;
uchar jd=5;
bit work; //開關(guān)標(biāo)志
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.數(shù)據(jù)端口
void delay(uint z)
{
uint a,b;
for(a=z;a>0;a--)
for(b=120;b>0;b--);
}
//向LCD寫入命令或數(shù)據(jù)************************************************************
#define LCD_COMMAND 0 // Command
#define LCD_DATA 1 // Data
#define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光標(biāo)返回原點(diǎn)
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);
}
//設(shè)置顯示模式************************************************************
#define LCD_SHOW 0x04 //顯示開
#define LCD_HIDE 0x00 //顯示關(guān)
#define LCD_CURSOR 0x02 //顯示光標(biāo)
#define LCD_NO_CURSOR 0x00 //無(wú)光標(biāo)
#define LCD_FLASH 0x01 //光標(biāo)閃動(dòng)
#define LCD_NO_FLASH 0x00 //光標(biāo)不閃動(dòng)
void LCD_SetDisplay(unsigned char DisplayMode)
{
LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
}
//設(shè)置輸入模式************************************************************
#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位數(shù)據(jù)端口,2行顯示,5*7點(diǎn)陣
delay(5);
LCD_Write(LCD_COMMAND,0x38);
delay(5);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //開啟顯示, 無(wú)光標(biāo)
delay(5);
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
delay(5);
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC遞增, 畫面不動(dòng)
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()// 定時(shí)器初始化
{
TMOD=0x01;
TH0=TL0=(256-200);
ET0=1;//開定時(shí)器0中斷
TR0=1;
EA=1;//開總中斷
}
void Delay_DS18B20(int num);
/*****初始化DS18B20*****/ //探頭1
void Init_DS18B20()
{
unsigned char x;
DQ=1; //DQ復(fù)位
Delay_DS18B20(8); //稍做延時(shí)
DQ = 0; //單片機(jī)將DQ拉低
Delay_DS18B20(80); //精確延時(shí),大于480us
DQ = 1; //拉高總線
Delay_DS18B20(14);
x = DQ; //稍做延時(shí)后,如果x=0則初始化成功,x=1則初始化失敗
Delay_DS18B20(20);
}
/*****延時(shí)子程序*****/
void Delay_DS18B20(int num)
{
while(num--) ;
}
/*****寫一個(gè)字節(jié)*****/
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;
}
}
/*****讀一個(gè)字節(jié)*****/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號(hào)
dat>>=1;
DQ = 1; // 給脈沖信號(hào)
if(DQ)
dat|=0x80;
Delay_DS18B20(4);
}
return(dat);
}
/*****讀取溫度*****/
unsigned int ReadTemperature(void) //讀取溫度并轉(zhuǎn)換
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
unsigned int tempb20;
float f_temp=0;
Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號(hào)列號(hào)的操作
WriteOneChar(0x44); //啟動(dòng)溫度轉(zhuǎn)換
Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號(hào)列號(hào)的操作
WriteOneChar(0xBE); //讀取溫度寄存器
a=ReadOneChar(); //讀低8位
b=ReadOneChar(); //讀高8位
tempb20=b;
tempb20<<=8;
tempb20=tempb20|a;
if((b&0xfc)==0xfc)//負(fù)溫度
{
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();//讀取溫度數(shù)據(jù)
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%10+0x30;
xianshi1[14]=wendu%10+0x30;
xianshi2[0]=jd/10+0x30;
xianshi2[1]=jd%10+0x30;
GotoXY(0,0);
Print(xianshi1);
GotoXY(0,1);
Print(xianshi2);
}
}
5 原理圖
原理圖由AD繪制,原理圖和仿真圖有出入,原理圖需要電源,電源開關(guān)模塊。此設(shè)計(jì)資料詳細(xì),硬件手冊(cè)資料圖片詳細(xì),不對(duì)硬件調(diào)試負(fù)責(zé),做實(shí)物需要一定的基本功。
6 元器件清單
-
萬(wàn)用板9*15
-
DC電源插口
-
自鎖開關(guān)
-
2.2K電阻*1
-
STC89C51單片機(jī)
-
40腳IC座
-
DC電源線
-
L298N驅(qū)動(dòng)芯片
-
LCD1602液晶顯示屏
-
10K排阻(103)
-
10K電阻*2
-
10uF電容
-
按鍵*2
-
單刀雙擲開關(guān)
-
12M晶振
-
30Pf瓷片電容*2
-
3.3V直流電機(jī)
-
導(dǎo)線
-
焊錫
-
DS18B20溫度傳感器
-
萬(wàn)用板一塊
7 視頻講解
代碼講解+仿真講解+仿真演示+原理圖講解
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-416618.html
8 資料清單
下載地址:看文章最上面的視頻。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-416618.html
到了這里,關(guān)于基于51單片機(jī)的智能空調(diào)控制系統(tǒng)設(shè)計(jì)(仿真+代碼+原理圖+報(bào)告+視頻講解)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!