5、CC2530 外部中斷控制LED開關
1.實驗目的
1)、通過實驗掌握CC2530芯片GPIO的配置方法,帶你一步步走進嵌入式大門
2)、握Led驅動電路及開關Led的原理
3)、過按鍵S1產生外部中斷改變LED1\LED2\LED3狀態
2.實驗設備
硬件:PC 機 一臺 EB2530(底板、核心板、仿真器、USB 線) 一套
軟件:2000/XP/win7 系統,IAR 8.10 集成開發環境
3.實驗相關電路圖
發光二極管是屬于二極管的一種,具有二級管單向導電特性,即只有在正向電壓(二極 管的正極接正,負極接負)下才能導通發光。P1.0引腳接發光二極管(D1)的負極, 所以P1.0引腳輸出低電平D1亮,P1.0引腳輸出高電平D1熄滅,D2,D3同理。
注:D3燈的控制腳復用到了防真器,而防真器用到了鎖存器,所以要使得D3亮,必 須取下防真器。
按鍵S1接在P0_1上,當按鍵松開時,p0_1通過電阻上拉為高電平,當按鍵S1按下時,
p0_1為低電平。
4.實驗相關寄存器
操作P1.0我們需要掌握相關寄存器的作用和配置方法。如下表所示:
寄存器 | 作用 | 描述 |
P1 (0x90) | 端口1 | 端口1。通用I / O端口。可以從SFR位尋址。 |
P1SEL(0x F4) | 端口1 功能 選擇 | P1.7 到P0.0功能選擇 0: 通用I / O 1: 外設功能 |
P1DIR(0x FE) | 端口1 方向 | P1.7到P1.0的I/O方向 0: 輸入 1: 輸出 |
P1INP(0x F6) | 端口1 輸入 模式 | P1.7到P1.2的I/O輸入模式。由于P1.0 和P1.1 沒有上 拉/下拉功能, P1INP暫時不需要配置, 了解一下為后面的實驗打下基礎 0: 上拉/下拉(見P2INP (0xF7)–端口2輸入模式) 1: 三態 |
CC2530外部中斷需要配置P0IEN 、PICTL 、P0IFG、IEN1寄存器。 外部中斷寄存器 說明如下表所示:
寄存器 | 作用 | 描述 |
P0IEN(0xAB) | 端口0 中斷屏蔽 | 端口P0.7到P0.0中斷使能 0:中斷禁用 1:中斷使能。 |
PICTL(0x8C) | 端口中斷控制 P0ICON(Bit0) | 端口0, 7到0輸入模式下的中斷配置。 該位為所有端口0的輸入選擇中斷請求條件。 0: 輸入的上升沿引起中斷 1: 輸入的下降沿引起中斷 |
P0IFG(0x89) | 端口0 中斷狀態標志 | 端口0,位7到位0輸入中斷狀態標志。當 輸入端口中斷請求未決信號時,其相應的標志位將置1。 |
IEN1 (0xB8) | 中斷使能1 P0IE(Bit5) | 端口0中斷使能 0: 中斷禁止 1: 中斷使能 |
按照表格寄存器的內容,對P1.0口進行配置,當P1.0輸出低電平時D1被點亮,D2、 D3同理。S1按下時P0.1產生外部中斷從而控制LED1/LED2/LED3的亮滅所以配置如下:
P1SEL &=~0x01; //配置P1.0為通用IO口 ,默認為0的,可以不設 P1DIR |= 0x01; //P10 定義為輸出
按鍵S1配置如下:
P0IEN |= 0x2; // P0.1 設置為中斷方式 1:中斷使能 PICTL |= 0x2; //下降沿觸發
IEN1 |= 0x20; //允許P0口中斷; P0IFG = 0x00; //初始化中斷標志位 EA = 1; //打開總中斷
5.源碼分析
1)、 請 打 開 工 程 , 學 習 例 程 \5 、 CC2530 外 部 中 斷 控 制 LED 開 關
\sz-yy-zigbee\sz-yy-zigbee.eww
2)、主代碼 main.c 如下:
- /**************************************/
- /*描述:按鍵 S1 外部中斷方式改變 LED1 狀態
- **************************************/
- #include <ioCC2530.h>
- #define uint unsigned int
- #define uchar unsigned char
- //定義控制 LED 燈的端口
- #define LED1 P1_0 //定義 LED1 為 P1.0 口控制
- #define KEY1 P0_1 //中斷口
- //函數聲明
- void Delayms(uint); //延時函數
- void InitLed(void); //初始化 P1 口
- void KeyInit(); //按鍵初始化
- uchar KeyValue=0;
- /****************************
- //延時函數
- *****************************/
- void Delayms(uint xms) //i=xms 即延時 i 毫秒
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=587;j>0;j--);
- }
- /**************************** LED 初始化程序
- *****************************/
- void InitLed(void)
- {
- P1DIR |= 0x01; //P1_0、P1_1 定義為輸出 LED1 = 1; //LED1 燈熄滅
- }
- /**************************** KEY 初始化程序--外部中斷方式
- *****************************/
- void InitKey()
- {
- P0IEN |= 0X2; //P01 設置為中斷方式 PICTL |= 0X2; // 下降沿觸發
- IEN1 |= 0X20; // 允許 P0 口中斷; P0IFG = 0x00; // 初始化中斷標志位 EA = 1;
- }
- /**************************** 中斷處理函數
- *****************************/
- #pragma vector = P0INT_VECTOR //格式:#pragma vector = 中斷向量,緊接 著是中斷處理程序
- interrupt void P0_ISR(void)
- {
- Delayms(10); //去除抖動 LED1=~LED1; //改變 LED1 狀態 P0IFG = 0; //清中斷標志
- P0IF = 0; //清中斷標志
- }
- /*************************** 主函數
- ***************************/
- void main(void)
- {
- InitLed(); //調用初始化函數 InitKey();
- while(1)
- {
- }
- }
復制代碼6.實驗步驟
1)、打開代碼工程,\5、CC2530 外部中斷控制 LED 開關\sz-yy-zigbee\sz-yy-zigbee.eww, 如果 IAR 沒有很安裝,請按。\學習例程以及開發環境安裝\2.開發環境搭建.pdf 去安裝。
2)通過仿真器把開發板接到電腦上。
3)編繹下載。

程序已下載完成,可以運行:
4).現象:每按下一次 S1,D1 的狀態會跟著變化,這里是通過按鍵中斷實驗的哦。