基于51單片機(jī)的藍(lán)牙智能光控窗簾_第1頁
已閱讀1頁,還剩55頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論