找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4720|回復(fù): 0
上一主題 下一主題
收起左側(cè)

貓砂盆自動(dòng)除塵風(fēng)機(jī)的設(shè)計(jì)實(shí)現(xiàn)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:61349 發(fā)表于 2018-8-27 06:18 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式


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



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

實(shí)現(xiàn)的主要功能:

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


電路原理圖如下:


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

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

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

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

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

  93. void da()   //長(zhǎng)鳴一聲,代表整點(diǎn)報(bào)時(shí)及動(dòng)作開(kāi)啟
  94. {
  95.         SPK=1;
  96.         delayms(2000);
  97.         SPK=0;
  98. }

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

  107. void didi() //短鳴兩聲,代表動(dòng)作結(jié)束
  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) //定時(shí)輸出
  126. {                                                                 
  127.         if((min==0x30)&&(sec==0x00))                                  {da();}          //每隔1h(xxh30m00s時(shí)),蜂鳴器長(zhǎng)鳴一聲
  128.         else if(((min>=0x30)&&(min<0x32))||(SW==0))                          {FAN=0;}               //風(fēng)機(jī)啟動(dòng)2min(xxh30m00s-xxh32m00s),如果光電開(kāi)關(guān)被觸發(fā)且維持低電平,維持風(fēng)機(jī)啟動(dòng)
  129.         else if((min==0x32)&&(sec==0x00))                             {FAN=1;didi();}  //2min后(xxh32m00s時(shí)),關(guān)閉風(fēng)機(jī),蜂鳴器短鳴兩聲                        
  130.         else if((min==0x00)&&(sec==0x00))                             {da();}                   //每個(gè)整點(diǎn)(xxh00m00s時(shí)),蜂鳴器長(zhǎng)鳴一聲,整點(diǎn)報(bào)時(shí)
  131.         else if((hour==0x07)&&(min==0x10)&&(sec==0x00))               {da();}               //每天早上07h10m00s,蜂鳴器長(zhǎng)鳴一聲
  132.         else if((hour==0x07)&&(min==0x10)&&(sec<0x30)&&(sec>=0x00))          {PUMP=0;}                   //水泵啟動(dòng)30s(07h10m00s-07h10m30s)
  133.         else if((hour==0x07)&&(min==0x10)&&(sec==0x30))                      {PUMP=1;didi();} //30s后(07h10m30s時(shí)),關(guān)閉水泵,蜂鳴器短鳴兩聲
  134.         else if(SD==1)                                                                              {PUMP=0;}                   //如果土壤濕度低于設(shè)定值,開(kāi)啟水泵澆水
  135. //        else if(SW==0)                                                                                      {FAN=0;}                   //如果光電開(kāi)關(guān)被觸發(fā)且維持低電平,維持風(fēng)機(jī)啟動(dòng)
  136.         else {FAN=PUMP=1;SPK=0;}
  137. }

  138. void chufa()           //PCA觸發(fā)定時(shí)執(zhí)行
  139. {
  140.         if(flag_PCA==1)           //被觸發(fā)
  141.         {
  142.                 FAN=0;                   //開(kāi)啟風(fēng)機(jī)
  143.                 if(flagT==1)   //定時(shí)滿2min
  144.                 {
  145.                         FAN=1;           //關(guān)閉風(fēng)機(jī)
  146.                         flagT=0;   //清零定時(shí)標(biāo)志位
  147.                         flag_PCA=0;//清零觸發(fā)標(biāo)志位
  148.                 }
  149.         }
  150. }

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

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

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

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


評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:519389 發(fā)表于 2019-4-23 11:00
我現(xiàn)在做做貓用品產(chǎn)品,有興趣可以加微信一起探討,微信15889751140

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表