基于51单片机的智能空调控制系统设计(仿真+代码+原理图+报告+视频讲解)

基于51单片机的智能空调控制系统

这里写目录标题

  • 1 开发环境
  • 讲解演示视频
  • 2 功能说明介绍
  • 3 仿真图
  • 4 程序
  • 4.1 工程文件
  • 4.2 代码
  • 5 原理图
  • 6 元器件清单
  • 7 视频讲解
  • 8 资料清单
  • 1 开发环境

    仿真图:proteus8.9以上

    程序代码:KEIL4/KEIL5

    原理图/PCB:AD

    设计编号:A0003

    讲解演示视频

    视频

    基于51单片机的智能空调控制系统视频讲解

    2 功能说明介绍

    基于51单片机的空调温度控制系统

    由STC89C51单片机+LCD1602液晶显示屏+L298N控制模块+直流电机+DS18B20温度传感器构成

    具体功能:

    (1)实现L298N对电机的控制,利用LCD1602直接、清晰明了的显示温度;

    (2) 基于测得的温度实现对电机转速的控制(利用电机模拟空调变频系统);

    (3)在自动模式下,温度越高,占空越高,转数越快。手动模式下,通过按键可以实现电机转速的控制。

    3 仿真图

    img

    4 程序

    4.1 工程文件

    img

    4.2 代码

    img

    主函数

    #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%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绘制,原理图和仿真图有出入,原理图需要电源,电源开关模块。此设计资料详细,硬件手册资料图片详细,不对硬件调试负责,做实物需要一定的基本功。

    img

    6 元器件清单

    1. 万用板9*15

    2. DC电源插口

    3. 自锁开关

    4. 2.2K电阻*1

    5. STC89C51单片机

    6. 40脚IC座

    7. DC电源线

    8. L298N驱动芯片

    9. LCD1602液晶显示屏

    10. 10K排阻(103)

    11. 10K电阻*2

    12. 10uF电容

    13. 按键*2

    14. 单刀双掷开关

    15. 12M晶振

    16. 30Pf瓷片电容*2

    17. 3.3V直流电机

    18. 导线

    19. 焊锡

    20. DS18B20温度传感器

    21. 万用板一块

    7 视频讲解

    代码讲解+仿真讲解+仿真演示+原理图讲解

    img

    8 资料清单

    img下载地址:看文章最上面的视频。

    物联沃分享整理
    物联沃-IOTWORD物联网 » 基于51单片机的智能空调控制系统设计(仿真+代码+原理图+报告+视频讲解)

    发表评论