1、实验的目的
1)通过实验掌握 CC2530 芯片 GPIO 的配置方法
2)掌握 Led 驱动电路及开关 Led 的原理
2、实验设备
硬件:1、PC机一台;2、ZigBee(CC2530)(底板、核心板、仿真器、USB 线)开发板一套
软件:Windows 10系统,IAR for 8051 集成开发环境
3、实验相关电路图
发光二极管是属于二极管的一种,具有二级管单向导电特性,即只有在正向电压(二极管的 正极接正,负极接负)下才能导通发光。P1.0 引脚接发光二极管(D1)的负极,所以 P1.0 引脚输出 低电平 D1 亮,P1.0 引脚输出高电平 D1 熄灭, D2, D3 同理。
4、实验相关寄存器
操作 P1、P0端口我们需要掌握相关寄存器的作用和配置方法。如下表所示:
寄存器 | 作用 | 描述 |
---|---|---|
P0 (0x80) | 端口0 | 端口0。通用I/O端口。可以从SFR位寻址。 该CPU内部寄存器可以从XDATA (0x7080)读,但是不能写。 |
P1 (0x90) | 端口1 | 端口1。通用I / O端口。可以从SFR位寻址。 该CPU内部寄存器可以从XDATA (0x7090)读,但是不能写。 |
P0SEL (0xF3) | 端口0 功能选择 | P0.7到 P0.0功能选择 0: 通用I / O 1: 外设功能 |
P1SEL (0xF4) | 端口1 功能选择 | P1.7 到P1.0功能选择 0: 通用I / O 1: 外设功能 |
P0DIR (0xFD) | 端口 0方向 | P0.7到P0.0的I/O方向 0: 输入 1: 输出 |
P1DIR (0xFE) | 端口1 方向 | P1.7到P1.0的I/O方向 0: 输入 1: 输出 |
P0INP (0x8F) | 端口 0输入模式 | P0.7到P0.0的I/O输入模式 0: 上拉/下拉(见P2INP (0xF7)–端口2输入模式) 1: 三态 |
P1INP (0xF6) | 端口1 输入模式 | P1.7到P1.2的I/O输入模式 0: 上拉/下拉(见P2INP (0xF7)–端口2输入模式) 1: 三态 P1.1到P1.0 不使用 |
按照表格寄存器的内容,对 P1.0、P1.1、P0.4 口进行配置,当 P1.0、P1.1、P0.4 输出低电平时 D1、D2、D3 被点亮。所以配置如下:
P1SEL &=~0x03; //配置 P10、P11为通用 IO 口,默认为 0 的,可以不设
P1DIR |= 0x03; //P10、P11 定义为输出
P0SEL &=~0xEF;//配置 P04为通用 IO 口,默认为 0 的,可以不设
P0DIR |= 0x10; // P04 定义为输出
由于 CC2530 寄存器初始化时默认值为(详细说明请参考《CC2530 中文数据手册完全版.pdf》):
P1SEL = 0x00; //通用IO口
P1DIR = 0x00; //方向为输入
P1INP = 0x00; //输入模式为上拉/下拉
P0SEL = 0x00; //通用IO口
P0DIR = 0x00; //方向为输入
P0INP = 0x00; //输入模式为上拉/下拉
所以 IO 口初始化我们可以简化初始化指令:
P1DIR |= 0x03; //配置 P1.0、P1.1为输出
P0DIR |= 0x10; //配置 P0.4为输出
5、源码分析
/*******************************************************************************
* @文件名 :CC2530IOTest.c
* @作 者 :GeekYang
* @版 本 :V1.0.0
* @描 述 :CC2530 GPIO 实验
*******************************************************************************/
/***************************** 头文件 ****************************/
#include <ioCC2530.h>
/***************************** 宏定义 ***************************/
//类型定义
#define uint unsigned int
#define uchar unsigned char
//定义控制灯的端口
#define LED1 P1_0 //定义LED1为P10口控制
#define LED2 P1_1 //定义LED2为P11口控制
#define LED3 P0_4 //定义LED3为P04口控制
/****************************** 函数声明 ******************************/
void Delay(uint); //延时函数
void InitIO(void); //初始化LED控制IO口函数
/****************************** 函数定义 ******************************/
/************************************************
函数名称:Delay
功 能:延时
参 数:无
返 回 值:无
*************************************************/
void Delay(uint n)
{
uint i;
for(i = 0;i<n;i++);
for(i = 0;i<n;i++);
for(i = 0;i<n;i++);
for(i = 0;i<n;i++);
for(i = 0;i<n;i++);
}
/************************************************
函数名称:InitIO
功 能:GPIO初始化
参 数:无
返 回 值:无
************************************************/
void InitIO(void)
{
P1DIR |= 0x03; //P10、P11定义为输出
P0DIR |= 0x10; //P04定义为输出
LED1 = 1;
LED2 = 1;
LED3 = 1; //LED灯初始化为关
}
/************************************************
函数名称:main
功 能:主函数
参 数:无
返 回 值:无
***********************************************/
void main(void)
{
InitIO(); //初始化LED灯控制IO口
while(1) //死循环
{
LED1 = !LED1; // LED1灯闪一次
Delay(50000);
LED2 = !LED2; // LED2灯闪一次
Delay(50000);
LED3 = !LED3; // LED3灯闪一次
Delay(50000);
}
}