实验一:LED发光二极管实验
一、实验环境
硬件:通用节点一个、USB仿真器、PC机;
软件:IAR Embedded Workbench for MCS-51;
二、 实验内容
1) 熟悉Zigbee硬件模块相关接口;
2) 使用IAR 开发环境设计程序,利用CC2530 的IO口进行LED发光二极管的亮灭操作;
三、实验原理
1) 硬件接口原理
在CC2530中,我们总共有3个可用的GPIO接口:P0、P1和P2。其中P0和P1的全部8位都有对应的引脚,而P2只有0-4几个引脚可用。这里我们主要对P0和P1共16个引脚进行操作,每个引脚都连接到一个发光二极管的驱动端,这样通过控制P0和P1的每一位,我们可以控制所有的16个发光二极管的亮灭。
2) 软件设计
#include <ioCC2530.h>
#define D_COUNT 50 //通用延时时间计数
/***************************************
延时函数,n为延时周期计数
***************************************/
void Delay(unsigned int n)
{
unsigned int t,tt;
for(tt=0;tt<n;tt++)
for(t=0;t<1000;t++);
}
/***************************************
程序主函数
***************************************/
void main( void )
{
unsigned int i;
P0DIR = 0xff; //设置P0口全部为输出
P1DIR = 0xff; //设置P1口全部为输出
P0 = 0xff; //点亮所有灯
P1 = 0xff;
Delay(D_COUNT);Delay(D_COUNT);Delay(D_COUNT);
P0 = 0; //熄灭所有灯
P1 = 0;
Delay(D_COUNT);Delay(D_COUNT);Delay(D_COUNT);
while(1)
{
for(i=0;i<8;i++)
{
P0 = 0x01<<i; //P0的第i位为1,其它位为0
//P1_0 ^= 1; //P1.0取反
Delay(D_COUNT); //设置IO状态后需要一个延时来让我们看到效果
}
P0 = 0;
for(i=0;i<8;i++)
{
P1 = 0x01<<i; //P1的第i位为1,其它位为0
//P0_0 ^= 1; //P0.0取反
Delay(D_COUNT); //设置IO状态后需要一个延时来让我们看到效果
}
P1 = 0;
}
}
DelayXms(unsigned int Count):延时函数。
main():主函数
main()函数中的代码,首先通过配置CC2530相关控制寄存器P0DIR、P1DIR来设置P0、P1工作于普通GPIO的输出模式。然后点亮所有灯,经过一个长延时后再熄灭所有灯,再经过一个长延时后进入程序主循环。在循环中首先依次将P0的某一位置1(从低到高,其他位为0,每次置位后在进行一个标准延时)。然后对P0所有位清0,接着对P1口执行以上类似操作。P1口操作结束后清0,再回到上面循环对P0口进行操作
由以上分析我们可以得到以下程序流程图:
四、实验步骤
l 使用USB 仿真器连接PC 机和通用节点模块,不接电源,直接使用仿真器给模块供电。
l 启动IAR 开发环境,将上述软件程序导入
l 在IAR 开发环境中编译程序、点击下载、调试程序。按“F5”使程序运行。
l 观察现象,可以看到发光二极管轮流亮起。
l 改变延时时间,观察变化
l 使用调试界面上的停止按钮使程序停止,观察现象是否停止。
l 使用调试界面上的go按钮(等同“F5”),观察现象。
实验二:串口收发数据实验
一、 实验环境
1) 硬件:通用节点或任意传感器节点一个、USB仿真器、USB电缆、PC机;
2) 软件:IAR Embedded Workbench for MCS-51、串口调试工具;
二、实验内容
1) 熟悉Zigbee硬件模块相关接口;
2) 使用IAR 开发环境设计程序,利用CC2530 的串口0 进行数据收发通讯;
三、实验原理
1) 硬件接口原理
在CC2530中,我们总共有2个可用的串行接口,这些串行接口可被配置为标准串口或者SPI接口。这个例程中我们只使用USART0,并且工作在UART标准串口模式下。由于每种设置都有2套可用的IO映射,这里根据我们的硬件设置,我们应该使用其默认设置,UART0的TXD和RXT对应于P0_3和P0_2。
首先,我们要对芯片的时钟操作有所了解,因为程序的启动部分,需要先对芯片时钟进行配置。其中CLKCONCMD控制寄存器,用来控制系统时钟源,SLEEP 寄存器用来控制各种时钟源的开关和状态。PERCFG 寄存器为外设功能控制寄存器,用来控制外设功能模式。U0CSR、U0GCR、U0BUF、U0BAUD 等位串口相关寄存器。
2) 软件设计
#include "ioCC2530.h"
#include <string.h>
#define uint unsigned int
#define uchar unsigned char
//定义控制灯的端口
#define led1 P1_0
#define led2 P1_1
void InitIO(void); //IO初始化
void InitUart(void); //串口初始化
void SendString(char*string,uint legth); //发送字符串
uchar temp; // 存放接受的数据
char wch[] = "Welcome to test this
program!\n";
/*****************************************************************************
功能描述: 延时
Count: 延时单位数量
*****************************************************************************/
void DelayXms(unsigned int Count)
{
unsigned int i;
unsigned int j;
for(i = 0; i< Count; i++)
{
for(j=10000; j>0; j--);
}
}
/*****************************************************************************
功能描述: IO初始化
*****************************************************************************/
void InitIO(void)
{
SLEEPCMD
&= ~0X04;
CLKCONCMD = 0X10; //32k和32M时钟使用外部晶体,timer分频8M
while(CLKCONSTA!=0X10); //等待时钟切换
SLEEPCMD = 0X04;
P2DIR = 0x00; //高两位零 若设则最高优先USART0
P1DIR|= 0X03; //P1.0 P1.1 LEDs 灯端口配置
P0DIR|= 0X00; //input
PERCFG = 0x00; //UART0 默认端口
P1SEL = 0X00;
P0SEL = 0X0c; //P0<3:2>设置成外围应用
}
/*****************************************************************************
功能描述: 串口初始化
*****************************************************************************/
void InitUart(void)
{
U0CSR |= 0x80; //UART方式
U0GCR = 11; //baud_e 波特率设为115200
U0BAUD |= 216; //baud_m = BaudRate*2^(28-buad_e)/32M-25
//BaudRate=(256+baud_m)/2^(28-buad_e)x32MHz
UTX0IF =1; //接收中断标记
U0CSR |=0X40; //允许接收
URX0IE =1; //接收中断使能
EA=1; //总中断开关打开
}
/*****************************************************************************
功能描述: 串口发送字符串
string: 字符串指针
lenth: 长度
*****************************************************************************/
void SendString(char*string,uint lenth)
{
uint j;
for (j=0;j<lenth; j++)
{
U0DBUF= *string++; //将要发送字符送入U0DBUF发送寄存器
while(UTX0IF == 0); //等待发送完成
UTX0IF= 0; //清0标志位
}
}
/*****************************************************************************
功能描述:
主函数
*****************************************************************************/
void main(void)
{
InitIO();
InitUart();
DelayXms(10);
led1=1; //点亮2个LED灯
led2=1;
SendString(wch,sizeof(wch));
while(1)
{
; //进入无限循环等待中断函数被处触发
}
}
/*****************************************************************************
功能描述: 串口中断函数
*****************************************************************************/
#pragma vector = URX0_VECTOR__interrupt void
UART0_ISR(void)
{
URX0IF= 0; //清中断标志
temp = U0DBUF;
U0DBUF = temp; //将收到的字符发送回去
while(UTX0IF == 0); //等待发送
UTX0IF = 0; //清发送标志
led1 = ~led1; //指示中断活动
led2 = ~led2;
}
程序中主要有这几个函数:
DelayXms(unsigned int Count):延时函数
main():主函数
InitIO():完成IO初始化功作
InitUart():完成串口的初始化工作
SendString(char*string,uint legth):完成从串口发送字符串。
ART0_ISR():串口接收中断函数。
其中BAUD_M和BAUD_E为相关寄存器中的设置位。
这里通过配置CC2530 处理器的串口相关控制寄存器来设置串口0 的工作模式为串口模式,波特率为115200,使用中断方式接受串口数据并向串口输出。
主函数和中断函数的流程图如下
四、实验步骤
l 使用USB 仿真器连接PC 机和ZIGBEE模块。关闭电源,节点使用仿真器连接供电,将系统配套USB线(两条)一端连接PC 机,一端连接ZIGBEE模块的MINI-USB接口上。
注意:如果使用通用节点运行本例程,请检查板子上的“TXD”和“RXD”位置跳线帽是否已经插上
连接USB电缆时,需要安装USB转串口的驱动程序,同时启动IAR 开发环境,导入程序。
l 在IAR 开发环境中编译程序、点击下载、调试程序。按“F5”使程序运行。
l 如上图所示,配置CC2530 处理器的串口相关控制寄存器,点击右下角的发送数据按钮,可以看到接受文本框中显示接受到同样的数据。
l 更换发送文本框“字符串输入框”中的内容,点击发送按钮。可以看到相同的字符串又被返回。
例程运行结果(按下复位键)
实验三:按键控制实验
一、 实验环境
1) 硬件:传感器节点一个、USB仿真器、PC机;
2) 软件:IAR Embedded Workbench for MCS-51;
二、 实验内容
1) 熟悉Zigbee硬件模块相关接口;
2) 使用IAR 开发环境设计程序,利用CC2530 的GPIO读取按键值并相应对进行LED发光二极管的亮灭操作;
三、实验原理
1) 硬件接口原理
UserINT信号连接的是芯片的P2.0引脚,在按键没有被按下时(处于断开状态),经过电阻R9的上拉作用,UserINT信号是处于高电平的,而当按键按下时,UserINT信号直接和地相连,这样处于低电平。在芯片内通过检测P2.0口的输出状态就可以知道按键的状态。电容C4在按键松开的时候起到对输出信号的缓冲作用,这样可以过滤掉部分干扰信号,使得输出信号较为平滑。
2) 软件设计
#include <ioCC2530.h>
#define D_COUNT 50 //标准延时周期计数
#define KEY_INPUT P2_0 //定义按键引脚
/*****************************************************************************
功能描述: 延时
Count: 延时单位数量
*****************************************************************************/
void Delay(unsigned int n)
{
unsigned int t,tt;
for(tt=0;tt<n;tt++)
for(t=0;t<1000;t++);
}
/*****************************************************************************
功能描述: 主函数
*****************************************************************************/
void main( void )
{
unsigned int i;
P0DIR = 0x00; //P0口全部为输入
P1DIR = 0x03; //P1口低2位输出,其他输入
P1 = 0;
Delay(D_COUNT);Delay(D_COUNT);Delay(D_COUNT);
while(1)
{
if(!KEY_INPUT) //判断按键是否按下
{
i++;
P1 = i&0x03; //P1低2位赋值为i的低2位
Delay(100); //延时,加长2次判断间隔
}
Delay(10);
}
}
DelayXms(unsigned int Count):延时函数。
main():主函数
程序通过读取P2.0的信息来获得按键的状态,同时对P1上的2个发光二极管进行操作。程序中的长延时是为了使得一定时间内的按下只被识别为一次按下,短延时是为了滤掉可能的干扰信号。程序的流程图如下。
四、实验步骤
l 使用USB 仿真器连接PC 机和任意一个传感器节点模块,模块电源开关处于“ON”档,使用电池给模块供电(如电池电量低插上USB电缆,可一边充电一边使用)。
l 启动IAR 开发环境,导入程序
l 在IAR 开发环境中编译程序、点击下载、调试程序。按“F5”使程序运行。
l 按下左下方按钮,观察现象,可以看到2个发光二极管都没有亮起。
l 按下按下左下方按钮,观察2个发光二极管的状态。
按第一次,按键呈现出01状态
按第二次,状态变为10
按第三次,状态变为11
其原因是由于在芯片内通过检测P2.0口的输出状态改变了从而按键的状态
l 重复按键操作,尝试长按或短按,观察发光二极管状态。修改程序中的延时数值后再重复上面操作,体会不同延时下的效果。
实验结果发现,程序中的长延时只被识别为一次按下,短延时则没有效果。这是因为程序中的长延时是为了使得一定时间内的按下只被识别为一次按下,短延时是为了滤掉可能的干扰信号