资源简介 (共68张PPT)单片机与C语言技术应用第五单元 任务15.1 SW2按键进行模式选择学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸阅读08学习目标01掌握交通信号灯在各种工作模式下的运行过程;掌握根据任务需求查阅C语言相关知识点;掌握根据任务要求查阅CC2530中文技术手册的相关知识要点;掌握对任务进行分解并设计软件流程;掌握C语言的预处理、数据类型、常用运算符、控制语句、程序结构相关知识点;掌握I/O口输入检测、I/O口输出控制、定时器1计数、串口0通信。学习目标01能根据任务需求对任务进行分解并设计软件流程图;能根据任务需求查阅CC2530中文技术手册的相关知识要点;能利用C语言知识要点结合软件流程图编写代码;能对I/O口输入检测、I/O口输出控制、定时器1计数、串口0通信进行整合设计智能交通信号灯。学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸阅读085.1 SW2按键进行模式选择任务要求与任务分析02● 任务要求:①黑板通电后,D4红色LED熄灭(指示灯灭)为手动模式;②按第一次SW2按键,D4红色LED点亮(指示灯亮)为自动模式;③按第二次SW2按键,D4红色LED闪烁(指示灯闪烁)为远程模式;任务要求与任务分析02● 任务要求:④按第三次SW2按键,D4红色LED熄灭(指示灯灭)为手动模式;⑤按键操作效果可循环。任务要求与任务分析02● 任务分析:定义一个字节型全局变量用于描述当前的工作模式;扫描方式SW2按键检测进行模式选择;定时器1工作在模模下定时输出控制。学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸阅读085.1 SW2按键进行模式选择交通信号灯的工作模式1知识储备03工作模式切换及模式指示灯计数器定义2345switch语句本任务所用到的C语言知识要点完成本任务需要查阅CC2530技术手册中相关知识要点03知识储备目前,交通信号灯控制系统中主要有三种工作模式,分别为手动模式、自动模式、远程模式。自动模式下,绿灯、黄灯、红灯按照固定的顺序和固定的时长自动定时交替点亮。大部分时间,交通信号灯工作在自动模式下。03知识储备手动模式下,按键动作时,绿灯、黄灯、红灯按照固定的顺序交替点亮,但交通信号灯点亮的时长不固定。当外部按键动作时,交通信号灯的状态才发生变化。在上班早高峰和下班晚高峰两个时间段,交通警察会根据各个方向的车流情况手动控制交通信号灯的状态。03知识储备远程模式下,交通信号灯系统通过有线或无线方式接收远端控制指令,根据控制协议管理交通信号灯的状态。目前,大部分十字路口都安装高清摄像头用于远程监控,在交通调度中心,交通警察通过视频流信息判断各个方向的车流情况,发送控制指令,从而实现远端控制交通信号灯的状态。交通信号灯的工作模式1知识储备03工作模式切换及模式指示灯计数器定义2345switch语句本任务所用到的C语言知识要点完成本任务需要查阅CC2530技术手册中相关知识要点03知识储备每一次按键动作,交通信号灯的工作模式将按照“手动模式->自动模式->远程模式->手动模式->……”的顺序进行循环切换。当下为手动模式时,按键动作将切换到自动模式;当下为自动模式时,按键动作将切换到远程模式;当下为远程模式时,按键动作将切换到手动模式。因此,需要定义一个字节型全局变量,该变量的值表示当前的工作模式。同时利用模式指示灯的不同状态表示不同的工作模式,熄灭表示手动模式,点亮表示自动模式,闪烁表示远程模式。03知识储备模式指示灯闪烁要求一定的时长的开关,因此需要定义一个字型全局变量作为模式指示灯计数器,定时器每中断一次,变量的值加1,根据变量的值控制模式指示灯的亮灭状态。03知识储备本任务定义一个字节全局变量Work_Mode,当Work_Mode为0x00时,表示目前处于手动模式;当Work_Mode为0x01时,表示目前处于自动模式;当Work_Mode为0x02时,表示目前处于远程模式;当Work_Mode为其它值时,则无任何意义。同时定义一字型全局变量Mode_Led_Timer,初始化为0,定时器每1毫秒中断一次,Mode_Led_Timer加1。当Mode_Led_Timer等于500时,刚好间隔500毫秒,模式指示灯的状态翻转,Mode_Led_Timer的值赋值为0,进行下一轮循环计数。03知识储备本任务中工作模式定义以及模式指示灯计数器的配置代码如下:1.#define Manual_Mode 0x00 //手动模式2.#define Auto_Mode 0x01 //自动模式3.#define Remote_Mode 0x02 //远程模式4.unsigned char Work_Mode = Manual_Mode; //工作模式,初始化默认为手动模式5.unsigned int Mode_Led_Timer=0x00; //模式指示灯计数器,单位为1ms03知识储备字节型变量的赋值范围为0~255,字型变量的赋值范围为0~65535,对变量的赋值不能超过其赋值范围。交通信号灯的工作模式1知识储备03工作模式切换及模式指示灯计数器定义2345switch语句本任务所用到的C语言知识要点完成本任务需要查阅CC2530技术手册中相关知识要点03知识储备switch语句的格式如下:1.switch (表达式)2.{3. case 常量表达式1:4. 语句组1;5. break;6. case 常量表达式2:7. 语句组2;8. break;9. …03知识储备10. case 常量表达式n:11. 语句组n;12. break;13. default:14. 语句组m;15. break;16.}03知识储备switch语句执行时,首先计算表达式的值,然后按照顺序逐个与各case后面的常量表达式的值进行比较,当与某个常量表达式的值相等时,则执行常量表达式后面的语句组,再执行break而跳出switch语句;当与某个常量表达式的值不相等时,则继续与下一个case后面的常量表达式的值进行比较;如与所有case后面的常量表达式的值都不相等时,则执行default后面的语句组m, 语句组m可以为空不做任何操作,最后跳出switch语句。交通信号灯的工作模式1知识储备03工作模式切换及模式指示灯计数器定义2345switch语句本任务所用到的C语言知识要点完成本任务需要查阅CC2530技术手册中相关知识要点03知识储备(1)预处理--文件包含、宏定义;(2)数据类型与变量说明--全局变量、局部变量、数据类型unsigned char、数据类型unsigned int;(3)算术运算符--自增(++);(4)关系运算符--等于(==);(5)位操作运算符--位非(~);(6)赋值运算符--简单赋值(=);(7)while循环语句;(8)for循环语句;(9)switch判断语句;(10)if判断语句;(11)程序结构--顺序结构、选择结构、循环结构;(12)函数和主函数--子函数的调用。交通信号灯的工作模式1知识储备03工作模式切换及模式指示灯计数器定义2345switch语句本任务所用到的C语言知识要点完成本任务需要查阅CC2530技术手册中相关知识要点03知识储备本任务主要涉及I/O口输入检测、I/O口输出控制和定时器1计数,其中,I/O口输入检测使用扫描方式,定时器1选择工作在模模式下。为完成本任务,可查阅CC2530中文数据手册中相关技术要点,具体如下:(1)查阅CC2530中文数据手册中的“7.3 通用I/O口”;(2)查阅CC2530中文数据手册中的“7.11 I/O引脚”;(3)查阅CC2530中文数据手册中的“7.6 外设I/O口”(4)查阅CC2530中文数据手册中的“9.1 16位计数器”;(5)查阅CC2530中文数据手册中的“9.4 模模式”;(6)查阅CC2530中文数据手册中的“9.8 输出比较模式”;(7)查阅CC2530中文数据手册中的“9.10 定时器1中断”;(8)查阅CC2530中文数据手册中的“9.12 定时器1寄存器”。学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸阅读085.1 SW2按键进行模式选择任务实施04● 任务实施前必须先准备好以下设备和资源:序号 设备/资源名称 数量 是否准备到位(√)1 计算机(已安装好IAR软件) 1台 2 NEWLab实训平台 1套 3 CC-Debugger 仿真器 1套 4 黑板 1块 12任务实施04打开工程编写代码3编译工程4仿真调试●打开本书配套源代码文件夹中的“SW2按键进行模式选择.ewp”工程。04任务实施12任务实施04打开工程编写代码3编译工程4仿真调试● 步骤1:头文件包含04任务实施#include ● 步骤2:I/O引脚宏定义04任务实施1.#define Led_Mode P1_1 //P1_1引脚宏定义,模式指示灯控制引脚2.#define SW2 P0_1 //P0_1引脚宏定义3.#define Manual_Mode 0x00 //手动模式4.#define Auto_Mode 0x01 //自动模式5.#define Remote_Mode 0x02 //远程模式步骤3:全局变量定义及初始化1.unsigned char Work_Mode=Manual_Mode; //工作模式,初始化默认为手动模式2.unsigned int Mode_Led_Timer=0x00; //模式指示灯计数器,单位为1ms04任务实施main主函数执行之前,全局变量将被定义并初始化,因此黑板上电后,工作模式默认为手动模式。步骤4:编写I/O口初始化函数04任务实施1.void InitIO(void)2.{3. P1SEL &=0xFD; //设置P1_1为通用I/O引脚4. P1DIR |=0x02; //设置P1_1为输出引脚5. P0SEL&=0xFD; //设置P0_1为通用I/O口引脚6. P0DIR&=0xFD; //设置P0_1为输入引脚7. //输入默认上拉8. Led_Mode=0; //模式指示灯关闭,表示上电初始状态为手动模式9.}04任务实施完成I/O口的输入/输出与上下拉配置,将模式指示灯关闭,表示上电初始状态为手动模式。步骤5:编写定时器1初始化函数04任务实施1.void Init_Timer1(void)2.{3. T1CTL=0x02; //定时器分频系数为1,默认为16MHz,选择模模式4. T1CC0L=0x80; //最大计数值低8位5. T1CC0H=0x3E; //最大计数值高8位,最大计数值为16000,定时1ms6. T1CCTL0|=0x04; //配置通道0为比较模式7. T1IE=1; //使能定时器1中断8.}04任务实施设置定时器1的分频系数,得到定时器1的时钟频率为16MHz;选择定时器1工作在模模式下并根据定时中断周期设置最大计数值;设置定时器1通道0比较输出并使能定时器1中断。步骤6:编写延时函数1.void Delay(unsigned int n)2.{3. unsigned int i,j;4. for(i=0;i5. {6. for(j=0;j<600;j++);7. }8.}04任务实施04任务实施本任务选择内部16MHz的高频RC振荡器为系统时钟源,该延时函数的输入参数为n,对应的延时时长为n毫秒。步骤7:编写SW2检测按下函数1.void SW2_Key_Scan(void)2.{3. if(SW2==0) //判断SW2按键是否被按下4. {5. Delay(10); //延时10ms去抖6. if(SW2==0) //判断SW2按键是否仍按下7. {8. switch(Work_Mode) //判断工作模式04任务实施9. {10. case Manual_Mode:11. Led_Mode=1; //模式指示灯熄灭12. Work_Mode=Auto_Mode; //切换到自动模式13. break;14. case Auto_Mode:15. Led_Mode=~Led_Mode; //模式指示灯状态翻转16. Work_Mode=Remote_Mode; //切换到远程模式17. Mode_Led_Timer=0; //模式指示灯计数器清018. break;04任务实施19. case Remote_Mode:20. Led_Mode=0; //模式指示灯熄灭21. Work_Mode=Manual_Mode; //切换到手动模式22. break;23. default:24. break;25. }26. while(SW2==0); //等待SW2按键松开27. }28. }29.}04任务实施04任务实施检测SW2按键状态,通过软件延时消抖;当检测SW2按键按下时,切换工作模式,然后等待SW2按键松开继续往下执行.04任务实施SW2检测按下任务:步骤8:编写定时器1中断服务函数1.#pragma vector=T1_VECTOR //定时器1中断向量指定2.__interrupt void Timer1_ISR(void)3.{4. Mode_Led_Timer++; //模式指示灯计数器加15. if(Work_Mode == Remote_Mode) //判断工作模式是否为远程模式6. {04任务实施7. if(Mode_Led_Timer==500)8. {9. Mode_Led_Timer=0; //模式指示灯计数器清010. Led_Mode=~Led_Mode; //模式指示灯状态翻转,亮0.5秒灭0.5秒11. }12. }13.}04任务实施04任务实施定时器1中断周期为1毫秒,每1毫秒Mode_Led_Timer加1。当Mode_Led_Timer的值为500时,模式指示灯状态翻转,Mode_Led_Timer的值清0,进行下一轮循环计数.04任务实施定时器1中断处理任务:步骤9:编写main主函数1.void main(void)2.{3. InitIO(); //I/O口初始化4. Init_Timer1(); //定时器初始化5. EA=1; //使能总中断6. while(1)7. {8. SW2_Key_Scan(); //SW2按键扫描任务9. }10.}04任务实施04任务实施main主函数完成I/O口初始化、定时器1初始化以及总中断使能,然后不断循环执行SW2检测按下任务04任务实施main主函数:04任务实施12任务实施04打开工程编写代码3编译工程4仿真调试对工程进行编译,观察是否提示编译成功。如果出现错误或警告,需要认真检查修改,重新编译链接,直到没有错误和警告为止。04任务实施12任务实施04打开工程编写代码3编译工程4下载代码(1)用CC-Debugger仿真器的下载线连接黑板;(2)完成代码下载;(3)黑板上电,D4红色LED熄灭为手动模式,手动操作SW2按键,D4红色LED状态切换,D4红色LED点亮为自动模式;D4红色LED闪烁为远程模式。04任务实施学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸阅读085.1 SW2按键进行模式选择05任务工单本次任务关键知识引导:1.自增运算符记为“++”,其功能是使变量的值( );自减运算符记为“--”,其功能是使变量值( )。2.二进制使用时必须以( )开头,八进制使用时必须以( )开头,十六进制使用时必须以( )开头。3.++i:i自增1后再参与( );i++:参与( )后i的值再自增1。4.在C语言中某些位清0而不影响其他位,可以使用位与( )操作符实现,某些位置1而不影响其他位值1,可以使用位或( )操作符实现。5.在单片机内部有一些特殊功能的存储单元,统称为特殊功能寄存器,英文简称为( )。6.CC2530的P0的通用I/O端口相关的寄存器为( ),P1的端口传输方向寄存器( )。7.关系运算符“==”,其功能是判断“==”左右两边的等式是否相等,当左右两边等式相等时,其运算结果为( );当左右两边不相等时,其运算结果为( )。8.C51语言的if(表达式)语句,其中“表达式”的结果只能为( )或( )。9.CC2530单片机I/O输入引脚可设置为( )、( )或( )模式。任务工单05各组选派代表分析本组任务实施经验;01添加标题请参照评价标准完成自评;02完成对其他小组的评价。03互评经验分享自评评价方式 可采用自评、互评、老师评价等方式 说明 主要评价学生在项目学习过程中的操作技能、理论知识、学习态度、课堂表现、学习能力等。 序号 评价内容 评价标准 分值 得分1 知识运用(20%) 掌握相关理论知识,完成本次任务关键知识的作答准确率(20分) 20分2 专业技能(40%) 工程编译通过,SW2按键动作,模式指示灯状态切换正常。(40分) 40分工程编译通过,SW2按键动作,模式指示灯状态切换异常。(30分)完成代码的输入,工程没有编译通过。(15分)建立工程错误,或者部分输入代码。(5分)3 核心素养(20%) 具有良好的自主学习、分析解决问题、帮助他人的能力、整个任务过程中有指导他人并解决他人问题(20分) 20分具有较好的学习能力和分析解决问题的能力,任务过程中无指导他人(15分)具有主动学习并收集信息的能力,遇到问题有请教他人并得以解决(10分)不主动学习(0分)4 职业素养(20%) 实验完成后,设备无损坏、设备摆放整齐、工位区域内保持整洁、无干扰课堂秩序(20分) 20分实验完成后,设备无损坏、无干扰课堂秩序(15分)无干扰课堂秩序(10分)干扰课堂秩序(0分)总得分学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸阅读085.1 SW2按键进行模式选择任务小结06学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸练习085.1 SW2按键进行模式选择任务拓展07动动脑在SW2按键检测任务里,将代码“Led_Mode=~Led_Mode;”改为“Led_Mode=0;”,其它代码保持不变,所实现的功能会一样吗?任务拓展07动动手请在本任务的基础上进行修改,将远程模式下模式指示灯的开关周期由1秒改为2秒,其中开关时长各1秒。学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸练习085.1 SW2按键进行模式选择延伸练习08按键检测任务可以采用扫描方式或中断方式,本任务采用扫描方式完成SW2按键的检测,如果将SW2按键改成中断方式,而所实现的功能保持不变,在原有代码基础上如何修改?针对以上问题,可以将SW2按键对应的I/O引脚设置为输入下降沿中断触发,在SW2按键按下时,单片机执行通用I/O中断服务函数,在中断服务函数里执行SW2按键检测任务,所实现的功能将保持不变。 展开更多...... 收起↑ 资源预览