高职单片机教学研究二
2017-10-31季红梅
季红梅
【摘 要】教育教学须因材施教,面对高职学生群体,应运用怎样的教学方法才能达到最佳教学效果呢?根据自己多年教学体会,认为高职课堂教学,既不能等同于高中教学,也不能完全照搬高校教学。它必须具有高职的特色,其课堂教学既要注重知识性,更要注重趣味性,理论够用,技能为主,通过学生跟着老师做、学生学着自己做、理论教学做总结的方式,通过实践体会理解掌握单片机的功能应用技能。
【关键词】高职教学;单片机应用;中断应用
1.引言
当前各类高职技能大赛项目的机器人控制、非接触识别等等科目,单片机的中断应用属于必用项目。如何设计中断知识的教学,使得学生学得不累,搞得明白,用的順手,就是作为授课老师研究的问题。
2.中断原理
首先,如何导入中断概念?设计以生活中的案例引导理解。
如果我们想要同时做烧一壶水与看电脑播放电视剧二件事,请设计一下实施方案…
方案1:先烧开水,再看电视剧
方案2:同时进行,但是可能忘记烧水,导致事故
方案3:中断机制,同时进行,使用带响的水壶,水烧开时中断看电视剧,可以暂停,然后处理好开水之后再重新继续看电视剧…
前面学习的定时器案例里面用按键切换几种LED表示的方式,有时反应及时有时会反应不及时,原因是主程序循环没有及时到达按键检测的位置,所以需要等待。如果采用中断方式,按键按下即可响应。
其次,需要了解中断事件的特点。中断程序主要处理及时性要求高的事件,所以应该设计的短平快。否则就失去了中断应用应有的效果。
其三,中断设计理念:
将主程序中的一部分功能,提取出来,放到中断处理程序中。在主程序中初始化时初次开放中断…
条件满足触发进入中断处理程序,进入立即关闭中断(初学者不建议使用多次中断嵌套);中断处理程序中主要完成一些计数判断功能,然后根据判断信息,设置标志或计数,退出时重新开放中断。中断程序设计尽量短平快…
主程序循环检查标志条件进行相对应的处理…
3.中断方式
中断分为硬中断和软中断,硬中断就是有硬件操作导致触发的中断,比如说按键按下去产生一个信号触发中断程序工作;软中断是有程序在特定的条件下发出信号触发中断,比如说定时器计数达到上限溢出引起中断。
在前节定时器的学习基础,理解了中断的理念,设计中断程序就变得非常轻松步骤化了:
①中断的初始化
②开中断(多数放在初始化里,也可以放在需要的任何位置,根据需要开放或关闭)
③中断服务程序框架(中断名称查中断向量地址表)
#pragma vector=中断名称_VECTOR
__interrupt void EINT_ISR(void)
{ EA = 0; // 关闭全局中断
//中断处理功能程序start
……中断功能实现程序
//中断处理功能程序end
EA = 1; // 重新开放全局中断 }
4.中断综合应用案例
①硬中断案例1(按键外中断),按键控制LED跑马灯开始或停止
#include "ioCC2530.h" // 引用头文件,包含对CC2530的寄存器、中断向量等的定义
//定义led灯端口和按键
…(参见高职单片机教学研究一)
unsigned int KeyTouchtimes = 0 ; //定义变量记录按键次数
unsigned int Keyflag = 0 ; //定义变量记录按键单2次,单次启动,双次停止
/* 函数名称:init 功能:初始化系统IO,外中断寄存器 */
void init()
{ //LED灯端口和按键初始化(参见高职单片机教学研究一)
PICTL &= ~0x02; //配置P1口的中断边沿为上升沿产生中断
P1IEN |= 0x04; //使能P1.2中断
IEN2 |= 0x10; //使能P1口中断
EA = 1; //使能全局中断 }
/* 函数名称:EINT_ISR 功能:外部中断服务函数 */
#pragma vector=P1INT_VECTOR
__interrupt void EINT_ISR(void)
{ EA = 0; // 关闭全局中断
//中断处理功能程序start
if(P1IFG & 0x04) // 若是P1.2产生的中断
{
/* 等待用户释放按键,并消抖 */
while(SW1 == 0); //低电平有效
delay(100); //延时程序略
while(SW1 == 0);
if(Keyflag==0) //根据按键,设计单双次标志
{Keyflag=1; }
else
{Keyflag=0;}
P1IFG &= ~0x04; // 清除P1.2中断标志
}
//中断处理功能程序end
EA = 1; // 重新开放全局中断 }
/* 函数名称:main 功能:main函数入口 */
void main(void)
{ init(); //调用初始化函数endprint
while(1)
{ …//根据标志变量Keyflag,计数变量KeyTouchtimes,设计LED1-4跑马灯功能 }
}
②软中断案例2(定时器触发中断)T1、T3分别控制LED1、LED2 闪烁
//预定义添加
unsigned int counter=0; //统计T1溢出次数
unsigned int counter1=0; //統计T3溢出次数
unsigned int flag0=0; //标志0
unsigned int flag1=1; //标志1
//初始化定时器T1、T3
T1CTL = 0x05; // T1 通道 0,8 分频; 自动重载模式(0x0000->0xffff);
T1IE=1; //定时器1使能
T3CTL = 0x7C; // T3 通道 0,8 分频; 自动重载模式(0x0000->0xffff);
T3IE = 1; //定时器3使能
//定时器T1中断服务功能程序
counter++;
if(counter>=30) //约0.5s (32/8)*10^6/65535/30=2Hz,参见文章一
{counter=0; flag0=1;}
T1IF=0; //清0 T1中断标志位,容许下次中断触发
//定时器T3中断服务功能程序
counter1++;
if(counter1>=3840) //30*256/2=3840 约0.25s ,加减计数次数,调整闪烁频率
{counter1=0; flag1=1;}
T3IF=0; //清0 T3中断标志位,容许下次中断触发
//函数名称:main
void main(void)
{ init(); //调用初始化函数
while(1)
{
If(flag0==1)
{LED1=!LED1;flag0=0;}
If(flag1==1)
{LED2=!LED2;flag1=0;}
}
}
5.中断教学总结
根据到目前获得的教学经验,高职学生一般不愿意主动思考,多数学生虽具备较好的思考理解能力,但是缺少总结归纳的能力,并且学的快忘得快,具有一定的惰性。所以如何设计好教学模块,通过合适的案例,将知识点像积木一样一块一块搭建整个知识体系,后面反复使用前面学习的知识,既能强化前面的内容,又能合理导入后面的知识,一层层上台阶,在不知不觉中,由浅入深,逐渐增加学习难度。开始的时候尽量用浅显的案例,结合生活案例实践理解,使得学生还没有畏难情绪生成就被逐步引导到了学习高点。对单片机应用这样的专业课程,学生学的进、有兴趣,达到教学目的,同时也是教师的欣慰。
参考文献:
[1]姜仲 刘丹 ZigBee技术与实训教程[M]北京 清华大学出版社 2014.
[2]物联网无线传感网实训教程[M]北京 新大陆时代教育科技有限公司 2014.
[3]本书编委 ZigBee技术开发-CC2530单片机原理及应用[M]北京 清华大学出版社 2015.
[4]杨玥 单片机与接口技术-基于CC2530的单片机应用[M]北京 清华大学出版社2017.endprint