找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机晾衣架控制程序

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include<absacc.h>                //头文件

  4. #define uc unsigned char
  5. #define ui unsigned int

  6. sbit in_go                =        P1^3;
  7. sbit in_back        =        P1^2;//手动前进后退按键
  8. sbit out_go                =        P3^0;
  9. sbit out_back        =        P3^5;//电机控制输出
  10. sbit limit_go        =        P3^4;
  11. sbit limit_back        =        P3^6;//前进后退限位开关
  12. sbit led_go                =        P1^4;
  13. sbit led_back        =        P1^5;//前进后退限位指示灯
  14. sbit light                =        P1^0;//光线传感器
  15. sbit change                =        P1^1;//手动自动切换按键(默认自动)  
  16. sbit led_zhishi =        P1^7;
  17. sbit buzz                =        P1^6;

  18. sbit W1=P2^2;
  19. sbit W2=P2^1;
  20. //定义DHT11数据口
  21. sbit DATA = P2^0;

  22. uc U8FLAG,U8temp,U8comdata,U8RH_data_H_temp,U8RH_data_L_temp,U8T_data_H_temp,U8T_data_L_temp,U8checkdata_temp;
  23. uc U8RH_data_H,U8RH_data_L,U8T_data_H,U8T_data_L,U8checkdata;
  24. uc Mode,humidity;
  25. bit bdata FlagStartRH,hot,cold,humid,dry;

  26. bit bdata flag1,flag2,change_flag,flag_shan,flag_shan1,flag_shan2,flag_HH;
  27. uc m,n,shan;

  28. uc code table[11]={        //共阴极字型码
  29.         0x3f,  //--0
  30.         0x06,  //--1
  31.         0x5b,  //--2
  32.         0x4f,  //--3
  33.         0x66,  //--4
  34.         0x6d,  //--5
  35.         0x7d,  //--6
  36.         0x07,  //--7
  37.         0x7f,  //--8
  38.         0x6f,  //--9
  39.         0x00   //--NULL
  40. };


  41. //定时器0初始化
  42. void Timer0_Init()
  43. {
  44.         ET0 = 1;        //允许定时器0中断
  45.         TMOD = 1;       //定时器工作方式选择
  46.         TL0 = 0xb0;     
  47.         TH0 = 0x3c;     //定时器赋予初值
  48.         TR0 = 1;        //启动定时器
  49.         EA=1;
  50. }


  51. void Delay1(ui j)
  52. {
  53.     uc i;
  54.     for(;j>0;j--)
  55.     {        
  56.                 for(i=0;i<27;i++);
  57.     }
  58. }

  59. void  Delay_10us(void)
  60. {
  61.     uc i;
  62.     i--;
  63.     i--;
  64.     i--;
  65.     i--;
  66.     i--;
  67.     i--;
  68. }       

  69. void  COM(void)
  70. {
  71.     uc i;
  72.     for(i=0;i<8;i++)          
  73.     {
  74.               U8FLAG=2;
  75.                    while((!DATA)&&U8FLAG++);
  76.                 Delay_10us();
  77.                 Delay_10us();
  78.                 Delay_10us();
  79.                   U8temp=0;
  80.         if(DATA)U8temp=1;
  81.                     U8FLAG=2;
  82.                 while((DATA)&&U8FLAG++);
  83.                    //超时则跳出for循环                  
  84.                    if(U8FLAG==1)break;
  85.                    //判断数据位是0还是1         
  86.                      
  87.                 // 如果高电平高过预定0高电平值则数据位为 1
  88.                     
  89.                 U8comdata<<=1;
  90.                    U8comdata|=U8temp;        //0
  91.     }//rof
  92. }

  93. //--------------------------------
  94. //-----温湿度读取子程序 ------------
  95. //--------------------------------
  96. //----以下变量均为全局变量--------
  97. //----温度高8位== U8T_data_H------
  98. //----温度低8位== U8T_data_L------
  99. //----湿度高8位== U8RH_data_H-----
  100. //----湿度低8位== U8RH_data_L-----
  101. //----校验 8位 == U8checkdata-----
  102. //----调用相关子程序如下----------
  103. //---- Delay();, Delay_10us();,COM();
  104. //--------------------------------
  105. uc RH(void)
  106. {
  107.     //主机拉低18ms
  108.     DATA=0;
  109.         Delay1(180);  //原来为5
  110.         DATA=1;
  111.         //总线由上拉电阻拉高 主机延时20us
  112.         Delay_10us();
  113.         Delay_10us();
  114.         Delay_10us();
  115.         Delay_10us();
  116.         //主机设为输入 判断从机响应信号
  117.         DATA=1;
  118.         //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行          
  119.         if(!DATA)                 //T !          
  120.         {
  121.             U8FLAG=2;
  122.             //判断从机是否发出 80us 的低电平响应信号是否结束         
  123.             while((!DATA)&&U8FLAG++);
  124.             U8FLAG=2;
  125.             //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
  126.             while((DATA)&&U8FLAG++);
  127.             //数据接收状态                 
  128.             COM();
  129.             U8RH_data_H_temp=U8comdata;
  130.             COM();
  131.             U8RH_data_L_temp=U8comdata;
  132.             COM();
  133.             U8T_data_H_temp=U8comdata;
  134.             COM();
  135.             U8T_data_L_temp=U8comdata;
  136.             COM();
  137.             U8checkdata_temp=U8comdata;
  138.             DATA=1;
  139.             //数据校验
  140.             U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  141.             if(U8temp==U8checkdata_temp)
  142.             {
  143.                       U8RH_data_H=U8RH_data_H_temp;
  144.                       U8RH_data_L=U8RH_data_L_temp;
  145.                       U8T_data_H=U8T_data_H_temp;
  146.                       U8T_data_L=U8T_data_L_temp;
  147.                       U8checkdata=U8checkdata_temp;
  148.             }
  149.                 return 1;
  150.         }
  151.         else   //传感器不响应
  152.         {
  153.            return 0;
  154.         }
  155. }


  156. void delay(ui x)//延时函数
  157. {
  158.         ui i,j;
  159.         for(i=0;i<x;i++)
  160.         for(j=0;j<110;j++);
  161. }

  162. void display()
  163. {
  164.         P0=table[humidity/10];
  165.         W1=0;                               
  166.         delay(1);                                //延时
  167.         W1=1;                                //关显示
  168.                                                   
  169.         P0=table[humidity%10];
  170.         W2=0;                 
  171.         delay(1);                                 //延时
  172.         W2=1;                                //关显示
  173. }
  174. void work()//工作函数
  175. {
  176.         if(change==0)//判断切换是否按下
  177.         {
  178.                 buzz=0;
  179.                 delay(50);
  180.                 if(change==0)
  181.                 change_flag=~change_flag;//手动,自动切换
  182.                 led_zhishi=change_flag;
  183.                 if(change_flag==1)
  184.                 {
  185.                         out_go=1;
  186.                         out_back=1;
  187.                         led_go=1;
  188.                         led_back=1;
  189.                 }
  190.                 buzz=1;
  191.                 while(!change);//释放
  192.                 buzz=1;
  193.         }
  194.        
  195.         if(change_flag==0)//自动模式
  196.         {
  197.                 if(light==0||flag_HH==1)//夜间(无光)时拉回衣架           flag_HH==1湿度高
  198.                 {
  199.                         delay(20);
  200.                         if(light==0||flag_HH==1)
  201.                         {
  202.                                 if((limit_go==0)&&(flag_shan==0))
  203.                                 {       
  204.                                         out_go=1;
  205.                                         out_back=1;
  206.                                         led_go=1;
  207.                                        
  208.                                         for(shan=0;shan<6;shan++)
  209.                                         {
  210.                                                 led_go=~led_go;
  211.                                                 buzz=led_go;
  212.                                                 delay(500);
  213.                                         }
  214.                                         flag_shan=1;
  215.                                 }
  216.                                 else if(limit_go==1)
  217.                                 {       
  218.                                         out_go=1;
  219.                                         out_back=0;
  220.                                        
  221.                                         led_back=1;
  222.                                         led_go=0;
  223.                                         flag_shan=0;
  224.                                 }
  225.                         }
  226.                 }
  227.                 else if(light==1&&flag_HH==0)//白天(有光)时伸出衣架
  228.                 {
  229.                         delay(20);
  230.                         if(light==1&&flag_HH==0)
  231.                         {
  232.                                 if((limit_back==0)&&(flag_shan==0))
  233.                                 {       
  234.                                         out_go=1;
  235.                                         out_back=1;
  236.                                        
  237.                                         led_back=1;
  238.                                         for(shan=0;shan<6;shan++)
  239.                                         {
  240.                                                 led_back=~led_back;
  241.                                                 buzz=led_back;
  242.                                                 delay(500);
  243.                                         }
  244.                                         flag_shan=1;
  245.                                 }
  246.                                 else if(limit_back==1)
  247.                                 {       
  248.                                         out_go=0;
  249.                                         out_back=1;
  250.                                        
  251.                                         led_back=0;
  252.                                         led_go=1;
  253.                                         flag_shan=0;
  254.                                 }
  255.                         }
  256.                 }
  257.         }
  258.         else if(change_flag==1)//手动模式
  259.         {
  260.                 if((in_go==0)&&(limit_go==1))//关闭是否按下
  261.                 {
  262.                         buzz=0;
  263.                         delay(5);
  264.                         if((in_go==0)&&(limit_go==1))
  265.                         {       
  266.                                 buzz=1;
  267.                                 out_go=1;
  268.                                 out_back=~out_back;//按一下伸出,再按一下,停止
  269.                                
  270.                                 buzz=1;
  271.                                 led_back=1;
  272.                                 led_go=out_back;
  273.                                 flag_shan1=0;
  274.                                
  275.                         }
  276.                         while(!in_go);//释放
  277.                         buzz=1;
  278.                 }
  279.                 else if((in_back==0)&&(limit_back==1))//打开是否按下
  280.                 {
  281.                         buzz=0;
  282.                         delay(5);
  283.                         if((in_back==0)&&(limit_back==1))
  284.                         {
  285.                                 buzz=1;       
  286.                                 out_back=1;
  287.                                 out_go=~out_go;//按一下收回,再按一下,停止  
  288.                                
  289.                                 buzz=1;
  290.                                 led_go=1;
  291.                                 led_back=out_go;
  292.                                 flag_shan2=0;
  293.                                
  294.                         }
  295.                         while(!in_back);//按键释放
  296.                         buzz=1;
  297.                 }
  298.                 if((limit_go==0)&&(flag_shan1==0))
  299.                 {
  300.                         delay(5);
  301.                         if((limit_go==0)&&(flag_shan1==0))
  302.                         {       
  303.                                
  304.                                 out_back=1;
  305.                                 led_go=1;
  306.                                 for(shan=0;shan<6;shan++)
  307.                                 {
  308.                                         led_go=~led_go;
  309.                                         buzz=led_go;
  310.                                         delay(500);
  311.                                 }
  312.                                 flag_shan1=1;
  313.                         }
  314.                 }
  315.                 if((limit_back==0)&&(flag_shan2==0))
  316.                 {
  317.                         delay(5);
  318.                         if((limit_back==0)&&(flag_shan2==0))
  319.                         {       
  320.                                
  321.                                 out_go=1;
  322.                                 led_back=1;
  323.                                 for(shan=0;shan<6;shan++)
  324.                                 {
  325.                                         led_back=~led_back;
  326.                                         buzz=led_back;
  327.                                         delay(500);
  328.                                 }
  329.                                 flag_shan2=1;
  330.                         }
  331.                 }
  332.         }
  333. }

  334. void main()//主函数
  335. {
  336.         uc testnum;
  337.         light=0;
  338.         buzz=1;
  339.         led_zhishi=0;
  340.         Timer0_Init();
  341.         while(1)//进入死循环
  342.         {
  343.                 work();//调用工作函数
  344.                 display();
  345.                 if (FlagStartRH == 1)         //温湿度转换标志检查
  346.                 {
  347.             testnum = RH();
  348.                         FlagStartRH = 0;
  349.                         humidity = U8RH_data_H;         //读出湿度,只取整数部分
  350.                         if(humidity>=80)
  351.                         flag_HH=1;
  352.                         else
  353.                         flag_HH=0;
  354.                         TR0 = 1;
  355.                 }
  356.                 display();
  357.         }
  358. }

  359. //定时器0中断
  360. void Timer0_ISR (void) interrupt 1 using 0
  361. {
  362.         ui RHCounter;
  363.         TL0 = 0xb0;
  364.         TH0 = 0x3c;     //定时器赋予初值

  365.         //每5秒钟启动一次温湿度转换
  366.     RHCounter ++;
  367.     if (RHCounter >= 20)
  368.     {
  369.        FlagStartRH = 1;
  370.            RHCounter = 0;
  371.            TR0=0;
  372.     }
  373. }
复制代码

所有资料51hei提供下载:
晾衣架.rar (235.43 KB, 下载次数: 41)


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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