单片机技术与C语言基础 课件 5.1 SW2按键进行模式选择_第1页
单片机技术与C语言基础 课件 5.1 SW2按键进行模式选择_第2页
单片机技术与C语言基础 课件 5.1 SW2按键进行模式选择_第3页
单片机技术与C语言基础 课件 5.1 SW2按键进行模式选择_第4页
单片机技术与C语言基础 课件 5.1 SW2按键进行模式选择_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机与C语言技术应用第五单元

任务15.1SW2按键进行模式选择学习目标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.1SW2按键进行模式选择任务要求与任务分析02●任务要求:①黑板通电后,D4红色LED熄灭(指示灯灭)为手动模式;②按第一次SW2按键,D4红色LED点亮(指示灯亮)为自动模式;③按第二次SW2按键,D4红色LED闪烁(指示灯闪烁)为远程模式;任务要求与任务分析02●任务要求:④按第三次SW2按键,D4红色LED熄灭(指示灯灭)为手动模式;⑤按键操作效果可循环。任务要求与任务分析02●任务分析:定义一个字节型全局变量用于描述当前的工作模式;扫描方式SW2按键检测进行模式选择;定时器1工作在模模下定时输出控制。学习目标01知识储备03任务工单

05任务要求与任务分析02任务实施04任务小结06知识与技能提升07延伸阅读085.1SW2按键进行模式选择交通信号灯的工作模式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.unsignedcharWork_Mode=Manual_Mode;//工作模式,初始化默认为手动模式5.unsignedintMode_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)数据类型与变量说明--全局变量、局部变量、数据类型unsignedchar、数据类型unsignedint;(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.11I/O引脚”;(3)查阅CC2530中文数据手册中的“7.6外设I/O口”(4)查阅CC2530中文数据手册中的“9.116位计数器”;(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.1SW2按键进行模式选择任务实施04●任务实施前必须先准备好以下设备和资源:序号设备/资源名称数量是否准备到位(√)1计算机(已安装好IAR软件)1台

2NEWLab实训平台1套

3CC-Debugger仿真器1套

4黑板1块

12任务实施04打开工程编写代码3编译工程4仿真调试●打开本书配套源代码文件夹中的“SW2按键进行模式选择.ewp”工程。04任务实施12任务实施04打开工程编写代码3编译工程4仿真调试●步骤1:头文件包含04任务实施#include<ioCC2530.h>●步骤2:I/O引脚宏定义04任务实施1.#defineLed_Mode P1_1//P1_1引脚宏定义,模式指示灯控制引脚2.#defineSW2 P0_1//P0_1引脚宏定义3.#defineManual_Mode 0x00//手动模式4.#defineAuto_Mode 0x01//自动模式5.#defineRemote_Mode 0x02//远程模式步骤3:全局变量定义及初始化1.unsignedcharWork_Mode=Manual_Mode;//工作模式,初始化默认为手动模式2.unsignedintMode_Led_Timer=0x00; //模式指示灯计数器,单位为1ms04任务实施

main主函数执行之前,全局变量将被定义并初始化,因此黑板上电后,工作模式默认为手动模式。步骤4:编写I/O口初始化函数04任务实施1.voidInitIO(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.voidInit_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.voidDelay(unsignedintn)2.{3.unsignedinti,j;4.for(i=0;i<n;i++)5.{6.for(j=0;j<600;j++);7.}8.}04任务实施04任务实施本任务选择内部16MHz的高频RC振荡器为系统时钟源,该延时函数的输入参数为n,对应的延时时长为n毫秒。步骤7:编写SW2检测按下函数1.voidSW2_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.caseManual_Mode:11.Led_Mode=1;//模式指示灯熄灭12.Work_Mode=Auto_Mode;//切换到自动模式13.break;14.caseAuto_Mode:15.Led_Mode=~Led_Mode;//模式指示灯状态翻转16.Work_Mode=Remote_Mode;//切换到远程模式17.Mode_Led_Timer=0; //模式指示灯计数器清018.break;04任务实施19.caseRemote_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.#pragmavector=T1_VECTOR//定时器1中断向量指定2.__interruptvoidTimer1_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.voidmain(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.1SW2按键进行模式选择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分)

建立工程错误,或者部分输入代码。(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论