×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-08-26 发布时间:
|

电路原理图如下:
 
制作出来的实物图如下:
 

 

单片机源程序如下:

#include

#include

#include      

#include        

#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)

      {



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会