




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
工作在手動模式工作在手動模式是否按下打開否是電動機正轉否是是否按下停止是否按下關閉否是完全打開是電動機反轉否是是否按下停止是完全打開否否否否否否圖4.3手動模式工作流程圖4.2BH1750FVI數字型光強度值讀取主要程序寫好BH1750FVI的初始化程序后,主要通過Single_Read_BH1750(ucharREG_Address)和voidMultiple_read_BH1750(void)子程序讀取光線強度數據。ucharSingle_Read_BH1750(ucharREG_Address)////單字節讀取//{ucharREG_data;BH1750_Start();//起始信號//BH1750_SendByte(SlaveAddress);//發送設備地址加寫信號//BH1750_SendByte(REG_Address);//發送存儲單元地址,從最開始的單元開始// BH1750_Start();BH1750_SendByte(SlaveAddress+1);//發送設備地址加讀信號//REG_data=BH1750_RecvByte();//讀出寄存器數據// BH1750_SendACK(1); BH1750_Stop();//信號停止//returnREG_data;}voidMultiple_read_BH1750(void)///連續讀出BH1750內部數據{uchari; BH1750_Start();///起始信號//BH1750_SendByte(SlaveAddress+1);///發送設備地址加讀信號// for(i=0;i<3;i++){BUF[i]=BH1750_RecvByte();if(i==3){BH1750_SendACK(1);//還回NOACK//}else{ BH1750_SendACK(0);//回應ACK//}}BH1750_Stop();////停止信號//Delay5ms();}4.3紅外遙控解碼程序及工作程序以下是紅外遙控數值鍵解碼的工作程序,例如數字0x16為按鍵0的操作,flag_num為光標的標記,在設置時光標起指示移動之用。voidir_display() {ucharbuf,i;disp[4]=ircode[2];//數字鍵的數據碼從0到9和加減if(disp[4]==0x16||disp[4]==0x18||disp[4]==0x0c||disp[4]==0x5a||disp[4]==0x52||disp[4]==0x42 ||disp[4]==0x5e||disp[4]==0x1c||disp[4]==0x08 ||disp[4]==0x4a) { switch(disp[4]) { case0x16:buf=0;flag_num++;break; case0x0c:buf=1;flag_num++;break; case0x18:buf=2;flag_num++;break; …… } disp[4]=0;//接受下一次做好準備// if(flag_num==1) sum=buf; if(flag_num>2) {flag_num=0; sum=sum*10+buf; } for(i=0;i<4;i++) //關閉接收防止進入死循環// ircode[i]=0; }}gkey()為除數字鍵咦外的功能鍵程序。voidgkey(){uchari;receive();disp[4]=ircode[2];if(disp[4]==0x45||disp[4]==0x47||disp[4]==0x46||disp[4]==0x46||disp[4]==0x44||disp[4]==0x43) {switch(disp[4]) {case0x45:kai=1;guan=0;break;//打開// case0x47:kai=0;guan=1;break;//關閉// case0x46:kai=0;guan=0;break;//停止// case0x44:zidong++;break; //手動自動切換// case0x43:wangnianli++;break;//查看萬年歷// } if(zidong>1) zidong=0; if(wangnianli>1) wangnianli=0; for(i=0;i<4;i++) //關閉接收防止進入死循環// ircode[i]=0; }} 4.4溫濕度傳感器工作程序voidread_init(){DHT=0; //使DHT11低電平并延時至少18ms// delay_ms(21); DHT=1; //置DHT11高電平20~40us,并等待從機相應// delay_10us(); …… DHT=1; if(!DHT)//從機發出響應信號// {flag=2; while((!DHT)&&flag++);//等待從機發高電平結束// flag=2; while(DHT&&flag++); //開始采集數據// tr_shiZ=read_datadht();//采集濕度整數部分// tr_shiX=read_datadht();//采集濕度小數部分// tr_wenZ=read_datadht();//采集溫度整數部分// tr_wenX=read_datadht();//采集溫度小數部分// check=read_datadht(); //采集校驗位// } DHT=0; delay(20);//采集完數據后// }charread_datadht(){ uchari,num,tempp; num=0; for(i=0;i<8;i++) {flag=2; while((!DHT)&&flag++);//等待50毫秒低電平// delay_10us();//延時判斷0還是1// …… if(DHT==1) {tempp=1; flag=2; while(DHT&&flag++); } else tempp=0; num<<=1; num|=tempp; } return(num);}濕度(shiZ)的值和預設定值shidu[0]進行比較,如果在設定的早晚時間之間,當shiZ大于shidu[0]就執行打開窗簾通風。4.5早晚定時開窗主要程序在早晚定時的程序中,如果當前時間不在早晚定時之間,dayflag為0,如果當前時間在早晚定時之間,dayflag為1。程序段為:read_init();//讀傳感器數據//read_time();//讀時間子程序//if((am[0]*10000+am[1]*10)<(shi*10000+fen*10)<(pm[0]*10000+pm[1])*10)dayflag=1;elsedayflag=0;利用dayflag就可以控制while里的程序。while((temp>(SET_guangqiang+20)||(dayflag==0))&&(closeall==0)&&zidong){…...}4.6電動機模塊以打開窗簾為例,程序段為:dakai(){inti,j;for(i=0;i<16;i++) for(j=0;j<8;j++) { {P1=(P1&0x0f)|(0xf0&); DelayMS(1); } } …… }其中因為P1的低字節已作為按鍵使用,所以P1=(P1&0x0f)|(0xf0&FFW[j]使得P1的高字節(FFW[j]的值依j的變化次循環)在不影響P1低字節變化的情況下,去驅動步進電機。同理可以完成關閉窗簾的函數程序guanbi()。4.7紅外對管程序控制定義2個全局變量openall(完全打開)、closeall(完全關閉),信號分別從引腳是P1.0和P1.1輸入。如果窗簾已完全關閉,則closeall為高電平;如果窗簾已完全打開,則closeall為低電平。例如:intopenall,closeall;while((temp>(SET_guangqiang+20)||(dayflag==0))&&(closeall==0)&&zidong){……}while(((temp<(SET_guangqiang.20)||shiZ>shidu[0])&&(dayflag==1))&&(openall==1)&&zidong){……}只有closeall為低電平才能執行第一個while循環體內容(關閉操作),只有openall為高電平才能執行第一個while循環體內容(打開操作)。4.8系統主程序voidmain(){uintSET_guangqiang;uchari,j;while(1){floattempp; delay_ms(200); //延時200ms lcd_init();//初始化LCD Init_BH1750();//初始化BH1750 timer0init(); int0init();while(1){if(k4flag==1)//如果按下k4即設置鍵,進入調整時間 {lcd_wcmd(0x80); xianshi("智能窗簾時鐘"); lcd_wcmd(0x91); xianshi("20年月日"); lcd_wcmd(0x8A); xianshi("星期"); lcd_wcmd(0x9a); xianshi("00:00:00"); while(k4flag==1) {if(k1==0) { read_time();//讀時間子程序 dingwei(); } keyscan(); //設置退出 if(key4==0) {k4flag=0; } } if(key4==0) {k4flag=0; break; } } if(k4flag==0) {read_init();//讀傳感器數據 read_time();//讀時間子程序 //if((am[0]*10000+am[1]*10)<(shi*10000+fen*10)<(pm[0]*10000+pm[1])*10) if((am[0]*10000+am[1]*10)<(shi*10000+fen*10)<(pm[0]*10000+pm[1])*10) dayflag=1; elsedayflag=0; keyscan(); if(key4==0) {k4flag=1; break; } gkey(); if(wangnianli) {cwannianli();//查看萬年歷 } lcd_wcmd(0x80); xianshi("::"); receive(); if(ircode[2]==0x0d)//光線強度/濕度/早晚開關時間設置 {set(); } SET_guangqiang=guangqiang[0]*100+guangqiang[1]; tempp=tr_shiZ+tr_shiX+tr_wenZ+tr_wenX; if(check==tempp) { shiZ=tr_shiZ; str2[0]=shiZ/10+0x30; str2[1]=shiZ%10+0x30; } k(); while((temp>(SET_guangqiang+20)||(dayflag==0))&&(closeall==0)&&zidong) {guanbi();//晚上(設定值)或者光線小于設定值關閉窗簾 } while(((temp<(SET_guangqiang.20)||shiZ>shidu[0])&&(dayflag==1))&&(openall==1)&&zidong) {dakai();//早上(設定值)或者光線大于設定值打開窗簾 } while(zidong==0&&(kai==1||guan==1))//手動 { gkey(); while(zidong==0&&kai==1&&openall==1)//手動下打開 {gkey(); dakai(); } if(openall==0) break; while(zidong==0&&guan==1&&closeall==0)//手動下關閉 {gkey(); guanbi(); } if(closeall==1) break; } }}} }4.9小結本設計的模塊較多,要完成整體設計,必須模塊化設計。在開始,寫一個簡單的液晶12864的程序調試,因為利用它可以調試并顯示其他模塊的工作情況并顯示出來。首先,進行顯示界面的規劃、進行紅外遙控解碼、功能鍵等程序的編寫,編寫好DS1302的工作程序。然后,進行光線強度傳感器、濕度傳感器、紅外對管程序的設計。最后,把各個模塊程序加入的主程序中完成整體程序的設計。5系統調試5.1各模塊調試5.1.1電機模塊調試電動機模塊P1=(P1&0x0f)|(0xf0&FFW[j]使得P1的高字節(FFW[j]的值依j的變化次循環)在不影響P1低字節的變化,去驅動步進電機。調節延時函數即控制電動機轉速。FFW數組的值為{0x1f,0x3f,0x2f,0x6f,0x4f,0xcf,0x8f,0x9f},這樣滿足電動機正轉。同理同理可以利用REV數組的值為{0x9f,0x8f,0xcf,0x4f,0x6f,0x2f,0x3f,0x1f}完成電動機反轉。5.1.2時鐘模塊調試經過24小時過5秒的走時,測出和網絡時間吻合,如圖5.1時鐘電路和程序正常。測試前的走時測試前的走時24小時之后的走時圖5.1時鐘走時測試調試5.1.3濕度模塊調試圖5.2所示為室內濕度值和向濕度傳感器加濕氣的比較(濕度值55%RH增加到81%RH),濕度傳感器模塊工作正常。室內濕度值室內濕度值加濕氣后的濕度值圖5.2濕度傳感器調試5.1.4光線模塊調試在對著窗子較強的光線強度和室內燈光調試對比(光線強度由224Lx減少到148Lx)測試圖如圖5.3所示。圖5.3光線強度傳感器測試調試圖5.3光線強度傳感器測試調試5.1.5紅外遙控按鍵解碼及調試將遙控器按鍵面板如圖5.4所示的按鍵解碼,其對應的鍵值為圖5.5所示。00FF400FF463900FF473800FF443B00FF403F00FF433C00FF077800FF156A00FF097600FF166900FF199600FF0D7200FF0C7300FF186700FF5E2100FF087700FF1C6300FF5A2500FF432D00FF522D00FF4A35開開停關手/自時間確定0設置123456789圖5.4遙控版面重新設計圖5.5遙控解碼值5.1.6將電路按照圖3.12連接起來,測得P00和P01的電壓都0.2V,用一張透光性不強的布料穿過紅外對管,此時,接收管截止,測得P00和P01的電壓都4.6V。2個全局變量openall(完全打開)和closeall(完全關閉)分別為P00和P01的值,用于反饋信號(0.2V為低電平、4.6V為高電平),此時能夠使得電動機在窗簾完全打開和完全關閉時停下來。5.2系統整體調試經模塊調試,各模塊的工作正常。將整體程序燒錄,系統整體整體工作如下:首先,程序初始化,其包括單片機、液晶、各傳感器等模塊的初始化。然后,進入界面后按照DS1302原有的時間進行走時,該界面也提供一個萬年歷的功能,可以有用遙控查看時間(包括年、月、日、時、分、秒、星期的查看),如果不進行時間調整,就直接進入自動模式和手動模式的任意切換,默認下為自動模式。其中,圖5.6為用遙控設置預設值(最適宜的光線強度值、最大濕度值、早晚晚開窗時間)的工作界面;圖5.7為自動模式下光強變化工作圖片,預設置的最適宜光強為150Lx,室內光強控制在窗簾在150+20Lx,如大于170就關閉窗簾調整,小于130則打開窗簾調整。圖5.8是手動模式下關窗工作圖片,在此工作模式下,窗簾的開關不受預設值控制,只可以用遙控進行開關或者停等操作。圖5.6遙控設置預設值工作圖片圖5.6遙控設置預設值工作圖片圖5.7自動模式下光強變化工作圖片圖5.7自動模式下光強變化工作圖片圖5.8手動模式下關窗工作圖片圖5.8手動模式下關窗工作圖片5.3小結經過前面幾章的工作,調試階段很順利的進行。本章節先對顯示模塊、時鐘模塊、傳感器等功能模塊電路分別調試,然后整體調試直到調試成功。該控制器的顯示模塊、時鐘模塊、遙控器模塊、電動機模和各傳感器等都能正常工作,并且設計的功能和結果都達到了預期目的。該設計具體能經行光線強度檢測、溫濕度檢測、紅外遙控遠程控制;具有時鐘定時及萬年歷功能、各參數(光線強度、濕度、手動和自動工作模式、萬年歷等)的實時顯示功能;以及窗簾完全關閉和打開的自動檢測和控制。最實用的是,其可以根據自己設定的光線強度值自動控制窗簾的打開程度;當濕度過大時能打開窗簾;早晚定時開關窗簾。最終在模塊化設計和不斷調試中完成各項指標和功能。6結束語6.1結論本設計以STC89C54RD+為主控芯片,利用數字光強度、濕度、溫度、紅外對管等傳感器為外圍元件,經過信號電量轉換送人單片機,然后利用單片機發送控制信號驅動電機的轉動,最終完成了以下功能:光線強度檢測:通過光線強度傳感器實時檢測光線強弱,控制窗簾打開的合適程度,為室內提供設定的光線強度;時鐘定時及萬年歷功能:能提供一個簡單的萬年歷功能并能夠定時早晚開關窗簾;紅外遙控遠程控制:可以用遙控進行窗簾的開和關,以及各個參數的設置;濕度檢測:能完成濕度檢測,當房屋內濕度太大能自動打開窗簾進行通風;各參數(光線強度、濕度、工作模式、萬年歷等)的實時顯示;窗簾的完全關閉和打開的自動檢測及控制等。6.2展望本次設計的電動機模塊是模擬的有較大力矩的電動機,如果把該設計投入使用,則需要將它換成實際需要的電動機用控制脈沖控制即可。本設計本來是完成智能窗的設計,由于缺少機械的器件,換成了智能窗簾控制部分的設計,如果有需要可以加上滑輪組和玻璃窗即可完成設計。本設計還可以用IOIOforAndroidGoogleIOPIC單片機進行設計,它可以代替本設計中的紅外遙控完成無線控制。隨著Android設備的快速增加,用手機等Android設備去控制窗簾,可以顯得更加智能和方便。由于本學期的時間被耽擱,很遺憾沒去整合Android知識,直接用學過的51單片機進行了設計,希望以后有空能完成Android系統的智能窗控制器的設計。參考文獻[1]孫向濱.智能家居控制系統展望[J].科協論壇,2012(9):30-31.[2]侯海濤.國內外智能家居發展現狀[J].建材發展導向,2004(5):92-93.[3]馮旭升.奧蘭AL.CK01的智能窗簾機[J].住宅科技,2003(11):36-37.[4]李勝多,張還,佟春明.基于PLC的多功能智能窗的設計[J].青島農業大學學報(自然科學版),2010,27(1):84-88.[5]陳海松,夏繼媛.基于Zigbee技術的智能窗簾網絡化控制系統[J].電子設計工程,2012,20(15):136-138.[6]王俊杰.傳感器與檢測技術[M].北京:清華大學出版社,2011.[7]陳旦花.單片機最小系統的設計與應用[J].無線互聯科技,2012(10):103-104.[8]李偉躍.基于時鐘芯片DS1302的萬年歷的設計[J].技術創新,2012(9):20-21.[9]云中華,白天蕊.基于BH1750FVI的室內光照強度測量儀[J].單片機與嵌入式系統應用,2012,12(6):27-29.[10]倪健,董強.編碼解碼技術在紅外遙控器中的實現[N].中國民航飛行學院學報,2004,15(1):35-36.[11]朱志偉,劉湘云.基AT89S51的紅外遙控解碼的實現[J].科技信息,2009(34):109-112.[12]郭豫榮.溫濕度傳感器的原理及應用[J].電子元器件應用,2012,14(11):35-56.[13]王曉明.電動機的單片機控制[M].北京:北京航空航天大學出版社,2002.[14]王兆安,劉進軍.電力電子技術[M].北京:機械工程出版社,2011.[15]溫子祺.51單片機C語言創新教程[M].北京:航空航天大學出版社,2011.致謝該控制器設計的最終結果達到了預期的目的,在這過程中也遇到很多的困難,在此衷心感謝我的指導老師嚴文娟的悉心指導,從論文的選題、文獻的采集、總體設計、實物的制作、元件的購買、論文結構的布局到論文定稿,從標題到標點,內容到格式,她都費盡了心血。感謝嚴老師的辛勤栽培和孜孜教誨,在她的支持和幫助下順利地完本設計系統的設計及論文撰寫。在此,還要感謝長江師范學院物理學與電子工程學院和所有老師、同學們的支持,感謝他們在技術上的指導和為我們提供軟硬件的支持。特別感謝實驗室的各位老師對該設計做PCB由于自身專業水平實際應用能力及經驗有限,整篇論文肯定存在尚未發現的缺點和錯誤。懇請閱讀此篇論文的老師、同學,多予指正,不勝感激!附錄A原理圖、印制板圖和實物圖原理圖:印制板圖:實物圖及實物工作圖:成品圖:工作圖自動模式自動模式手動模式窗簾打開查看萬歷年窗簾打開查看萬歷年參數設置參數設置附錄B元件清單CommentValueDesignatorFootprint晶振11.0591MHZB1R38晶振32.768KZB2R38瓷片電容CapacitorC1,C2VP32-3.2電解電容CapacitorC3CAPR5-4X53V電源3VCR2032PCBComponent_1-duplicate-duplicate發光二極管TypicalBLUESiCLEDD13.5X2.8X1.9紅外對管發射管-D2,D43.5X2.8X1.9紅外對管接收管-D3,D5TO-220_A排阻1KR0HDR1X9電阻1K(R1,R4),10K,4.7K(R5-R8),220(R9,R11),9.1k,(R10,R12)R1,R2,R4,R5,R6,R7,R8,R9,R10,R11,R12AXIAL-0.4電位器1KR3PCBComponent_1-duplicate3按鍵-S0,S1,S2,S3,S4PCBComponent_1-duplicate4按鈕-S5PCBComponent_1-duplicate4單片機STC89C54U1DIP40時鐘芯片TrickleChargeTimekeepingChip,DS1302U2DIP8紅外接收頭和遙控器1838TU3HDR1X3H濕度傳感器DHT11U4HDR1X4光線強度傳感器BH1750FVIU5HDR1X5電動機驅動芯片ULN2003ADU6D016液晶顯示帶中文字庫12864液晶12864HDR1X20注:不包括電源元件清單附錄C使用說明書接上電源后,進行初始化,默認工作在自動模式:通過按鍵可以調整萬年歷的時間設置和查看;通過遙控可完成設置改控制器的工作參數(最適宜的光線強度值、最大濕度值、早晚開窗時間等);在12864的界面上能對各參數的實時顯示;在自動模式下預設值中,到開窗時間就打開窗簾,到關窗時間就關閉窗簾。有一個最適宜的光強度值,可根據實際的需要設點其值的大小。在開窗和關窗的設定值之間,如果高于設定濕度最大值,就會打開窗簾進行通風。按下遙控的手動和自動鍵,就可進行手動模式和自動模式的切換,在手動模式下可隨意開關窗簾,不受各預設參數的影響,按下“開”就打開,按下“關”就關閉,按下“停”就停止工作。根據需要可以調滑動變阻器的值,改變12864的顯示的亮暗程度。本設計包含有電源模塊、光線傳感器模塊、溫濕度傳感器模塊、紅外遙控器模塊、紅外對管模塊,必要時可分別對其維護。光線強度可以根據環境照度值(陰天室內:5—50;陰天室外:50—500;晴天室內:100—1000;夏季中午太陽光下的照度:約為10*6次方;閱讀書刊時所需的照度:50—60;家用攝像機標準照度:1400)進行設定自己要求。可以根據最有利的防病、治病環境(40%~55%RH;圖書、文物保管環境:40%-60%RH;棉毛織品存放:40%-60%RH;糖果、點心存放:50%~60%RH;蔬菜、水果存放:50%~70%RH;糧食存放:50%~70%RH)設定開窗的最大濕度值。附錄D程序主要程序:#include<reg52.h> #include<math.h>#include<reg52.h> #include<math.h>#include<stdio.h>#include<INTRINS.H>#defineucharunsignedchar#defineuintunsignedint #define SlaveAddress0x46uchark4flag; uchardayflag;ucharflag_num=0;uchararrows_x=1;ucharline_num=4;ucharrow_num=5;ucharset_flag,kai,guan,shoudong,zidong=1,wangnianli;uintdisp[4];uchark1;ucharplus=0,sub=0;ucharsum=0;ucharnian,yue,ri,xq,shi,fen,miao;ucharnian1,yue1,ri1,xq1,shi1,fen1,miao1;voidxianxq(ucharxq);charread_datadht();/////按鍵sbitkey3=P1^0;sbitkey2=P1^1;sbitkey1=P1^2;sbitkey4=P1^3;sbitopenall=P0^0;sbitcloseall=P0^1;sbitclk=P3^4;sbitIO=P3^5;sbitrst=P3^6;sbitACC0=ACC^0;sbitACC7=ACC^7;voiddelay(ucharz){uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}sbitDHT=P3^7;sbitSCL=P3^0;sbitSDA=P3^1;sbitLCD_RS=P0^7;sbitLCD_RW=P0^6; sbitLCD_EN=P0^5;sbitLCD_PSB=P0^4;sbitLCD_RST=P0^3;ucharidatastr1[]={""};//用來存放濕度數據unsignedcharidatastr2[]={""};//用來存放溫度數據unsignedcharidatastr3[]={""};//用來存放光強數據unsignedcharidatastr4[]={"自動"};unsignedcharidatastr5[]={"手動"};unsignedcharidataam[3]={7,30,0};unsignedcharidatapm[3]={20,0,0};unsignedcharidatashidu[1]={70};unsignedcharidataguangqiang[2]={1,50};unsignedcharcodedis2[]={"濕度%RH"};unsignedcharcodedis3[]={"光強LX"};unsignedcharcodedis4[]={"窗簾模式:"};unsignedlongidatazao_time_flag;//早上打開窗簾的時間標志unsignedlongidatanow_time_flag;unsignedlongidatawan_time_flag;//晚上打開窗簾的時間標志typedefunsignedcharBYTE;typedefunsignedshortWORD;typedefunsignedcharunint8;typedefunsignedcharunint16;BYTEBUF[8];ucharge,shi2,bai,qian,wan;intdis_data;unint8TH_data,TL_data,RH_data,RL_data,CK_data;unint8TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;unsignedinttemp_s,temp_w;unint8com_data,untemp,temp;unint8respond;ucharshiZ,shiX,wenZ,wenX,check;uchartr_shiZ,tr_shiX,tr_wenZ,tr_wenX;ucharflag;//定義紅外解碼所用變量charirtime;ucharstartflag,bitnum,irreceok,irprosok,l;ucharidatairdata[32];ucharidataircode[4];ucharidatadis8[8]; voidtimer0init(void)//計時器初始化{TMOD=0X02; TH0=0X00; TL0=0X00; ET0=1; EA=1; TR0=1;}voidint0init(void){IT1=1; EX1=1; EA=1;}voidirpros(void){ uchark,i,j; ucharvalue; k=1; for(j=0;j<4;j++) { for(i=0;i<8;i++) { value=value>>1; if(irdata[k]>6) { value=value|0x80; } k++; } ircode[j]=value; } irprosok=1;}//以下為中斷服務程序/////////voidtimer0()interrupt1{ irtime++;}voidint0()interrupt2{ if(startflag) { if(irtime>32) { bitnum=0; } irdata[bitnum]=irtime; irtime=0; bitnum++; if(bitnum==33) { bitnum=0; irreceok=1; } } else { startflag=1; irtime=0; }}/*****************************延時程序***********************************/voiddelayNOP(){_nop_();_nop_();_nop_();_nop_();}voiddelay_ms(unsignedcharms){unsignedchari;while(ms--){for(i=0;i<250;i++){ _nop_(); _nop_();_nop_();_nop_();}}}voiddelay_us(){unint8i;i--; i--; i--; i--; i--;}voiddelay_10us(){ uchari; i--; i--; i--; i--; i--; i--;}voidDelay5us(){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();}voidDelay5ms(){WORDn=560;while(n--);}/************************延時end****************************//*************12864程序段***********************************/////測試LCD忙碌狀態lcd_busy()為1時,忙,等待。lcd_busy()為0時,閑,可寫指令與數據。///bitlcd_busy(){ bitresult;LCD_RS=0; LCD_RW=1;LCD_EN=1; Delay5us(); result=(bit)(P0&0x80); LCD_EN=0; return(result);}voidlcd_wcmd(unsignedcharcmd){while(lcd_busy());LCD_RS=0; LCD_RW=0; LCD_EN=0; Delay5us(); P2=cmd; Delay5us(); LCD_EN=1; Delay5us(); LCD_EN=0;}voidlcd_wdata(unsignedchardat){while(lcd_busy()); LCD_RS=1;LCD_RW=0; LCD_EN=0; P2=dat; Delay5us(); LCD_EN=1; Delay5us(); LCD_EN=0;}voidlcd_init()//////LCD初始化設定{LCD_PSB=1;////并口方式LCD_RST=0;Delay5ms();LCD_RST=1;Delay5ms();lcd_wcmd(0x34);Delay5ms();lcd_wcmd(0x30);Delay5ms();lcd_wcmd(0x0C);Delay5ms();}///*/設定LCD顯示位置*/////voidlcd_dis_pos(unsignedcharX,unsignedcharY){unsignedcharpos;if(X==1){X=0x80;}elseif(X==2){X=0x90;}elseif(X==3){X=0x88;}elseif(X==4){X=0x98;}pos=X+Y;lcd_wcmd(pos);///////////////顯示地址}voidxianshi(uchar*s){while(*s>0) { lcd_wdata(*s); s++; } }voidlcd_pos(unsignedcharX,unsignedcharY){unsignedcharpos;if(X==1){pos=0x80;}elseif(X==2){pos=0x90;}elseif(X==3){pos=0x88;}elseif(X==4){pos=0x98;}lcd_wcmd(Y|pos);}/********************12864end************//*****************BH1750程序段*************/voidBH1750_Start()//起始信號{SDA=1;/////拉高數據線//SCL=1;////拉高時鐘線//Delay5us();////延時///SDA=0;//產生下降沿//Delay5us();////延時///SCL=0;/////拉低時鐘線///}voidBH1750_Stop()//停止信號{SDA=0;SCL=1;Delay5us();SDA=1;//產生上升沿Delay5us();}voidBH1750_SendACK(bitack)//發送應答信號入口參數:ack(0:ACK1:NAK){SDA=ack;SCL=1;Delay5us();SCL=0;//拉低時鐘線Delay5us();}bitBH1750_RecvACK()//接收應答信號{SCL=1;Delay5us();CY=SDA;SCL=0;Delay5us();returnCY;}voidBH1750_SendByte(BYTEdat)//////向IIC總線發送一個字節數據{BYTEi;for(i=0;i<8;i++){dat<<=1;SDA=CY;//送數據口SCL=1;Delay5us();SCL=0;Delay5us();}BH1750_RecvACK();}BYTEBH1750_RecvByte()//////從IIC總線接收一個字節數據{BYTEi;BYTEdat=0;SDA=1;//使能內部上拉,準備讀取數據,for(i=0;i<8;i++){dat<<=1;SCL=1;Delay5us();dat|=SDA;SCL=0;Delay5us();}returndat;}voidSingle_Write_BH1750(ucharREG_Address){BH1750_Start();//起始信號BH1750_SendByte(SlaveAddress);BH1750_SendByte(REG_Address);//BH1750_SendByte(REG_data);BH1750_Stop();}//////*/*單字節讀取*/*/ucharSingle_Read_BH1750(ucharREG_Address){ucharREG_data;BH1750_Start();BH1750_SendByte(SlaveAddress);BH1750_SendByte(REG_Address);BH1750_Start();BH1750_SendByte(SlaveAddress+1);//發送設備地址+讀信號REG_data=BH1750_RecvByte();//讀出寄存器數據 BH1750_SendACK(1); BH1750_Stop();returnREG_data;}voidMultiple_read_BH1750(void)//連續讀出BH1750內部數據{uchari; BH1750_Start();BH1750_SendByte(SlaveAddress+1); for(i=0;i<3;i++){BUF[i]=BH1750_RecvByte();if(i==3){BH1750_SendACK(1);}else{ BH1750_SendACK(0);////回應ACK}}BH1750_Stop();////停止信號Delay5ms();}voidInit_BH1750()//初始化BH1750{Single_Write_BH1750(0x01);}//*****************BH1750程序段end************//***************DHT11溫濕度傳感器************voidread_init(){ DHT=0; delay_ms(21); DHT=1; delay_10us(); delay_10us(); delay_10us(); delay_10us(); DHT=1; if(!DHT) { flag=2; while((!DHT)&&flag++); flag=2; while(DHT&&flag++); tr_shiZ=read_datadht(); tr_shiX=read_datadht(); tr_wenZ=read_datadht(); tr_wenX=read_datadht(); check=read_datadht(); } DHT=0; delay(20);//采集完數據后 }charread_datadht(){ uchari,num,tempp; num=0; for(i=0;i<8;i++) { flag=2; while((!DHT)&&flag++); delay_10us();//延時判斷0還是1 delay_10us(); delay_10us(); delay_10us(); if(DHT==1) { tempp=1; flag=2; while(DHT&&flag++); } else tempp=0; num<<=1; num|=tempp; } return(num);}voidwrite_sj1(uchardate)//12864時間的劃分{ ucharshi2,ge; shi2=date/10; ge=date%10; lcd_wdata(0x30+shi2); lcd_wdata(0x30+ge);}voidconversion(uinttemp_data){wan=temp_data/10000+0x30;temp_data=temp_data%10000; qian=temp_data/1000+0x30;temp_data=temp_data%1000;bai=temp_data/100+0x30;temp_data=temp_data%100;shi2=temp_data/10+0x30;temp_data=temp_data%10;ge=temp_data+0x30; }//***************DHT11溫濕度傳感器end***//************DS1302及按鍵時間調整階****voiddingwei()////12864年月日等的定位{ lcd_wcmd(0x92); write_sj1(nian); lcd_wcmd(0x94); write_sj1(yue); lcd_wcmd(0x96); write_sj1(ri); xianxq(xq); lcd_wcmd(0x9a); write_sj1(shi); lcd_wcmd(0x9c); write_sj1(fen); lcd_wcmd(0x9e); write_sj1(miao);}voidInputByte(ucharbyte1){ uchari; ACC=byte1; for(i=8;i>0;i--) { IO=ACC0; clk=1; clk=0; ACC=ACC>>1; } return;}ucharOutputByte(){ uchari; for(i=8;i>0;i--) { ACC=ACC>>1; ACC7=IO; clk=1; clk=0; } return(ACC);}voidwrite_ds1302(ucharadd,uchardate){ rst=0; _nop_(); clk=0; _nop_(); rst=1; InputByte(add); _nop_(); InputByte(date); clk=1; _nop_(); rst=0;}ucharread_ds1302(ucharadd){ uchardate; rst=0; _nop_(); clk=0; _nop_(); rst=1; InputByte(add); date=OutputByte(); clk=1; _nop_(); rst=0; return(date);}voidBCDTO(ucharnum1,ucharnum2){ num2=((num1&0x70)>>4)*10+(num1&0x0f);// return(num2);}voidTOBCD(ucharnum1,ucharnum2){ num1=((num2/10)<<4|(num2%10));// return(num1);}voidwrite_time(){ write_ds1302(0x8e,0x00); // TOBCD(nian1,nian); nian1=((nian/10)<<4|(nian%10)); write_ds1302(0x8c,nian1); //年// TOBCD(yue1,yue); yue1=((yue/10)<<4|(yue%10)); write_ds1302(0x88,yue1); //月// TOBCD(ri1,ri); ri1=((ri/10)<<4|(ri%10)); write_ds1302(0x86,ri1); //日// TOBCD(xq1,xq); xq1=((xq/10)<<4|(xq%10)); write_ds1302(0x8A,xq1); //星期// TOBCD(shi1,shi); shi1=((shi/10)<<4|(shi%10)); write_ds1302(0x84,shi1); //時// TOBCD(fen1,fen); fen1=((fen/10)<<4|(fen%10)); write_ds1302(0x82,fen1); //分// TOBCD(miao1,miao); miao1=((miao/10)<<4|(miao%10)); write_ds1302(0x80,miao1); //秒 write_ds1302(0x8e,0x80); //寫保護寄存器}voidread_time()//讀DS1302時間子程序{ miao1=read_ds1302(0x81); //秒寄存器// BCDTO(miao1,miao); miao=((miao1&0x70)>>4)*10+(miao1&0x0f); fen1=read_ds1302(0x83); //分// BCDTO(fen1,fen); fen=((fen1&0x70)>>4)*10+(fen1&0x0f); shi1=read_ds1302(0x85); //時// BCDTO(shi1,shi); shi=((shi1&0x70)>>4)*10+(shi1&0x0f); xq1=read_ds1302(0x8b); // BCDTO(xq1,xq); xq=((xq1&0x70)>>4)*10+(xq1&0x0f);//write_ds1302(0x8a,xq+1); ri1=read_ds1302(0x87); // BCDTO(ri1,ri); ri=((ri1&0x70)>>4)*10+(ri1&0x0f); yue1=read_ds1302(0x89); // BCDTO(yue1,yue); yue=((yue1&0x70)>>4)*10+(yue1&0x0f); nian1=read_ds1302(0x8d); // BCDTO(nian1,nian); nian=((nian1&0xf0)>>4)*10+(nian1&0x0f);}voidxianxq(ucharxq){ lcd_wcmd(0x8e); if(xq==1) xianshi("一"); if(xq==2) xianshi("二"); if(xq==3) xianshi("三"); if(xq==4) xianshi("四"); if(xq==5) xianshi("五"); if(xq==6) xianshi("六"); if(xq==7) xianshi("日");}ucharkeyscan()//鍵盤控制{ if(key1==0) { delay(45); if(key1==0) { while(!key1); k1++; switch(k1) { case1:lcd_wcmd(0x92);lcd_wcmd(0x0d);break; case2:lcd_wcmd(0x94);break; case3:lcd_wcmd(0x96);break; case4:lcd_wcmd(0x8e);break; case5:lcd_wcmd(0x9a);break; case6:lcd_wcmd(0x9c);break; case7:lcd_wcmd(0x9e);break; case8:k1=0;lcd_wcmd(0x0c); write_time();break; } } } if(k1!=0) { if(key2==0) { delay(45); if(key2==0) { while(!key2); if(k1==1)//nian { nian++; if(nian==100) nian=0; //qiehuan(1,nian); //write_sj(0x92,nian); write_sj1(nian); lcd_wcmd(0x92); } if(k1==2)//yue { yue++; if(yue>=13) yue=0; //qiehuan(1,yue); //write_sj(0x94,yue); write_sj1(yue); lcd_wcmd(0x94); } if(k1==3)//ri { ri++; if(ri==31) ri=0; //write_sj(0x96,ri); //qiehuan(1,ri); write_sj1(ri); lcd_wcmd(0x96); } if(k1==4)//xq { xq++; if(xq==8) xq=1; xianxq(xq); lcd_wcmd(0x8e); } if(k1==5)//shi { shi++; if(shi==24) shi=0; //write_sj(0x9a,shi); //qiehuan(1,shi); write_sj1(shi); lcd_wcmd(0x9a); } if(k1==6)//fen { fen++; if(fen==60) fen=0; //write_sj(0x9c,fen); //qiehuan(1,fen); write_sj1(fen); lcd_wcmd(0x9c); } if(k1==7)//miao { miao++; if(miao==60) miao=0; //write_sj(0x9e,miao); //qiehuan(1,miao); write_sj1(miao); lcd_wcmd(0x9e); } } } if(key3==0) { delay(45); if(key3==0) { while(!key3); if(k1==1)//nian { nian--; if(nian==-1) nian=99; //write_sj(0x92,nian); //qiehuan(2,nian); write_sj1(nian); lcd_wcmd(0x92); } if(k1==2)//yue { yue--; if(yue<=0) yue=12;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 圓盤流量計企業數字化轉型與智慧升級戰略研究報告
- 農產品初加工機械企業ESG實踐與創新戰略研究報告
- 康復輔具制造企業ESG實踐與創新戰略研究報告
- 有機發光二極管照明產品生產設備企業ESG實踐與創新戰略研究報告
- 異步交流電動機企業ESG實踐與創新戰略研究報告
- 企業不誠信合同樣本
- 勞務承攬卸車合同標準文本
- 加工項目分包合同標準文本
- 個人箱包工廠合同樣本
- 會展委托招商合同范例
- 2024年高考英語訓練動詞(謂語、非謂語)單句語法填空50題
- 七年級下冊數學平行線中拐點問題
- 2024年杭州市高三二模英語試卷及答案
- 走進歌劇世界智慧樹知到期末考試答案2024年
- 20G520-1-2鋼吊車梁(6m-9m)2020年合訂本
- 介入手術需要的設備
- (高清版)TDT 1036-2013 土地復墾質量控制標準
- 人際交往與溝通課件第六章 人際交往禮儀
- 社會穩定風險評估 投標方案(技術標)
- 銷售銷售數據分析培訓講義
- 超密集組網技術及其應用
評論
0/150
提交評論