|
- 家有惡貓,任性跋扈;
- 貪吃貪睡,屎尿巨臭;
- 爪力強(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í)間。
電路原理圖如下:
原理圖.jpg (83.04 KB, 下載次數(shù): 77)
下載附件
簡(jiǎn)單原理圖
2018-8-27 06:18 上傳
部分單片機(jī)程序:
- #include "STC12C56XX.H"
- #include "intrins.h"
- #include "TM1637.h"
- #include "DS1302.h"
- /*定義各個(gè)端口*/
- sbit GPS_EN=P2^4; //定義GPS模塊使能端口
- sbit LED=P2^5; //定義GPS_LED開(kāi)關(guān)端口
- sbit FAN=P2^6; //定義風(fēng)機(jī)信號(hào)端口(繼電器驅(qū)動(dòng))
- sbit PUMP=P2^7; //定義水泵信號(hào)端口(繼電器驅(qū)動(dòng))
- sbit SPK=P3^7; //定義蜂鳴器信號(hào)端口
- sbit SD=P1^0; //定義土壤濕度信號(hào)端口(數(shù)字信號(hào))
- sbit GPS_RST=P1^4; //GPS手動(dòng)對(duì)時(shí)按鍵
- sbit SW=P3^5; //定義觸發(fā)端口,低電平有效,一并捕獲上升沿觸發(fā)
- sbit EPCAI=IE^6; //PCA模塊和LVD監(jiān)測(cè)中斷允許位(在頭文件中為EPCA_LVD)
- /*定義各個(gè)變量、數(shù)組及標(biāo)志位*/
- unsigned char hour,min,sec,hourr,minr,secr,hour1,hour2,min1,min2;//小時(shí),分鐘,秒鐘,小時(shí)收到,分鐘收到,秒鐘收到,小時(shí)十位,小時(shí)個(gè)位,分鐘十位,分鐘個(gè)位
- bit rev_start,rev_stop; //串口接收開(kāi)始標(biāo)志位,接收停止標(biāo)志位
- bit flagT,flag_PCA; //計(jì)時(shí)標(biāo)志位,PCA觸發(fā)標(biāo)志位
- unsigned int t50ms; //定時(shí)變量
- unsigned char buf[80]; //接收到GPS數(shù)據(jù)存儲(chǔ)到該數(shù)組
- void delayms(unsigned int xms)//ms延時(shí)函數(shù)
- {
- unsigned int i,j;
- for(i=0; i<xms; i++)
- for(j=0; j<500; j++);
- }
-
- void USART_Init() //串口及定時(shí)器0,1初始化
- {
- TMOD=0x21; //定時(shí)器1工作在方式2,8位自動(dòng)重裝,定時(shí)器0工作在模式1
- SCON = 0x50; //使用串行工作方式1,10位異步收發(fā)8位數(shù)據(jù),波特率可變(由T1的溢出率控制)
- TH1 = TL1=0xFD; //9600波特率的初值
- // TH1 = TL1=0xFA; //4800波特率的初值
- ES = 1; //開(kāi)串口中斷
- TR1 = 1; //允許T1計(jì)數(shù)
- TH0 = 0x3C; //裝定時(shí)器0初值,TH0=(65535-50000)/256,TL0=(65535-50000)%256
- TL0 = 0xB0; //50ms中斷一次
- ET0 = 1; //開(kāi)T0中斷
- TR0 = 1; //允許T0計(jì)數(shù)
- EA=1; //開(kāi)總中斷
- }
- void PCA_Init() //PCA初始化,關(guān)于計(jì)數(shù)部分的配置可注釋掉,這里只用到了捕獲模式
- {
- CCON=0; //初始化PCA控制寄存器,PCA定時(shí)器停止運(yùn)行,清零CF標(biāo)志位,清零所有模式中斷標(biāo)志位
- CL=0; //重置PCA計(jì)數(shù)器
- CH=0;
- CMOD=0x00; //設(shè)置PCA計(jì)數(shù)器時(shí)鐘源為Fosc/12,禁止PCA計(jì)數(shù)器溢出中斷
- // CCAPM1=0x31; //PCA模塊1工作在16位捕獲模式,跳變觸發(fā)
- CCAPM1=0x21; //PCA模塊1工作在16位捕獲模式,上升沿觸發(fā)
- CR=1; //PCA計(jì)數(shù)器啟動(dòng)
- EPCAI=1; //開(kāi)PCA中斷
- EA=1; //開(kāi)總中斷
- }
- /* NMEA0183協(xié)議中最簡(jiǎn)定位信息GNRMC數(shù)據(jù)格式 */
- /* $GNRMC,203741.00,A,3636.39993,N,12011.80057,E,0.023,,270718,,,A,V*19 */
- /* 定位成功的GNRMC數(shù)據(jù)格式,串口調(diào)試模擬發(fā)送時(shí)務(wù)必要有換行標(biāo)志"\n"符提示接收停止 */
- /* $GNRMC,,V,,,,,,,,,,N,V*37 */
- /* 無(wú)信號(hào)時(shí)的GNRMC數(shù)據(jù),即無(wú)效定位/授時(shí)數(shù)據(jù),此時(shí)Write_time函數(shù)將從','和'V'中取值,所以需要判斷定位/授時(shí)數(shù)據(jù)的有效性 */
- void Write_time()//將GPS授時(shí)數(shù)據(jù)取值轉(zhuǎn)換并寫(xiě)入DS1302
- {
- 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ú)效
- {
- ES=0; //關(guān)閉串口中斷
- hourr= (buf [4]-0x30)* 16+ buf[5] -0x30; //取hour數(shù)值HEX
- minr= (buf [6]-0x30)* 16+ buf[7]-0x30; //取min數(shù)值HEX
- secr= (buf[8]-0x30)* 16+ buf[9]-0x30; //取sec數(shù)值HEX
- hourr= hourr / 16 * 10 + hourr % 16; //HEX-DEC
- hourr= (hourr+8) % 24; //UTC Time換算成北京時(shí)間,+8h
- hourr=hourr/10*16+hourr%10; //DEC-HEX
- set_time(secr,minr,hourr); //授時(shí)數(shù)據(jù)寫(xiě)入DS1302
- ES=1; //開(kāi)啟串口中斷
- rev_stop=0; //接收停止標(biāo)志位清零
- }
-
- }
- void Read_time() //從DS1302中讀取時(shí)間數(shù)據(jù)
- {
- hour= ds1302_read(0x85); //小時(shí)
- min = ds1302_read(0x83); //分鐘
- sec = ds1302_read(0x81); //秒鐘
- }
- void jisuan(void) //根據(jù)接收到的授時(shí)數(shù)據(jù)取值
- {
- hour1=hour/16; //取hour十位
- hour2=hour%16; //取hour個(gè)位
- min1=min/16; //取min十位
- min2=min%16; //取min個(gè)位
- if (sec%2==0) //判斷sec奇偶
- {
- hour2=hour2+10; //":"閃爍,間隔1s,亮1s,滅1s
- }
- }
- void da() //長(zhǎng)鳴一聲,代表整點(diǎn)報(bào)時(shí)及動(dòng)作開(kāi)啟
- {
- SPK=1;
- delayms(2000);
- SPK=0;
- }
- void daa() //短鳴一聲,用于GPS授時(shí)時(shí)的聲音提示
- {
- SPK=0;
- delayms(1000);
- SPK=1;
- delayms(1000);
- SPK=0;
- }
- void didi() //短鳴兩聲,代表動(dòng)作結(jié)束
- {
- SPK=1;
- delayms(500);
- SPK=0;
- delayms(300);
- SPK=1;
- delayms(500);
- SPK=0;
- }
- void shan() //GPS模塊上的LED閃爍
- {
- LED=0;
- delayms(1000);
- LED=1;
- delayms(1000);
- LED=0;
- }
- void Out(void) //定時(shí)輸出
- {
- if((min==0x30)&&(sec==0x00)) {da();} //每隔1h(xxh30m00s時(shí)),蜂鳴器長(zhǎng)鳴一聲
- 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)
- else if((min==0x32)&&(sec==0x00)) {FAN=1;didi();} //2min后(xxh32m00s時(shí)),關(guān)閉風(fēng)機(jī),蜂鳴器短鳴兩聲
- else if((min==0x00)&&(sec==0x00)) {da();} //每個(gè)整點(diǎn)(xxh00m00s時(shí)),蜂鳴器長(zhǎng)鳴一聲,整點(diǎn)報(bào)時(shí)
- else if((hour==0x07)&&(min==0x10)&&(sec==0x00)) {da();} //每天早上07h10m00s,蜂鳴器長(zhǎng)鳴一聲
- else if((hour==0x07)&&(min==0x10)&&(sec<0x30)&&(sec>=0x00)) {PUMP=0;} //水泵啟動(dòng)30s(07h10m00s-07h10m30s)
- else if((hour==0x07)&&(min==0x10)&&(sec==0x30)) {PUMP=1;didi();} //30s后(07h10m30s時(shí)),關(guān)閉水泵,蜂鳴器短鳴兩聲
- else if(SD==1) {PUMP=0;} //如果土壤濕度低于設(shè)定值,開(kāi)啟水泵澆水
- // else if(SW==0) {FAN=0;} //如果光電開(kāi)關(guān)被觸發(fā)且維持低電平,維持風(fēng)機(jī)啟動(dòng)
- else {FAN=PUMP=1;SPK=0;}
- }
- void chufa() //PCA觸發(fā)定時(shí)執(zhí)行
- {
- if(flag_PCA==1) //被觸發(fā)
- {
- FAN=0; //開(kāi)啟風(fēng)機(jī)
- if(flagT==1) //定時(shí)滿2min
- {
- FAN=1; //關(guān)閉風(fēng)機(jī)
- flagT=0; //清零定時(shí)標(biāo)志位
- flag_PCA=0;//清零觸發(fā)標(biāo)志位
- }
- }
- }
- void main()
- {
- P2M0=0x00;
- P2M1=0xf0; //P24-P27強(qiáng)推挽輸出
- P3M0=0x20;
- P3M1=0x80; //P37強(qiáng)推挽輸出,P35高阻輸入
- FAN=PUMP=SW=1; //關(guān)閉風(fēng)機(jī)、水泵,觸發(fā)端口置高
- SPK=0; //關(guān)閉蜂鳴器
- GPS_EN=0; //關(guān)閉GPS模塊
- LED=1; //開(kāi)啟GPS模塊上的LED
- GPS_RST=1; //GPS手動(dòng)對(duì)時(shí)按鍵端口置高
- PCA_Init(); //PCA初始化
- USART_Init(); //串口及定時(shí)器0初始化
- while(1)
- {
- 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)
- {GPS_EN=1;shan();daa();ES=1;} //使能GPS模塊,LED閃爍,蜂鳴器鳴響,開(kāi)啟串口中斷
- else
- {GPS_EN=0;LED=0;ES=0;} //關(guān)閉GPS模塊,LED關(guān)閉,關(guān)閉串口中斷
- Write_time(); //向DS1302中寫(xiě)入時(shí)間
- Read_time(); //讀取DS1302中的時(shí)間數(shù)據(jù)
- Out(); //輸出
- chufa(); //PCA觸發(fā)執(zhí)行延時(shí)
- jisuan(); //接收時(shí)間數(shù)據(jù)并取值
- xsled(hour1,hour2,min1,min2); //顯示時(shí)間
- }
- }
- void Uart_Receive(void) interrupt 4 //串口中斷,接收GNRMC授時(shí)數(shù)據(jù)
- {
- unsigned char ch,num; //定義接收字符、數(shù)組計(jì)數(shù)變量
- ES = 0; //關(guān)閉串口
- if (RI) //如果接收完成則進(jìn)入
- {
- ch=SBUF; //從串口緩沖寄存器中取值
- if(ch=='R') //如果收到字符'R',便開(kāi)始接收
- {
- rev_start=1; //接收開(kāi)始標(biāo)志位置1
- rev_stop =0; //接收停止標(biāo)志置0
- }
- if(rev_start==1) //標(biāo)志位為1,開(kāi)始接收
- {
- buf[num++]=ch; //字符存到數(shù)組中
- if (ch=='\n') //如果接收到換行
- {
- buf[num]='\n';
- rev_start=0; //接收開(kāi)始標(biāo)志位置0
- rev_stop=1; //接收停止標(biāo)志位置1
- num=0; //計(jì)數(shù)置0
- }
- }
- }
- RI = 0; //RI清0,重新接收
- ES = 1; //串口1中斷允許
- }
- void TIM0(void) interrupt 1 //定時(shí)器0中斷函數(shù)
- {
- TH0 = 0x3C; //重裝初值
- TL0 = 0xB0;
- if(flag_PCA==1) //如果觸發(fā)
- {
- t50ms++; //開(kāi)始計(jì)時(shí)
- if(t50ms>=2400) //計(jì)時(shí)滿2min時(shí),實(shí)際測(cè)試約2min10sec
- {
- t50ms=0; //清零計(jì)時(shí)變量
- flagT=1; //計(jì)時(shí)標(biāo)志位置1
- }
- }
- }
- void PCA_isr() interrupt 6 //PCA捕獲模式中斷函數(shù)
- {
- CCF1=0; //清零中斷標(biāo)志位
- flag_PCA=1; //觸發(fā)執(zhí)行標(biāo)志位
- }
復(fù)制代碼
全部資料51hei下載地址:
GPS授時(shí).zip
(54.18 KB, 下載次數(shù): 19)
2018-8-27 06:22 上傳
點(diǎn)擊文件名下載附件
程序 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|