嵌入式cc2530单片机ZigBee-流水灯的实验

article/2025/5/11 9:16:10

嵌入式cc2530单片机ZigBee

单片机是一种集成电路芯片,包含中央处理器CPU、随机存储器RAM、只读存储器ROM、输入输出I/O接口、中断控制系统、定时/计数器和通信等多种功能部件

其针脚定义如下:

1.0 --P0、P1各8个针脚(1字节=8位,针脚/位。一般16进制定义,可以自己换算二进制并结合参数表去理解每个设定功能),P2有5个针脚。

1.1–CC2530单片机采用QFN40封装,外观上是一个边长为6mm的正方形芯片,每个边上有10个引脚,总共40个引脚。CC2530的引脚布局如图所示。

在这里插入图片描述

【软件】

1、IAR Embedded Workbench for 8051,IAR是著名的C编译器,CC2530使用的是8051内核。

2、SmartRF Flash Programmer,将IAR生成的hex文件烧写进cc2530芯片中。

3、sscom3.2 串口调试助手。

一、任务要求

编写程序控制实验板上的LED1和LED2的亮、灭状态,使它们以流水灯方式进行工作,即实验板通电后两个发光二极管以下述方式工作:

①电后LED1和LED2都熄灭。

②延时一段时间后LED1点亮。

③延时一段时间后LED2点亮,此时LED1和LED2都处在点亮状态。

④延时一段时间后LED1熄灭。

⑤延时一段时间后LED2熄灭,此时LED1和LED2都处在熄灭状态。

⑥返回步骤②循环执行。

二、2、CC2530的I/O引脚

1)CC2530总共具有21个数字I/O引脚,这些引脚可以组成3个8位端口,分别为端口0、端口1和端口2,通常表示为P0、P1和P2。其中,P0和P1是完全的8位端口,而P2仅有5位可以使用。21个I/O引脚具有以下特性,可以通过编程进行配置。

2)1.0–可配置为通用I/O端口

通用I/O端口是指可以对外输出逻辑值0(低电平)或1(高电平),也可读取从I/O引脚输入的逻辑值(低电平为0,高电平为1)。可以通过编程来将I/O端口设置成输出方式或输入方式。

3)1.1–可配置为外部设备I/O端口

CC2530内部除了含有8051CPU核心外,还具有其他功能模块,如ADC、定时器和串行通信模块,我们也称这些功能模块为外设。可通过编程将I/O口与这些外设建立起连接关系,以便这些外设与CC2530芯片外界电路进行信息交换。需要注意的是,不能随意指定某个I/O口连接到某个外设

4)1.2–输入口具备3种输入模式

当CC2530的I/O口被配置成通用输入端口时,端口的输入模式有上拉、下拉和三态三种选择,可通过编程进行选择,能够适应多种不同的输入应用。

5)1.3 --具有外部中断能力

当使用外部中断时,I/O口引脚可以作为外部中断源的输入口,这使得电路设计变得更加灵活。

6)I/O端口的相关寄存器

在单片机内部,有一些具有特殊功能的存储单元,这些存储单元用来存放控制单片机内部器件的命令、数据或是运行过程中的一些状态信息。这些寄存器统称“特殊功能寄存器(SFR)”,操作单片机本质上就是对这些特殊功能寄存器进行读写操作,并且某些特殊功能寄存器可以位寻址。例如通过已配置好的P1_1口向外输出高电平可用以下代码实现:

P1 = 0x02; 或者 P1_1 = 1;

7)P1是特殊功能寄存器的名字,P1_1是P1中一个位的名字,为了便于使用,每个特殊功能寄存器都会起一个名字,其中x取值为0~2,分别对应P0、P1和P2口。

三、电路分析

要使用单片机控制外界器件,就要清楚器件与单片机的连接关系和工作原理,这样才能在编写程序代码时知道该操作哪些I/O端口或功能模块,以及应该输入或输出什么样的控制信号。

(1)LED的连接和工作原理

实验板上LED1和LED2与CC2530的连接如图2-2所示,LED1和LED2的负极端分别通过一个限流电阻连接到地(低电平),它们的正极端分别连接到CC2530的P1_0端口和P1_1端口。

为控制两个LED,连接LED的P1_0端口和P1_1端口应被配置成通用输出端口。当端口输出低电平(逻辑值0)时,LED正极端和负极端都为低电平,LED两端没有电压差,也就不会有电流流过LED,此时LED熄灭。当端口输出高电平时,LED正极端电平高于负极端电平,LED两端存在电压差,会有电流从端口流出并通过LED的正极端流向负极端,此时LED点亮

四、寄存器配置分析:

这里我们只用到了灯,所以我们只配置灯的一系列寄存器。
第一个是我们端口功能选择寄存器,我们用的是P1端口所以我们只对P1端口进行配置。

对端口输入和输出进行定义:

通过对i/o的计算
https://img-blog.csdnimg.cn/2020120120230525.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDMzOTAz,size_16,color_FFFFFF,t_70

五、流程分析

根据任务要求,可将LED的控制流程用流程图进行表示,如下图所示。

六、代码如下:

#include "ioCC2530.h" //引用CC2530头文件/**************************************************************函数名称:delay功    能:软件延时入口参数:time--延时循环执行次数出口参数:无返 回 值:无**************************************************************/void delay(unsigned int time){unsigned int i;unsigned char j;for(i = 0;i < time;i++){      for(j = 0;j < 240;j++)}}/**************************************************************函数名称:main功    能:程序主函数入口参数:无出口参数:无返 回 值:无**************************************************************/void main(void){P1SEL &= ~0xff;//设置P1口所有位为普通IO口P1DIR |= 0xff;//设置P1口所有位为输出口while(1)//程序主循环{P1 = ~P1;//P1口输出状态反转delay(1000);//延时}}

或者代码为:


#include "iocc2530.h" //头文件#define LED1 P1_0 //宏定义p1_0#define LED2 P1_1 //宏定义p1_1void delay(unsigned int time){ //延时函数unsigned int i,j;for(i=0;i<time;i++){for(j=0;j<200;j++);}}void main(void){ //主函数P1SEL &=~0X03; //定义通用I/O口P1DIR |=0X03; //定义输出接口LED1=0;  //将led1置于低电平LED2=0; //将led2置于低电平while(1){delay(100);LED1=1;delay(100);LED2=1;delay(100);LED1=0;delay(100);LED2=0;delay(100);}//利用while循环使灯依此循环亮循环灭}

http://chatgpt.dhexx.cn/article/VRLmjIGU.shtml

相关文章

快速学会CC2530单片机基础点灯

使用的软件是IAR 使用的板是经常提到的小黑板 上面四个灯分别是 D3 ---> P1_0 D4 ---> P1_1 D5 ---> P1_3 D6 ---> P1_4 #include <ioCC2530.h>//引用CC2530头文件 #define D3 P1_0 #define D4 P1_1 #define D5 P1_3 #define D6 P1_4//为了方便使用&…

CC2530单片机开发--串口

题目 源码下载链接https://download.csdn.net/download/czx20020728/85975522?spm1001.2014.3001.5503

【CC2530入门教程-06】CC2530的ADC工作原理与应用

【CC2530入门教程-06】CC2530的ADC工作原理与应用 【CC2530入门教程-05】CC2530的串行接口原理与应用 【CC2530入门教程-04】CC2530的定时/计数器原理与应用 【CC2530入门教程-03】CC2530的中断系统及外部中断应用 【CC2530入门教程-02】CC2530的通用I/O端口输入和输出控制…

【CC2530入门教程-01】CC2530微控制器开发入门基础

【CC2530入门教程-06】CC2530的ADC工作原理与应用 【CC2530入门教程-05】CC2530的串行接口原理与应用 【CC2530入门教程-04】CC2530的定时/计数器原理与应用 【CC2530入门教程-03】CC2530的中断系统及外部中断应用 【CC2530入门教程-02】CC2530的通用I/O端口输入和输出控制…

CC2530概述(简单了解)

CC2530概述简单版 CC2530是由TI公司生产&#xff08;德州仪器&#xff09;用于 2.4Ghz IEEE 802.15.4、ZigBee 和RF4CE 的片上系统&#xff08;SOC&#xff09;&#xff0c;经济实惠功耗低。 CC2530F256 结合了ZigBee 协议栈&#xff08;Z-Stack&#xff09;。 什么是片上系统…

单片机CC2530学习笔记

文章目录&#xff1a; 一&#xff1a;与或操作 二&#xff1a;CC2530的通用 IO及相关寄存器 1.与通用I/O端口相关常用的4个寄存器 2.PxSEL寄存器与PxDIR寄存器 3.P0INP寄存器与P1INP寄存器与P2INP 三&#xff1a;按键的工作原理与程序设计思路 四&#xff1a;CC2530的中…

c语言长空格的代码是什么,c语言中表示空格的是什么代码?

分析如下&#xff1a; 不是所有字符都需要转义的&#xff0c;空格直接就敲空格&#xff0c;或者使用ASCII码值赋值为32。 空格没有转义字符。合法转义字符如下&#xff1a; \a 响铃(BEL) 、\b 退格(BS)、\f 换页(FF)、\n 换行(LF)、\r 回车(CR)、\t 水平制表(HT)、\v 垂直制表(…

读入带空格的字符串 C语言

如何输出带空格的字符串 C语言默认是遇到空格&#xff0c;即代表输入的字符串的结束处 那么该如何读入带空格的字符串呢&#xff1f; scanf("%[^\n]", buf); //回车结束 这样的话就可以读入空格啦 表达式的意思为遇到’\n’才读取结束 请看演示代码 #include <…

C语言去除一段字符串中的空格

函数说明 将字符串中的所有空格都去掉。该函数简单但实用性强&#xff0c;可以作为字符串过滤器使用&#xff0c;随便改一下就可以实现去掉任意字符的功能&#xff0c;建议程序员的代码库里可以收藏一段该类型代码&#xff0c;用取方便。 函数实现 #include <stdio.h>…

C语言删除字符串中的空格

实现思路&#xff1a;分别定义2个指针&#xff0c;一个快指针s1, 一个慢指针s2,s1负责快速移动&#xff0c;遍历我们的的字符串&#xff0c;遇到空格就跳过&#xff0c;不是空格&#xff0c;就赋值给我们的s2,我们s2再往后移动&#xff0c;这样就把空格挤掉了。 最后别忘记s2 …

c语言空格符 r t,c语言中、\t \r \n 和空格什么意思

具体意思&#xff1a; 都是转义字符&#xff0c;空格就是单纯的空格&#xff0c;输入时可以输入空格 \t 跳格 \r 回车 \n 换行 \\ 反斜杠 \a 警告 \b 退格 \f 换页 \v 垂直跳格 \ddd ddd 是 1、2 或 3 位八进制数字。 转义字符串(E…

c++之静态数据成员与静态成员函数

什么是静态数据成员&#xff1f; 数据成员我们之前学过&#xff0c;是对象的属性。 同一个类&#xff0c;不同的对象&#xff0c;可能拥有不同的属性 例如一个车行&#xff0c;不同的车有不同的颜色&#xff0c;不同的耗油量。。。等等属性 但是当我们统计一个公有的数据&am…

类的静态数据成员和静态成员函数

一.什么是类的静态成员 静态成员变量和全局变量都存储在全局/静态区,它们都是在程序编译时创建,直到编译结束才被收回.所以全局变量和静态成员变量的功能差不多,只是创建的方式不同,类的静态成员创建在类中,全局变量创建在程序开头. 二.为什么要用类的静态成员而不用全局变量 …

37.【C/C++ 静态数据成员和静态成员函数 (超详解)】

静态函数 &#xff08;一&#xff09;、什么是静态函数?1.static变量2.static函数&#xff08;也叫内部函数&#xff09; &#xff08;二&#xff09;、静态数据成员1.空间分配和释放2.静态数据成员初始化效果展示: 3.静态数据成员的访问代码展示:效果展示: (四)、静态成员函数…

[C++] 类的静态成员 (静态数据成员 和 静态成员函数)

目录 一、声明静态成员&#xff1a; 二、定义静态成员&#xff1a; 三、使用类的静态成员&#xff1a; 四、静态成员类内初始化&#xff1a; 五、静态成员与普通成员的区别&#xff1a; 六、案例代码&#xff1a; 类内的静态成员包括&#xff1a; 静态数据成员 和 静态成…

对静态数据成员进行初始化

1.如果希望同类的各个对象中的数据成员的值是一样的&#xff0c;就可以把它定义为静态数据成员。 2.静态数据成员是在编译时预留空间的&#xff0c;在程序开始运行时被分配空间&#xff0c;到程序结束才释放空间。 3.静态数据成员可以初始化&#xff0c;但只能在类体外进行初…

静态数据成员与非静态数据成员的区别

数据成员&#xff1a; 静态数据成员是类的一部分&#xff0c;为类的所有实例共享(静态区)&#xff1b; 非静态数据成员&#xff0c;类的每个实例都有一份拷贝(动态区)。 静态数据成员的访问&#xff1a; 静态数据成员是类的一部分&#xff0c;在产生任何实例之前已经存在&a…

静态数据成员和静态数据成员函数

c中的static静态数据成员和静态成员函数应该是让大家比较头疼的东西&#xff0c;好像也是找工作公司面试中常常问到的东西。我自己也深有体会&#xff0c;在学习c的过程中&#xff0c;总感觉static很烦人&#xff0c;但是又是一个必须懂的东西&#xff0c;所以今天就对静态数据…

静态数据成员(C++)

目录 一、静态数据成员 1.1、定义 1.2、声明 1.3、初始化 1.4、普通访问 1.5、对象访问 二、静态成员函数 一、静态数据成员 1.1、定义 我们都知道&#xff0c;类是对具有相同属性和相同行为的一组对象的描述。 有时侯&#xff0c;我们希望每定义一个对象&#xff0c…

C语言文件 open函数和fopen函数

open 头文件&#xff1a; #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>定义函数&#xff1a; int open(const char * pathname, int flags); int open(const char * pathname, int flags, mode_t mode);函数说明&#xff1a; 参数1…