版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 基于51單片機(jī)的藍(lán)牙智能光控窗簾</p><p><b> 設(shè)計(jì)思路</b></p><p> 系統(tǒng)選用 STC12C5A60S2 作為主控芯片,用以完成對(duì)系統(tǒng)執(zhí)行機(jī)構(gòu)的控制、信息處理和液晶顯示。 單片機(jī)控制直流減速電機(jī)實(shí)現(xiàn)窗簾、窗戶的控制。 光照強(qiáng)度、溫濕度信號(hào)均通過無線藍(lán)牙模塊傳輸至單片機(jī),經(jīng)處理后實(shí)現(xiàn)電機(jī)對(duì)窗戶、窗簾的自動(dòng)控制。<
2、/p><p> 根據(jù)設(shè)計(jì)方案和要求,可將電路分為 5 部分,分別為無線藍(lán)牙遙控,傳感器數(shù)據(jù)采集,電機(jī)驅(qū)動(dòng)控制,單片機(jī)主控和電源部分。</p><p><b> 系統(tǒng)結(jié)構(gòu)</b></p><p> 此方案控制采用51單片機(jī)的最小系統(tǒng)來驅(qū)動(dòng)步進(jìn)電動(dòng)機(jī)控制窗戶和窗簾的拉開和關(guān)閉。家居推拉窗及窗簾控制系統(tǒng)可以利用藍(lán)牙無線模塊根據(jù)室外環(huán)境亮度實(shí)現(xiàn)環(huán)境亮
3、度光控。以及光控狀態(tài)下環(huán)境亮度的控制參數(shù)的調(diào)整等等。該控制設(shè)計(jì)可謂是一款多功能的推拉窗及窗簾控制系統(tǒng)設(shè)計(jì)方案。</p><p> 系統(tǒng)軟件設(shè)計(jì)框圖如下:</p><p> 光強(qiáng)度傳感器 BH1750FVI</p><p> 不區(qū)分光源數(shù)字型環(huán)境光強(qiáng)度傳感器BH1750FVI是日本RHOM 株式會(huì)社近些年推出的一種兩線式串行總線接口的集成電路,可以根據(jù)收集的光線
4、強(qiáng)度數(shù)據(jù)來進(jìn)行環(huán)境監(jiān)測(cè),其具有1~65535x的高分辨率,可支持較大范圍的光照強(qiáng)度變化。BH1750FVI結(jié)構(gòu)框圖如圖1所示。圖1 BH1750FVI結(jié)構(gòu)框圖</p><p> 從結(jié)構(gòu)框圖可容易看出,外部光照被接近人眼反應(yīng)的 高精度光敏二極管PD探測(cè)到后,通過集成運(yùn)算放大器將 PD電流轉(zhuǎn)換為 PD電壓,由模數(shù)轉(zhuǎn)換器獲取 16位數(shù)字?jǐn)?shù) 據(jù),然后被邏輯和IC界面進(jìn)行數(shù)據(jù)處理與存儲(chǔ)。OSC為 內(nèi)部的振蕩器提供內(nèi)部邏
5、輯時(shí)鐘,通過相應(yīng)的指令操作即 可讀取出內(nèi)部存儲(chǔ)的光照數(shù)據(jù)。數(shù)據(jù)傳輸使用標(biāo)準(zhǔn)的 I2 C總線,按照時(shí)序要求操作起來也非常方便。</p><p><b> 溫濕傳感器:</b></p><p> DHT11數(shù)字溫濕度傳感器是一款含有已校準(zhǔn)數(shù)字信號(hào)輸出的溫濕度復(fù)合傳感器。它應(yīng)用專用的數(shù)字模塊采集技術(shù)和溫濕度傳感技術(shù),確保產(chǎn)品具有極高的可靠性與卓越的長(zhǎng)期穩(wěn)定性。傳感器包括
6、一個(gè)電阻式感濕元件和一個(gè)NTC測(cè)溫元件,并與一個(gè)高性能8位單片機(jī)相連接。因此該產(chǎn)品具有品質(zhì)卓越、超快響應(yīng)、抗干擾能力強(qiáng)、性價(jià)比極高等優(yōu)點(diǎn)。每個(gè)DHT11傳感器都在極為精確的濕度校驗(yàn)室中進(jìn)行校準(zhǔn)。校準(zhǔn)系數(shù)以程序的形式儲(chǔ)存在OTP內(nèi)存中,傳感器內(nèi)部在檢測(cè)信號(hào)的處理過程中要調(diào)用這些校準(zhǔn)系數(shù)。單線制串行接口,使系統(tǒng)集成變得簡(jiǎn)易快捷。超小的體積、極低的功耗,信號(hào)傳輸距離可達(dá)20米以上,使其成為各類應(yīng)用甚至最為苛刻的應(yīng)用場(chǎng)合的最佳選則。產(chǎn)品為 4
7、針單排引腳封裝。連接方便,特殊封裝形式可根據(jù)用戶需求而提供。</p><p><b> 電機(jī)驅(qū)動(dòng)</b></p><p> L298N 的說明及應(yīng)用</p><p> 恒壓恒流橋式2A 驅(qū)動(dòng)芯片L298NL298 是SGS 公司的產(chǎn)品,比較常見的是15 腳Multiwatt 封裝的L298N,內(nèi)部同樣包含4 通道邏輯驅(qū)動(dòng)電路。可以方便的驅(qū)
8、動(dòng)兩個(gè)直</p><p> 流電機(jī),或一個(gè)兩相步進(jìn)電機(jī)。L298N 芯片可以驅(qū)動(dòng)兩個(gè)二相電機(jī),也可以驅(qū)動(dòng)一個(gè)四相電機(jī),輸出電壓最高可達(dá)50V,可以直接通過電源來調(diào)節(jié)輸出電壓;可以直接用</p><p> 單片機(jī)的IO 口提供信號(hào);而且電路簡(jiǎn)單,使用比較方便。L298N 可接受標(biāo)準(zhǔn)TTL 邏輯電平信號(hào)VSS,VSS 可接4.5~7 V 電壓。4 腳VS 接電源電壓,VS 電壓范圍VIH
9、為+2.5~46 V。輸出電流可達(dá)2 A,可驅(qū)動(dòng)電感性負(fù)載。1 腳和15 腳下管的發(fā)射極分別單獨(dú)引出以</p><p> 便接入電流采樣電阻,形成電流傳感信號(hào)。L298 可驅(qū)動(dòng)2 個(gè)電動(dòng)機(jī),OUT1,OUT2 和OUT3,OUT4 之間可分別接電動(dòng)機(jī),本實(shí)驗(yàn)裝置我們選用驅(qū)動(dòng)一臺(tái)電動(dòng)機(jī)。5,7,10,12 腳接輸入控制電平,控制電機(jī)的正反轉(zhuǎn)。EnA,EnB 接控制使能端,控制電機(jī)的停轉(zhuǎn)。表1 是L298N 功能邏
10、輯圖。L298N <wbr>驅(qū)動(dòng)模塊的應(yīng)用In3,In4 的邏輯圖與表1 相同。由表1 可知EnA 為低電平時(shí),輸入電平對(duì)電機(jī)控制起作用,當(dāng)EnA 為高電平,輸入電平為一高一低,電機(jī)</p><p> 正或反轉(zhuǎn)。同為低電平電機(jī)停止,同為高電平電機(jī)剎停。</p><p> L298N 控制器原理如下:</p><p> 控制軟件流程圖(多個(gè))<
11、/p><p><b> 傳感器控制程序</b></p><p> 凡是利用一定的物性(物理、化學(xué)、生物)法則、定理、定律、效應(yīng)等進(jìn)行能量轉(zhuǎn)換與信息轉(zhuǎn)換,并且輸出與輸入嚴(yán)格一一對(duì)應(yīng)的器件和裝置均可稱為傳感器;傳感器又被稱為變換器、轉(zhuǎn)換器、檢測(cè)器、敏感元件、換能器和一次儀表等。傳感器一般由敏感元件、轉(zhuǎn)換元件和測(cè)量電路三部分組成,有時(shí)還加上輔助電源。系統(tǒng)中的傳感器是感受被測(cè)
12、量的大小并輸出相對(duì)應(yīng)的可用輸出信號(hào)的器件或裝置。數(shù) 據(jù)傳輸環(huán)節(jié)用來傳輸數(shù)據(jù)。當(dāng)檢測(cè)系統(tǒng)的幾個(gè)功能環(huán)節(jié)獨(dú)立地分隔開的時(shí)候,則必須由一 個(gè)地方向另一個(gè)地方傳輸數(shù)據(jù),數(shù)據(jù)傳輸環(huán)節(jié)就是完成這種傳輸功能。</p><p><b> 中斷控制程序</b></p><p> 當(dāng)傳感器模塊傳來的數(shù)據(jù)并判斷正確時(shí),則中斷程序?qū)1口進(jìn)行初始化,進(jìn)而接收來自兩個(gè)模塊的新數(shù)據(jù),比較判斷
13、后傳到命令地址進(jìn)而對(duì)電機(jī)進(jìn)行驅(qū)動(dòng)和通過顯示器顯示出來。</p><p><b> 中斷控制程序</b></p><p><b> 電機(jī)驅(qū)動(dòng)程序</b></p><p> 步進(jìn)電機(jī)執(zhí)行來自控制器的命令,判斷其命令是否正確,若不正確則返回,若正確則繼續(xù)執(zhí)行命令,比較做出相應(yīng)的動(dòng)作,當(dāng)窗簾及推拉窗到達(dá)指定的位置時(shí)停止,器流
14、程圖如下。</p><p><b> 主要程序的指令:</b></p><p> 附錄一:藍(lán)牙無線模塊</p><p> 附錄二:DHT11數(shù)字溫濕度傳感器</p><p> 附錄三:光強(qiáng)度傳感器BH1750</p><p><b> 附錄一:</b></p&
15、gt;<p><b> 藍(lán)牙無線模塊:</b></p><p><b> 修改at:</b></p><p> #include <SoftwareSerial.h> // 引用程式庫</p><p> SoftwareSerial BT(8, 9); // 接收腳, 傳送腳</
16、p><p> char val; // 儲(chǔ)存接收資料的變數(shù)</p><p> void setup() {</p><p> Serial.begin(9600); // 與電腦序列埠連線</p><p> Serial.println("BT is ready!");</p><p>
17、 // 設(shè)定藍(lán)牙模組的連線速率</p><p> BT.begin(9600);</p><p><b> }</b></p><p> void loop() {</p><p> // 若收到「序列埠監(jiān)控視窗」的資料,則送到藍(lán)牙模組</p><p> if (Serial.avail
18、able()) {</p><p> val = Serial.read();</p><p> BT.print(val);</p><p><b> }</b></p><p> // 若收到藍(lán)牙模組的資料,則送到「序列埠監(jiān)控視窗」</p><p> if (BT.available
19、()) {</p><p> val = BT.read();</p><p> Serial.print(val);</p><p><b> }</b></p><p><b> }</b></p><p><b> 從機(jī):</b><
20、/p><p> void setup()</p><p><b> {</b></p><p> Serial.begin(9600);</p><p><b> }</b></p><p> void loop()</p><p><b&
21、gt; {</b></p><p> while(Serial.available())</p><p><b> {</b></p><p> char c=Serial.read();</p><p> if(c=='A')</p><p><b&g
22、t; {</b></p><p> Serial.println("Hello I am amarino");</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p
23、><p><b> 主機(jī):</b></p><p> void setup(){</p><p> Serial.begin(9600);</p><p><b> }</b></p><p> void loop(){</p><p> Se
24、rial.println('A'); // 發(fā)送A </p><p> while(1); </p><p><b> }</b></p><p><b> 附錄二:</b></p><p> DHT11數(shù)字溫濕度傳感器:</p><p> U8 c
25、ode table2[]=" wendu shidu ";</p><p> U8 code table3[]=" . . ";</p><p> sbit RS=P2^6;</p><p> sbit RW=P2^5;</p><p> sbit E=P2^7;&l
26、t;/p><p> void write_com(U8 com)</p><p><b> {</b></p><p><b> E=0;</b></p><p><b> RS=0;</b></p><p><b> RW=0;<
27、/b></p><p><b> Delay(5);</b></p><p><b> E=1;</b></p><p><b> P0=com;</b></p><p><b> E=0;</b></p><p>&
28、lt;b> }</b></p><p> void write_date(U8 date)</p><p><b> {</b></p><p><b> E=0;</b></p><p><b> RS=1;</b></p><
29、p><b> RW=0;</b></p><p><b> Delay(5);</b></p><p><b> E=1;</b></p><p><b> P0=date;</b></p><p><b> E=0;</b
30、></p><p><b> P0=0;</b></p><p><b> }</b></p><p> void init()</p><p><b> {</b></p><p><b> U8 num;</b
31、></p><p> Delay(15);</p><p> write_com(0x38);</p><p> write_com(0x38);</p><p> write_com(0x38);</p><p> write_com(0x0c);</p><p> writ
32、e_com(0x06);</p><p> write_com(0x01);</p><p> for(num=0;num<15;num++)</p><p><b> {</b></p><p> write_date(table2[num]);</p><p><b>
33、 Delay(1);</b></p><p><b> }</b></p><p> write_com(0x80+0x40);</p><p> for(num=0;num<15;num++)</p><p><b> {</b></p><p>
34、; write_date(table3[num]);</p><p><b> Delay(1);</b></p><p><b> }</b></p><p><b> }</b></p><p> void write_dht11(U8 add,U8 date)&
35、lt;/p><p><b> {</b></p><p> U8 shi,ge; </p><p> shi=date/10; </p><p> ge=date%10;</p><p> write_com(0x80+0x40+add);</p><p>
36、write_date(0x30+shi);</p><p> write_date(0x30+ge);</p><p><b> }</b></p><p> /***********************dht11.h***************************/</p><p> typedef
37、unsigned char U8; </p><p> typedef unsigned int U16;</p><p> sbit P1_0 = P2^0 ; </p><p> U8 U8FLAG,k; </p><p> U8 U8temp; </p><p> U8 U8T_da
38、ta_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata; </p><p> U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp; </p><p> U8 U8comdata; </p><
39、p> void Delay(U16 z)</p><p><b> {</b></p><p><b> U8 x,y;</b></p><p> for(x=z;x>0;x--)</p><p> for(y=110;y>0;y--);</p><p
40、><b> }</b></p><p> void delay_10us() </p><p><b> { </b></p><p><b> U8 i; </b></p><p><b> i--; </b></p>&
41、lt;p><b> i--; </b></p><p><b> i--; </b></p><p><b> i--; </b></p><p><b> i--; </b></p><p><b> i--; </b&g
42、t;</p><p><b> }</b></p><p> void COM(void) //數(shù)據(jù)0 1確認(rèn)</p><p><b> { </b></p><p><b> U8 i; </b></p><p> for(i=0;i<
43、;8;i++) </p><p><b> { </b></p><p> U8FLAG=2; </p><p> while((!P1_0)&&U8FLAG++); //1bit是否結(jié)束</p><p> delay_10us(); </p><p> del
44、ay_10us(); </p><p> delay_10us(); </p><p> U8temp=0;// 26us~28us 表示為0</p><p> if(P1_0)U8temp=1; //超過28us依然為高電平 表示為1</p><p> U8FLAG=2; </p><p> while(
45、(P1_0)&&U8FLAG++); </p><p> if(U8FLAG==1)break;//U8FLAG溢出超時(shí)則跳出for循環(huán) </p><p> //判斷數(shù)據(jù)位是0還是1 </p><p> // 如果高電平高過預(yù)定0高電平值則數(shù)據(jù)位為 1 </p><p> U8comdata<
46、<=1; </p><p> U8comdata|=U8temp; </p><p><b> } </b></p><p><b> } </b></p><p> void RH(void) //-----濕溫度讀取子程序 ------------ </p><
47、p><b> { </b></p><p><b> P1_0=0; </b></p><p> Delay(34); //主機(jī)拉低高于18ms </p><p><b> P1_0=1; </b></p><p> //總線由上拉電阻拉高 主機(jī)延時(shí)20us
48、 </p><p> delay_10us(); </p><p> delay_10us(); </p><p> delay_10us(); </p><p> delay_10us(); </p><p> P1_0=1;//主機(jī)設(shè)為輸入 判斷從機(jī)響應(yīng)信號(hào) </p><p>
49、 if(!P1_0)//判斷從機(jī)是否有低電平響應(yīng)信號(hào) 如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行 </p><p><b> { </b></p><p> U8FLAG=2; </p><p> while((!P1_0)&&U8FLAG++);//判斷從機(jī)是否發(fā)出 80us 的低電平響應(yīng)信號(hào)是否結(jié)束 </p&g
50、t;<p> U8FLAG=2; </p><p> while((P1_0)&&U8FLAG++);//判斷從機(jī)是否發(fā)出 80us 的高電平, 如發(fā)出則進(jìn)入數(shù)據(jù)接收狀態(tài) </p><p> COM();//數(shù)據(jù)接收狀態(tài) </p><p> U8RH_data_H_temp=U8comdata; //濕度整數(shù)8位<
51、/p><p><b> COM(); </b></p><p> U8RH_data_L_temp=U8comdata; //濕度小數(shù)8位</p><p><b> COM(); </b></p><p> U8T_data_H_temp=U8comdata; //溫度整數(shù)8位</p&g
52、t;<p><b> COM(); </b></p><p> U8T_data_L_temp=U8comdata; //溫度小數(shù)8位</p><p><b> COM(); </b></p><p> U8checkdata_temp=U8comdata; //校驗(yàn)位</p><
53、;p> P1_0=1; U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp); </p><p> if(U8temp==U8checkdata_temp) //數(shù)據(jù)校驗(yàn) 正確執(zhí)行 </p><p><b> { </b></p>&
54、lt;p> U8RH_data_H=U8RH_data_H_temp; </p><p> U8RH_data_L=U8RH_data_L_temp; </p><p> U8T_data_H=U8T_data_H_temp; </p><p> U8T_data_L=U8T_data_L_temp; </p><p> U8
55、checkdata=U8checkdata_temp; </p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> /***********************main.c**********
56、*****************/</p><p> #include <reg52.h> </p><p> #include <LCD1602.h></p><p> U16 a,b,t;</p><p> U8 flag,i;</p><p> void main() <
57、;/p><p><b> {</b></p><p><b> RW=1;</b></p><p><b> t=0;</b></p><p><b> flag=0;</b></p><p> TMOD=0x01;<
58、/p><p> TH0=(65536-50000)/256;</p><p> TL0=(65536-50000)%256;</p><p><b> EA=1;</b></p><p><b> ET0=1;</b></p><p><b> TR0=1;&
59、lt;/b></p><p><b> init();</b></p><p><b> P1_0=1;</b></p><p><b> P2=0xff;</b></p><p> Delay(40);</p><p><b>
60、 while(1)</b></p><p><b> { </b></p><p><b> RH();</b></p><p> write_dht11(0,U8T_data_H);</p><p> write_dht11(3,U8T_data_L);</p>
61、<p> write_dht11(9,U8RH_data_H);</p><p> write_dht11(12,U8RH_data_L);</p><p> if(flag==2)//100后flag為2,進(jìn)行比較</p><p><b> {</b></p><p> if(a==U8T_dat
62、a_H&&b==U8RH_data_H)</p><p><b> Buzzer=0;</b></p><p> while(a==U8T_data_H&&b==U8RH_data_H);</p><p><b> flag=0;</b></p><p><
63、;b> }</b></p><p><b> test();</b></p><p><b> }</b></p><p><b> }</b></p><p> void timer0() interrupt 1</p><p&
64、gt;<b> {</b></p><p> TH0=(65536-50000)/256;</p><p> TL0=(65536-50000)%256;</p><p><b> t++;</b></p><p> if(t==2000)//100秒檢測(cè)一次</p>&l
65、t;p><b> {</b></p><p><b> t=0;</b></p><p> flag=2;//100秒后flag為2</p><p><b> }</b></p><p> if(flag==0)//最開始 flag為0 賦值</p>
66、;<p><b> {</b></p><p> a=U8T_data_H;</p><p> b=U8RH_data_H;</p><p> flag=1;//flag變化</p><p><b> }</b></p><p><b>
67、}</b></p><p><b> 附錄三:</b></p><p> 光強(qiáng)度傳感器BH1750:</p><p> //使用時(shí),用戶只需更改GPIO_Pin_14、GPIO_Pin_15這兩個(gè)引腳,并在主函數(shù)里面調(diào)用此函數(shù)即可。void BH1750_Get_Guang( float *Zhaodu)</p>
68、<p> #include "stm32f10x_lib.h"</p><p> #define uchar unsigned char</p><p> #define uint unsigned int</p><p> #define DataPort P0 //LCD1602數(shù)據(jù)端口</p>
69、<p> #define SlaveAddress 0x46 //定義器件在IIC總線中的從地址,根據(jù)ALT ADDRESS地址引腳不同修改</p><p> //ALT ADDRESS引腳接地時(shí)地址為0x46,接電源時(shí)地址為0xB8</p><p> #define BH1750_SCL GPIO_Pin_14 </p><p&
70、gt; #define BH1750_SDA GPIO_Pin_15 </p><p> //#define GPIO_I2C GPIOB</p><p> #define BH1750_SCL_0() GPIOF->BRR=BH1750_SCL</p><p> #define BH1750_SCL_1() GPIOF->BSRR
71、=BH1750_SCL</p><p> #define BH1750_SDA_0() GPIOF->BRR=BH1750_SDA</p><p> #define BH1750_SDA_1() GPIOF->BSRR=BH1750_SDA</p><p> #define BH1750_SDA_STATE() (GPIOF->ID
72、R&BH1750_SDA) //{ return (GPIOB->IDR & PIN_SDA) != 0; }</p><p> typedef unsigned char BYTE;</p><p> typedef unsigned short WORD;</p><p> BYTE BUF[8];
73、 //接收數(shù)據(jù)緩存區(qū) </p><p> uchar ge,shi,bai,qian,wan; //顯示變量</p><p> int dis_data; //變量</p><p> void Init_BH1750(void);</p&
74、gt;<p> void conversion(uint temp_data);</p><p> void Single_Write_BH1750(uchar REG_Address); //單個(gè)寫入數(shù)據(jù)</p><p> uchar Single_Read_BH1750(uchar REG_Address);
75、 //單個(gè)讀取內(nèi)部寄存器數(shù)據(jù)</p><p> void Multiple_Read_BH1750(void); //連續(xù)的讀取內(nèi)部寄存器數(shù)據(jù)</p><p> //------------------------------------</p><p> u8 BH1750_Start(void
76、); </p><p> void BH1750_Stop(void); </p><p> u8 BH1750_SendByte(u8 Data); </p><p> u8 BH1750_ReceiveByte(void); </p><p> void BH1750_SendACK(void); </p&g
77、t;<p> void BH1750_SendNACK(void);</p><p> void BH1750_Nop(void );</p><p> void BH1750_Delay(unsigned int k) ;</p><p> //-----------------------------------</p>&l
78、t;p> u8 BH1750_ACK =0; </p><p> u8 BH1750_READY =0; </p><p> u8 BH1750_NACK =1; </p><p> u8 BH1750_BUS_BUSY =2; </p><p> u8 BH1750_BUS_ERROR =
79、3; </p><p> u8 BH1750_RETRY_COUNT = 3; //重試次數(shù) </p><p> void BH1750_Nop(void) </p><p><b> { </b></p><p><b> u8 i=50; </b></p><
80、;p><b> while(i) </b></p><p><b> i--; </b></p><p><b> } </b></p><p> void BH1750_Delay(unsigned int k)</p><p><b> {
81、</b></p><p> unsigned int i,j;</p><p> for(i=0;i<k;i++)</p><p><b> {</b></p><p> for(j=0;j<121;j++);</p><p><b>
82、; }</b></p><p><b> }</b></p><p> /******************************************************************************* </p><p> * 函數(shù)名稱:IIC_START
83、 </p><p> * 描 述:發(fā)送啟動(dòng) </p><p> *
84、 </p><p> * 輸 入:無 </p><p> * 輸 出:無
85、 </p><p> * 返 回:無 </p><p> * 作 者:
86、 </p><p> * 修改日期:2010年6月8日 </p><p> ************************************************************************
87、*******/ </p><p> u8 BH1750_Start(void) </p><p><b> { </b></p><p> BH1750_SDA_1(); </p><p> BH1750_Nop(); </p><p> BH1750_SCL_1();
88、 </p><p> BH1750_Nop(); </p><p> if(!BH1750_SDA_STATE()) </p><p><b> { </b></p><p> ////DebugPrint("TWI_START:BUSY\n"); </p>
89、<p> return BH1750_BUS_BUSY; </p><p><b> } </b></p><p> BH1750_SDA_0(); </p><p> BH1750_Nop();</p><p> BH1750_SCL_0(); </p><p>
90、 BH1750_Nop(); </p><p> if(BH1750_SDA_STATE()) </p><p><b> { </b></p><p> ////DebugPrint("TWI_START:BUS ERROR\n"); </p><p> return BH17
91、50_BUS_ERROR; </p><p><b> } </b></p><p> return BH1750_READY; </p><p><b> } </b></p><p> /* -------------------------------------------
92、-------------------------------*/ </p><p><b> /** </b></p><p> * @Brief: IIC_STOP </p><p><b> */ </b></p><p> /* ----------------------
93、----------------------------------------------------*/ </p><p> void BH1750_Stop(void) </p><p><b> { </b></p><p> BH1750_SDA_0(); </p><p> BH1750_N
94、op(); </p><p> BH1750_SCL_1(); </p><p> BH1750_Nop(); </p><p> BH1750_SDA_1(); </p><p> BH1750_Nop(); </p><p> //////DebugPrint("TWI_ST
95、OP\n"); </p><p><b> } </b></p><p> /* --------------------------------------------------------------------------*/ </p><p><b> /** </b></p
96、><p> * @Brief: IIC_SendACK </p><p><b> */ </b></p><p> /* --------------------------------------------------------------------------*/ </p><p> void B
97、H1750_SendACK(void) </p><p><b> { </b></p><p> BH1750_SDA_0(); </p><p> BH1750_Nop(); </p><p> BH1750_SCL_1(); </p><p> BH1750_Nop();
98、 </p><p> BH1750_SCL_0(); </p><p> BH1750_Nop(); </p><p> BH1750_SDA_1(); </p><p> //////DebugPrint("TWI_SendACK\n"); </p><p><
99、b> } </b></p><p> /* --------------------------------------------------------------------------*/ </p><p><b> /** </b></p><p> * @Brief: IIC_SendNACK &
100、lt;/p><p><b> */ </b></p><p> /* --------------------------------------------------------------------------*/ </p><p> void BH1750_SendNACK(void) </p><p>
101、;<b> { </b></p><p> BH1750_SDA_1(); </p><p> BH1750_Nop(); </p><p> BH1750_SCL_1(); </p><p> BH1750_Nop(); </p><p> BH1750_SCL_0();
102、 </p><p> BH1750_Nop(); </p><p> //////DebugPrint("TWI_SendNACK\n"); </p><p><b> } </b></p><p> /* ----------------------------------
103、----------------------------------------*/ </p><p><b> /** </b></p><p> * @Brief: TWI_SendByte </p><p><b> * </b></p><p> * @Param: Dat
104、a </p><p><b> * </b></p><p> * @Returns: </p><p><b> */ </b></p><p> /* ---------------------------------------------------------------
105、-----------*/ </p><p> u8 BH1750_SendByte(u8 Data) </p><p><b> { </b></p><p><b> u8 i; </b></p><p> BH1750_SCL_0(); </p><p&g
106、t; for(i=0;i<8;i++) </p><p><b> { </b></p><p> //---------數(shù)據(jù)建立---------- </p><p> if(Data&0x80) </p><p><b> { </b></p>
107、<p> BH1750_SDA_1(); </p><p><b> } </b></p><p><b> else </b></p><p><b> { </b></p><p> BH1750_SDA_0(); </p>
108、<p><b> } </b></p><p> Data<<=1; </p><p> BH1750_Nop(); </p><p> //---數(shù)據(jù)建立保持一定延時(shí)---- </p><p> //----產(chǎn)生一個(gè)上升沿[正脈沖] </p><p&
109、gt; BH1750_SCL_1(); </p><p> BH1750_Nop(); </p><p> BH1750_SCL_0(); </p><p> BH1750_Nop();//延時(shí),防止SCL還沒變成低時(shí)改變SDA,從而產(chǎn)生START/STOP信號(hào) </p><p> //------------------
110、--------- </p><p><b> } </b></p><p> //接收從機(jī)的應(yīng)答 </p><p> BH1750_SDA_1(); </p><p> BH1750_Nop(); </p><p> BH1750_SCL_1(); </
111、p><p> BH1750_Nop(); </p><p> if(BH1750_SDA_STATE()) </p><p><b> { </b></p><p> BH1750_SCL_0(); </p><p> BH1750_SDA_1(); </p>
112、<p> //////DebugPrint("TWI_NACK!\n"); </p><p> return BH1750_NACK; </p><p><b> } </b></p><p><b> else </b></p><p><b&
113、gt; { </b></p><p> BH1750_SCL_0(); </p><p> BH1750_SDA_1(); </p><p> //////DebugPrint("TWI_ACK!\n"); </p><p> return BH1750_ACK; </p>
114、<p><b> } </b></p><p><b> } </b></p><p> /* --------------------------------------------------------------------------*/ </p><p><b>
115、/** </b></p><p> * @Brief: IIC_ReceiveByte </p><p><b> * </b></p><p> * @Returns: </p><p><b> */ </b></p><p> /*
116、 --------------------------------------------------------------------------*/ </p><p> u8 BH1750_ReceiveByte(void) </p><p><b> { </b></p><p> u8 i,Dat; </p>
117、<p> BH1750_SDA_1(); </p><p> BH1750_SCL_0(); </p><p><b> Dat=0; </b></p><p> for(i=0;i<8;i++) </p><p><b> { </b></p>
118、<p> BH1750_SCL_1();//產(chǎn)生時(shí)鐘上升沿[正脈沖],讓從機(jī)準(zhǔn)備好數(shù)據(jù) </p><p> BH1750_Nop(); </p><p> Dat<<=1; </p><p> if(BH1750_SDA_STATE()) //讀引腳狀態(tài) </p><p><b>
119、 { </b></p><p> Dat|=0x01; </p><p><b> } </b></p><p> BH1750_SCL_0();//準(zhǔn)備好再次接收數(shù)據(jù) </p><p> BH1750_Nop();//等待數(shù)據(jù)準(zhǔn)備好 </p>
120、<p><b> } </b></p><p> //////DebugPrint("TWI_Dat:%x\n",Dat); </p><p> return Dat; </p><p><b> }</b></p><p> //*********
121、************************************************</p><p> //void conversion(uint temp_data) // 數(shù)據(jù)轉(zhuǎn)換出 個(gè),十,百,千,萬</p><p><b> //{ </b></p><p> // wan=temp_data/10000
122、+0x30 ;</p><p> // temp_data=temp_data%10000; //取余運(yùn)算</p><p> //qian=temp_data/1000+0x30 ;</p><p> // temp_data=temp_data%1000; //取余運(yùn)算</p><p> // bai=
123、temp_data/100+0x30 ;</p><p> // temp_data=temp_data%100; //取余運(yùn)算</p><p> // shi=temp_data/10+0x30 ;</p><p> // temp_data=temp_data%10; //取余運(yùn)算</p><
124、;p> // ge=temp_data+0x30; </p><p><b> //}</b></p><p> //*********************************</p><p> void Single_Write_BH1750(uchar REG_Address)</p><p
125、><b> {</b></p><p> BH1750_Start(); //起始信號(hào)</p><p> BH1750_SendByte(SlaveAddress); //發(fā)送設(shè)備地址+寫信號(hào)</p><p> BH1750_SendByte(REG_Address); //內(nèi)部寄存器地
126、址,</p><p> // BH1750_SendByte(REG_data); //內(nèi)部寄存器數(shù)據(jù),</p><p> BH1750_Stop(); //發(fā)送停止信號(hào)</p><p><b> }</b></p><p> //********單字節(jié)讀取***
127、**************************************</p><p><b> /*</b></p><p> uchar Single_Read_BH1750(uchar REG_Address)</p><p> { uchar REG_data;</p><p> BH1750_S
128、tart(); //起始信號(hào)</p><p> BH1750_SendByte(SlaveAddress); //發(fā)送設(shè)備地址+寫信號(hào)</p><p> BH1750_SendByte(REG_Address); //發(fā)送存儲(chǔ)單元地址,從0開始</p><p&
129、gt; BH1750_Start(); //起始信號(hào)</p><p> BH1750_SendByte(SlaveAddress+1); //發(fā)送設(shè)備地址+讀信號(hào)</p><p> REG_data=BH1750_RecvByte(); //讀出寄存器數(shù)據(jù)</p><p&g
130、t; BH1750_SendACK(1); </p><p> BH1750_Stop(); //停止信號(hào)</p><p> return REG_data; </p><p><b> }</b></p><p><b> */</b&g
131、t;</p><p> //*********************************************************</p><p><b> //</b></p><p> //連續(xù)讀出BH1750內(nèi)部數(shù)據(jù)</p><p><b> //</b></p>
132、;<p> //*********************************************************</p><p> void Multiple_Read_BH1750(void)</p><p> { uchar i;</p><p> BH1750_Start();
133、 //起始信號(hào)</p><p> BH1750_SendByte(SlaveAddress+1); //發(fā)送設(shè)備地址+讀信號(hào)</p><p> for (i=0; i<3; i++) //連續(xù)讀取2個(gè)地址數(shù)據(jù),存儲(chǔ)中BUF</p><p><b> {</b>&l
134、t;/p><p> BUF[i] = BH1750_ReceiveByte(); //BUF[0]存儲(chǔ)0x32地址中的數(shù)據(jù)</p><p> if (i == 3)</p><p><b> {</b></p><p> BH1750_SendNACK(); //最后一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于89c51單片機(jī)的智能窗簾
- 基于51單片機(jī)的智能窗簾的研究與設(shè)計(jì)
- 基于51單片機(jī)的聲控和光控路燈設(shè)計(jì)
- 基于單片機(jī)控制的智能窗簾設(shè)計(jì)
- 基于51單片機(jī)的藍(lán)牙遙控小車.doc
- 基于單片機(jī)的智能光控路燈的設(shè)計(jì)
- 基于51單片機(jī)的智能車
- 基于89c51單片機(jī)的光控路燈設(shè)計(jì)
- 基于51單片機(jī)藍(lán)牙開關(guān)控制家電系統(tǒng)
- 畢業(yè)設(shè)計(jì)(論文)+基于51單片機(jī)的智能窗簾的研究與設(shè)計(jì)
- 7基于單片機(jī)的智能光控路燈的設(shè)計(jì)
- 基于51單片機(jī)的智能窗戶設(shè)計(jì)
- 基于51單片機(jī)的智能公交系統(tǒng)
- 基于51單片機(jī)的智能臺(tái)燈設(shè)計(jì)
- 基于51單片機(jī)的智能臺(tái)燈設(shè)計(jì)
- 基于51單片機(jī)的智能尋跡小車
- 基于51單片機(jī)的智能門禁系統(tǒng)
- 基于51單片機(jī)的智能門禁系統(tǒng)
- 基于51單片機(jī)的智能小車設(shè)計(jì)
- 基于51單片機(jī)的智能臺(tái)燈設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論