资源简介 (共67张PPT)单片机与C语言技术应用第五单元 任务45.4 远程模式使用串口命令控制交通信号灯学习目标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.4 远程模式使用串口命令控制交通信号灯任务要求与任务分析02● 任务要求:①黑板通电后,D5绿色LED点亮(绿灯亮),D3、D4和D6均熄灭,表示初始化为手动模式和绿灯亮状态;②操作SW2按键,直到出现D4红色LED闪烁(指示灯闪烁),表示当前为远程模式;任务要求与任务分析02● 任务要求:③PC机发送控制命令0xBF,D4闪烁,D3绿色LED点亮(黄灯亮),D5和D6熄灭,PC机接收到应答数据0xBF;④PC机发送控制命令0xCF,D4闪烁,D6红色LED点亮(红灯亮),D3和D5熄灭,PC机接收到应答数据0xCF;任务要求与任务分析02● 任务要求:⑤PC机发送控制命令0xAF,D4闪烁,D5绿色LED点亮(绿灯亮),D3和D6熄灭,PC机接收到应答数据0xAF;⑥PC机发送除0xAF、0xBF、0xCF以外的控制命令,D3、D4、D5、D6状态未发生任何变化,PC机接收到应答数据为PC机所发出的控制命令。任务要求与任务分析02● 任务分析:定时器1工作在模模式下定时输出控制;中断方式串口接收PC机控制命令;根据控制命令控制交通信号灯;扫描方式将控制命令作为应答数据发送给PC机。学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸阅读085.4 远程模式使用串口命令控制交通信号灯交通信号灯远程模式下的运行过程1知识储备03C语言知识要点23CC2530技术手册中相关知识要点03知识储备远程模式下,单片机通过串口接收PC机发送的控制命令控制交通信号灯,并将控制命令作为应答数据发送给PC机。控制命令可以是一个字节或多个字节,每个字节所代表的含义依据双方制定的控制协议。单片机串口发送和接收都可以采用扫描方式或中断方式,但在工程应用中,串口发送一般采用扫描方式,而串口接收一般采用中断方式。03知识储备本任务的串口发送采用扫描方式,而串口接收采用中断方式。串口接收中断服务函数的执行时间要求尽可能短,避免连续字节接收过程中丢掉下一个字节。因此,在串口接收中断服务函数里,需要将接收寄存器的内容放入串口接收数据缓冲区,同时更新串口接收数据更新标志。主函数根据串口接收数据更新标志的值判断当前串口是否接收到新的数据。03知识储备定义两个字节型全局变量,其中一个变量用作串口接收数据缓冲区,另一个变量用作串口接收数据更新标志。当串口接收数据更新标志无效时,表示串口未接收到新的数据;当串口接收数据更新标志有效时,表示串口已接收到新的数据。主函数根据串口接收数据更新标志判断串口是否接收到新的数据,同时根据串口接收数据缓冲器的值控制交通信号灯。03知识储备本任务中定义串口接收数据缓冲区和串口接收数据更新标志的配置代码如下:1.unsigned char Rec_Data=0x00; //串口接收数据缓存区2.unsigned char Rec_flag=0x00; //串口接收数据更新标志Rec_flag为0x00表示串口未接收到数据;Rec_flag为0x01表示串口已接收到数据。交通信号灯远程模式下的运行过程1知识储备03C语言知识要点23CC2530技术手册中相关知识要点03知识储备已在本单元任务1介绍。交通信号灯远程模式下的运行过程1知识储备03C语言知识要点23CC2530技术手册中相关知识要点03知识储备本任务主要涉及I/O口输入检测、I/O口输出控制、定时器1计数和串口0通信,其中,I/O口输入检测使用扫描方式,定时器1选择工作在模模式下,串口0接收采用中断方式,串口0发送采用扫描方式。03知识储备为完成本任务,可查阅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 模模式”;03知识储备(6)查阅CC2530中文数据手册中的“9.8 输出比较模式”;(7)查阅CC2530中文数据手册中的“9.10 定时器1中断”;(8)查阅CC2530中文数据手册中的“9.12 定时器1寄存器”(9)查阅CC2530中文数据手册中的“16.1 UART模式”;(10)查阅CC2530中文数据手册中的“16.4 波特率的产生”;(11)查阅CC2530中文数据手册中的“16.6 USART中断”;(12)查阅CC2530中文数据手册中的“16.8 USART寄存器”。学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸阅读085.4 远程模式使用串口命令控制交通信号任务实施04● 任务实施前必须先准备好以下设备和资源:序号 设备/资源名称 数量 是否准备到位(√)1 计算机(已安装好IAR软件) 1台 2 NEWLab实训平台 1套 3 CC-Debugger 仿真器 1套 4 黑板 1块 12任务实施04打开工程编写代码3编译工程4仿真调试●打开本书配套源代码文件夹中的“远程模式使用串口命令控制交通信号灯.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 //红灯亮14.#define Yellow_Time 5000 //绿灯持续时间15.#define Red_Time 6000 //绿灯与黄灯持续的总时间16.#define Green_Time 11000 //绿灯、黄灯、红灯持续的总时间步骤3:全局变量定义及初始化1.unsigned char Work_Mode=Manual_Mode; //工作模式,初始化默认为手动模式2.unsigned char Led_State =Green_State; //初始化默认为绿灯3.unsigned int Led_Timer=0; //交通灯计数器4.unsigned int Mode_Led_Timer=0x00; //模式指示灯计数器,单位为1ms5.6.unsigned char Rec_Data=0x00; //串口接收数据缓存区7.unsigned char Rec_flag=0; //串口接收数据更新标志04任务实施04任务实施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任务实施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的时钟频率;设置定时器1的最大计数值并选择模模式工作;设置定时器1为通道0比较输出并使能定时器1中断。步骤6:编写串口0初始化函数04任务实施1.void InitUart(void)2.{3. PERCFG = 0x00; //位置1 P0口4. P0SEL = 0x0C; //P0_2,P0_3用作串口5. P2DIR &= ~0xC0; //P0优先作为UART06. U0CSR |= 0x80; //UART方式7. U0GCR |= 9; //U0GCR.BAUD_E04任务实施8. U0BAUD |= 59; //波特率设为9600 UxBAUD.BAUD_M9. U0UCR|=0x02; //禁止流控,串口通信模式设置10. UTX0IF = 0; //串口0发送中断标志初始化为011. URX0IF = 0; //串口0接收中断标志初始化为012. U0CSR |= 0x40; //串口0接收允许13. URX0IE=1; //串口0接收中断使能14.}选择串口0通信的I/O口,设置串口0通信波特率;设置串口0通信的数据帧格式,将串口发送和接收中断标志置0;设置串口0接收允许,使能串口0接收中断。04任务实施步骤7:编写延时函数已在本单元任务1完成。步骤8:编写SW1按键检测函数已在本单元任务2完成。步骤9:编写SW2按键检测函数已在本单元任务1完成。步骤10:编写远程模式控制任务函数04任务实施1.void Remote_Control_Task(void)2.{3. if(Work_Mode==Remote_Mode) //判断当前是否为远程模式4. {5. if(Rec_flag==1) //判断串口是否接收到新数据6. {7. Rec_flag=0; //串口接收更新标志置08. switch(Rec_Data) //判断接收数据的值9. {10. case 0xAF:04任务实施11. Led_Green=1; //绿灯亮12. Led_Yellow=0; //黄灯灭13. Led_Red=0; //红灯灭14. Led_State=Green_State; //绿灯状态15. break;16. case 0xBF:17. Led_Green=0; //绿灯灭18. Led_Yellow=1; //黄灯亮19. Led_Red=0; //红灯灭20. Led_State=Yellow_State; //黄灯状态21. break;04任务实施22. case 0xCF:23. Led_Green=0; //绿灯灭24. Led_Yellow=0; //黄灯灭25. Led_Red=1; //红灯亮26. Led_State=Red_State; //红灯状态27. break;28. default:29. break;30. }04任务实施31. UTX0IF=0; //串口发送完成标志清032. U0DBUF=Rec_Data; //串口发送应答数据33. while(UTX0IF==0); //等待串口发送完成34. UTX0IF=0; //串口发送完成标志清0,为下次发送做准备35. }36. }37.}04任务实施远程模式下根据串口接收的命令控制交通信号灯,并将接收的命令作为应答数据通过串口发送至PC机。04任务实施远程模式控制任务:04任务实施步骤11:编写定时器1中断服务函数已在本单元任务3完成。步骤12:编写串口0接收中断服务函数04任务实施1.#pragma vector = URX0_VECTOR2. __interrupt void UART0_RX_ISR(void)3.{4. URX0IF = 0; //清除串口接收中断标志5. Rec_Data=U0DBUF; //将接收到的数据放入接收数据缓冲区6. Rec_flag=1; //串口接收数据更新标志7.}04任务实施串口0接收中断主要完成将接收到的数据移入接收数据缓冲区,同时将串口接收数据更新标志置1,远程模式控制任务根据串口接收数据更新标志判断是否接收到控制命令。步骤13:编写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. Remote_Control_Task(); //远程模式控制任务12. }13.}04任务实施main主函数完成I/O口初始化、定时器1初始化、串口初始化以及总中断使能,然后不断循环执行SW1按键检测任务、SW2按键检测任务及远程模式控制任务04任务实施main主函数:04任务实施12任务实施04打开工程编写代码3编译工程4仿真调试对工程进行编译,观察是否提示编译成功。如果出现错误或警告,需要认真检查修改,重新编译链接,直到没有错误和警告为止。04任务实施12任务实施04打开工程编写代码3编译工程4下载代码(1)用CC-Debugger仿真器的下载线连接黑板;(2)完成代码下载;(3)黑板上电,手动操作SW2按键,观察到D4红色LED闪烁表示当前为远程模式;PC机通过串口发送0xAF命令,观察D5绿色LED(绿灯)是否点亮,同时PC机是否接收到应答数据0xAF;PC机通过串口发送0xBF命令,观察D3绿色LED(黄灯)是否点亮,同时PC机是否接收到应答数据0xBF;PC机通过串口发送0xCF命令,观察D6红色LED(红灯)是否点亮,同时PC机是否接收到应答数据0xCF。04任务实施学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸阅读085.4 远程模式使用串口命令控制交通信号灯05任务工单本次任务关键知识引导:1.( )类型数据长度为1个字节,可以表示( )到( )之间的数值。( )类型数据长度为2个字节,可以表示( )到( )之间的数值。2.while循环表达式为( )时,执行循环主体内的语句;直到表达式为( )时,跳出循环语句。3.连接好CC-Debugger仿真器,选择菜单Project->( )进入调试状态。4.选择菜单Debug->( )退出仿真调试模式。5.断点有( )和( )之分,功能为在指定指令或者代码行中断程序的执行。6.P0INP、P1INP、P2INP寄存器的配置只对( )I/O端口有效。7.中断服务函数中( )关键字表示该函数是一个中断服务函数。8.( )用于中断服务函数指向特定的中断向量。任务工单05各组选派代表分析本组任务实施经验;01添加标题请参照评价标准完成自评;02完成对其他小组的评价。03互评经验分享自评评价方式 可采用自评、互评、老师评价等方式 说明 主要评价学生在项目学习过程中的操作技能、理论知识、学习态度、课堂表现、学习能力等。 序号 评价内容 评价标准 分值 得分1 知识运用(20%) 掌握相关理论知识,完成本次任务关键知识的作答准确率(20分) 20分2 专业技能(40%) 工程编译通过,PC机发送命令,交通信号灯控制和PC机接收应答数据正常。(40分) 40分工程编译通过,PC机发送命令,交通信号灯控制和PC机接收应答数据异常。(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.4 远程模式使用串口命令控制交通信号灯任务小结06学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸练习085.4 远程模式使用串口命令控制交通信号灯任务拓展07动动脑如果SW1按键或SW2按键出现卡键现象,远程模式下使用串口命令控制交通信号灯能正常运行吗?任务拓展07动动手请在本任务的基础上进行修改,PC机发送控制命令0x01时,绿灯点亮并将控制命令加1作为应答数据;PC机发送控制命令0x02时,黄灯点亮并将控制命令加2作为应答数据;PC机发送控制命令0x03时,红灯点亮并将控制命令加3作为应答数据;任务拓展07动动手PC机发送控制命令0x00时,绿灯、黄灯、红灯均熄灭并将控制命令直接作为应答数据;PC机发送控制命令0xFF时,绿灯、黄灯、红灯均点亮并将控制命令直接作为应答数据。学习目标01知识储备03任务工单05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸练习085.4 远程模式使用串口命令控制交通信号灯延伸练习08本任务的远程控制命令为一个字节,而工程应用中的远程控制命令通常为数据帧,包括帧头、帧尾、数据包等。采用数据帧进行远程控制,将使得控制功能更加丰富。延伸练习08针对以上问题,可以根据数据帧的长度定义接收数据缓冲区的大小。单片机依据约定好的协议解析接收数据缓冲器的内容,并控制交通信号灯。同时定义一串口计数器,用于计算前后两个字节接收之间的时间差,当计数器所计算的时长超过一定范围,可判定为下一帧数据的开始。 展开更多...... 收起↑ 资源预览