基于51单片机的智能自动晾衣架proteus仿真原理图程序设计

该博客介绍了基于51单片机的智能自动晾衣架的设计,利用AT89C52单片机进行硬件控制,并通过Proteus软件进行仿真。设计中结合了SHT11温湿度传感器、感光原件、LCD显示和模式控制单元,以实现根据环境条件自动调整晾衣架的功能。博主提供了仿真截图和部分程序代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

硬件设计

文件仅供参考

链接:https://pan.baidu.com/s/1H49s8Kp7LL3U4IZNXNsjlg
提取码:vf6u

方案
为了实现晾衣自身能够完成对外界数据的采集与分析,集成控制环节我们采用了ATMEL公司生产的AT89C52单片机,与市面上的其他嵌入式控制单元相比较在体积与功耗方面都相当出色。此次设计主要突破在于设计合理的控制电路单元,同时结合采用的主控编写高质量的源码并使系统在实际与应用中能够发挥出色的稳定性和参考价值。本次将围绕主控单元设计合理的电路,结合SHT11温湿度采集单元、感光原件单元、LCD显示单元、模式控制单元使晾衣架能够得到外界的实时数据并作出相应的调整。在设定合适的温湿度及感光度的条件下能够自动控制电机驱动滑杆实现自动量晒与回收衣物,结合光线角度进行上下左右调整。主要框架如下图所示:
在这里插入图片描述

仿真1:
在这里插入图片描述

仿真2:
在这里插入图片描述

程序1

#include<reg52.h>
#include <intrins.h>
#include <math.h>   
#include <stdio.h>
#include <1602.h>
#include <sht11.h>
#include <24c02.h> 
    
#define uchar unsigned char
#define uint  unsigned  int
#define W_cmd 0xa0   //24c02写指令
#define R_cmd 0xa1
uint  temp,humi; 
value humi_val,temp_val;     	//定义两个共同体,一个用于湿度,一个用于温度
uchar error;                	//用于检验是否出现错误
uchar checksum;            	  	//CRC

uchar TEMP_data[7];         	//用于记录实测的温度
uchar HUMI_data[6];         	//用于记录实测的湿度
uchar LIGH_data[4];				//用于记录实测光感度

uchar show_temp[5];           	//显示设定的温度
uchar show_humi[4];           	//显示设定的湿度

uchar data temp_humi_cache[4]; 	//温湿度设置缓存
uchar temp_set;                 //保存温度变量
uchar humi_set;         		//保存湿度变量
uchar presskeynum;    			//按键次数变量
uchar nn;            			//用于蜂鸣器
uchar code word1[]={"  a product of  "};
uchar code word2[]={"UNITED ELECTRONS"};
uchar code word3[]={" Welcome........"};
sbit k1=P2^0; //选择按键
sbit k2=P2^1; //增加按键
sbit k3=P2^2; //减小按键
sbit k4=P2^3;// 确认按键
sbit led1=P1^4;	//温度过低指示灯
sbit led2=P1^5;	//温度过高
sbit led3=P1^6;	//湿度低于下限值,报警,加湿。
sbit led4=P1^7;	//湿度过高,报警,不调湿
sbit motor1=P3^4;
sbit motor2=P3^5;
sbit motor3=P3^6;
sbit motor4=P3^7;
sbit P2_6=P2^6;

//********延时函数*********
void delay(uint z)  //z为毫秒数

{
     int a,b;
     for(a=z;a>0;a--)
     for(b=120;b>0;b--);
}
void key()
{
     uchar m;
     if (k1==0) //调整按键检测
     {
         delay(5);
         if (k1==0)
         {
             presskeynum++;
             if(presskeynum==3)
             presskeynum=0;
             while(k1==0);	 //若一直按下,循环
             LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
         }
     }
     if(presskeynum==1)//温度设置
     {
         if(k2==0)    // 加
         {
             delay(300);
             temp_set++;
             if (temp_set>30)
             temp_set=30;
             while(k2==0);       //加上此句必须松按键才处理
          }
          if(k3==0)//减
          {
               delay(300);
                temp_set--;
                if (temp_set<18)
                temp_set=18;
                while(k3==0);       //加上此句必须松按键才处理
           }
     
       }
      
         if(presskeynum==2)//湿度设置
         {
              if(k2==0)// 加
              {
                  delay(300);
                  humi_set++;
                  if (humi_set>99)
                  humi_set=99;
                  while(k2==0);
                }
                if(k3==0)//减
                {
                    delay(300);
                    humi_set--;
                    if (humi_set<1)
                    humi_set=1;
//					while(k3==0);							//这句是调试加入的
                  }
      
           }
     

      
       if(k4==0)// 退出键											//设置完初始值以后通过IIC写入24c02并清屏	
       {
            delay(10);
            if(k4==0)
            {
                while(k4==0);
                presskeynum=0;
                temp_humi_cache[0]=temp_set/10;
                temp_humi_cache[1]=temp_set%10;
                temp_humi_cache[2]=humi_set/10;
                temp_humi_cache[3]=humi_set%10;
      
                for(m=0;m<4;m++)
                {  
                     WriteIIC(W_cmd,0x00+m,temp_humi_cache[m]);      //设定值写入24c02
                }
                LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
             }
        }
}

//主函数

void main()
{ 
	 uchar t;
	 uchar temp_adc;
	 k1=k2=k3=k4=1;
	 motor1=motor2=motor3=motor4=0;
	 P2_6=0;
     for (t=0;t<4;t++)
     temp_humi_cache[t]=ReadIIC(W_cmd,0x00+t,R_cmd);			//读入24c02设定的值
     temp_set=temp_humi_cache[0]*10+temp_humi_cache[1];			//设置温度
     humi_set=temp_humi_cache[2]*10+temp_humi_cache[3];			//设置湿度
     LCD_Initial();    											//液晶初始化
     GotoXY(0,0);
     Print_slow(word1);
     GotoXY(0,1);
     Print_slow(word2);
     LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
     GotoXY(0,0);
     Print_slow(word3);
     LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏          //完成系统初始化           
     while(1)
     {
		     key();
			 P1 = 0xff;						 					//P1口初始化
			 temp_adc = P1;										//读取光敏值,8位精度最大256
             if(presskeynum==0)	 //测量温湿度
             {                                                                  
             s_connectionreset(); //启动连接复位
             error=0;                                           	       //初始化error=0,即没有错误
             error+=s_measure((unsigned char*)&temp_val.i,&checksum,TEMP); //温度测量值返回到temp.val.i
             error+=s_measure((unsigned char*)&humi_val.i,&checksum,HUMI); //湿度测量值返回到humi_val.i
             if(error!=0)
			 s_connectionreset();                 						   //如果发生错误,系统复位
             else
                 { 
					humi_val.f=(float)humi_val.i;                   //转换为浮点数
					temp_val.f=(float)temp_val.i;                   //转换为浮点数
					calc_sth10(&humi_val.f,&temp_val.f);            //修正相对湿度及温度,误差弥补
					temp=temp_val.f*10;
					humi=humi_val.f*10;
					GotoXY(0,0);                                    //选择温度显示位置
					Print("Temp:      C --- ");                          //5格空格
					GotoXY(0,1);                                    //选择湿度显示位置
					Print("Humi:      %     ");                          //5格空格 
					                           
					GotoXY(5,0);                                    //设置温度显示位置
					TEMP_data[0]=temp/1000+'0';						//温度百位 
					if (TEMP_data[0]==0x30) 						//ASCLL = 0
					TEMP_data[0]=0x20;							    //对应的ASCLL位空格
					TEMP_data[1]=temp%1000/100+'0';                	//温度十位      
					if (TEMP_data[1]==0x30 && TEMP_data[0]!=0x30) 
					TEMP_data[1]=0x20;
					TEMP_data[2]=temp%100/10+'0';                   //温度个位
					TEMP_data[3]=0x2e;                              //小数点
					TEMP_data[4]=temp%10+'0';                       //温度小数点后第一位            
					TEMP_data[5]=0xdf;                              //显示温度符号℃书上是第248
					TEMP_data[6]='\0';								//实际上0xdf对应的是小圆圈
					Print(TEMP_data);                               //输出温度 
					 							
					GotoXY(5,1);                                    
					HUMI_data[0]=humi/1000+'0';                     //湿度百位                           
					if (HUMI_data[0]==0x30)
					HUMI_data[0]=0x20;
					HUMI_data[1]=humi%1000/100+'0';         		//湿度十位      
					HUMI_data[2]=humi%100/10+'0';            		//湿度个位
					HUMI_data[3]='.' ;                       		//小数点
					HUMI_data[4]=humi%10+'0';                		//湿度小数点后第一位    
					HUMI_data[5]='\0';
					Print(HUMI_data);                        		//输出湿度

					GotoXY(13,1);
					LIGH_data[0] = temp_adc%1000/100+'0';
//					if(LIGH_data[0] == 0x30)
//					LIGH_data[0] = 0x20;
					LIGH_data[1] = temp_adc%100/10+'0';
					LIGH_data[2] = temp_adc%10+'0';
					LIGH_data[3] = '\0';
					Print(LIGH_data);  
							

.

.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值