CC2530单片机技术与应用,CC2530单片机技术与应用主

课程 9
编副主编参编 杨瑞李存志蔡敏邹梓秀 董昌春董晓亮陈旭 刘丰华刘新川 周海涛李文亮 机械工业出版社 本书按照企业对物联网技术应用开发者的能力要求,根据高等教育及职业教育改革精神,实施任务化教学设计。
以C语言为程序开发工具,以CC2530单片机为学习对象,按照从浅入深的学习顺序、从常用功能到专有功能的讲解,设计了12个学习单元共15个典型任务。
书中将51单片机基本知识与CC2530单片机应用知识相结合,介绍了CC2530单片机的基本知识和应用,结合物联网技术应用开发中实际案例和全国职业院校技能大赛物联网赛项题目设计了具体实施任务,是一本理实一体化教材。
本书可作为高职院校物联网应用技术、电子工程技术、应用电子技术、自动控制技术等专业的单片机应用技术课程教材,也可以作为应用型本科、职业中专、函授大学以及单片机技术培训班的教材或相关技术人员的参考用书。
图书在版编目(CIP)数据/主编.—北京:机械工业出版社,2015.7 中等职业学校以工作过程为导向课程改革实验项目.计算机网络技术专业核心课程系列教材 ISBN978-7-111-50833-
5 Ⅰ.①服…Ⅱ.①韩…②王…Ⅳ.①TP368.5 Ⅲ.①网络服务器—配置—中等专业学校—教材 中国版本图书馆CIP数据核字(2015)第154699号机械工业出版社(北京市百万庄大街22号邮政编码100037) 策划编辑:版式设计:封面设计: 责任编辑:责任校对:责任印制:印刷厂印刷 年月第版第次印刷 184mm×260mm·印张·千字 0001— 册 标准书号:ISBN978-7-111-- 定价:.元 凡购本书,如有缺页、倒页、脱页,由本社发行部调换 电话服务服务咨询热线:010-88379833 读者购书热线:010-88379649封面无防伪标均为盗版 网络服务机工官网:机工官博:/cmp1952教育服务网:金书网: 前言 PREFACE 物联网作为教育部新设立专业,教育教学资源缺乏,各开设院校普遍面临着缺教材、缺设备、缺师资现象。
传统的单片机教材,不适合物联网专业使用,为此山东交通职业学院与北京新大陆时代教育科技有限公司合作,对接物联网企业岗位需求,结合高职学生特点及相关院校物联网专业建设实际,开发了本教材。
内容选取上,是以物联网技术应用中常见的CC2530芯片作为单片机学习研究对象,兼顾通用单片机应用所需基础知识,同时结合企业物联网工程师岗位人才需求,将本书内容划分成12个学习单元共15个学习任务。
单元1讲解单片机的相关基本概念和IAR开发环境的运用方法;单元2讲解I/O端口的输出控制和输入识别;单元3讲解中断系统和外部中断输入应用;单元4讲解定时/计数器概念和运用方法;单元5讲解串口通信的实现;单元6讲解A/D转换模块运用方法;单元7讲解看门狗功能及使用;单元8讲解电源管理和低功耗实现;单元9讲解DMA传输方式;单元10讲解内部Flash存取操作;单元11讲解随机数发生器的相关概念和使用方法;单元12讲解定时计数器的PWM功能应用。
内容编排上,基于物联网硬件设计开发工作过程中的典型工作任务进行教学单元设计;每一个教学单元按照概述、目标、任务、总结这样的顺序编排;每个任务按照任务描述、任务分析、必备知识、任务实施、任务拓展这样的顺安排。
任务驱动、层次分明,非常适合教学。
可作为中高职院校、应用型本科院校、培训机构的单片机应用课程教材,也可作为相关技术人员的参考用书。
本书具有以下特点:
(1)由浅入深,分层次学习。
学习单元1到学习单元5属于基本应用能力学习,学习单元6到学习单元12属于高阶能力学习,不同层次的院校或读者可根据自身情况选择学习的内容。

(2)理论与实践相结合。
作为一本理实一体化教材,本书中每个学习任务都是以实际开发项目为载体,在讲述任务实施所必需的基本知识后,紧跟任务实施指导,并在任务完成后给出扩展运用练习。

(3)各学科知识融会贯通。
在任务实施过程中,引导读者将单片机技术与其他课程(如电子应用技术、C语言程序开发等)的知识相结合,让读者学会将各学科知识融会贯通,以解决实际问题。

(4)根据岗位实际设定学习内容。
采用C语言编程,以CC2530为主要学习对象,对接物联网工程技术人员岗位实际需求。

(5)实践操作通用性高。
本书实践部分的源代码测试,是以北京新大陆时代 —·III·— 基于CC2530的单片机技术 CC2530DANPIANJIJISHUYUYINGYONG 教育科技有限公司提供的物联网实验教学设备作为硬件平台。
但在书中对硬件设计和任务实施思路进行了详细的讲解,因此,可很方便地使用其他基于CC2530的实验设备来完成本书中实践任务。

(6)配套完整的相关学习资源。
提供了15个学习任务的全部源代码文件。
不同层次院校根据开设课程的学习深度,可参照下表安排教学学时: 学习单元学习单元1CC2530开发入门学习单元2CC2530并行I/O口应用学习单元3CC2530外部中断应用学习单元4CC2530定时/计数器应用学习单元5CC2530串口通信应用学习单元6CC2530的AD转换应用学习单元7CC2530看门狗应用学习单元8CC2530电源管理应用学习单元9CC2530的DMA应用学习单元10CC2530内部Flash读写应用学习单元11CC2530随机数生成器应用学习单元12PWM控制 分配学时886684444444 本书由杨瑞、董昌春主编,房华教授主审,参与本书编写的各位老师都在各院校从事物联网相关专业教学多年。
房华、杨瑞老师指导学生获得2015年全国职业院校物联网应用技术赛项第一名;董昌春老师指导学生获得2013年全国职业院校物联网应用技术赛项一等奖,是物联网应用技术专业国家资源库建设“物联网硬件基础1”课程资源建设主要负责人。
本书在编写过程中参考了相关的文献与资料,在此向相关作者表示感谢。
同时感谢北京新大陆时代教育科技有限公司给予的大力支持。
由于编者的水平有限,加之时间紧迫,错误不当之处难免,恳请各位读者批评指正,并将意见和建议及时反馈给我们,以便下次修订时改进。
所有意见和建议请发往:zbyr@。
编者2015年10月 —·IV·— 学习单元1CC2530开发入门 单元概述学习目标任务1为CC2530烧写程序任务2让所有发光二极管闪烁单元总结习题
(1)
(1)(1)
(2)(10)(17)(18) 目录 CONTENTS 学习单元5CC2530串口通信应用 单元概述学习目标任务7实现串口发送数据到PC任务8实现PC控制发光二极管单元总结习题 (69) (69)(69)(70)(85)(95)(96) 学习单元2CC2530并行I/O口运用 单元概述学习目标任务3实现流水灯效果 任务4按键控制LED单元总结习题 (19) (19)(19)(20)(30)(36)(37) 学习单元6CC2530的AD转换应用 单元概述学习目标任务9实现外部电压值的测量单元总结习题 (97) (97)(97)(98)(112)(112) 学习单元3CC2530外部中断应用 单元概述 (39) (39) 学习目标 (39) 任务5实现按键控制跑马灯的启停(40) 单元总结 (53) 习题 (54) 学习单元7CC2530看门狗应用 单元概述学习目标任务10实现自动复位单元总结习题 (113) (113)(113)(114)(121)(122) 学习单元4CC2530定时/计数器应用 单元概述 (55) (55) 学习目标 (55) 任务6实现发光二极管的周期性闪烁(56) 单元总结 (67) 习题 (68) 学习单元8CC2530电源管理应用 单元概述 (123) (123) 学习目标 (123) 任务11实现CC2530低功耗运行(124) 单元总结 (143) 习题 (144) —·V·— 基于CC2530的单片机技术 CC2530DANPIANJIJISHUYUYINGYONG 学习单元9CC2530的DMA应用 单元概述 (145) (145) 学习目标 (145) 任务12实现DMA方式拷贝数据(146) 单元总结 (166) 习题 (166) 学习单元10 CC2530内部Flash读写应用 (167) 单元概述 (167) 学习目标 (167) 任务13
实现内部Flash存取数据(168) 单元总结 (179) 习题 (180) 学习单元11 CC2530随机数生成器应用(181) 单元概述 (181) 学习目标任务14产生随机数单元总结习题 学习单元12PWM控制 单元概述学习目标任务15实现呼吸灯效果单元总结习题 (181)(182)(191)(192) (193) (193)(193)(194)(202)(203) 附录 附录
A 附录
B CC2530引脚描述 (205) (205) CC2530外设I/O引脚映射(207) 参考文献 (208) —·VI·— UNIT2 学习单元
2 CC2530并行I/O口运用 单元概述 本学习单元的主要内容是CC2530单片机I/O端口的使用方法,包含任务3和任务4两个任务。
任务3介绍了CC2530的引脚和I/O口相关知识,通过本任务可使学生掌握使用I/O口输出信号的方法。
任务4介绍了I/O输入模式,通过本任务可使学生掌握使用I/O口获取输入信号的方法。
学习目标 知识目标:了解CC2530的I/O口所具备的特性。
理解通用I/O和外设I/O的区别。
了解上拉、下拉和三态的含义。
掌握特殊功能寄存器的作用。
熟悉CC2530控制I/O口的相关寄存器。
理解简单宏定义的作用。
知道按键消抖的目的和方法。
技能目标:能够根据实际应用对I/O口进行配置。
能够使用I/O口输出信号。
能够从I/O口获取输入的信号。
能够使用简单宏定义来帮助编写代码。
能够使用软件方法消除按键抖动 素质目标:具备开阔、灵活的思维能力。
具备积极、主动的探索精神。
具备严谨、细致的工作态度。
基于CC2530的单片机技术 JIYUCC2530DEDANPIANJIJISHU 任务
3 实现流水灯效果 任务要求 编写程序控制实验板上的LED1和LED2的亮、灭状态,使它们以流水灯方式进行工作,即实验板通电后两个发光二极管以下述方式工作: ①通电后LED1和LED2都熄灭。
②延时一段时间后LED1点亮。
③延时一段时间后LED2点亮,此时LED1和LED2都处在点亮状态。
④延时一段时间后LED1熄灭。
⑤延时一段时间后LED2熄灭,此时LED1和LED2都处在熄灭状态。
⑥返回步骤②循环执行。
任务分析 本任务主要是实现对LED灯的控制,我们需要知道CC2530是如何向外输出控制信号的,LED是如何与CC2530进行连接和工作的,以及怎样通过程序来控制CC2530输出所需要的信号。
建议学生带着以下问题去进行本任务的学习和实践:CC2530有哪些I/O端口?CC2530的I/O端口有什么特性?要控制CC2530的I/O端口需要用到哪些寄存器?如何编写程序控制I/O口对外输出信号? 必备知识
1.CC2530的引脚CC2530单片机采用QFN40封装,外观上是一个边长为6mm的正方形芯片,每个边上有10个引脚,总共40个引脚。
CC2530的引脚布局如图3-1所示。
—·20·— 学习单元2CC2530并行I/O口运用 DCOUPLDVDD1P1_6P1_7P2_0P2_1P2_2P2_3/XOSC32K_Q2P2_4/XOSC32K_Q1AVDD6 GNDGNDGNDGNDP1_5P1_4P1_3P1_2P1_1DVDD2 4039123456789101112 383736353433323130 29 28 27 GND 26 GroundPad 25 24 23 22 211314151617181920 RBIASAVDD4AVDD1AVDD2RF_NRF_PAVDD3XOSC_Q2XOSC_Q1AVDD5 P1_0P0_7P0_6P0_5P0_4P0_3P0_2P0_1P0_0RESET_
N 图3-1CC2530引脚布局可按表3-1将CC2530的40个引脚按功能进行分类,各个引脚的详细介绍请参考附录
A。
引脚类型电源类引脚数字I/O引脚时钟引脚复位引脚 RF引脚其他引脚 表3-1引脚类型划分包含引脚 AVDD1~
6、DVDD1~
2、GND、DCOUPLP0_0~P0_
7、P1_0~P1_
7、P2_0~P2_4XOSC_Q1、XOSC_Q2RESET_NRF_
N、RF_PRBIAS 功能简介为芯片内部供电数字信号输入/输出时钟信号输入 让芯片复位外接无线收发天线 外接偏置电阻
2.CC2530的I/O引脚 CC2530总共具有21个数字I/O引脚,这些引脚可以组成3个8位端口,分别为端口
0、端口1和端口
2,通常表示为P0、P1和P2。
其中,P0和P1是完全的8位端口,而P2仅有5位可以使用。
21个I/O引脚具有以下特性,可以通过编程进行配置。

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

(2)可配置为外部设备I/O端口 CC2530内部除了含有8051CPU核心外,还具有其他功能模块,如ADC、定时器和串
行通信模块,我们也称这些功能模块为外设。
可通过编程将I/O口与这些外设建立起连接关 —·21·— 基于CC2530的单片机技术 JIYUCC2530DEDANPIANJIJISHU 系,以便这些外设与CC2530芯片外界电路进行信息交换。
需要注意的是,不能随意指定某个I/O口连接到某个外设,它们之间有一定的对应关系,可参考附录
B,具体知识将在后续任务中学习。

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

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

3.I/O端口的相关寄存器 在单片机内部,有一些具有特殊功能的存储单元,这些存储单元用来存放控制单片机内部器件的命令、数据或是运行过程中的一些状态信息。
这些寄存器统称“特殊功能寄存器(SFR)”,操作单片机本质上就是对这些特殊功能寄存器进行读写操作,并且某些特殊功能寄存器可以位寻址。
例如通过已配置好的P1_1口向外输出高电平可用以下代码实现: P1=0x02;或者P1_1=1; P1是特殊功能寄存器的名字,P1_1是P1中一个位的名字,为了便于使用,每个特殊功能寄存器都会起一个名字。
与CC2530的I/O口有关的主要特殊功能寄存器如表3-2所列,其中x取值为0~
2,分别对应P0、P1和P2口。
表3-2CC2530中I/O口相关主要特殊功能寄存器 名称PxPERCFGAPCFGPxSELPxDIRPxINPPxIFGPICTLPxIENPMUX 功能描述端口数据,用来控制端口的输出或获取端口的输入。
外设控制,用来选择外设功能在I/O口上的位置。
模拟外设I/O配置,用来配置P0都作为模拟I/O口使用。
端口功能选择,用来设置端口是通用I/O还是外设I/O。
端口方向,当端口为通用I/O时,用来设置数据传输方向。
端口输入模式,当端口为通用输入口时,用来选择输入模式。
端口中断状态标志,使用外部中断时,用来表示是否有中断。
端口中断控制,使用外部中断时,用来配置端口中断触发类型。
端口中断屏蔽,用来选择是否使用外部中断功能。
掉电信号,用来输出32KHz时钟信号或内部数字稳压状态。
可以看到I/O端口的相关寄存器有很多,在实际运用时只需根据需要使用其中的部分寄存器即可。
同时需要注意,特殊功能寄存器中的各位数据都是有操作约定的,如表3-
3。
—·22·— 学习单元2CC2530并行I/O口运用 符号R/W RR0R1WW0W1H0H1 表3-3寄存器位操作约定 访问模式可读取也可写入 只能读取读出的值始终为0读出的值始终为
1 只能写入写入任何值都变成0写入任何值都变成1硬件自动将其变成0硬件自动将其变成
1 任务实施
1.电路分析 要使用单片机控制外界器件,就要清楚器件与单片机的连接关系和工作原理,这样才能在编写程序代码时知道该操作哪些I/O端口或功能模块,以及应该输入或输出什么样的控制信号。

(1)LED的连接和工作原理 实验板上LED1和LED2与CC2530的连接如图3-2所示,LED1和LED2的负极端分别通过一个限流电阻连接到地(低电平),它们的正极端分别连接到CC2530的P1_0端口和P1_1端口。
LED-LINKLED1LED-COMMLED2 LE2DLE2D R101KR111K LED-LINKLED-COMMKEY1P1.3P1.4P1.5P1.6P1.7 119P1.08P1.17P1.26P1.35P1.438P1.537P1.6 P1.7 图3-2LED与CC2530连接电路图 为控制两个LED,连接LED的P1_0端口和P1_1端口应被配置成通用输出端口。
当端口输出低电平(逻辑值0)时,LED正极端和负极端都为低电平,LED两端没有电压差,也就不会有电流流过LED,此时LED熄灭。
当端口输出高电平时,LED正极端电平高于负极端电平,LED两端存在电压差,会有电流从端口流出并通过LED的正极端流向负极端,此时LED点亮。
—·23·— 基于CC2530的单片机技术 JIYUCC2530DEDANPIANJIJISHU
(2)驱动电流 LED工作时的电流不能过大,否则会将其烧坏,同时CC2530的I/O口输入和输出电流的能力是有限的,因此这里需要使用限流电阻R10和R11来限制流电流的大小。
红色LED和绿色LED工作时的电压压降约为1.8V,I/O端口的输出电压为3.3V,当LED点亮时其工作电流的大小也就是流过电阻的电流大小。
当前电路中电流的大小为: 电流大小=输出电压-LED压降=3.3V-1.8V=1.5mA 限流电阻阻值 1KΩ CC2530的I/O端口除P1_0和P1_1端口有20mA的驱动能力外,其他I/O端口只有4mA的驱动能力,在应用中从I/O口流入或流出的电流不能超过这些限定值。

2.代码设计
(1)建立工程 参照任务2建立任务3的工程项目,在项目添加名为“code.c”的代码文件。

(2)编写代码 根据任务要求,可将LED的控制流程用流程图进行表示,如图3-3所示。
通电 熄灭LED1
和LED2 延时 延时 点亮LED1 熄灭LED1 延时 延时 点亮LED2 熄灭LED2 1)引用CC2530头文件 图3-3LED控制流程 在code.c文件中引用“ioCC2530.h”文件: #include"ioCC2530.h"//引用CC2530头文件 该文件是为CC2530编程所需的头文件,它包含了CC2530中各个特殊功能寄存器的定义。
只有在引用该头文件后,我们才能在程序代码中直接使用特殊功能寄存器的名称,如P1、P1DIR等。
—·24·— 学习单元2CC2530并行I/O口运用 2)设计延时函数 LED控制流程中需要用到延时,我们在code.c中单独编写一个名为“delay”的延时函数,在需要延时的地方调用该函数即可。
delay函数定义如下: /**************************************************************
函数名称:delay功能:软件延时入口参数:time--延时循环执行次数出口参数:无返回值:无**************************************************************/voiddelay(unsignedinttime){unsignedinti;unsignedcharj;for(i=0;iasm("NOP"); }} 延时函数使用两个for循环嵌套来让CPU进行执行,以达到消耗时间的目的。
函数带有一个整型参数time,在调用函数时,所填入time值的大小决定了延时时间的长短。
3)初始化I/O端口 LED1和LED2分别连接到P1_0和P1_
1,需要将这两个I/O口配置成通用I/O功能,并将
端口的数据传输方向配置成输出。
①将P1_0和P1_1设置成通用I/O。
将I/O口配置成通用I/O需要使用PxSEL特殊功能寄存器,该寄存器的描述如表3-
4。
位 位名称 复位值 7:0SELPx_[7:0]0x00 表3-4PxSEL寄存器 操作 描述设置Px_7到Px_0端口的功能。
R/W 0:对应端口为通用I/O功能。
1:对应端口为外设功能。
这里的“x”是指要使用的端口编号,任务中使用的是P1口的两个端口,所以在编程时寄 —·
25·— 基于CC2530的单片机技术 JIYUCC2530DEDANPIANJIJISHU 存器的名字应该是P1SEL。
将P1_0和P1_1设置为通用I/O,就是将P1SEL寄存器中的第0位和第1位设置成数值
0,设置方法如下: P1SEL&=~0x03;//设置P1_0和P1_1口为普通I/O口 十六进制数0x03转换成二进制后是00000011B,前面加取反符号“~”后数值变成11111100B。
“a&=b”是指将a与b进行按位“与”运算,运算结果赋值给a。
由于0与任何数进行“与”操作结果都是0,1与任何数运算结果都是另一个数本身,所以这种操作方式能在实现将指定位复位(设置成0)的同时不影响其他位的的值。
此时P1SEL中的第0位和第1位被设置成
0,其他位不变。
注意:由于P2口只有5个端口,真正使用的一般只有3个,因此P2SEL寄存器中的位定义和功能与P0SEL和P1SEL不同,详情可参考CC2530的编程手册。
②将P1_0和P1_1设置成输出口。
两个端口被配置成通用I/O功能后,还要设置其传输数据的方向。
我们使用这两个端口对LED进行控制,这实际是在对外输出信号,因此要将P1_0和P1_1的传输方向设置成输出。
配置端口的传输方向使用PxDIR寄存器,其描述如表3-
5。
表3-5PxDIR寄存器 位 位名称 复位值 操作 7:0DIRPx_[7:0]0x00 R/W 描述设置Px_7到Px_0端口的传输方向。
0:输入。
1:输出。
将P1_0和P1_1设置成输出,需要将P1DIR中的DIRP1_0和DIRP1_1两位设置成
1,具体方法如下: P1DIR|=0x03; //设置P1_0口和P1_1口为输出口 此处使用“|=”运算来对P1DIR进行设置,可以将相应位置位(设置成1)且不影响其他位。
③熄灭LED1和LED2。
根据电路连接可知,要熄灭LED只需让对应的I/O口输出
0,在将对应端口设置成通用输出口后,可以采用以下代码来实现: P1_0=0; //熄灭LED1 P1_1=0; //熄灭LED2 以上①、②、③,三部分内容构成了整个初始化代码。
初始化代码是后续代码实现功能 的前提,且在CC2530上电后只需要执行一次,因此要将其放置在主函数(main函数)中的 最前面。
—·
26·— 学习单元2CC2530并行I/O口运用 4)设计主功能代码 根据任务要求,主功能实现代码如下: while
(1)//程序主循环 { delay(1000);//延时 P1_0=1; //点亮LED1 delay(1000);//延时 P1_1=1; //点亮LED2 delay(1000);//延时 P1_0=0; //熄灭LED1 delay(1000);//延时 P1_1=0; //熄灭LED2 } 我们需要实现的功能往往都是要循环执行的,单片机在执行代码时是逐条命令语句依次 执行,当执行完最后一条命令语句后,我们并不确定单片机下一步要执行什么。
因此主函数中 必须使用死循环结构,明确让单片机执行完最后一条指令后返回到循环体开始处重新执行。
可 以选用while
(1){}方式或for(;;){}方式来实现死循环。
整个任务实现的完整代码如下: #include
"ioCC2530.h"//引用CC2530头文件 /**************************************************************函数名称:delay功能:软件延时入口参数:time--延时循环执行次数出口参数:无返回值:无**************************************************************/voiddelay(unsignedinttime){unsignedinti;unsignedcharj;for(i=0;iasm(“NOP”); }} —·27·— 基于CC2530的单片机技术 JIYUCC2530DEDANPIANJIJISHU /************************************************************** 函数名称:main 功能:程序主函数 入口参数:无 出口参数:无 返回值:无 **************************************************************/ void
main(void) { P1SEL&=~0x03;//设置P1_0口和P1_1口为普通I/O口 P1DIR|=0x03; //设置P1_0口和P1_1口为输出口 P1_0=0;P1_1=0; //熄灭LED1//熄灭LED2 while
(1)//程序主循环 { delay(1000);//延时 P1_0=1; //点亮LED1 delay(1000);//延时 P1_1=1; //点亮LED2 delay(1000);//延时 P1_0=0; //熄灭LED1 delay(1000);//延时 P1_1=0; //熄灭LED2 } } 参照前面任务,编译项目,将生成的程序烧写到CC2530中,观察实验板上LED1和 LED2的流水灯效果。
任务拓展
(1)简单宏定义在任务3程序的主函数中,我们直接使用端口名称来控制LED灯的亮/灭状态,如果LED与单片机的连接方式发生改变,如LED1连接到了P1_3口,我们需要将程序中所有的P1_0修改成P1_
3。
这种编程方式给程序的可扩展性带来不利,可以使用宏定义的方法来解决这一问题。
例如:#defineLED1(P1_0)//LED1端口宏定义 —·28·— 学习单元2CC2530并行I/O口运用 #defineLED2(P1_1)//LED1端口宏定义“#define”表示进行宏定义,比如“#definea(b)”。
在程序进行编译时,编译器会将代码中所有出现的a用b来替换掉。
括号不是必须的,但加括号可以避免出现某些运算方面的错误。
将以上内容添加到引用头文件之后,将程序中所有的P1_0和P1_1分别用LED1和LED2取代。
voidmain(void){ P1SEL&=~0x03;P1DIR|=0x03; //设置P1_0口和P1_1口为普通I/O口//设置P1_0口和P1_1口为输出口 LED1=0;LED2=0; //熄灭LED1//熄灭LED2 while
(1)//程序主循环 { delay(1000);//延时 LED1=1; //点亮LED1 delay(1000);//延时 LED2=1; //点亮LED2 delay(1000);//延时 LED1=0; //熄灭LED1 delay(1000);//延时 LED2=0; //熄灭LED2 } } 将程序重新编译和下载后,会发现执行效果没有任何不同,但程序变得更加容易理解。
同时,如果电路连接发生改变,我们只需要修改初始化代码和宏定义的内容就能适应变化。

(2)LED控制拓展练习
编写程序控制实验板上的LED1和LED2的亮、灭状态,使它们以下述方式工作: ①通电后LED1和LED2都点亮。
②延时一段时间后LED2熄灭。
③延时一段时间后LED1熄灭。
④延时一段时间后LED1点亮。
⑤延时一段时间后LED2点亮。
⑥返回步骤②循环执行。
—·29·— 基于CC2530的单片机技术 JIYUCC2530DEDANPIANJIJISHU 任务
4 按键控制LED 任务要求 使用实验板上的SW1按键控制LED1,每按下一次按键,LED1就切换一次亮/灭状态。
任务分析 任务要求使用SW1按键对LED1进行控制,我们首先需要知道SW1按键是如何连接到
CC2530的,以及CC2530如何从I/O端口读取按键的状态。
然后在编写的控制代码中去判断按键的状态,如果SW1按键按下,就让LED1切换一次亮/灭状态。
建议学生带着以下问题去进行本任务的学习和实践:如何将CC2530的I/O端口配置成输入端口?按键如何为I/O口提供输入信号?如何判断按键的状态? 必备知识 使用单片机的I/O端口经常会接触到上拉、下拉和三态这几个概念。

1.上拉和下拉 上拉是指单片机的引脚通过一个电阻连接到电源(高电平),当外界没有信号输入到引
脚时,引脚被上拉电阻固定在高电平(逻辑值1)。
下拉是指单片机的引脚通过一个电阻连接到地(低电平),当外界没有信号输入到引脚时,引脚被下拉电阻固定在低电平(逻辑值0)。
单片机的I/O引脚通过引脚上电平的高、低来判断输入信号是逻辑值1还是逻辑值
0。
接近电源电压值的电平信号认为是逻辑值
1,如3.0V~3.3V之间的电压。
接近0V电压的电平信号认为是逻辑值
0,如0V~0.3V之间的电压。
如果单片机的I/O引脚没有外接器件或者外接器件没有为单片机提供输入信号,那么单片机引脚上的电压就变得不确定,可能介于0V~3.3V之间,单片机就无法正确判断引脚上的状态。
所以,在实际应用中需要使用上拉或下拉来将单片机引脚上的电平固定到一个确定的值。
—·30·— 学习单元2CC2530并行I/O口运用
2.三态 三态也叫高阻,即I/O引脚既没有上拉到电源,也没有下拉到地,呈现高阻值状态。
三态模式一般用于引脚的输出功能,特别是在单片机的引脚接在多个设备公用的通信总线上时。
当单片机不发送信号时,采用三态工作模式可以保证不干扰其他设备之间的通信。
三态模式用于输入引脚时,引脚必须外接其他器件,此时由于不存在上拉或下拉电阻,还能降低单片机的功耗。

3.CC2530I/O端口的输入模式 CC2530的I/O端口作为通用I/O功能使用时,可以配置成输出方式或输入方式。
输入方式用来从外界器件获取输入的电信号,当CC2530的I/O端口被配置成通用输入端口时,这些端口能够提供“上拉”、“下拉”和“三态”三种输入模式,可通过编程进行设置,以满足外接电路设计的要求。
需要注意,P1_0和P1_1端口没有上拉/下拉功能,只能工作在三态模式。
CC2530的I/O引脚如果没有外接设备,应当将这些引脚配置成带上拉或下拉的通用输入方式,也可以配置成通用输出方式,不能让引脚悬空。
如果I/O引脚连接了外部设备,且作为输入方式时外部设备能提供有效的电信号,则可选取上拉、下拉和三态中的任何一种模式来使用。
任务实施
1.电路分析 在实验板上,SW1按键与CC2530之间的连接如图4-1所示。
3.3V_
C R6
10K
4 SW11
3 PUSH2 KEY1C190.1uF LED-LINKLED-COMMKEY1P1.3P1.4P1.5P1.6P1.7 11P1.0 9P1.1 8P1.2 7P1.3 6P1.4 5P1.5 38P1.6 37P1.7 图4-1SW1与CC2530连接电路图SW1按键的一侧(3号、4号引脚)通过一个上拉电阻连接到电源,同时连接到CC2530的P1_2引脚,另一侧(1号、2号引脚)连接到地。
当按键没有按下时,由于上拉电阻的存在,CC2530的P1_2引脚相当于外接了一个上拉电阻,呈现高电平状态。
当按键按下时,按键的4个引脚导通,CC2530的P1_2引脚相当于直接连接到地,呈现低电平状态。
电容C19 —·31·— 基于CC2530的单片机技术 JIYUCC2530DEDANPIANJIJISHU 起到滤波作用,具有一定的消抖功能。
根据电路连接图可知,当SW1按键按下时,程序从P1_2引脚读取的逻辑值是
0,否则读 取的值是
1。

2.按键消抖 通常的按键所用的都是机械弹性开关,由于机械触点的弹性作用,一个按键开关在闭合
时不会马上稳定地接通,在断开时也不会一下子断开,而是在闭合或断开的瞬间均伴随有一连串的抖动,如图4-2所示。
理想按键波形 实际按键波形 图4-2机械按键的抖动 抖动时间的长短由按键的机械特性决定,一般为5ms~10ms,人按一下按键的时间一般为零点几秒至数秒。
由于单片机运行速度快,按键的抖动会导致在一次按下过程中,单片机识别出多次按下和抬起,为避免这种情况需要想办法来消除按键抖动带来的影响。
按键消抖的方法有两种:硬件消抖和软件消抖。
硬件消抖是通过电路硬件设计的方法来过滤按键输出信号,将抖动信号过滤成理想信号后传输给单片机。
软件消抖是通过程序过滤的方法,在程序中检测到按键动作后,延时一会儿后再次检测按键状态,如果延时前后按键的状态一致,则说明按键是正常执行动作,否则认为是按键抖动。
开始配置P1_0为输出口配置P1_2为输入口 熄灭LED1
3.代码设计
(1)建立工程 建立任务4的工程项目,在项目添加名为“code.c”的代码文件。
否SW1是否按下? 是延时消抖
(2)编写代码根据任务要求,可将整个程序的控制流程用图4-3表示。
1)编写基本代码①在代码中引用“ioCC2530.h”头文件。
切换LED1状态 否SW1是否抬起?是 图4-3按键控制LED流程 —·32·— 学习单元2CC2530并行I/O口运用 ②LED1和SW1使用的I/O端口进行宏定义。
#defineLED1(P1_0)//LED1端口宏定义#defineSW1(P1_2)//SW1端口宏定义③因为按键软件消抖需要进行延时,可直接使用之前的延时函数delay函数。
2)编写初始化代码 ①将P1_0和P1_2设置成通用I/O口。
P1SEL&=~0x05;//设置P1_0口和P1_2为通用I/O口②将P1_0设置成输出口,P1_2设置成输入口。
P1DIR|=0x01; //设置P1_0口为输出口 P1DIR&=~0x04;//设置P1_2口为输入口 ③设置P1_2的输入模式。
设置I/O端口的输入模式需使用PxINP寄存器,其中P1INP寄存器和P2INP寄存器的定义一样,如表4-1所示。
P2INP寄存器的定义是另外一种,如表4-2所示。
位 位名称 7:
0 MDPx_[7:0] 表4-1P0INP和P1INP寄存器 复位值0x00 操作 描述 设置Px_7到Px_0端口的I/O输入模式。
R/W 0:上拉或下拉。
1:三态。
该寄存器中某位设置成1时对应I/O端口使用三态模式,设置成0时对应I/O端口使用上拉
或下拉。
具体是上拉还是下拉,需要在P2INP寄存器中设置。
表4-2P2INP寄存器 位 位名称 复位值
7 PDUP2
0 6 PDUP1
0 5 PDUP0
0 4:
0 MDP2_[4:0]
0 操作R/WR/WR/WR/W 描述为端口2所有引脚选择上拉或下拉。
0:上拉。
1:下拉。
为端口1所有引脚选择上拉或下拉。
0:上拉。
1:下拉。
为端口0所有引脚选择上拉或下拉。
0:上拉。
1:下拉。
设置P2_4到P2_0端口的I/O输入模式。
0:上拉或下拉。
1:三态。
—·33·— 基于CC2530的单片机技术 JIYUCC2530DEDANPIANJIJISHU P2INP寄存器中,低5位用来选择P2端口各位的输入模式,高3位分别为P0端口、P1端口和P2端口中的所有引脚选择是使用上拉还是下拉。
例如将P1_2引脚设置成上拉模式,可使用以下代码: P1INP&=~0x04;P2INP&=~0x40; //设置P1_2口为上拉或下拉//设置P1口所有引脚使用上拉 在本任务中,SW1按键与CC2530连接时已经外接了上拉电阻,在程序代码中可以设置P1_2使用上拉或三态模式。
由于CC2530复位后,各个I/O端口默认使用的就是上拉模式,所以该部分代码也可省略。
④将LED1熄灭。
3)编写主程序 在程序主循环中,使用if语句判断SW1(P1_2)的值是否为
0,如果为0则说明按键按下。
接着进行延时和再次判断SW1的值是否为
0,以便消除按键抖动。
如果最终确定按键按下,则切换LED1的亮/灭状态。
最后,为等待按键抬起,需再次对SW1的状态进行判断,如果SW1为0说明按键还没松开,需要执行循环等待。
程序主循环的参考代码如下: while
(1)//程序主循环 { if(SW1==0) //如果按键被按下 { delay(100);//为消抖进行延时 if(SW1==0)//经过延时后按键仍旧处在按下状态 { LED1=~LED1;//反转LED1的亮灭状态 while(!
SW1);//等待按键松开 } } } 完整任务实现代码如下: #include"ioCC2530.h"//引用CC2530头文件 #defineLED1(P1_0)#defineSW1(P1_2) //LED1端口宏定义//SW1端口宏定义 /**************************************************************函数名称:delay功能:软件延时入口参数:time--延时循环执行次数 —·34·— 学习单元2CC2530并行I/O口运用 出口参数:无返回值:无**************************************************************/voiddelay(unsignedinttime){unsignedinti;unsignedcharj;for(i=0;iasm("NOP"); }} /************************************************************** 函数名称:main 功能:程序主函数 入口参数:无 出口参数:无 返回值:无 **************************************************************/ void
main(void) { P1SEL&=~0x05;//设置P1_0口和P1_2为通用I/O口 P1DIR|=0x01; //设置P1_0口为输出口 P1DIR&=~0x04;//设置P1_2口为输入口 P1INP&=~0x04;P2INP&=~0x40; //设置P1_2口为上拉或下拉//设置P1口所有引脚使用上拉 LED1=0; //熄灭LED1 while
(1)//程序主循环 { if(SW1==0) //如果按键被按下 { delay(100);//为消抖进行延时 if(SW1==0)//经过延时后按键仍旧处在按下状态 { —·35·— 基于CC2530的单片机技术 JIYUCC2530DEDANPIANJIJISHU LED1=~LED1;//反转LED1的亮灭状态while(!
SW1);//等待按键松开 }}}}编译项目,将生成的程序烧写到CC2530中,使用实验板上的SW1按键控制LED1的亮/灭。
任务拓展
(1)按键控制拓展练习1结合任务3和任务4所学内容,使用按键控制LE1和LED2的流水灯效果,具体要求如下:①系统复位后LED1和LED2以流水灯方式进行工作。
②当按下SW1按键时,流水灯暂停运行,保持按键按下时的状态。
③当松开SW1按键后,流水灯继续之前的运行。
提示:可以在延时函数中添加代码,使SW1按键按下时执行循环,等待SW1松开。

(2)按键控制拓展练习2使用按键控制LE1的闪烁效果,具体要求如下:①系统复位后LED1熄灭。
②按下一次SW1按键后,LED1开始闪烁。
③再按下一次SW1按键后,LED1停止闪烁并熄灭。
提示:可定义一个标志位变量,用SW1按键来改变该标志位变量的值。
对标志位变量的值进行判断,当其为1的时候,LED1能够闪烁,当其为0的时候,LED1停止闪烁并熄灭。
单元总结
(1)CC2530具有21个数字I/O引脚,分为P0、P1两个完全8位端口和具有5位的P2
端口。

(2)CC2530的I/O端口根据实际需要,可配置成通用I/O口、外设I/O口和外部中断输入口。
—·36·— 学习单元2CC2530并行I/O口运用
(3)当CC2530的I/O端口作为通用输入口时,有上拉、下拉和三态三种不同可模式可供配置,需要根据实际情况进行选择。
P1_0口和P1_1口不支持上拉、下拉模式。

(4)使用特殊功能寄存器能够控制单片机内部器件的工作,能够获取单片机内部器件的状态,能够为单片机内部器件提供数据。

(5)对单片机内部器件的操作本质是对相关特殊功能寄存器进行读/写操作。

(6)在使用单片机驱动外界器件时,需要注意驱动电流的大小。

(7)使用宏定义可以提高代码的可读写和可维护性。

(8)机械按键动作时存在抖动,会影响单片机对按键状态的判断,需要进行消抖,有硬件消抖和软件消抖两种方法。

(9)要将CC2530的I/O口作为通用I/O来使用,需要配置相关特殊功能寄存器来为其设定工作方式、传输方向,如果用作输入还要根据需要配置输入模式。
习题
1.CC2530有多少数字I/O引脚?是如何划分的?
2.CC2530的I/O引脚有哪些特性?
3.特殊功能寄存器对单片机有什么含义?
4.使用CC2530的I/O口实现通用I/O功能需要用到哪些特殊功能寄存器?
5.宏定义的作用是什么?
6.什么是上拉、下拉?他们的作用是什么?
7.为什么要进行按键消抖?如何实现软件消抖? —·37·—

标签: #科目 #互联网 #单车 #安全问题 #人工智能 #职位 #人工智能 #领域