资源简介 (共51张PPT)单片机与C语言技术应用第五单元 任务25.2 手动模式使用SW1按键控制交通信号灯学习目标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.2 手动模式使用SW1按键控制交通信号灯任务要求与任务分析02● 任务要求:①黑板通电后,D4红色LED熄灭(模式指示灯灭),表示当前为手动模式,D5绿色LED点亮(绿灯亮),D3和D6熄灭;②SW1按键按下时,交通信号灯的状态发生变化;任务要求与任务分析02● 任务要求:③按键按下前,D5绿色LED点亮(绿灯亮),则按下后,D3绿色LED点亮(黄灯亮),D5和D6熄灭; 按键按下前,D3绿色LED点亮(黄灯亮),则按下后,D6红色LED点亮(红灯亮),D3和D5熄灭; 按键按下前,D6红色LED点亮(红灯亮),则按下后,D5绿色LED点亮(绿灯亮),D3和D5熄灭。④按键操作效果可循环。任务要求与任务分析02● 任务分析:扫描方式SW1按键检测;定义一个字节型全局变量用于描述当前的交通灯信号灯状态。学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸阅读085.2 手动模式使用SW1按键控制交通信号灯交通信号灯手动模式下的运行过程1知识储备0303知识储备手动模式下,外部按键动作时,交通信号灯状态发生变化,并且按照“绿灯亮->黄灯亮->红灯亮->绿灯亮->……”的顺序进行切换。交通信号灯状态维持时间取决于外部按键动作,外部按键空闲时,交通信号灯状态将一直保持。外部按键按下时,如果原来的交通信号灯状态为绿灯亮,那么新的交通信号灯状态为黄灯亮;如果原来的交通信号灯状态为黄灯亮,那么新的交通信号灯状态为红灯亮;如果原来的交通信号灯状态为红灯亮,那么新的交通信号灯状态为绿灯亮。03知识储备本任务定义一个字节型全局变量Led_State表示交通信号灯状态,当Led_State为0x00时,表示目前交通信号灯状态为绿灯亮;当Led_State为0x01时,表示目前交通信号灯状态为黄灯亮;当Led_State为0x02时,表示目前交通信号灯状态为红灯亮;当Led_State为其它值时,则无任何意义。03知识储备本任务中关于交通信号灯状态全局变量的配置代码如下:1.#define Green_State 0x00 //绿灯亮状态2.#define Yellow_State 0x01 //黄灯亮状态3.#define Red_State 0x02 //红灯亮状态4.unsigned char Led_State =Green_State; //初始化默认为绿灯亮状态学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸阅读085.2 手动模式使用SW1按键控制交通信号灯任务实施04● 任务实施前必须先准备好以下设备和资源:序号 设备/资源名称 数量 是否准备到位(√)1 计算机(已安装好IAR软件) 1台 2 NEWLab实训平台 1套 3 CC-Debugger 仿真器 1套 4 黑板 1块 12任务实施04打开工程编写代码3编译工程4仿真调试●打开本书配套源代码文件夹中的“手动模式使用SW1按键控制交通信号灯.ewp”工程。04任务实施12任务实施04打开工程编写代码3编译工程4仿真调试● 步骤1:头文件包含04任务实施#include ● 步骤2:I/O引脚宏定义04任务实施1.#define Led_Red P1_4 //P1_4引脚宏定义2.#define Led_Green P1_3 //P1_3引脚宏定义3.#define Led_Yellow P1_0 //P1_0引脚宏定义4.#define Led_Mode P1_1 //P1_1引脚宏定义5.#define SW1 P1_2 //P1_2引脚宏定义6.#define SW2 P0_1 //P0_1引脚宏定义7.8.#define Manual_Mode 0x00 //手动模式9.#define Auto_Mode 0x01 //自动模式10.#define Remote_Mode 0x02 //远程模式11.#define Green_State 0x00 //绿灯亮状态12.#define Yellow_State 0x01 //黄灯亮状态13.#define Red_State 0x02 //红灯亮状态步骤3:全局变量定义及初始化1.unsigned char Work_Mode=Manual_Mode; //工作模式,初始化默认为手动模式2.unsigned char Led_State =Green_State; //初始化默认为绿灯点亮状态unsigned int Mode_Led_Timer=0x00; //模式指示灯计数器,单位为1ms04任务实施main主函数执行之前,全局变量将被定义并初始化。黑板上电后,工作模式默认为手动模式,交通信号灯状态为绿灯点亮。步骤4:编写I/O口初始化函数04任务实施1.void InitIO(void)2.{3. P1SEL &=0xE4; //设置P1_0、P1_1、P1_3、P1_4为通用I/O引脚4. P1DIR |=0x1B; //设置P1_0、P1_1、P1_3、P1_4为输出引脚5. P1SEL &=0xFB; //设置P1_2为通用I/O引脚6. P1DIR &=0xFB; //设置P1_2为输入引脚7. P0SEL&=0xFD; //设置P0_1为通用I/O口引脚8. P0DIR&=0xFD; //设置P0_1为输入引脚04任务实施9. //输入默认上拉10. Led_Red=0; //关闭红灯11. Led_Green=1; //开启绿灯12. Led_Yellow=0; //关闭黄灯13. Led_Mode=0; //模式指示灯关闭,表示上电初始状态处于手动模式14.}完成I/O口的输入/输出与上下拉配置,绿灯点亮,模式指示灯关闭。步骤5:编写定时器1初始化函数04任务实施步骤6:编写延时函数已在本单元任务1完成。已在本单元任务1完成。步骤7:编写SW1按键检测函数04任务实施1.void SW1_Key_Scan(void)2.{3. if(SW1==0) //判断SW1按键是否被按下4. {5. Delay(10); //延时10ms去抖6. if(SW1==0) //判断SW1按键是否仍按下7. {8. if(Work_Mode==Manual_Mode) //判断当前模式为手动模式9. {步骤7:编写SW1按键检测函数04任务实施10. switch(Led_State) //手动模式下判断交通灯状态11. {12. case Green_State:13. Led_Green=0; //绿灯灭14. Led_Yellow=1; //黄灯亮15. Led_Red=0; //红灯灭16. Led_State=Yellow_State; //黄灯状态17. break;18. case Yellow_State:步骤7:编写SW1按键检测函数04任务实施19. Led_Green=0; //绿灯灭20. Led_Yellow=0; //黄灯灭21. Led_Red=1; //红灯亮22. Led_State=Red_State; //红灯状态23. break;24. case Red_State:25. Led_Green=1; //绿灯亮26. Led_Yellow=0; //黄灯灭27. Led_Red=0; //红灯灭28. Led_State=Green_State; //绿灯状态步骤7:编写SW1按键检测函数04任务实施29. break;30. default:31. break;32. }33. }34. while(SW1==0); //等待SW1按键松开35. }36. }37.}04任务实施检测SW1按键状态,软件延时消抖;当检测SW1按键按下时,切换交通信号灯状态,然后等待SW1按键松开继续往下执行04任务实施SW1按键检测任务:步骤8:编写SW2按键检测函数04任务实施已在本单元任务1完成。步骤9:编写定时器1中断服务函数已在本单元任务1完成。步骤10:编写main主函数04任务实施1.void main(void)2.{3. InitIO(); //I/O口初始化4. Init_Timer1(); //定时器初始化5. InitUart(); //串口初始化6. EA=1; //使能总中断7. while(1)04任务实施8. {9. SW1_Key_Scan(); //SW1按键扫描任务10. SW2_Key_Scan(); //SW2按键扫描任务11. }12.}04任务实施main主函数完成I/O口初始化、定时器1初始化以及总中断使能,然后不断循环执行SW1按键检测任务和SW2按键检测任务04任务实施main主函数:04任务实施12任务实施04打开工程编写代码3编译工程4仿真调试对工程进行编译,观察是否提示编译成功。如果出现错误或警告,需要认真检查修改,重新编译链接,直到没有错误和警告为止。04任务实施12任务实施04打开工程编写代码3编译工程4下载代码(1)用CC-Debugger仿真器的下载线连接黑板;(2)完成代码下载;(3)黑板上电,D4红色LED熄灭,D5绿色LED点亮,表示上电初始化为手动模式且交通信号灯状态为绿灯点亮;手动操作SW1按键,交通信号灯状态按照“D5亮D3亮D6亮D5亮……”的顺序进行切换。04任务实施学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸阅读085.2 手动模式使用SW1按键控制交通信号灯05任务工单本次任务关键知识引导:1.C语言中的整数可以使用( )进制、( )进制、八进制和( )进制表示。2.CC2530输出电流为20mA的端口为( )、( )。3.CC2530共有( )个引脚,可以作为通用数字I/O端口的共有( )个。4.将CC2530单片机I/O输入引脚设置为上拉模式,该引脚悬空时,所读到该引脚的电平值为( )。5.P0INP寄存器的复位值为( ),P1INP寄存器的复位值为( ),P2INP寄存器的复位值为( ),因此P0_0到P0_7引脚默认为( )模式,P1_2到P1_7引脚默认为( )模式,P2_0到P2_4引脚默认为( )模式,其中( )和( )两个引脚默认为三态模式,不能通过软件设置为上下拉模式。6.独立按键电路中,按键按下时,所读到按键引脚电平值为( );按键松开时,所读到按键引脚电平值为( )。7.按键消抖的方法包括( )和( )。8.将P1_2引脚配置为输入上拉模式,需要对( )、( )、( )、( )四个寄存器进行配置。任务工单05各组选派代表分析本组任务实施经验;01添加标题请参照评价标准完成自评;02完成对其他小组的评价。03互评经验分享自评评价方式 可采用自评、互评、老师评价等方式 说明 主要评价学生在项目学习过程中的操作技能、理论知识、学习态度、课堂表现、学习能力等。 序号 评价内容 评价标准 分值 得分1 知识运用(20%) 掌握相关理论知识,完成本次任务关键知识的作答准确率(20分) 20分2 专业技能(40%) 工程编译通过,SW1按键动作,交通信号灯状态切换正常。(40分) 40分工程编译通过,SW1按键动作,交通信号灯状态切换异常。(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.2 手动模式使用SW1按键控制交通信号灯任务小结06学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸练习085.2 手动模式使用SW1按键控制交通信号灯任务拓展07动动脑请思考下为什么要定义字节全局变量Led_State记录交通信号灯状态?任务拓展07动动手请将SW1按键检测任务里的switch语句改成if语句实现,保持现有功能不变。学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸练习085.2 手动模式使用SW1按键控制交通信号灯延伸练习08本任务在SW1和SW2按键检测任务里均采用while判断语句,当SW2按键按下未松开或卡键时,SW1按键检测任务将不会被执行;同理当SW1按键按下未松开或卡键时,SW2按键检测任务也将不会被执行。延伸练习08针对以上存在问题,可以采用状态机的方式,也就是把每个任务分解成多个状态,至上而下执行,连续执行动作放在一个状态中,而把需要等待判断的动作独立在一个状态中。主函数的while(1)循环里,每次循环进入等待判断状态,当条件满足,退出等待判断状态,进入的任务的下一状态;如果条件不满足,退出任务,下一次循环再次进入等待判断状态执行。采用这种状态机的方式,可以有效地避免某个条件不满足导致主循环中的其他任务不被执行或相对较长时间不被执行。 展开更多...... 收起↑ 资源预览