《Zigbee入门与实践》第四章基础实验

前言

本章要求掌握使用CC2530内部各个模块功能,学习开发底层驱动代码,对我们以后的传感器移植有着非常大的帮助,教程将从简单的流水灯开始,一步一步带大家掌握CC2530F256这款芯片的所有功能,教程中会对代码进行详细的分析和解释,大家可以一步看教程一边使用开发套件来做实验,本教程路径下有本章需要的实验代码和执行效果视频。

ZigBee 重点在协议栈,但是基础实验也非常重要。基础实验说白了就是在玩增强型51单片机。学习本章将能令你快速掌握C C2530 的编程方法,在以后学习完组网及数据传输的程序后我们会发现,很多应用必须是基于传感器和控制类芯片的,而这些恰好是基础实验的知识。学习Zigbee非常的简单,本章以图形和文字结合为打搅讲解,让大家更好更清楚的掌握CC2530这块类似430的51单片机,大家可以理解CC2530就是一块低功耗的430单片机和一个无线收发模块组成的处理器就行了。

基础实验讲解过程。

?标题:实验的内容

?实验目的:需要掌握的知识

?实验相关寄存器:非常重要的编程

?程序效果:程序实现的功能

?实验代码:需要自己填写到编译器里面的代码

?硬件与软件分析:硬件与软件结合的方式来为大家详细讲解

适用平台

佳杰科技Q2530SB硬件平台

TEL:158********

技术群:193850136

硬件平台提供网站: https://www.360docs.net/doc/078140778.html,/

目录

前言 (2)

适用平台 (2)

4.1 CC2530 流水灯 (6)

4.1.1 实验设备 (6)

4.1.2 实验目的 (6)

4.1.3 实验相关寄存器 (6)

4.1.4 程序效果 (6)

4.1.5 程序代码 (6)

4.1.6 硬件与软件分析 (8)

4.2 流水灯实验 (9)

4.2.1 实验设备 (9)

4.2.2 实验目的 (9)

4.2.3 实验相关寄存器 (9)

4.2.4 程序效果 (9)

4.2.5 程序代码 (9)

4.2.6 硬件与程序分析 (11)

4.3 外部中断控制流水灯 (13)

4.3.1 实验设备 (13)

4.3.2 实验目的 (13)

4.3.3 实验相关寄存器 (13)

4.3.4 程序效果 (13)

4.3.5 程序代码 (13)

4.5.6 硬件与程序分析 (16)

4.4 按键控制LED开关 (17)

4.4.1 实验设备 (17)

4.4.2 实验目的 (18)

4.4.3 实验相关寄存器 (18)

4.4.4 程序效果 (18)

4.4.5 程序代码 (18)

4.4.6 硬件与程序分析 (20)

4.5 外部中断控制LED开关 (21)

4.5.1 实验设备 (21)

4.5.2 实验目的 (21)

4.5.3 实验相关寄存器 (21)

4.5.4 程序效果 (22)

4.5.5 程序代码 (22)

4.5.6 硬件与程序分析 (23)

4.6 查询方式使用定时器 (25)

4.6.1 实验设备 (25)

4.6.2 实验目的 (25)

4.6.3 实验相关寄存器 (25)

4.6.4 程序效果 (25)

4.6.5 程序代码 (26)

4.6.6 硬件与程序分析 (27)

4.7 定时器T1的使用 (28)

4.7.1 实验设备 (28)

4.7.2 实验目的 (28)

4.7.3 实验相关寄存器 (28)

4.7.4 程序效果 (29)

4.7.5 程序代码 (29)

4.7.6 硬件与程序分析 (30)

4.8 定时器T3的使用 (32)

4.8.1 实验设备 (32)

4.8.2 实验目的 (32)

4.8.3 实验相关寄存器 (32)

4.8.4 程序效果 (33)

4.8.5 程序代码 (33)

硬件和程序分析 (36)

4.9 串口UART0发送字符串 (40)

4.9.1 实验设备 (40)

4.9.2 实验目的 (40)

4.9.3 实验相关寄存器 (40)

4.9.4 程序效果 (41)

4.9.5 程序代码 (41)

硬件与软件分析 (43)

4.10 串口UART0收发送字符串 (45)

4.10.1 实验设备 (45)

4.10.2 实验目的 (45)

4.10.3 实验相关寄存器 (45)

4.10.4 程序效果 (46)

4.10.5 程序代码 (47)

硬件与程序分析 (49)

4.11 串口发送指令控制LED灯 (52)

4.11.1 实验设备 (52)

4.11.2 实验目的

4.11.3 实验相关寄存器 (52)

4.11.4 程序效果 (53)

4.11.5 程序代码 (53)

硬件与程序分析 (56)

AD采集内部温度串口显示 (60)

4.12.1 实验设备 (60)

4.12.2 实验目的 (60)

4.12.3 实验相关寄存器 (60)

4.12.4 程序效果 (62)

4.12.5 程序代码 (62)

硬件与程序分析 (64)

4.12 睡眠定时器唤醒系统 (66)

4.12.1 实验设备 (66)

4.12.2 实验目的 (66)

4.12.3 实验相关寄存器 (66)

4.12.4 程序效果 (66)

4.12.5 程序代码 (67)

硬件与程序分析 (70)

4.13 中断唤醒系统 (71)

4.13.1 实验设备 (71)

4.13.2 实验目的 (71)

4.13.3 实验相关寄存器 (71)

4.13.4 程序效果 (72)

4.13.5 程序代码 (72)

硬件与程序分析 (74)

4.14 液晶LCD显示 (76)

4.15.1 实验设备 (76)

4.15.2 实验目的 (76)

4.15.3 程序效果 (76)

4.15.4 程序代码 (76)

4.15 看门狗Watch Dog使用 (82)

4.16.1 实验设备 (82)

4.16.2 实验目的 (83)

4.16.3 实验相关寄存器 (83)

4.16.4 程序效果 (83)

4.16.5 程序代码 (83)

4.1CC2530 流水灯

4.1.1实验设备

1.RF2530N或者RF2530A 1块

2.Q2530SB底板1块

https://www.360docs.net/doc/078140778.html,B连接线1条

4.SmartRF04EB仿真器1个

4.1.2实验目的

让用户了解芯片IO的基本配置方法以及相关应用。

4.1.3实验相关寄存器

P1 P1DIR(详细情况可以参考CC2530Datasheet.PDF)

P1(0x90) 可位寻址的IO寄存器

P1DIR(0xFE) P1端口输入输出方向设置寄存器

0:IO输入

1:IO输出

4.1.4程序效果

程序通过IO口设置输出,依次点亮D1 D2 D3 3个LED灯,效果见文件夹视频;

4.1.5程序代码

//┏━━━━━━━━━━━━━━━━━━━━┓

//┃出品公司:佳杰科技有限公司…....──────┃

//┃版本:1.1…───────────────┃

//┃硬件平台:Q2530SB.───────────┃

//┗━━━━━━━━━━━━━━━━━━━━┛

#include

#define uint unsigned int

#define uchar unsigned char

//定义控制灯的端口

#define RLED P1_0 //定义LED1 为P10 口控制

#define GLED P1_1 //定义LED2 为P11 口控制

#define YLED P1_4 //定义LED3 为P14 口控制

//函数声明

void Delay(uint); //延时函数

void InitIO(void); //初始化LED 控制IO 口函数/****************************

//延时函数

*****************************/

void Delay(uint n)

{

uint i;

for(i = 0;i

for(i = 0;i

for(i = 0;i

for(i = 0;i

for(i = 0;i

}

/****************************

//初始化IO 口程序

*****************************/

void InitIO(void)

{

P1DIR |= 0x13; //P10、P11、P14 定义为输出RLED = 1; //输出高电平,LED灭

GLED = 1; //输出高电平,LED灭

YLED = 1; //LED 灯初始化为关

}

/***************************

//主函数

***************************/

void main(void)

{

InitIO(); //初始化LED 灯控制IO 口while(1) //死循环

{

RLED = !RLED; // LED1 状态改变一次

Delay(10000); //延时

GLED = !GLED; // LED2状态改变一次

Delay(10000); //延时

YLED = !YLED; // LED3状态改变一次

Delay(10000);

}

}

4.1.6硬件与软件分析

首先看一下实验用到得电路图部分:LED接了3.3V和一个电阻到IO口,IO口是处理器作为输出用,那么:当IO口输出为3.3V的时候由于没有电压差,所以LED没有电流流过,那么就不能够发光了。当输出为低电平的时候,二极管和电阻2边有3.3V电压,那么电流流过LED,LED发光。电阻起到了限制电流的作用。

V D D33V

RLED = !RLED;

就是让RLED的电平翻转一次,加入RLED为高电平,那么就让RLED输出0V,假如以前是低电平,那么就让他输出3.3V,这样以前LED亮会灭掉,同理灭的LED执行这条语句后会亮起来。

4.2流水灯实验

4.2.1实验设备

1.RF2530N或者RF2530A 1块

2.Q2530SB底板1块

https://www.360docs.net/doc/078140778.html,B连接线1条

4.SmartRF04EB仿真器1个

4.2.2实验目的

让用户学会按键应用是这一常用的人机交互方式。本实验用D1, D2, D3灯及按键S1为外设。采用P10、P11、P14口为输出口,驱动D1/D2/D3,P01口为输入口,接受按键信号输入(高电平为按键信号)。

4.2.3实验相关寄存器

相关寄存器:P1,P1DIR,P0SEL,P0INP, P0,P0DIR(前面以介绍过的这里不再重复介绍,寄存器功能说明请参阅CC2530Datasheet.pdf )

P0SEL(0XF3) P0 [7:0 ]功能设置寄存器,默认设置为普通I/ O口

P0INP( 0X8F) P0[7: 0]作输入口时的电路模式寄存器

P0( 0X80) P0[7: 0]位寻址I/ O寄存器

P0DIR(0XFD) P0口输入输出设置寄存器,0:输入,1:输出

4.2.4程序效果

本实验程序实现按键控制LED灯:开机按键一次,LED3、LED2、LED1依次熄灭;再次按键S1,LED3 、LED2、LED 1 依次熄灭;如此循环。

4.2.5程序代码

//┏━━━━━━━━━━━━━━━━━━━━┓

//┃出品公司:佳杰科技有限公司.. ....──────┃

//┃版本:1.1…───────────────┃

//┃硬件平台:Q2530SB.───────────┃

//┗━━━━━━━━━━━━━━━━━━━━┛

#include

#define uint unsigned int

#define uchar unsigned char

//定义控制灯的端口

#define RLED P1_0 //定义LED1为P10口控制

#define GLED P1_1 //定义LED2为P11口控制

#define YLED P1_4 //定义LED3为P14口控制

#define KEY1 P0_1 //定义按键为P01口控制

//函数声明

void Delay(uint); //延时函数声明

void InitIO(void); //初始化函数声明

void InitKey(void); //初始化按键函数声明

uchar KeyScan(void); //按键扫描函数声明

uchar Keyvalue = 0 ; //定义变量记录按键动作

uint KeyTouchtimes = 0 ; //定义变量记录按键次数

/********************************************************

//延时

*********************************************************/ void Delay(uint n)

{

uint i;

for(i = 0;i

for(i = 0;i

for(i = 0;i

for(i = 0;i

for(i = 0;i

}

/********************************************************

//按键初始化

*********************************************************/ void InitKey(void)

{

P0SEL &= ~0X02; //设置P0_1功能为一般的IO口功能

P0DIR &= ~0X02; //按键在P01口,设置为输入模式

P0INP |= 0x02; //上拉

}

/********************************************************

//初始化程序,将P10、P11、P14定义为输出口,并将LED灯初始化为灭*********************************************************/ void InitIO(void)

{

P1DIR |= 0x13; //P10、P11、P14定义为输出

RLED = 0; //IO输出0V,LED亮

GLED = 0; //IO输出0V,LED亮

YLED = 0; //LED灯初始化为灭

}

/*****************************************

//按键动作记录函数

*****************************************/

uchar KeyScan(void)

{

if(KEY1 == 1) //高电平有效

{

Delay(100); //检测到按键

if(KEY1 == 1) //如果是高电平那么进入

{

while(KEY1); //直到松开按键

return(1); //按了一次按键后就返回1

}

}

return(0); //没有按键被按下

}

/*******************************************************

//主函数

*******************************************************/

void main(void)

{

InitIO(); //初始化LED灯控制IO口

InitKey(); //初始化按键控制IO口

while(1)

{

Keyvalue = KeyScan(); //读取按键动作

if(Keyvalue == 1) //按下按键设置为LED3,LED2,LED1倒序流水闪烁

{

YLED = !YLED; //翻转一次

Delay(20000); //延时操作

GLED = !GLED; //翻转一次

Delay(20000); //延时操作

RLED = !RLED; //翻转一次

Delay(20000); //延时操作

}

}

}

4.2.6硬件与程序分析

前面已经讲过LED的工作原理了,这里就不再多说了,我们主要看看按键电路,当S1没有按下的时候,P0_1这个点的电压应该是0V,因为他通过R11和R16接到了地,当S1被按下后,R16的左端电压变成了3.3V,那么P0_1这个点的电压就变成了3.3V了,这样按

键与不按键就可以让P0_1得到2个不同的电平,然后让处理器检测这个端口就可以实现按键的功能了。

初始化了按键和LED后,就进入了死循环,不断的检测KeyScan();,如果有按键被按下,那么KeyScan();会返回1,就会进入操作。让RLED的电平翻转一次,加入RLED为高电平,那么就让RLED输出0V,假如以前是低电平,那么就让他输出3.3V,这样以前LED亮会灭掉,同理灭的LED执行这条语句后会亮起来。

4.3外部中断控制流水灯

4.3.1实验设备

1.RF2530N或者RF2530A 1块

2.Q2530SB底板1块

https://www.360docs.net/doc/078140778.html,B连接线1条

4.SmartRF04EB仿真器1个

4.3.2实验目的

上一个程序里的按键扫描是通过查询方式,而查询方式需要主程序主动进行查询,在这一节里,我们将使用外部中断方式实现。让用户初步学会使用外部中断。本实验用LED1,LED2,LED3灯及按键S1为外设。本实验采用P10,P11,P14口为输出口,驱动LED1/LED2/LED3,P01口为输入口,接受按键信号输入(高电平为按键信号)。此例中按键输入信号为中断触发信号。

4.3.3实验相关寄存器

相关寄存器:P1,P1DIR,P0IEN,PICTL,P0IFG,IEN1(前面以介绍过的这里不再重复介绍,寄存器功能说明请参阅CC2530Datasheet.pdf )

P0IEN(0XAB) P0[7:0]中断掩码寄存器.

0:关中断1:开中断

PICTL(0X8C) P0口的中断触发控制寄存器

Bit0为P0[0:7]的中断触发配置:

0:上升沿触发1:下降沿触发

P0IFG(0X89) P0[7:0]中断标志位,在中

断发生时,相应位置1.

IEN1(0XB8) Bit5为P0[7:0]中断使能位:

0:关中断1:开中断

4.3.4程序效果

本实验程序实现按键控制LED灯:开机按键一次,LED3、LED2、LED1依次熄灭;再次按键S1,LED3 、LED2、LED 1 依次熄灭;如此循环。详情见文件夹视频。

4.3.5程序代码

//┏━━━━━━━━━━━━━━━━━━━━┓//┃出品公司:佳杰科技有限公司.. ....──────┃//┃版本:1.1…───────────────┃//┃硬件平台:Q2530SB.───────────┃//┗━━━━━━━━━━━━━━━━━━━━┛#include

#define uint unsigned int

#define uchar unsigned char

//定义控制灯的端口

#define RLED P1_0 //定义LED1为P10口控制

#define YLED P1_1 //定义LED2为P11口控制

#define GLED P1_4 //定义LED3为P14口控制

#define KEY1 P0_1 //定义按键为P01口控制

//函数声明

void Delay(uint); //延时函数声明

void Initial(void); //初始化函数声明

void InitKey(void); //初始化按键函数声明uchar KeyScan(void); //按键扫描函数声明

uchar Keyvalue = 0 ; //定义变量记录按键动作uint KeyTouchtimes = 0 ; //定义变量记录按键次数/****************************

//延时

*****************************/

void Delay(uint n)

{

uint i;

for(i = 0;i

for(i = 0;i

for(i = 0;i

for(i = 0;i

for(i = 0;i

for(i = 0;i

for(i = 0;i

for(i = 0;i

for(i = 0;i

for(i = 0;i

for(i = 0;i

for(i = 0;i

for(i = 0;i

for(i = 0;i

for(i = 0;i

}

/****************************

//初始化按键为中断输入方式

*****************************/

void InitKeyINT(void)

{

P0INP |= 0x02; //上拉

P0IEN |= 0X02; //P01设置为中断方式

PICTL &=~ 0X01; //下降沿触发

EA = 1; //开中断使能

IEN1 |= 0X20; // P0设置为中断方式;

P0IFG |= 0x00; //初始化中断标志位

}

/****************************

//初始化程序,将P10、P11、P14定义为输出口,并将LED灯初始化为灭

*****************************/

void InitIO(void)

{

P1DIR |= 0x13; //P10、P11、P14定义为输出

RLED = 0; //LED输出低电平

GLED = 0; //LED输出低电平

YLED = 0; //LED灯初始化为亮

}

/****************************

//中断处理函数

*****************************/

#pragma vector = P0INT_VECTOR

__interrupt void P0_ISR(void)

{

if(P0IFG>0) //按键中断

{

P0IFG = 0; //清楚中断标志位

Delay(100); //延时

if(P0IFG==0) //按键中断

{

Delay(100); //延时

KeyT ouchtimes = KeyT ouchtimes+1; //每次中断发生时记录按键次数加1 }

}

P0IF = 0; //清中断标志

}

/***************************

//主函数

***************************/

void main(void)

图4-3 硬件电路部分

程序部分

InitIO函数

P1DIR |= 0x13;

0x13是B0001 0011,对应的是第0位和第1位以及第4位为1,大家可以观察一下图4-1 ,而大家知道P1DIR |= 0x13; 就是P1DIR =P1DIR|0x13;该条程序执行完成后,P1DIR的第0 1 4位变成了1,而其他位没有变化,这就是常见的写1操作,而不改变其他位的值,因为任何数或上0都是它本身。

RLED = 1;

GLED = 1;

YLED = 1;

RLED、GLED 和YLED 为宏定义的3个端口RLED = 1; 就是P1_0写1,那么IO口就会输出3.3V,相同如果RLED=0;那么P1_0就写了0,那么程序执行这条语句后会输出0V,这时候更具电路图分析就知道,LED 要发光了。

InitKeyINT函数

P0INP |= 0x02;

设置端口P0_1 上拉

P0IEN |= 0X02;

设置端口P0_1为中断方式

PICTL &=~ 0X01;

设置端口P0_1的触发方式,就是怎么样才进中断,设置的是上升沿进中断,也就是说,端口P0_1从低电平变为高电平后,系统就会调用中断处理函数。

EA = 1;

开中断使能、中断使能想51单片机一样,所以的中断要有效,必须设置中断使能才行。

IEN1 |= 0X20;

P0设置为中断方式,允许中断

P0IFG |= 0x00;

初始化中断标志位,最初状态清0中断标志位

#pragma vector = P0INT_VECTOR__interrupt void P0_ISR(void)函数,

if(P0IFG>0) //按键中断

{

P0IFG = 0; //清楚中断标志位

Delay(100); //延时

if(P0IFG==0) //按键中断

{

Delay(100); //延时

KeyT ouchtimes = KeyT ouchtimes+1; //每次中断发生时记录按键次数加1

}

}

P0IF = 0; //清中断标志

}

该中断处理函数,在按键被按下后会执行一次,如果按键一直按着会一直执行。

P0IFG = 0;

中断发生后,进入中断处理函数,需要延时一段时间,然后让KeyTouchtimes变了加1,最后清除中断标志位

4.4按键控制LED开关

4.4.1实验设备

1.RF2530N或者RF2530A 1块

2.Q2530SB底板1块

https://www.360docs.net/doc/078140778.html,B连接线1条

4.SmartRF04EB仿真器1个

4.4.2实验目的

让用户学会按键应用是这一常用的人机交互方式。本实验用D1, D2, D3灯及按键S1为外设。采用P10、P11、P14口为输出口,驱动D1/D2/D3,P01口为输入口,接受按键信号输入(高电平为按键信号)。

4.4.3实验相关寄存器

相关寄存器:P1,P1DIR,P0SEL,P0INP, P0,P0DIR(前面以介绍过的这里不再重复介绍,寄存器功能说明请参阅CC2530Datasheet.pdf )

P0SEL(0XF3) P0 [7:0 ]功能设置寄存器,默认设置为普通I/ O口

P0INP( 0X8F) P0[7: 0]作输入口时的电路模式寄存器

P0( 0X80) P0[7: 0]位寻址I/ O寄存器

P0DIR(0XFD) P0口输入输出设置寄存器,0:输入,1:输出

4.4.4程序效果

本实验程序实现按键控制LED灯:每按一次S1,D1改变一次状态。

4.4.5程序代码

//┏━━━━━━━━━━━━━━━━━━━━┓

//┃出品公司:佳杰科技有限公司. .....──────┃

//┃版本:1.1…───────────────┃

//┃硬件平台:Q2530SB.───────────┃

//┗━━━━━━━━━━━━━━━━━━━━┛

#include

#define uint unsigned int

#define uchar unsigned char

//定义控制LED灯的端口

#define LED1 P1_0 //LED1为P1.0口控制

#define KEY1 P0_1 //KEY1为P0.1口控制

//函数声明

void Delayms(uint); //延时函数

void InitLed(void); //初始化LED1

void KeyInit(); //按键初始化

uchar KeyScan(); //按键扫描程序

延时函数

*****************************/

void Delayms(uint xms) //i=xms 即延时i毫秒

{

uint i,j;

for(i=xms;i>0;i--)

for(j=587;j>0;j--); //587为了大约延时而配置的值,可以不考虑}

/****************************

LED初始化函数

*****************************/

void InitLed(void)

{

P1DIR |= 0x01; //P1_0定义为输出

LED1 = 1; //LED1灯熄灭

}

/****************************

按键初始化函数

*****************************/

void InitKey()

{

P0SEL &= ~0X2; //设置P01为普通IO口

P0DIR &= ~0X2; //按键在P01 口,设置为输入模式

P0INP &= ~0x2; //打开P01上拉电阻,不影响

}

/****************************

按键检测函数

*****************************/

uchar KeyScan(void)

{

if(KEY1==0)

{Delay ms(10);

if(KEY1==0)

{

while(!KEY1); //松手检测

return 1; //有按键按下

}

}

return 0; //无按键按下

}

/***************************

主函数

void main(void)

{

InitLed(); //调用初始化LED函数

InitKey(); //调用初始化按键函数

while(1)

{

if(KeyScan()) //如果有按键,那么改变LED状态 LED1=~LED1; //改变LED状态

}

}

P0SEL &= ~0X2;

设置P01为普通IO口,默认的时候都是0

P0DIR &= ~0X2;

由电路图可以看出,按键在P01 口,将他设置为输入方向。 P0INP &= ~0x2;

打开P01上拉电阻,不影响

KeyScan函数

相关文档
最新文档