新工科背景下计算机程序设计类课程案例教学改革研究
2018-07-28于莉莉苏晓光李晶
于莉莉 苏晓光 李晶
摘要:新工科教育改革的背景下,非计算机专业的计算机C语言程序设计课程如何融入专业知识,合理选择案例教学是计算机基础教学的改革重点。该文从单片机C语言编程作为切入点,优化课程案例教学,提高學生的动手能力和编程思想,为后续专业课程提供良好的支撑。
关键词:新工科;程序设计;单片机;C语言编程
中图分类号:G424 文献标识码:A 文章编号:1009-3044(2018)15-0158-02
1 引言
随着人工智能的发展,嵌入式技术和单片机系统也优势凸显。单机片堪称是一块芯片的微型计算机,特别是flash的运用使单片机进入一个崭新的时代。由于具有集成度高,性能可靠,操作简便,功能强大,体积小、功耗低、性价比高等特点为其学习、开发和应用提供了便捷的条件,使其渗透到各个领域,现在生活中很难找到没有单片机的存在领域。单片机是学习计算机原理与结构的理想选择,面向单片机的编程目前使用最多的是汇编语言和C语言。
汇编语言是一种用文字助记符来表示机器指令的符号语言,是面向机器的语言,和机器语言最为接近。其主要优点是对机器控制清晰、调试方便、占用ROM资源少、程序执行效率高。但是不同单片机指令系统是不同的,可移植性差,学习难度相对较大,而且如果一个大型的应用程序的开发如果全都使用汇编语言编写就特别复杂,特别是一些算法问题,汇编语言就显得力不从心了。
C语言是一种编译型程序设计语言,它是介于高级语言和低级语言之间的语言。既具有高级语言的可读性强、可移植性高等特点,同时又具备低级语言运行速度快、效率高、可直接对硬件进行控制的功能。C语言是一种结构化程序设计语言,它支持当前程序设计中广泛采用的由顶向下结构化程序设计技术。C语言程序具有模块化程序设计思想,是软件系统开发中模块化程序设计方法的基础保障,现在使用C语言进行单片机程序设计已成为一个趋势。用C语言来编写目标系统软件,开发周期短,程序可读性强,便于改进和扩充,从而研制出规模更大、性能更完备的系统。其缺点是占用资源多,执行效率没有汇编语言高。根据不同的情况,很多工程通常采用C语言和汇编语言结合二者的优势进行混合编程。随着单片机技术的发展,在速率和存储空间上都有了很大的提高,由最初的4位、8位,到现在已有300M的高速单片机,C语言的优势也就越来越明显。
C语言虽然是嵌入式和单片机系统的首选语言,但是很多专业在单片机编程部分并没有开设专门的课程,所以很多学生都采用自学。如何充分发挥高校非计算机专业C语言程序设计通识课程的作用,与专业结合更需要教育工作者深入思考。
2 发挥C语言通识课程优势,更好地为相关专业服务
C语言程序设计作为大学通识课程普遍面向大一新生开设的第一门程序设计类课程,很多与嵌入式和单片机系统相关专业的学生在还没有学习更多的相关专业知识。如何让C语言教学更贴近专业,还要让学生零硬件基础的前提下,体验到C语言在将来专业学习的重要性和趣味性,精选硬件系统结构简单实现容易的案例,生动课堂教学的同时还能增加学生的编程自信和专业探究渴望,同时对后期专业编程打下坚实的基础。
2.1 合理的案例选择
对于电学专业的学生的C语言教学重点是案例的合理选择,既要和专业有相关性,同时还要摆脱专业知识的束缚,让硬件基础相对薄弱的大一学生体会到硬件编程的效果的同时更能感受到C语言的灵魂和魅力。
选择原型简单结构清晰的案例,使学生无需在硬件上做多过的研究,如流水LED灯的电路设计,电路图如图1所示。此电路只有一个按钮开关和多个LED灯,可以采用多分支选择、循环结构来实现多路灯的循环点亮,学生可以充分理解和实践C语言的分支选择和循环结构。同时还可以调用延时函数,让学生提升函数概念和结构化程序设计思想。同时也可以采用数组和指针的方式,可以对数组和指针的认知和运用大幅度加强。教师可以提前做好实验准备,在案例演示同时配合实验更生动形象,有说服力。同时本系统可以模拟实验或者有条件的话可以让学生自己动手组装,这样在提高学生动手能力的同时更能让学生感到学有所用、成就感倍增。
2.2 同一案例学习对应不同知识结构
虽然标准C与单片机C51在很多方面都非常一致,但是还有一些细节要加以区别。在讲解案例之前需要专题讲解,比如头文件的使用,输入输出的方式等等。本案例采用switch结构来实现LED1~LED8的循环点亮,设计电路的知识只需略点拨即可,可以从不同角度来着重介绍C语言的实现过程。例如当重点讲解switch与while循环的配合来实现功能时,程序设计如下:
#include
Sbit S=P1^4; //将S位定义为P1.4
void delay100(void) //延时函数
{
unsigned int k;
for(k=0;k<10000;k++);//延时100μs
}
void main( )
{
unsigned char n;
n=0;
while (1) //永真循环
{
if(S==0)//采用轮询方式,不停地判断端口是否有变化
{
delay100();//调用延时函数
if(S==0)//采用轮询方式,不停地判断端口是否有变化
n++;
if(n==9)
n=1;//使n始终在1~8 之间轮转
}
switch(i) //switch结构来实现流水灯点亮控制
{
Case 1:P0=0xfe; break;//点亮LED1
Case 2:P0=0xfd; break; //点亮LED2
Case 3:P0=0xfb; break; //点亮LED3
Case 4:P0=0xf7; break; //点亮LED4
Case 5:P0=0xef; break; //点亮LED5
Case 6:P0=oxdf; break; //点亮LED6
Case 7:P0=0xbf; break; //点亮LED7
Case 8:P0=0x7f; break; //点亮LED8
Default:P0=0xff;//全部熄灭
}}}
当讲解字符数组时,此程序还可以通过定义字符型数组来实现轮转简化程序。如果想要变换花样流水灯的顺序,只需改变字符型数组的流水灯控制码的顺序即可。通过此案例,学生能够对字符型数组的定义和引用更直观、深刻地理解。
void main(void)
{unsigned char n;
unsigned char code x[ ]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定义无符号字符型数组
while(1)
{for(n=0;n<8;n++)
{P0=x[n];//引用字符数组的每一个元素送至P0口
delay100();}}}
指针是C语言的难点,如何化难为简,可以在采用同一案例,學生通过前面章节的学习,对此电路已有基础,这时就可以转移重心至指针的学习上。
void main(void)
{unsigned char code x[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//定义无符号字符型数组并初始化位各个端口值
unsigned char *pp[ ]={&x;[0],&x;[1],&x;[2],&x;[3],&x;[4],&x;[5],&x;[6],&x;[7]};//定义指向字符型数组的指针数组
unsigned char n;
while(1)
{for(n=0;n<8;n++)//通过n的变化来移动指针PP
{P0=*pp[n]; //利用指针pp的移动引用字符数组的每一个元素送至P0口
delay100 ();//调用延时函数}}}
同一程序可以采用多种编程设计方案,让学生充分发挥编程想象力,把学过的知识都得到运用,体会C语言的系统性和编程的开放性。
学生可以通过反复调试和改进来,使学生深刻理解程序设计思想的同时更增加了课堂的粘合度,让学生与教师之间、学生与学生之间的讨论更加实际而有效,同时还充分调动学生学习的主动性和创造性,可以分配多个学习协作小组在课下进一步深入讨论和研究。
3 结论
目前对后期学习单片机相关专业的学生进行教学改革反馈调查表明,C语言教学对学生的专业学习更有影响,更好地与专业知识融合,提高了学习动力,进一步深入自学降低了难度。在新工科建设改革中,作为通识课程的C语言如何服务于电类相关专业,可以从单片机编程入手,既无需过多的硬件知识基础,又体现编程的实用性,在案例选择上要多选取“有用”“有趣”的案例,提高学生动手能力和编程能力,为进一步专业打下良好的基础。
参考文献:
[1]郭天祥.51单片机C语言教程[M].北京:电子工业出版社,2009.
[2]徐爱钧等,单片机高机语言C51 应用程序设计[M].电子工业出版社,1998,6.
[3]C51 Compiler Optimizing 8051 C Compiler and Library Reference KEIL SOFTWARE Users Guide 03.2000.