智能燈控(基於ZigBee)

時間:2017年12月

階段:大二上學期

背景:單片機原理與應用課設

名稱:智能燈控

摘要

本系統實現了多方式控燈功能,有按鍵控燈、串口指令控燈、點對點無線射頻控燈、AI模式控燈。其中AI模式控燈是通過紅外模塊感應外界是否有人靠近來控制燈的亮滅及通過光敏傳感器模塊感應外界光照強度進而動態調整PWM佔空比的輸出來控制燈的亮度。

物聯網是新一代信息技術的重要組成部分,也是“信息化”時代的重要發展階段。互聯網是物聯網個過渡,物聯網將成爲新時代的發展靈魂。

處於AI時代來臨前的我深感可慶,傳統的燈控需要大量的佈線,若要實現雙控、三控及多控更是需要加大用線量,且開關還需要特別定製,及其麻煩,對於遠程控制更是不敢想象。

我們將要設計並打造出一款基於ZigBee模塊,多傳感器,多方式開關,遠程智能控制的燈控系統,達到智能照明的節能、環保、舒適、方便的功能。

 

關鍵詞  物聯網;智能;控制;LED燈

前言

1.1 系統研究背景

傳統的燈控需要大量的佈線,若要實現雙控、三控及多控更是需要加大用線量,且開關還需要特別定製,及其麻煩,對於遠程控制更是不敢想象。

1.2 系統研究的意義和目的

設計並打造出一款基於ZigBee模塊,多傳感器,多方式開關,遠程智能控制的燈控系統,達到智能照明的節能、環保、舒適、方便的功能。

系統概述

2.1 系統的結構

本系統有軟件和硬件兩部分組成。

軟件部分:串口調試助手,控制燈的亮滅、打開和關閉AI模式和實時監測燈的變化情況和日誌

硬件部分:兩個ZigBee模塊,其中控制模塊可以控制燈的亮滅和打開和關閉AI模式,被控制模塊有人體紅外感應模塊、光敏傳感器和LED發光二極管,其本身按鍵S1可以控制燈的亮滅,S2按鍵可以控制AI模式的開和關。AI模式是通過紅外感應模塊和光敏傳感器智能控燈。

                                                            圖2.1  系統結構圖

2.2  系統的功能

1)按鍵控燈:開發板按鍵S1可以控制燈的亮和滅;

2)串口控燈:串口調試助手可發1開燈,和0關燈,控制燈的亮和滅;

3)無線控燈:一對一無線控制燈的開關,安全,可靠,無線發送模塊的按鍵S1爲燈控按鍵;

4)AI模式控燈:智能燈控的核心,AI模式可以感應周圍是否有人經過來控制燈的開和關,並且可以根據外界的光照強度來調節自身燈的亮度,達到了節能、環保、舒適的絕佳效果;

5)多方式AI模式開關:本系統提供多方式控制AI模式的開啓和關閉,其方式有:按鍵S2、串口、無線發送模塊按鍵S2;

6)實時信息:串口助手實時上報燈的亮滅情況和當前受到哪方面的控制,如無線開燈時,串口將會顯示“----無線開燈成功-----”和“/////AI模式關閉/////”信息,以達到最佳安全級別。

2.3  開發環境

IAR Embedded Workbench微型處理器開發環境

 硬件系統設計

3.1  Zigbee芯片 CC2530

ZigBee是基於IEEE802.15.4標準的低功耗局域網協議。根據國際標準規定,ZigBee技術是一種短距離、低功耗的無線通信技術。這一名稱(又稱紫蜂協議)來源於蜜蜂的八字舞,由於蜜蜂(bee)是靠飛翔和“嗡嗡”(zig)地抖動翅膀的“舞蹈”來與同伴傳遞花粉所在方位信息,也就是說蜜蜂依靠這樣的方式構成了羣體中的通信網絡。其特點是近距離、低複雜度、自組織、低功耗、低數據速率。主要適合用於自動控制和遠程控制領域,可以嵌入各種設備。簡而言之,ZigBee就是一種便宜的,低功耗的近距離無線組網通訊技術。ZigBee是一種低速短距離傳輸的無線網絡協議。ZigBee協議從下到上分別爲物理層(PHY)、媒體訪問控制層(MAC)、傳輸層(TL)、網絡層(NWK)、應用層(APL)等。其中物理層和媒體訪問控制層遵循IEEE 802.15.4標準的規定。

3.2  LED發光二極管

LED發光二極管採用的是2*5*7MM霧狀白藍色發光二極管,二極管的陽極接在ZigBee模塊的P1_0引腳,陰極接ZigBee模塊的GND引腳。

 

                        圖3.1  LED發光二極管實物圖

3.3 人體紅外感應模塊

人體紅外感應模塊採用的是完整版的HC-SR501人體模塊,自動感應,紅外感應模塊的VCC接在ZigBee模塊的5.0vVCC引腳,GND接在ZigBee模塊的GND 引腳,out接在ZigBee模塊的P1_3引腳。

            

圖3.2      人體紅外感應模塊原理圖             圖3.3     人體紅外感應模塊實物圖

 3.4 光敏電阻傳感器

光敏電阻傳感器採用的是4線光敏電阻傳感器模塊,光敏電阻型號爲:5516,本產品使用的是AO模擬量輸出,光敏電阻傳感器的VCC腳接在ZigBee模塊的3.3vVCC引腳,GND接在ZigBee模塊的GND引腳,AO接在ZigBee模塊的P0_5引腳。

             

圖3.4   光敏傳感器模塊原理圖                    圖 3.5  光敏傳感器模塊實物圖

軟件系統設計

4.1系統整體功能設計

ADC環境光照強度魔術轉換;PWM多級調光;多中斷智能處理;人體紅外感應;無線遠距離控制。

                                          圖4.1  程序流程圖

4.2  AI模式

AI模式可以感應周圍是否有人經過來控制燈的開和關,並且可以根據外界的光照強度來調節自身燈的亮度,達到了節能、環保、舒適的絕佳效果。

主函數while(1)循環裏,if((boozd==1)&&(P1_3==1))(boozd爲AI模式是否允許標誌位,P1_3==1表示當前有人經過)成立則會不斷獲取當前ADC環境光照強度魔術轉換後的值,然後用if(){}else if(){}方法與標準區間進行比較,若比較成功將會以當前區間所對應的LED亮度動態調整PWM佔空比輸出,然後將進行新判斷、獲取、比較。

 

                                      圖 4.2-1

如圖 4.2-1,串口調試助手發送 2,收到 CC2530 串口發送的的信息,此時紅外人體感應模塊和光敏傳感器模塊兩者協調工作,共同控制 LED 燈,也可以通過接收 CC2530 單片機的按鍵模塊的 S2 按鍵來打開和關閉 AI 模式,也可通過發送CC2530 單片機的按鍵 S2 來控制 AI 模式的啓動與關閉; 

                                      圖 4.2-2 

 如圖 4.2-2,系統處於 AI 模式時用手握緊光敏傳感器模塊,讓光敏傳感器模塊處於黑暗的環境下,可見 LED 燈的亮度 

 

                                    圖 4.2-3

 如圖 4.2-3,系統處於 AI 模式時,打開手機閃光燈靠近光敏傳感器模塊,可見LED 燈的亮度明顯降低,當閃光燈更加接近光敏傳感器模塊時,LED 燈會熄滅 

4.3 多中斷智能處理

本系統包含3大中斷處理函數:

1》》串口接收中斷處理函數:

#pragma vector=URX0_VECTOR 

__interrupt void urx0(){}

可判斷串口接收到的數據,然後進行智能處理,當接收到‘1’時,會以最大亮開燈和關閉AI模式,並且向串口調試助手發送“---串口開燈成功-----”和“----AI模式關閉-----”日誌,當收到‘0’時,將向串口發送“/////串口關燈成功////”日誌;當收到‘2’時,模塊將會利用標誌位判斷AI模式是否打開,若打開則進行關閉操作,並向串口發送“----AI模式打開-----”日誌;當收到其他數據時,模塊將向串口將會發送“!!!無該指令!!!”日誌。

 

                                          圖 4.3-1
如圖 4.3-1,串口調試助手發送‘1’,LED 燈會以全亮的形式打開,並關閉AI模式

                                        圖 4.3-2

如圖 4.3-2,串口調試助手發送‘0’,LED 燈熄滅 (2 按鍵中斷處理函數: 

#pragma vector=P0INT_VECTOR
__interrupt void p0int(){}
模塊按鍵有 S1 和 S2,分別對應的是 ZigBee 模塊的 P0_0 和 P0_1 引腳,S1可以控制燈的亮滅,當按鍵按下且 if(P0IFG&0x01)成立則表示可進入 S1 中斷處理函數,函數裏將根據標誌位狀態進行下一步操作,若標誌位顯示此時燈是滅的,則將會進行開燈功能,並向串口發送相應日誌;S2 可以控制 AI 模式的開和關,當按按下且 if(P0IFG&0x02)成立將進入 S2 中斷處理函數,函數裏將根據標誌位狀態進行下一步操作,若標誌位顯示此時 AI 模式已開啓,則會進行關閉 AI 模式操作,並先串口發送相應日誌。 

 

                                         圖 4.3-3
如圖 4.3-3,當按下接收 CC2530 單片機的按鍵模塊的 S2 按鍵,串口調
試助手收到單片機發來的 AI 模式打開的信息,此時 AI 模式正在運行中。

                                      圖 4.3-4
如圖 4.3-4,當再次按下接收 CC2530 單片機的按鍵模塊的 S2 按鍵,串口調試助手收到單片機發來的 AI 模式關閉信息,此時 LED 燈熄滅

                                        圖 4.3-5
如圖 4.3-5,當按下接收 CC2530 單片機的按鍵模塊的 S1 按鍵,串口調試
助手收到單片機發來的按鍵開燈成功和 AI 模式關閉信息,此時 LED 最亮顯示

                                         圖 4.3-6
如圖 4.3-6,當再次按下接收 CC2530 單片機的按鍵模塊的 S1 按鍵,串口調試助手收到單片機發來的 LED 關閉信息,此時 LED 燈熄滅
3》》RF 中斷處理函數

#pragma vector=RF_VECTOR __interrupt void x1(){}

 當 ZigBee 模式收到發送模塊數據時且 if(RFIRQF0 & 0x40)成立將進入 RF接收處理函數,讀取數據包的倒數第 4 和第 3 個有效字節,倒數第 3 位數據對應串口發送‘2’的功能,倒數第 4 位數據對應的是串口發送‘1’的功能 

 

                                          圖 4.3-7

如圖 4.3-7,當發送 CC2530 單片機模塊按下 S1 按鍵時 ,接受 CC2530 將會進入 RF 中斷,並收到“0x0D,0x51,0x88,0x00, 0x07,0x20,0xEF,0xBE,0x20, 0x50,'1','0'” 數據包,經過解析可知是控制燈的亮滅指令,接受單片機模塊執行開燈和關閉 AI 模式 

 

                                            圖 4.3-8

如圖 4.3-8,當發送 CC2530 單片機模塊再次按下 S1 按鍵時 ,接受CC2530 將會再次進入 RF 中斷,並再次接收到“0x0D,0x51,0x88,0x00, 0x07,0x20,0xEF,0xBE,0x20, 0x50,'1','0'” 數據包,經過解析可知是控制燈的亮滅指令,接受單片機模塊執行關燈操作 

 

                                       圖 4.3-9

如圖 4.3-9,當發送 CC2530 單片機模塊按下 S2 按鍵時 ,接受 CC2530 將會進入RF 中斷,並收到“0x0D,0x51,0x88,0x00,0x07,0x20,0xEF,0xBE,0x20, 0x50,'0','2'” 數據包,經過解析可知是控制 AI 模式的啓動與停止指令,接受單片機判斷此時 AI 模式是否開啓然後繼續相反操作。

 

                                     圖 4.3-10

 如圖 4.3-10,當發送 CC2530 單片機模塊再次按下 S2 按鍵時 ,接受 CC2530將會再次進入 RF 中斷,並收到“0x0D,0x51,0x88,0x00,0x07,0x20,0xEF, 0xBE,0x20,0x50,'0','2'” 數據包,經過解析可知是控制 AI 模式的啓動與停止指令,接受單片機判斷此時 AI 模式是否開啓然後進行相反操作。

系統調試

5.1. 系統硬件調試
單個功能一一測試完成後,發現 ZigBee 模塊僅有一個 GND 引腳,所以把全
部傳感器、二極管等的 GND 引腳一起用 1 根杜邦線引入 ZigBee 模塊的 GND 引腳。

 

                              5.1 硬件總體實物圖

5.2. 系統軟件調試
如何更加準確的知道當前環境的光照情況,明暗變化的光照強度 ADC 變化,可以通過:

char str[30];
sprintf(str,"adc 數值爲:%d",adc);
uartTX_Send(str);
在主函數實時發送 ADC 的值到串口調試助手裏,獲取每個光照階段裏 ADC轉換的值,計算 PWM 佔空比以達到最佳的調光效果。

相關部分代碼

RF收

  1 #include<iocc2530.h>
  2 #include<stdio.h>
  3 #include<string.h>
  4 #include<stdbool.h>
  5 #define LED P1_1
  6 #define uint unsigned int
  7 bool boozd=1;
  8 bool boog=1;
  9 uint pwmx[11]={0x00,0xF7,0xE1,0xC8,0xAF,0x96,0x7D,0x64,0x4B,0x32,0x01};
 10 uint adc;
 11 float adcResu;
 12 void InitLED(){//*****************初始化LED燈
 13 P1SEL &=0xFD;
 14 P1DIR |=0x02;
 15 LED=0;
 16 }
 17 void InitADC(){//********************初始化ADC
 18 P0DIR &=0xDF;//P0_5爲輸入
 19 APCFG |=0x20;//設置爲模擬口
 20 ADCCON3 =0x75;//0011 0101,端口電壓,512抽取率,P0_5
 21 adc=0;
 22 ADCH=0;
 23 ADCL=0;//清除ADC數據
 24 ADCCON1=0x30;//停止ADC轉換
 25 ADCCON1 |=0x40;//啓動ADC轉換
 26 }
 27 void Initclock()//*************************************時鐘初始化
 28 {//32MHz
 29  SLEEPCMD &=0xFB;//開啓全部RC振盪器,避免16MHZRC振盪器被關閉
 30  while((SLEEPSTA&0x40)==0);//等待32MHZ上電穩定
 31  CLKCONCMD &=0xBF;//設置32MHZ爲系統時鐘源
 32  while(CLKCONSTA&0x40);//等待32MHZ成功成爲系統時鐘源
 33  CLKCONCMD |=0x38;
 34  CLKCONCMD &=0xF8;//系統時鐘不分頻輸出,定時器爲250KHZ
 35  SLEEPCMD |=0x04;//關閉不用的RC振盪器
 36 }
 37 
 38 void InitUart(){//*******************************串口初始化
 39   PERCFG &=0xFE;//將串口0的位置選在P0口
 40   P2DIR &=0x3F; //P0口的外設優先級控制設爲串口0優先
 41   P0SEL |=0x0C;//P0口的2、3管腳設爲外設工作方式
 42   U0CSR |=0xC0;//USART0工作的UART模式,接收使能
 43   U0UCR=0x02;//據格式爲8位數據位、1位停止位、沒有校驗位
 44   U0GCR |=11;//波特率爲115200
 45   U0BAUD |=216;
 46   EA=1;
 47   URX0IE=1;//接收中斷打開
 48   UTX0IF=0;
 49   URX0IF=0;
 50  }
 51  void delay(uint i){//*********************延時函數
 52 for(uint j=0;j<i;j++)
 53 for(uint x=0;x<1000;x++);
 54 }
 55 void uartTX_Send(char *strx){//********************串口發送
 56  while(*strx!='\0'){
 57   U0DBUF=*strx;
 58   while((U0CSR&0x02)==0);//等待發送完成
 59    *strx++;
 60    U0CSR &=0xFD;
 61   }
 62 }
 63 void InitTime(){//**********************pwm
 64   //輸出比較,P1_0
 65  P1SEL |=0x01;
 66  P1DIR &=0xEE;
 67  PERCFG |=0x40;
 68  P2DIR |=0xC0;//定時器通道2-3最高優先級
 69  T1CTL=0x02;//模模式,0x00-T1CC0!!!!!!!!!!!!!!!!
 70  T1CCTL2=0x1C;
 71  T1CC0H=0x00;
 72  T1CC0L=0xFA;//週期爲1ms,頻率爲1KHZ 必須設置!!!!
 73  T1CC2H=0x00;
 74  T1CC2L=pwmx[0];
 75 //0x00 0xF7 0xE1 0xC8 0xAF 0x96 0x7D 0x64 0x4B 0x32 0x19 
 76 }
 77 void InitButton(){//*******************按鍵中斷初始化
 78 P0SEL &=0xFC;
 79 P0DIR &=0xFC;
 80 P0INP &=0xFC;
 81 P2INP &=0xFC;
 82 PICTL |=0x01;
 83 P0IE=1;
 84 P0IEN |=0x03;
 85 P0IF=0;
 86 P0IFG &=0xFC;
 87 }
 88 void Initho(){//******************************紅外感應初始化
 89 //P1_3
 90 P1SEL &=0xF7;
 91 P1DIR &=0xF7;
 92 P1INP &=0xF7;
 93 P2INP |=0x40;
 94 }
 95 void InitWX()//***********************************射頻的初始化
 96 {
 97 FRMCTRL0 |=0x60;
 98 TXFILTCFG =0x09;
 99 AGCCTRL1 =0x15;
100 FSCAL1=0x00;
101 
102 RFIRQM0 |=0x40;//打開接收中斷
103 IEN2 |=0x01;
104 FREQCTRL=(11+(25-11)*5);// 25號信道可改設置載波爲2475M
105 
106 PAN_ID0=0x07;
107 PAN_ID1=0x20;//PAMID
108 
109 RFST=0xEC;//清除接收緩衝器
110 RFST=0xE3;//開啓接收使能
111 
112 SHORT_ADDR0=0xEF;
113 SHORT_ADDR1=0xBE;//設置模塊網絡地址
114 }
115 void main(){
116   InitLED();
117   Initclock();
118   InitUart();
119   InitADC();
120   InitTime();
121   InitButton();
122   Initho();
123   InitWX();
124   boozd=1;
125   boog=1;
126   while(1){
127     if(ADCCON1&0x80){
128     adc |=(ADCL>>2);
129     adc |=(ADCH<<6);
130     if((boozd==1)&&(P1_3==1)){
131         LED=1;
132        if(adc>6191){T1CC2H=0x00;T1CC2L=pwmx[10];}
133        else if(adc>5191){T1CC2H=0x00;T1CC2L=pwmx[8];}
134        else if(adc>4191){T1CC2H=0x00;T1CC2L=pwmx[6];}
135        else if(adc>3191){T1CC2H=0x00;T1CC2L=pwmx[4];}
136        else if(adc>2191){T1CC2H=0x00;T1CC2L=pwmx[2];}
137        if(adc<2191){T1CC2H=0x00;T1CC2L=pwmx[0];}
138     /*  char str[30];
139     sprintf(str,"adc數值爲:%d",adc);
140     uartTX_Send(str);*/
141     }else if(boog){
142     LED=0;
143     T1CC2H=0x00;
144     T1CC2L=pwmx[0];
145     }
146     InitADC();//再次啓動
147     delay(1000);
148     
149     }
150   }
151 }
152 #pragma vector=URX0_VECTOR
153 __interrupt void urx0(){  //*******************串口中斷處理函數
154   
155   char bufch1;
156   bufch1=U0DBUF;
157  if(bufch1=='1')
158  {boog=0;
159   T1CC2H=0x00;
160   T1CC2L=pwmx[10];
161   boozd=0;
162   LED=1;
163   uartTX_Send("\r\n   ----串口開燈成功-----  \r\n");
164    uartTX_Send("\r\n   ----AI模式關閉-----  \r\n");
165 }
166  else if(bufch1=='0')
167 {boog=0;
168 boozd=0;
169   LED=0;
170  T1CC2H=0x00;
171  T1CC2L=pwmx[0];
172  uartTX_Send("\r\n   /////串口關燈成功////  \r\n");
173 }
174  else if(bufch1=='2'){
175    boog=1;
176     LED=1;
177    boozd=1;
178   uartTX_Send("\r\n   ----AI模式打開-----  \r\n");
179  }
180  else 
181 uartTX_Send("\r\n   !!!無該指令!!!  \r\n");
182 
183 
184 }
185 #pragma vector=P0INT_VECTOR//**************按鍵中斷處理函數
186 __interrupt void p0int(){
187   if(P0IFG&0x01){
188    delay(150);
189   if(P0_0==0){
190     boog=0;
191     if(LED==1){
192       LED=0;
193      boozd=0;
194      T1CC2H=0x00;
195      T1CC2L=pwmx[0];
196      uartTX_Send("\r\n   /////按鍵關燈成功////  \r\n");
197      
198     }else{
199       LED=1;
200       boozd=0;
201   uartTX_Send("\r\n   ----按鍵開燈成功-----  \r\n");
202   uartTX_Send("\r\n   /////AI模式關閉///// \r\n");
203   T1CC2H=0x00;
204   T1CC2L=pwmx[10];
205     }
206   }
207   }
208   if(P0IFG&0x02){
209    delay(150);
210   if(P0_1==0){
211     boog=1;
212     if(boozd==0){
213       boozd=1;
214       LED=1;
215     uartTX_Send("\r\n   ----AI模式打開-----  \r\n");
216     }else{
217      boozd=0;
218      LED=0;
219     uartTX_Send("\r\n   /////AI模式關閉///// \r\n");
220     }
221     }
222   }
223 P0IF=0;
224 P0IFG &=0xFC;
225 }
226 #pragma vector=RF_VECTOR//******************RF中斷處理函數
227 __interrupt void x1()
228 {
229 if(RFIRQF0 & 0x40){
230 
231 static int len;
232 static char  ch;
233 len=ch=0;
234 len=RFD; //第一個字節
235 while(len>0){
236   ch=RFD;
237 if(len==4){
238   if(ch=='1'){ 
239       boog=0;
240       if(LED==1){
241        LED=0;
242        boozd=0;
243        T1CC2H=0x00;
244      T1CC2L=pwmx[0];
245      uartTX_Send("\r\n   /////無線關燈成功////  \r\n");
246      
247     }else{
248    LED=1;
249     boozd=0;
250     uartTX_Send("\r\n   ----無線開燈成功-----  \r\n");
251     uartTX_Send("\r\n   /////AI模式關閉///// \r\n");
252     T1CC2H=0x00;
253     T1CC2L=pwmx[10];
254     }}}
255 if(len==3){
256   if(ch=='2'){     
257     boog=1;
258     if(boozd==0){
259       boozd=1;
260       LED=1;
261     uartTX_Send("\r\n   ----AI模式打開-----  \r\n");
262     }else{
263      boozd=0;
264      LED=0;
265     uartTX_Send("\r\n   /////AI模式關閉///// \r\n");
266     }}}
267 len--;
268 }
269 RFIRQF0 &=~0x40;
270 S1CON=0;
271 RFST =0xEC;
272 RFST=0xE3;
273 }}

RF發

 1 #include<iocc2530.h>
 2 void Initwx()//********************************射頻的初始化
 3 {
 4 EA=0;
 5 FRMCTRL0 |=0x60;
 6 TXFILTCFG =0x09;
 7 AGCCTRL1 =0x15;
 8 FSCAL1=0x00;
 9 
10 RFIRQM0 |=0x40;//打開射頻接收中斷,應該在下面寫接收中斷函數
11 IEN2 |=0x01;//RFIE中斷開
12 FREQCTRL=(11+(25-11)*5);//設置信道爲25則載波爲2475M
13 
14 PAN_ID0=0x07;//////PANID
15 PAN_ID1=0x20;//0x2007
16 
17 RFST=0xEC;//清除接收緩衝器
18 RFST=0xE3;//開啓接收使能
19 EA=1;
20 }
21 void fa( char *fsj,int len){//************************發送函數
22 RFST=0xEC;//確保接收是空
23 RFST=0xE3;//清接收標誌位
24 while(FSMSTAT1 & 0x22);//等待射頻發送準備好
25 RFST =0xEE;//確保發送隊列爲空 
26 RFIRQF1 &=~0x02;//清空發送標誌位
27 for(int i=0;i<len;i++){
28   RFD=fsj[i];}
29 RFST=0xE9;//發送緩衝區的數據
30 
31 while(!(RFIRQF1 & 0x02));//等待發送完成
32 RFIRQF1=~0x02;//清發送完成標誌
33 }
34 
35 void delay(){//*****************延時函數
36 for(int i=0;i<30;i++)
37 for(int j=0;j<1000;j++);
38 }
39 void go32m()//*************************時鐘頻率初始化
40 {
41  SLEEPCMD &=0xFB;//開啓全部RC振盪器,避免16MHZRC振盪器被關閉
42  while((SLEEPSTA&0x40)==0);//等待32MHZ上電穩定
43  CLKCONCMD &=0xBF;//設置32MHZ爲系統時鐘源
44  while(CLKCONSTA&0x40);//等待32MHZ成功成爲系統時鐘源
45  CLKCONCMD |=0x38;
46  CLKCONCMD &=0xF8;//系統時鐘不分頻輸出,定時器爲250KHZ
47  SLEEPCMD |=0x04;//關閉不用的RC振盪器
48 }
49 void InitButton()//**************************
50 {
51 P0SEL &=0xFC;
52 P0DIR &=0xFC;
53 P0INP &=0xFC;
54 P2INP &=0xFC;
55 PICTL |=0x01;
56 P0IE=1;
57 P0IEN |=0x03;
58 P0IF=0;
59 P0IFG &=0xFC;
60 }
61 void InitLED(){//***************************************
62 P1SEL &=0xFC;
63 P1DIR |=0x03;
64 P1_0=1;
65 P1_1=1;
66 
67 }
68 void main(){
69 InitLED();
70 go32m();
71 InitButton();
72 Initwx();
73 SHORT_ADDR0=0x50;
74 SHORT_ADDR1=0x20;//設置模塊網絡地址爲0x2050;
75 while(1);
76 }
77 #pragma vector=P0INT_VECTOR
78 __interrupt void xx()
79 {
80   if(P0IFG&0x01){
81     delay();
82     if(P0_0==0){
83 
84     P1_0=~P1_0;
85     char fsj[]={0x0D,0x51,0x88,0x00,0x07,0x20,0xEF,0xBE,0x20,0x50,'1','0'};
86     fa(fsj,12); //發送函數
87     }
88   }
89   if(P0IFG&0x02){
90   delay();
91   if(P0_1==0){
92 
93    P1_0=~P1_0;
94     char fsj[]={0x0D,0x51,0x88,0x00,0x07,0x20,0xEF,0xBE,0x20,0x50,'0','2'};
95     fa(fsj,12); //發送函數
96   }
97   }
98  P0IF=0;
99  P0IFG &=0xFC;}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章