资源简介 (共79张PPT)单片机与C语言技术应用第二单元 任务12.1 使用CC2530的I/O端口学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸阅读08学习目标01掌握if-else条件语句的基本用法;掌握判断条件标志位进行逻辑控制;掌握单片机按键检测的基本原理;掌握按键控制相关端口寄存器设置方法;掌握查询方式按键处理的编程方法;掌握按键外部中断寄存器设置方法;掌握外部中断方式按键处理的编程方法。学习目标01能对CC2530单片机按键进行端口设置;能使用查询方法进行按键有效判断和按键处理;能对CC2530单片机外部中断寄存器进行设置;能使用外部中断方法进行按键有效判断和按键处理。2.1 使用CC2530的I/O端口学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸阅读08任务要求与任务分析02● 任务要求:LED灯交替闪烁● 任务分析:CC2530单片机I/O口输出高低电平控制LED灯的亮灭;采用Delay()延时函数定时输出控制。2.1 使用CC2530的I/O端口学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸阅读08自增自减运算符1知识储备03C语言中整数的表示方法2345C语言中设置和清除某位CC2530通用I/O端口通过寄存器配置通用I/O端口● 自增运算符 :“++”——使变量的值自增1● 自减运算符 :“--” ——使变量值自减1● ++i:i自增1后再参与运算● --i :i自减1后再参与运算● i++:参与运算后i的值再自增1● i-- :参与运算后i的值再自减1知识储备03自增自减运算符1C语言中整数的表示方法2345C语言中设置和清除某位CC2530通用I/O端口通过寄存器配置通用I/O端口知识储备03● 二进制二进制由0和1两个数字组成,使用时必须以0b或0B(不区分大小写)开头。● 八进制八进制由0~7八个数字组成,使用时必须以0开头(注意是数字0,不是字母o)。● 十六进制十六进制由数字0~9、字母A~F或a~f(不区分大小写)组成,使用时必须以0x或0X(不区分大小写)开头。● 十进制十进制由0~9十个数字组成,没有任何前缀,和我们平时的书写格式一样。知识储备03自增自减运算符1C语言中整数的表示方法2345C语言中设置和清除某位CC2530通用I/O端口通过寄存器配置通用I/O端口知识储备03● 对变量的某些位清0而不影响其他位变量a当前的值是0x6d(0b0110 1101),现需要将该变量的第0位和第5位的值改为0,同时不能影响其它位的值。那么,在C语言中可以使用位与(&)操作符实现。写法举例:a = a & ~0x21;用复合位运算符简写为:a &= ~0x21;知识储备03逻辑“与”操作的特点为,该位有0结果就为0,若为1则保持原来值不变。如果需要将其中的第n位清零,可以写成:a &= ~(0x01<左移的起始次数是从0次开始,即第0位清零不需要移动,而第n位清零则需要左移n次。知识储备03● 对变量的某些位置1而不影响其他位变量a当前的值是0x6d(0b0110 1101),现需要将该变量的第1位和第4位的值改为1,同时不能影响其它位的值。那么,在C语言中可以使用位或(|)操作符实现。写法举例:a = a | 0x12;用复合位运算符简写为:a |= 0x12;知识储备03● 对变量的某些位置1而不影响其他位逻辑“或”操作的特点为,该位有1结果就为1,若为0则保存原来值不变。如果需要将其中的第n位置1,可以写成:a |= (0x01<知识储备03自增自减运算符1C语言中整数的表示方法2345C语言中设置和清除某位CC2530通用I/O端口通过寄存器配置通用I/O端口知识储备03● CC2530采用QFN40封装,共有40个引脚,可以作为GPIO(General-purpose input/output,通用数字输入输出端口,也简称I/O口)的共有21个,分为3个端口组,分别命名为P0、P1、P2;● 其中P0和P1端口组有8位端口,P2仅有5个端口;● 在这些I/O口中有两种不同的输出电流,P1_0和P1_1输出电流为20mA,在配置为输入时没有上拉和下拉功能;● 剩下的19个端口输出电流只有4mA,在配置为输入时可以选择内部上拉、下拉或三态;● 仿真时需要使用P2_1和P2_2,实时时钟的晶振需要使用P2_3和P2_4。知识储备03知识储备03自增自减运算符1C语言中整数的表示方法2345C语言中设置和清除某位CC2530通用I/O端口通过寄存器配置通用I/O端口知识储备03● 在单片机内部有一些特殊功能的存储单元,这些单元用来存放控制单片机的内部命令、数据或运行过程中的一些状态信息,这些寄存器统称为“特殊功能寄存器”,操作单片机的本质,就是对这些特殊功能寄存器进行读写操作。● 每一个特殊功能寄存器本质上就是一个内存单元,而且只能通过内存地址标识和使用内存单元。● 为了便于使用,每个特殊功能寄存器都有一个对应的名字。● 在程序设计时,通过预处理的文件包含命令#include ,就可以直接使用寄存器的名称访问内存地址。知识储备03● PxSEL:端口功能选择寄存器,设置端口是通用I/O还是外设功能。位 位名称 复位值 操作 描述7:0 PxSEL_[7:0] 0x00 R/W 设置Px_7到Px_0端口的功能。设置为0:对应端口被设置为通用I/O功能。设置为1:对应端口被设置为外设功能。这里的“x”是指要使用的端口组编号,例如要配置P1_0端口,则选择P1SEL寄存器。复位值为0x00,即复位后均默认为通用I/O功能。知识储备03配置代码举例:1. P1SEL &= ~0x03; //设置P1_0和P1_1为通用I/O功能2. P0SEL |= 0x48; //设置P0_3和P0_6为外设功能知识储备03● PxDIR:端口传输方向寄存器,用来设置数据的传输方向(作为输入或者作为输出)位 位名称 复位值 操作 描述7:0 PxDIR_[7:0] 0x00 R/W 设置Px_7到Px_0端口的传输方向。设置为0:对应端口被设置为输入。设置为1:对应端口被设置为输出。这里的“x”是指要使用的端口编号,例如要设置P1_0端口,则选择P1DIR寄存器。复位值为0x00,即复位均默认为输入功能。知识储备03配置代码举例:1. P1DIR &= ~0x03; //设置P1_0和P1_1为输入2. P0DIR |= 0x48; //设置P0_3和P0_6为输出知识储备032.1 使用CC2530的I/O端口学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸阅读08任务实施04● 任务实施前必须先准备好以下设备和资源:序号 设备/资源名称 数量 是否准备到位(√)1 计算机(已安装好IAR软件) 1台 2 NEWLab实训平台 1套 3 CC-Debugger 仿真器 1套 4 白板 1块 12打开工程编写代码3编译工程4仿真调试任务实施04●按单元1任务3的方式打开工程。任务实施0412打开工程编写代码3编译工程4仿真调试任务实施04● 步骤1:头文件包含#include 任务实施04● 步骤2:I/O引脚宏定义任务实施04分析原理图可以得到LED1是连接到P1_0,LED2是连接到P1_1,输出高电平LED点亮,输出低电平LED熄灭。可以通过软件对P1_0或P1_1直接操作输出,写“0”输出低电平,写“1”输出高电平,参考代码如下:P1_0 = 0; //P1_0输出低电平P1_0 = 1; //P1_0输出高电平P1_1 = 0; //P1_1输出低电平P1_1 = 1; //P1_1输出高电平任务实施04考虑到直接使用P1_0或P1_1不够直观,可以使用第一单元介绍的宏定义,将P1_0和P1_1宏定义为LED1和LED2,参考代码如下:#define LED1 P1_0 //P1_0引脚宏定义为LED1#define LED2 P1_1 //P1_1引脚宏定义为LED2任务实施04采用以上宏定义后,后续可以采用LED1代替P1_0,LED2代替P1_1, 对LED1和LED2的操作等效于对P1_0和P1_1引脚的操作,参考代码如下:LED1 = 0; //P1_0输出低电平LED1 = 1; //P1_0输出高电平LED2 = 0; //P1_1输出低电平LED2 = 1; //P1_1输出高电平任务实施04● 步骤3:编写I/O口初始化函数初始化I/O口的代码编写思路如下:(1)设置P1SEL寄存器,将P1_0和P1_1设置为通用I/O端口。(2)设置P1DIR寄存器,将P1_0和P1_1设置为输出。初始化代码如下:P1SEL &= ~0x03; //设置P1_0和P1_1设为通用I/O功能P1DIR |= 0x03; //设置P1_0和P1_1设为输出任务实施04由于上电复位之后所有端口均设置为通用I/O,因此设置P1SEL可以省略,修改后的代码如下:P1DIR |= 0x03; //设置P1_0和P1_1设为输出任务实施04把以上代码写到初始化函数中,是一个无参函数,无返回值,参考代码如下:void InitIO(void){P1DIR |= 0x03; //设置P1_0和P1_1设为输出}任务实施04● 步骤4:编写延时函数LED的亮灭之间需要插入延时,人眼才能观察到LED灯在闪烁,延时函数参考代码如下:任务实施04void Delay(unsigned int n){unsigned int i,j;for(i=0;i{for(j=0;j<600;j++);}}该延时函数的输入参数为n,对应的延时时长为n毫秒。任务实施04● 步骤5:编写main主函数void main(void) //主函数{InitIO( ); //初始化LED灯控制IO口while(1){LED1 = 1; //设置P1_0输出高电平,点亮LED1灯LED2 = 0; //设置P1_1输出低电平,熄灭LED2灯任务实施04Delay(1000); //延时1秒LED1 = 0; //设置P1_0输出低电平,熄灭LED1灯LED2 = 1; //设置P1_1输出高电平,点亮LED2灯Delay(1000); //延时1秒}}任务实施04main主函数完成I/O口初始化,然后进入不断循环执行LED1和LED2交替闪烁。在循环语句中,点亮LED1,熄灭LED2,延时,再熄灭LED1,点亮LED2,再延时,反复循环,就可以实现LED交替闪烁。任务实施0412打开工程编写代码3编译工程4仿真调试任务实施04按照任务2的第四步对工程进行编译。如果没有错误,可在以信息栏看到编译成功的信息,如果提示错误,需要认真检查修改,重新编译链接,直到没有错误为止。任务实施0412打开工程编写代码3编译工程4仿真调试任务实施04按任务3连接好CC-Debugger仿真器和ZigBee模块白板。(1)进入仿真调试模式。先检查一下仿真软件的驱动是否安装,如有需要,请参见书配套资源。还需要确认菜单栏中否有仿真菜单“Texas Instruments Emulator”任务实施04如果没有以上菜单,需要重新设置,直到出现“Texas Instruments Emulator”为止。任务实施04连接好CC-Debugger仿真器,选择菜单Project->Download and Debug、或快捷键CTRL+D、或点击工具栏上 进入调试状态,开始下载程序,下载完成程序指针停止在main函数的第一行,表明预备执行该行代码(只是预备,还没有开始执行)。第一次下载程序前需要按仿真器侧面的复位按钮,否则会导致下载错误。任务实施04(2)观察变量的值。可以通过Watch观察变量的值,以LED1和LED2为例,先选择菜单View->Watch,打开Watch窗口,在Watch窗口中输入LED1和LED2。任务实施04分别操作逐行运行、跳入运行、跳出运行,观察程序指针的运行状态,观察Watch窗口中LED1和LED2值的变化,再看观察ZigBee板上LED灯的亮灭,值的变化与亮灭是否一一对应。任务实施04(3)观察寄存器值选择菜单View-> Register,打开Register窗口,可以通过窗口看到寄存器的值。分别操作逐行运行、跳入运行、跳出运行,观察程序指针的运行状态,并且观察Register窗口的值。任务实施04任务实施04(4)断点。先点击需要插入断点的语句,再选择图标 插入断点如果需要取消断点,可以先点击需要取消的的语句,再选择图标 取消断点。全速运行程序,选择菜单Debug->Go,或者按F5,或点调试工具栏上 , 如果有断点,运行到断点处会自动停下,如果没有断点,程序将一直运行下去,观察ZigBee板上LED灯的亮灭。任务实施04(5)退出仿真调试模式选择菜单Debug->Stop Debugging,或者快捷键Ctrl + Shift + D ,或点调试工具栏上仿真调试除了可以用于下载代码,还能帮我们分析代码执行过程中程序的状态,还能观察变量、寄存器、RAM中的值、端口的状态等,有利于进行代码设计和分析等工作。任务实施04学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸阅读082.1 使用CC2530的I/O端口05任务工单本次任务关键知识引导1.自增运算符记为“++”,其功能是使变量的值( );自减运算符记为“--”,其功能是使变量值( )。2.二进制使用时必须以( )开头,八进制使用时必须以( )开头,十六进制使用时必须以( )开头。3.十六进制的值为0x6d,转为二进制为( ),4.++i:i自增1后再参与( );i++:参与( )后i的值再自增1。5.C语言中的整数可以使用( )进制、( )进制、八进制和( )进制表示。6.在C语言中某些位清0而不影响其他位,可以使用位与( )操作符实现,某些位置1而不影响其他位值1,可以使用位或( )操作符实现。7.CC2530共有( )个引脚,可以作为通用数字I/O端口的共有( )个。8.CC2530输出电流为20mA的端口为( )和( )。9.在单片机内部有一些特殊功能的存储单元,统称为特殊功能寄存器,英文简称为( )。10.CC2530的P0的通用I/O端口相关的寄存器为( ),P1的端口传输方向寄存器( )。11.选择菜单Project->( ),开始下载程序。任务工单05各组选派代表分析本组任务实施经验;01添加标题请参照评价标准完成自评;02完成对其他小组的评价。03互评经验分享自评评价方式 可采用自评、互评、老师评价等方式 说明 主要评价学生在项目学习过程中的操作技能、理论知识、学习态度、课堂表现、学习能力等。 序号 评价内容 评价标准 分值 得分1 知识运用(20%) 掌握相关理论知识,完成本次任务关键知识的作答准确率(20分) 20分2 专业技能(40%) 工程编译通过,LED的指示功能正常。(40分) 40分工程编译通过,LED的指示功能异常。(30分)完成代码的输入,工程没有编译通过。(15分)建立工程错误,或者部分输入代码。(5分)3 核心素养(20%) 具有良好的自主学习、分析解决问题、帮助他人的能力、整个任务过程中有指导他人并解决他人问题(20分) 20分具有较好的学习能力和分析解决问题的能力,任务过程中无指导他人(15分)具有主动学习并收集信息的能力,遇到问题有请教他人并得以解决(10分)不主动学习(0分)4 职业素养(20%) 实验完成后,设备无损坏、设备摆放整齐、工位区域内保持整洁、无干扰课堂秩序(20分) 20分实验完成后,设备无损坏、无干扰课堂秩序(15分)无干扰课堂秩序(10分)干扰课堂秩序(0分)总得分学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸阅读082.1 使用CC2530的I/O端口任务小结06学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸练习082.1 使用CC2530的I/O端口任务拓展07动动脑1.知识储备中有介绍C语言中整数的表示方法,在数学上010和10的值是相同的,但在C语言中,表达式010和10的前缀不一样,其表示的数值大小也是不一样的,为什么?2.例子中有一个延时函数,这个函数的功能是什么,如果没有这个函数,人还能不能观察到外接的LED灯闪烁,为什么?任务拓展07动动手1.课本中的例子为两个LED交替闪烁,试着修改代码,改为两个LED同时闪烁,再重新编译链接之后,将生成的代码写到ZigBee模块白板中测试一下效果。2.在进入仿真调试界面,观察View菜单下的各功能。学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸练习082.1 使用CC2530的I/O端口延伸练习081.IAR断点类型设置断点目的简单来说就是在指定指令或者代码行中断程序的执行,有硬件断点和软件断点之分。常规的断点调试是在想观察哪里的问题时,就在对应的代码位置设置断点,一旦运行到断点位置时程序会自动暂停运行,通过观察感兴趣的变量、寄存器、RAM中的值等工具找查问题。延伸练习08很多时候我们想知道某段代码运行之后的状态,但又不能让程序停下来,譬如说调试ZigBee协议栈时就不能单步运行,否则会打断ZigBee的通讯时序;在中断处理函数调试时也不能停下,否则就会失去后续的中断响应;还有就是同一段循环体,想运行一定次数再停下来等。对此IAR提供了代码断点、条件断点、读写访问权限的数据断点、数据日志断点和电源断点等。部分断点功能在右键菜单中。延伸练习08右键菜单:延伸练习08还有部分断点需要进行条件设置,以设置循环次数断点为例,计划在延时函数中当i值为4000时停止运行,先View->Breakpoints打开断点调试界面延伸练习08先在循环内需要观察的代码行用图标设置断点,成功后会有断点标记,在断点调试界面中自动生成相关信息。延伸练习08断点信息:延伸练习08在断点信息窗口中的断点单击右键,左键选择Edit延伸练习08Conditions的Expression窗口中设置好条件i==4000,单击“确定”延伸练习082.视觉暂留和PWM调光视觉暂留现象又称“余晖效应”,人眼在观察景物时,光信号传入大脑神经,需经过一段短暂的时间,光的作用结束后,大脑中的视觉形象并不立即消失,这种残留的视觉称“后像”,视觉的这一现象则被称为“视觉暂留”。延伸练习08视觉暂留现象首先被中国人运用,走马灯是有历史记载最早的视觉暂留现象的运用。正月十五元宵节,民间风俗要挂花灯,马灯为其中的一种,是利用燃灯的热气推动灯旋转,这是我国民间彩灯一种独特的艺术形式。由于灯的各个面上都绘有古代武将骑马的图画,而灯转动时看起来好像几个人你追我赶,故名走马灯延伸练习08走马灯:延伸练习08视觉暂留会使人的视觉产生重叠现象,使物体“变静为动”,例如,下雨时,雨点是一滴一滴落到地面上,它本身并不是连续的,但我们的感觉却是雨点仿佛是一条条连绵不断地向下倾注的水线;电风扇转动时,每个扇叶仍是分开的,但我们却只看到一个圆盘的形状;黑暗中旋转的焰火,看起来就像一个火圈。延伸练习08手机显示屏中的PWM调光就是利用视觉暂留现象。PWM的意思为脉冲宽度调制,通过周期性的点亮熄灭屏幕来调节屏幕的亮度延伸练习08延伸练习08根据上图我们可以发现,亮灭虽然交替,但是里面亮的时间和灭的时间是不一样的,当亮的时间更长的时候,我们观察到的屏幕亮度会比较亮的,当灭的时间更长的时候,我们看到的屏幕亮度会比较暗的,通过调节亮和灭在一个周期内所占的时间比例,就可以控制屏幕亮度。 展开更多...... 收起↑ 资源预览