找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3015|回复: 2
打印 上一主题 下一主题
收起左侧

51单片机自动凉衣服源程序电路图与实物图

[复制链接]
跳转到指定楼层
楼主
电路原理图如下:

制作出来的实物图如下:




单片机源程序如下:
#include <REGX51.H>
#include <intrins.h>
#include <math.h>     
#include <stdio.h>      
#define uchar unsigned char
#define uint unsigned int

sbit DATA=P1^0;
sbit MOTOR_A_1=P2^5;   //电机控制脚
sbit MOTOR_A_2=P2^6;    //电机控制脚
sbit EN_MOTOR_A =P2^7;  //电机控制脚
sbit k1=P3^2;                               //按键
sbit k2=P3^3;                               //按键
sbit k3=P3^4;                               //按键
sbit k4=P3^5;                               //按键
sbit k5=P3^6;
sbit CS   = P1^2;
sbit Clk = P1^3;
sbit DATI = P1^4;
sbit DATO = P1^4;
unsigned char dat = 0x00;      
unsigned char count = 0x00;     
unsigned char CH;   
uchar mode=0;
sbit LED0=P2^3;
sbit LED1=P2^4;
uchar temp,humi;
uchar error;                                //用于检验是否出现错误
uchar checksum,nn;                          //CRC                    
uchar nn;                                  //蜂鸣器                    
uchar TEMP_data[6];                         //用于记录实测的温度
uchar CO2_data[6];                         //用于记录实测的温度

uchar  U8FLAG,k;
uchar  U8count,U8temp;
uchar  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
uchar  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
uchar  U8comdata;
uchar  count, count_r=0;
/*************************************************************************/
void Delay1(uint );
void  Delay_10us(void);
void  COM(void);
uchar RH(void);
unsigned char adc0832(unsigned char CH)
{
     unsigned char i,test,adval;
     adval = 0x00;
     test = 0x00;
     Clk = 0;      
     DATI = 1;
     _nop_();
     CS = 0;
     _nop_();
     Clk = 1;
     _nop_();
    if ( CH == 0x00 )      
    {
       Clk = 0;
       DATI = 1;      
       _nop_();
       Clk = 1;
       _nop_();
       Clk = 0;
       DATI = 0;      
       _nop_();
       Clk = 1;
       _nop_();
     }
     else
     {
       Clk = 0;
       DATI = 1;      
       _nop_();
       Clk = 1;
       _nop_();
       Clk = 0;
       DATI = 1;      
       _nop_();
       Clk = 1;
       _nop_();
     }
      Clk = 0;
      DATI = 1;
     for( i = 0;i < 8;i++ )      
     {
       _nop_();
       adval <<= 1;
       Clk = 1;
       _nop_();
       Clk = 0;
       if (DATO)
          adval |= 0x01;
      else
          adval |= 0x00;
    }
      for (i = 0; i < 8; i++)      
      {
           test >>= 1;
           if (DATO)
              test |= 0x80;
           else
              test |= 0x00;
          _nop_();
          Clk = 1;
          _nop_();
          Clk = 0;
      }
      if (adval == test)      
           dat = test;
      _nop_();
       CS = 1;        
       DATO = 1;
       Clk = 1;
      return dat;
}


void Delay1(uint j)
{
    uchar i;
    for(;j>0;j--)
    {  
  for(i=0;i<27;i++);
    }
}
void  Delay_10us(void)
{
    uchar i;
    i--;
    i--;
    i--;
    i--;
    i--;
    i--;
}
void  COM(void)
{
    uchar i;
    for(i=0;i<8;i++)   
    {
       U8FLAG=2;
     while((!DATA)&&U8FLAG++);
  Delay_10us();
  Delay_10us();
  Delay_10us();
    U8temp=0;
        if(DATA)U8temp=1;
  U8FLAG=2;
  while((DATA)&&U8FLAG++);   
     if(U8FLAG==1)break;

        
    }
}
//--------------------------------
//-----温湿度读取子程序 ------------
//--------------------------------
//----以下变量均为全局变量--------
//----温度高8位== U8T_data_H------
//----温度低8位== U8T_data_L------
//----湿度高8位== U8RH_data_H-----
//----湿度低8位== U8RH_data_L-----
//----校验 8位 == U8checkdata-----
//----调用相关子程序如下----------
//---- Delay();, Delay_10us();,COM();
//--------------------------------
uchar RH(void)
{
    DATA=0;        //主机拉低18ms
Delay1(180);      //原来为5
DATA=1;      //总线由上拉电阻拉高 主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
DATA=1;         //主机设为输入 判断从机响应信号
if(!DATA)      //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行   
{
     U8FLAG=2;
     
     while((!DATA)&&U8FLAG++); //判断从机是否发出 80us 的低电平响应信号是否结束  
     U8FLAG=2;
    while((DATA)&&U8FLAG++);    //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
     COM();      //数据接收状态
     U8RH_data_H_temp=U8comdata;
     COM();
     U8RH_data_L_temp=U8comdata;
     COM();
     U8T_data_H_temp=U8comdata;
     COM();
     U8T_data_L_temp=U8comdata;
     COM();
     U8checkdata_temp=U8comdata;
     DATA=1;
     U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp); //数据校验
     if(U8temp==U8checkdata_temp)
     {
        U8RH_data_H=U8RH_data_H_temp;
        U8RH_data_L=U8RH_data_L_temp;
        U8T_data_H=U8T_data_H_temp;
        U8T_data_L=U8T_data_L_temp;
        U8checkdata=U8checkdata_temp;
     }
  return 1;
}
else            //传感器不响应
{
    return 0;
}
}
void delay(uint z)                          //延时函数z为毫秒数
{
   int a,b;
   for(a=z;a>0;a--)
   for(b=120;b>0;b--);
}
         
void key()
{
   
   if (k1==0)                               //调整按键检测
   {
      delay(10);
      if (k1==0)
      {
         mode=!mode;
    EN_MOTOR_A=0;  //电机启动,等于0停止

         while(k1==0);
         
      }
   }
   if (k2==0)                               //调整按键检测
   {
      delay(10);
      if (k2==0)
      {
      if(mode==0)
   {
    EN_MOTOR_A=1;  //电机启动,等于0停止
    MOTOR_A_2 =0;  //正转
    MOTOR_A_1 =1;  //反转停止
   }
         while(k2==0);
         
      }
   }
    if (k3==0)                               //调整按键检测
   {
      delay(10);
      if (k3==0)
      {
      if(mode==0)
   {
    EN_MOTOR_A=1;  //电机停止
    MOTOR_A_1 =0;  //反转
    MOTOR_A_2 =1;  //正转停止
   }
         while(k3==0);
         
      }
   }
   if(k4==0)
   {
      delay(10);
      if(k4==0)
      {
      if(MOTOR_A_2==0)
   EN_MOTOR_A=0;  //电机停止
         
      }
   }
    if(k5==0)
   {
      delay(10);
      if(k5==0)
      {
   if(MOTOR_A_1==0)
   EN_MOTOR_A=0;  //电机停止
         
      }
   }
}
void main()                                                  //主函数
{
   int ch0_temp;
   while(1)
   {
        
   ch0_temp=adc0832(0)*49/25;
   RH();                                               //测量温湿度
      temp=U8T_data_H;
      humi=U8RH_data_H;
    key();
   // LED1=0;
   //LED0=0;
     if(mode==0)
   {
    LED1=0;
    LED0=1;
   
   }
    if(mode==1)
   {
    LED1=1;
    LED0=0;
    if(k4==0)
    {
     if(MOTOR_A_2==0)
                 EN_MOTOR_A=0;  //电机停止
     
    }
    else if(k5==0)
    {
     if(MOTOR_A_1==0)
      EN_MOTOR_A=0;  //电机停止
   
    }
    else
    {
     if((ch0_temp>250)&&(humi<75))
     {
        EN_MOTOR_A=1;  //电机启动,等于0停止
        MOTOR_A_2 =0;  //正转
        MOTOR_A_1 =1;  //反转停止
     }
     else if((ch0_temp<250)||(humi>75))//光照不足,湿度大于50
     {
         EN_MOTOR_A=1;  //电机停止
         MOTOR_A_1 =0;  //反转
         MOTOR_A_2 =1;  //正转停止
     }
     else
     {
      EN_MOTOR_A=0;  //电机停止
     }
     
    }
   
   }
     
   
    }
}
         


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:619604 发表于 2019-10-17 23:24 | 只看该作者
参考参考,感谢分享
回复

使用道具 举报

板凳
ID:253767 发表于 2019-10-18 07:15 | 只看该作者
谢谢分享!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表