久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3427|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩在线成人 | 中文字幕av在线 | 日韩精品一区二区三区中文字幕 | 五月综合激情在线 | 久久综合久色欧美综合狠狠 | 91国产精品| 国产视频久 | 精品国产乱码久久久 | 精品国产成人 | 成人免费视频一区 | 伊人亚洲| 亚洲二区在线观看 | www.国产.com| 日本成人午夜影院 | 免费观看日韩av | 一区二区国产在线 | 亚洲三区视频 | 一区欧美 | 日韩影院在线 | 99福利视频 | 日韩欧美在线视频观看 | 精品99在线 | 久久国内 | 国产精品精品视频一区二区三区 | 国产精品亚洲精品 | 久久亚洲国产精品 | 国产色婷婷久久99精品91 | 一区二区三区日 | 91新视频| 一级日韩 | 午夜精品一区二区三区免费视频 | 成人aaa视频 | 中文字幕成人免费视频 | 中文字幕一区在线观看视频 | 国产免费xxx | 国产精品久久久久一区二区三区 | 久久久成人一区二区免费影院 | 91九色在线观看 | 午夜精品久久久久久久久久久久久 | 在线观看成年人视频 | 不卡一区二区在线观看 |