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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4685|回復: 0
上一主題 下一主題
收起左側

貓砂盆自動除塵風機的設計實現

[復制鏈接]
跳轉到指定樓層
樓主


  • 家有惡貓,任性跋扈;
  • 貪吃貪睡,屎尿巨臭;
  • 爪力強勁,刨砂瘋狂;
  • 貓砂四濺,塵土飛揚;
  • 娘子過敏,噴嚏不止;
  • 吾心痛焉,技以治之;



本設計用到的元器件:
1.STC12C5068AD為主控;
2.DS1302為時鐘IC;
3.TD1030衛星定位授時模塊授時;
4.TM1637模塊用于顯示時間;
5.E18-D80NK型光電開關為觸發開關;
6.輔以土壤濕度監測模塊監測砂盆附近花盆里的土壤濕度;
7.對外輸出包括兩路低電平有效的繼電器模塊(控制風扇、水泵的開關)、蜂鳴器、指示燈等。

實現的主要功能:

1.在惡貓進入砂盆后出發光電開關輸出維持低電平,打開風扇開始通風除塵;
2.當惡貓大小便完畢離開砂盆,光電開關輸出恢復高電平,使用單片機PCA模塊的觸發捕獲功能捕獲上升沿跳變,風扇延時開啟2min后關閉;
3.每隔1h自動打開風扇2min通風除味;
4.每天早上07:10打開水泵30s向花盆噴水(潤濕植物表層);
5.當土壤濕度模塊檢測到土壤濕度過低,啟動水泵澆水;
6.每天早上7:00及晚上19:00自動打開衛星定位授時模塊校準時間。


電路原理圖如下:


部分單片機程序:
  1. #include "STC12C56XX.H"
  2. #include "intrins.h"
  3. #include "TM1637.h"
  4. #include "DS1302.h"
  5. /*定義各個端口*/
  6. sbit GPS_EN=P2^4;  //定義GPS模塊使能端口
  7. sbit LED=P2^5;     //定義GPS_LED開關端口
  8. sbit FAN=P2^6;     //定義風機信號端口(繼電器驅動)
  9. sbit PUMP=P2^7;    //定義水泵信號端口(繼電器驅動)
  10. sbit SPK=P3^7;     //定義蜂鳴器信號端口
  11. sbit SD=P1^0;           //定義土壤濕度信號端口(數字信號)
  12. sbit GPS_RST=P1^4; //GPS手動對時按鍵
  13. sbit SW=P3^5;           //定義觸發端口,低電平有效,一并捕獲上升沿觸發
  14. sbit EPCAI=IE^6;   //PCA模塊和LVD監測中斷允許位(在頭文件中為EPCA_LVD)
  15. /*定義各個變量、數組及標志位*/  
  16. unsigned char hour,min,sec,hourr,minr,secr,hour1,hour2,min1,min2;//小時,分鐘,秒鐘,小時收到,分鐘收到,秒鐘收到,小時十位,小時個位,分鐘十位,分鐘個位
  17. bit rev_start,rev_stop;  //串口接收開始標志位,接收停止標志位
  18. bit flagT,flag_PCA;                 //計時標志位,PCA觸發標志位
  19. unsigned int t50ms;                 //定時變量
  20. unsigned char buf[80];   //接收到GPS數據存儲到該數組

  21. void delayms(unsigned int xms)//ms延時函數
  22. {
  23. unsigned int i,j;
  24. for(i=0; i<xms; i++)
  25. for(j=0; j<500; j++);
  26. }
  27.                                                                                                                                           
  28. void USART_Init()           //串口及定時器0,1初始化
  29. {
  30.         TMOD=0x21;                   //定時器1工作在方式2,8位自動重裝,定時器0工作在模式1
  31.         SCON = 0x50;       //使用串行工作方式1,10位異步收發8位數據,波特率可變(由T1的溢出率控制)
  32.         TH1 = TL1=0xFD;    //9600波特率的初值
  33. //        TH1 = TL1=0xFA;    //4800波特率的初值
  34.         ES = 1;                           //開串口中斷
  35.         TR1 = 1;                   //允許T1計數
  36.         TH0 = 0x3C;                   //裝定時器0初值,TH0=(65535-50000)/256,TL0=(65535-50000)%256
  37.         TL0 = 0xB0;        //50ms中斷一次
  38.         ET0 = 1;                   //開T0中斷
  39.         TR0 = 1;                   //允許T0計數
  40.         EA=1;                           //開總中斷
  41. }

  42. void PCA_Init()                   //PCA初始化,關于計數部分的配置可注釋掉,這里只用到了捕獲模式
  43. {
  44.         CCON=0;            //初始化PCA控制寄存器,PCA定時器停止運行,清零CF標志位,清零所有模式中斷標志位
  45.         CL=0;              //重置PCA計數器
  46.         CH=0;
  47.         CMOD=0x00;         //設置PCA計數器時鐘源為Fosc/12,禁止PCA計數器溢出中斷
  48. //        CCAPM1=0x31;       //PCA模塊1工作在16位捕獲模式,跳變觸發
  49.         CCAPM1=0x21;       //PCA模塊1工作在16位捕獲模式,上升沿觸發
  50.         CR=1;              //PCA計數器啟動
  51.         EPCAI=1;           //開PCA中斷
  52.         EA=1;              //開總中斷
  53. }
  54. /*  NMEA0183協議中最簡定位信息GNRMC數據格式  */
  55. /*  $GNRMC,203741.00,A,3636.39993,N,12011.80057,E,0.023,,270718,,,A,V*19  */               
  56. /*  定位成功的GNRMC數據格式,串口調試模擬發送時務必要有換行標志"\n"符提示接收停止  */
  57. /*  $GNRMC,,V,,,,,,,,,,N,V*37  */
  58. /*  無信號時的GNRMC數據,即無效定位/授時數據,此時Write_time函數將從','和'V'中取值,所以需要判斷定位/授時數據的有效性  */
  59. void Write_time()//將GPS授時數據取值轉換并寫入DS1302
  60. {
  61.         if((rev_stop==1)&&(buf[0]=='R')&&(buf[2]=='C')&&(buf[4]!=','))//如果接收到GPRMC,從'R'開始接受計數,當buf[4]!=','時,授時數據有效,否則無效
  62.         {
  63.                 ES=0;                                                                           //關閉串口中斷
  64.                 hourr= (buf [4]-0x30)* 16+ buf[5] -0x30;   //取hour數值HEX
  65.                 minr=  (buf [6]-0x30)* 16+ buf[7]-0x30;           //取min數值HEX
  66.                 secr=  (buf[8]-0x30)* 16+ buf[9]-0x30;           //取sec數值HEX
  67.                 hourr=  hourr / 16 * 10 + hourr % 16;           //HEX-DEC
  68.                 hourr= (hourr+8) % 24;                     //UTC Time換算成北京時間,+8h
  69.                 hourr=hourr/10*16+hourr%10;                                   //DEC-HEX
  70.                 set_time(secr,minr,hourr);                                   //授時數據寫入DS1302
  71.                 ES=1;                                                                           //開啟串口中斷
  72.                 rev_stop=0;                                                                   //接收停止標志位清零
  73.         }
  74.         
  75. }

  76. void Read_time()                //從DS1302中讀取時間數據
  77. {
  78.         hour= ds1302_read(0x85);        //小時
  79.         min = ds1302_read(0x83);        //分鐘
  80.         sec = ds1302_read(0x81);        //秒鐘
  81. }

  82. void jisuan(void)               //根據接收到的授時數據取值
  83. {        
  84.         hour1=hour/16;                                //取hour十位
  85.         hour2=hour%16;                                //取hour個位
  86.         min1=min/16;                                //取min十位
  87.         min2=min%16;                                //取min個位
  88.         if (sec%2==0)                                //判斷sec奇偶
  89.         {
  90.                 hour2=hour2+10;                        //":"閃爍,間隔1s,亮1s,滅1s
  91.         }            
  92. }                                          

  93. void da()   //長鳴一聲,代表整點報時及動作開啟
  94. {
  95.         SPK=1;
  96.         delayms(2000);
  97.         SPK=0;
  98. }

  99. void daa()  //短鳴一聲,用于GPS授時時的聲音提示
  100. {
  101.         SPK=0;
  102.         delayms(1000);
  103.         SPK=1;
  104.         delayms(1000);
  105.         SPK=0;
  106. }

  107. void didi() //短鳴兩聲,代表動作結束
  108. {
  109.         SPK=1;
  110.         delayms(500);
  111.         SPK=0;
  112.         delayms(300);
  113.         SPK=1;
  114.         delayms(500);
  115.         SPK=0;
  116. }

  117. void shan()        //GPS模塊上的LED閃爍
  118. {
  119.         LED=0;
  120.         delayms(1000);
  121.         LED=1;
  122.         delayms(1000);
  123.         LED=0;
  124. }

  125. void Out(void) //定時輸出
  126. {                                                                 
  127.         if((min==0x30)&&(sec==0x00))                                  {da();}          //每隔1h(xxh30m00s時),蜂鳴器長鳴一聲
  128.         else if(((min>=0x30)&&(min<0x32))||(SW==0))                          {FAN=0;}               //風機啟動2min(xxh30m00s-xxh32m00s),如果光電開關被觸發且維持低電平,維持風機啟動
  129.         else if((min==0x32)&&(sec==0x00))                             {FAN=1;didi();}  //2min后(xxh32m00s時),關閉風機,蜂鳴器短鳴兩聲                        
  130.         else if((min==0x00)&&(sec==0x00))                             {da();}                   //每個整點(xxh00m00s時),蜂鳴器長鳴一聲,整點報時
  131.         else if((hour==0x07)&&(min==0x10)&&(sec==0x00))               {da();}               //每天早上07h10m00s,蜂鳴器長鳴一聲
  132.         else if((hour==0x07)&&(min==0x10)&&(sec<0x30)&&(sec>=0x00))          {PUMP=0;}                   //水泵啟動30s(07h10m00s-07h10m30s)
  133.         else if((hour==0x07)&&(min==0x10)&&(sec==0x30))                      {PUMP=1;didi();} //30s后(07h10m30s時),關閉水泵,蜂鳴器短鳴兩聲
  134.         else if(SD==1)                                                                              {PUMP=0;}                   //如果土壤濕度低于設定值,開啟水泵澆水
  135. //        else if(SW==0)                                                                                      {FAN=0;}                   //如果光電開關被觸發且維持低電平,維持風機啟動
  136.         else {FAN=PUMP=1;SPK=0;}
  137. }

  138. void chufa()           //PCA觸發定時執行
  139. {
  140.         if(flag_PCA==1)           //被觸發
  141.         {
  142.                 FAN=0;                   //開啟風機
  143.                 if(flagT==1)   //定時滿2min
  144.                 {
  145.                         FAN=1;           //關閉風機
  146.                         flagT=0;   //清零定時標志位
  147.                         flag_PCA=0;//清零觸發標志位
  148.                 }
  149.         }
  150. }

  151. void main()
  152. {
  153.         P2M0=0x00;
  154.         P2M1=0xf0;      //P24-P27強推挽輸出
  155.         P3M0=0x20;
  156.         P3M1=0x80;      //P37強推挽輸出,P35高阻輸入
  157.         FAN=PUMP=SW=1;        //關閉風機、水泵,觸發端口置高
  158.         SPK=0;                        //關閉蜂鳴器
  159.         GPS_EN=0;       //關閉GPS模塊
  160.         LED=1;                 //開啟GPS模塊上的LED
  161.         GPS_RST=1;                //GPS手動對時按鍵端口置高
  162.         PCA_Init();                //PCA初始化
  163.     USART_Init();        //串口及定時器0初始化
  164.         while(1)
  165.     {
  166.                 if(((hour==0x07)&&(min==0x00))||((hour==0x19)&&(min==0x00))||(GPS_RST==0))          //每天(07:00、19:00)定時打開GPS校準時間再關掉,對時持續1min,也可手動觸發校準
  167.                 {GPS_EN=1;shan();daa();ES=1;} //使能GPS模塊,LED閃爍,蜂鳴器鳴響,開啟串口中斷
  168.                 else
  169.                 {GPS_EN=0;LED=0;ES=0;}                  //關閉GPS模塊,LED關閉,關閉串口中斷                  
  170.                 Write_time();                 //向DS1302中寫入時間
  171.                 Read_time();                  //讀取DS1302中的時間數據
  172.                 Out();                        //輸出
  173.                 chufa();                                          //PCA觸發執行延時
  174.                 jisuan();                     //接收時間數據并取值
  175.                 xsled(hour1,hour2,min1,min2); //顯示時間
  176.     }
  177. }

  178. void Uart_Receive(void) interrupt 4   //串口中斷,接收GNRMC授時數據
  179. {
  180.         unsigned char ch,num;                          //定義接收字符、數組計數變量
  181.         ES = 0;                                                          //關閉串口
  182.         if (RI)                           //如果接收完成則進入
  183.         {
  184.                 ch=SBUF;                                          //從串口緩沖寄存器中取值
  185.                 if(ch=='R')                   //如果收到字符'R',便開始接收
  186.                 {
  187.                         rev_start=1;                          //接收開始標志位置1
  188.                         rev_stop =0;              //接收停止標志置0
  189.                 }
  190.                 if(rev_start==1)              //標志位為1,開始接收
  191.                 {
  192.                         buf[num++]=ch;            //字符存到數組中
  193.                         if (ch=='\n')             //如果接收到換行
  194.                         {
  195.                                 buf[num]='\n';
  196.                                 rev_start=0;                  //接收開始標志位置0
  197.                                 rev_stop=1;           //接收停止標志位置1
  198.                                 num=0;                                  //計數置0
  199.                         }
  200.                 }
  201.         }
  202.         RI = 0;                           //RI清0,重新接收
  203.         ES = 1;                           //串口1中斷允許
  204. }
  205. void TIM0(void) interrupt 1                          //定時器0中斷函數
  206. {
  207.         TH0 = 0x3C;                                                  //重裝初值
  208.         TL0 = 0xB0;
  209.         if(flag_PCA==1)                                          //如果觸發
  210.         {
  211.                 t50ms++;                                          //開始計時
  212.                 if(t50ms>=2400)                                  //計時滿2min時,實際測試約2min10sec
  213.                 {
  214.                         t50ms=0;                                  //清零計時變量
  215.                         flagT=1;                                  //計時標志位置1
  216.                 }
  217.         }
  218. }

  219. void PCA_isr() interrupt 6                  //PCA捕獲模式中斷函數
  220. {
  221.         CCF1=0;                           //清零中斷標志位
  222.         flag_PCA=1;                                                  //觸發執行標志位
  223. }                 
復制代碼

全部資料51hei下載地址:
GPS授時.zip (54.18 KB, 下載次數: 19)


評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:519389 發表于 2019-4-23 11:00
我現在做做貓用品產品,有興趣可以加微信一起探討,微信15889751140

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 男人亚洲天堂 | 成人免费淫片aa视频免费 | 欧美日韩一区二区三区四区 | 91视视频在线观看入口直接观看 | 爱爱综合网 | 免费在线视频一区二区 | 在线免费观看a级片 | 国产探花在线精品一区二区 | 久久久久久久久国产 | 97色在线视频 | 日韩欧美中文字幕在线观看 | 正在播放国产精品 | 成年女人免费v片 | 欧美mv日韩mv国产网站91进入 | 久久久久香蕉视频 | 国产一区91精品张津瑜 | 日本成人在线免费视频 | 久热精品免费 | 欧美综合在线观看 | 国产一区二区欧美 | a爱视频| 国产精品亚洲视频 | 一区二区三区四区免费视频 | 久久久久久国产精品久久 | 国产成人一区二区三区 | 操操网站 | 国产福利在线看 | 中文字幕日韩欧美一区二区三区 | 日韩在线一区二区 | 成年人视频在线免费观看 | 中文字幕高清av | 一区二区三区国产好 | 一区二区在线不卡 | 国产h视频| 中文字幕免费视频 | 日韩激情视频一区 | 精品国产乱码久久久久久牛牛 | 成人av一区二区三区 | 成人h动漫亚洲一区二区 | 成人av免费播放 | 国产xxxx岁13xxxxhd|