智慧燈控(基於ZigBee)

東小東發表於2019-05-12

時間: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;}

 

相關文章