单片机C语言教学探索

2009-09-06 06:26周国运
计算机教育 2009年22期
关键词:C语言

摘要:本文总结了我院在单片机C语言教学中的探索,包括在教学中精选了“变量定义、函数定义、混合编程”为C语言主要内容,以“变量定义、专用指针定义、C51汇编函数格式”为重点展开教学,并且紧密结合单片机概念和应用,编写了相关的习题和实验题目。实践表明,讲授C语言明显提高了学生的编程能力和教学效果。

关键词:单片机教学;C语言;内容选取;讲授方法;习题和实验

中图分类号:G642 文献标识码:B

1引言

近几年随着单片机和Keil C等开发工具的发展,我们教师在单片机项目开发中都采用C语言编写程序。与汇编语言相比,C语言有诸多优势,为了把单片机C语言编程方法和经验传授给学生,作者结合多年来讲授单片机和C语言的教学心得,以及从事单片机项目开发的经验,将单片机C语言部分写成小册子,补充到单片机教学中。后来组织教师动手编写了C语言版的“单片机原理及应用”讲义,讲义经过试用修改后,由中国水利水电出版社出版发行,其书名为《单片机原理及应用(C语言版)》。在教学中,我们精选C语言的内容,并对一些内容的讲解方法进行了深入地研究,把C语言的一些概念从开始就引入到单片机中,以C语言为主来讲授MCS-51单片机,并且举例和编程都用C语言,试用效果比用汇编语言好,学生更容易掌握用C语言编写单片机程序。

C语言引入单片机教学中是最近几年的事情,因此其内容的选取、一些概念的讲授方法、与之相适应的习题和实验等,都不够完善成熟,为了推进单片机C语言教学,提高单片机的教学水平,将我们在教学中的试验和探索进行总结,形成文字,与同行交流和探讨。

2单片机C语言内容的选取

由于国内把C语言引入单片机教学中的时间比较短,单片机教材中C语言内容差别很大。欲搞好单片机C语言教学,首先需要研究在单片机教学中C语言的内容,进行恰当地选取,从而用较小的篇幅、较少的学时数,使学生较轻松地学习和掌握单片机C语言的内容,实现用C语言熟练编写单片机程序。

2.1单片机开发所需要的C语言知识

从事单片机程序开发所需要的C语言内容,与PC机C语言的内容基本相同,其内容有:基本概念(数据类型、变量和常量、运算符、表达式),程序控制语句,程序基本结构,数组,函数,指针,位操作,结构体与共用体,编译预处理等,只是少了文件操作的内容。这些只是二者相同的方面,对于单片机来说,还需要结合自身的特殊性在数据类型、变量定义、数组、函数、指针、位,结构体与共用体等方面做一些补充和改变。

2.2单片机C语言内容的选取

我们先浏览一下当前国内单片机书中C语言内容的选取,主要有两种情况:一种是在单片机书中安排了C语言的全部内容,并且C语言的内容放在全书的前面,各个内容分章编写,有的内容比较详细,有的不是很详细,这样的安排是认为读者没有C语言的基础,其内容和讲解方法与单片机结合较少,并且习题基本上不涉及单片机的概念,学习效果不会太好。第二种情况是单片机书中安排了C语言的大部分内容,但各个内容编写在一章中,安排的位置有的是放在“指令系统和汇编程序设计”后面,有的是放在书的最后,其内容有做复习的意思,要求读者有一定C语言的基础,有的书与单片机结合得较好,有的结合得不好,更像一般的C语言内容。

2.3我们的单片机C语言内容

我们精选的单片机C语言内容可以用一句话概括:变量(包括一般变量、数组、结构体、位变量、指针、特殊功能寄存器)定义、函数定义和混合编程。现在工科大部分专业都开设了C语言课程,特别是学单片机的专业,无一不开C语言课程,学生都具有C语言的基础,因此在单片机教学中不用重复讲授学习过的C语言内容,只需要讲单片机中所涉及的新内容以及与C语言不同的即可。具体我们在单片机课程中讲授的C语言有以下内容。

(1)C51数据类型及存储:增加了“bit和sbit位类型”、“sfr和sfr16特殊功能寄存器”两种新的数据类型,描述了各种数据在单片机中的存储方式。

(2)C51变量的定义及数据存储区域:对变量、数组、结构体等的定义,增加了“存储区”属性,强调所定义的对象具体存放的区域,并且对“存储类型”属性也作了要求。在内容处理上以基本变量(字符型、整型、浮点型)定义为例进行讲解。

(3)C51位变量的定义,特殊功能寄存器的定义,明确给出具体的定义形式。

(4)C51指针的定义:讲指针的定义及应用,在单片机中用两种指针访问存储器,一种是通用指针,另一种是专用指针,主要是讲专用指针,定义时不仅要清楚其存储区域,更要明确其指向区域。单片机中指针的使用更加自由和方便。

(5)C51的输入/输出:特别安排了格式输入函数“scanf”和格式输出函数“printf”内容,在单片机中这两个函数是对应串行口的输入和输出,并不是PC机C语言的从键盘输入和从显示器输出。

(6)C51函数的定义:讲函数和中断函数的定义,特别是中断函数,必须要明确对应的中断源,强调既不传递参数也不返回值。

(7)C51与汇编语言混合编程:讲解了C51汇编函数的规则、格式和混合编程,该内容为学生将来从事单片机开发进行混合编程提供方法和实例。

(8)C51集成开发软件Keil C简介:介绍了单片机集成开发软件µVision2,使学生尽快掌握单片机C语言程序开发软件。

从上面这些内容可以看出,前6个内容是必须要学习的,并且都是一些零碎的内容,仅涉及了基本概念(数据类型、变量定义)、指针概念、和函数定义格式等几个方面,写成讲义仅有二十来页、三万字左右。可见真正与单片机密切相关的C语言内容并不多,除了混合编程之外,对于学过C语言的学生来说,都非常容易理解和掌握,需要的学时数也较少,而混合编程不是基本内容,在实际教学中,我们也仅是简单地讲一下,不做要求。

3单片机C语言的讲解方法

在内容的讲解中,为了达到使学生容易理解、掌握和应用单片机C语言的目的,我们从三个方面努力:一是尽可能地做到概念明确、清晰、准确;二是紧密结合单片机实际多举例子;三是讲一些应用中的体会,如应该注意的问题、容易出错的地方等。在教学中,以变量定义、专用指针定义、C51汇编语言函数格式三个内容为重点。下面通过对两个重点内容的讲解情况,说明在教学中是怎样做到“概念明确、清晰、准确”的,其他方面不一一赘述,可以参阅教材。

3.1关于变量的定义

我们首先明确给出在单片机C语言变量定义的具体形式。在不少PC机C语言教材中,讲变量的定义时都没有明确给出具体形式,在单片机书中大多数也是如此,在PC机C语言中通过教师举例和书上例子,学生就能够轻松学会定义变量,但是在单片机中就大不一样了。用C语言编写单片机程序遇到最多的问题就是变量的定义,所以明确给出变量的定义形式是非常重要的。我们给出的变量定义的形式为:

[存储类型] 数据类型[存储区]变量名[=初值] (1)

该定义式明确地提出了单片机中C语言变量有4种属性,方括号中的内容可以缺省。“存储类型”这个属性我们仍沿用PC机ANSI C的说法,尽量不改变原来的含义,“存储类型”有4种:动态存储(auto)、静态存储(static)、全局存储(extern)和寄存器存储(register),缺省时为动态存储。

与PC机C语言变量定义的形式比较,多了一个“存储区”属性,这个新的属性极其重要,该属性就是要指明将变量存储在什么地方,变量的“存储区”有:data、bdata、idata、pdata、xdata、code区域,可以根据实际情况选择某一种存储区。缺省时变量的存储区域决定于程序所选取的编译模式,在小模式下缺省存储区为data区域。

当前“存储区”属性的说法很乱,有的书上称为“存储类型”,有的称为“存储空间”,有的称为“存储器类型”,很显然这些说法都不妥,第一种说法与原有的“存储类型”属性术语一样,后两种说法与实际含义不符合,因为“data、bdata、idata……”既不是存储空间也不是存储器,而是某种存储器的一部分,所以将其称为“存储区”最恰当。

另外在定义变量时可以指定存储地址也不再赘述,可以参考教材。

3.2关于专用指针的定义

我们也是明确地给出专用指针定义的形式:

[存储类型]数据类型指向存储区*[指针存储区]指针名 (2)

可见,该定义式明确提出了专用指针有5种属性,这里的“指针存储区”属性与一般变量的“存储区”属性对应,就是指针变量所存储的区域。“指向存储区”属性是程序员通过指针访问数据的存储区,在这里使用“指向存储区”这一术语而不是用“存储区”,使得专用指针变量的概念更清楚。“指针存储区”属性可以省略,省略时指针变量保存在默认的区域;“指向存储区”不能省略,否则就成了通用指针。一般“指向存储区”和“指针存储区”不是同一个区域。

从专用指针定义式(2)来看,指针的定义有些复杂,可能会有人说把问题搞复杂化了,并且使学生产生畏惧心理,但由于“指向存储区”属性和“指针存储区”属性都能够与单片机的实际情况对应起来,使学生对专用指针的概念认识得更清楚。反过来,如果不指出“指针存储区”属性,对于那些善于思考问题的学生反而会产生“指针存放于何处”的疑问,典型的问题如:定义一指向程序存储区的指针,通过该指针读取首地址为0x0100的数表,定义式如下:

unsignedcharcode*point=0x0100;

指针point指向程序区是很明确的,但是会产生疑问,“该指针能够赋值吗”?能够赋值说明指针不是存放在程序区,那它存放于何处?可以给学生讲它存放于默认区,但如果学生问“想把它保存到其他区域该怎么做”?欲想圆满解答必须用定义式(2)。

4单片机C语言的习题和实验

针对单片机C语言的教学内容,编写习题和实验题目,使习题和实验题目与单片机密切结合,与实际应用相联系。

4.1习题内容

编写的习题可以分为三个层次,第一个层次是帮助理解所讲的内容,这一部分主要是一些思考题;第二个层次是所讲内容的简单应用;第三个层次是一些结合实际的应用,这一部分多是编程题。

(1) 帮助理解所讲内容的如有以下题目:

C51定义变量的一般格式是什么?变量的4种属性是什么?

C51的数据存储区域类型有哪些?各种存储区域类型是哪种存储空间,存储范围是什么?

如何将C51变量或数组定义存储到指定的位置?

C51位变量的定义格式是什么?如何定义bdata型字节变量的位变量?

如何定义8位字节型特殊功能寄存器?如何定义16位特殊功能寄存器?如何定义特殊功能寄存器的位变量?

C51专用指针定义的一般格式是什么?如何确定专用指针定义的指向空间和指针变量本身存储的空间?

(2) 基本概念的简单应用题如有以下题目:

定义数码管显示0~9的共阴极显示代码(0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f, 0x6f)数组dis_code,将其定义在code区;

定义给定时器/计数器0赋初值的变量t0l和t0h,将其定义在data区的0x30、0x31处;

定义长度为20的整型数组data_buf于idata区中;

定义长度为100的无符号字符型数组data_array于片外数据区中;

先定义一个无符号字符型变量state于bdata区中,再定义两个与state的最高位和次高位对应的位变量flag_lamp和flag_machine。

(3) 结合实际应用的编程题目如:二进制数与ASCII码相互转换,多位二进制数与十进制数相互转换,排序,不同区域之间数据传送,数字滤波等。

4.2实验内容

针对理论教学内容,编写了两类实验题目,一类是基本概念实验,第二类是与实际应用有关的编程训练实验。其实验题目主要有如下一些:认识变量的存储区属性和存储方式的实验,实验内容为在data、idata、bdata、pdata、xdata区域中分别定义char、unsigned char、int、unsigned int、float等类型的变量,并将其赋值,单步运行程序,观察各个变量所存储的位置和不同类型数据的存放方式。

指针实验,实验内容为定义指向data、idata、xdata、code区域中的unsigned char、unsigned int型指针于指定的位置。通过指针,将源区域某个地方的一些数据传送到目标区域的某个地方,单步运行程序,观察指针变量的变化情况、观察各个区域数据的变化情况。

编程训练实验:排序、查找某区域的某个数据、两个区域中是数据比较、实现延时1ms、10ms倍数的实验等。

5结束语

相对于其他微控制器如三星公司的ARM7及一些较复杂的芯片如射频IC卡芯片MFRC500,MCS-51单片机是一个简单的芯片,初学者之所以感到困难,原因主要是两个方面:一是编程,特别是用汇编语言编程更难,学习单片机的人多数没有接触过汇编语言,欲在短短的十几个学时掌握单片机指令,并能够熟练进行汇编程序设计是不可能的,但如果用C语言编程,并且有较好的编程能力,只要理解了单片机各个部分的工作原理,掌握了相应的特殊功能寄存器(对51子系列主要有6个),就能够顺利地编写单片机程序;第二个原因是实践少,学习单片机与学习其它高级语言课程一样,需要多编程序多练习,虽然过去有Keil C软件可以模拟运行程序,但不够直观,只有在单片机硬件系统上运行才能够直观地看到运行情况和结果,所以Keil C模拟运行程序不能够激发学生的学习兴趣,但做一个硬件系统需要时间较长,并且非常麻烦,致使学生对单片机编程练习较少。

现在有了单片机系统设计和模拟运行软件Proteus,使用该软件可以设计单片机应用系统电路,并且由Keil C生成的执行代码可以在电路中模拟运行,显示出程序在应用系统中的运行情况和结果,非常直观,不仅能够激发学生的学习兴趣,而且电路设计非常快捷,大大提高训练的效率,并且能够使学生的编程能力和电路设计能力同步提高。

Keil C的出现推动了单片机C语言的教学,提高了人们的编写能力,为了充分发挥Proteus的作用,也需要在单片机教学中做一些探索和研究,进一步推动单片机教学改革,不仅使学生更容易掌握单片机编程,而且还能够使学生有更强的硬件电路设计能力。

参考文献:

[1] 周国运.单片机原理与应用(C语言版)[M].北京:中国水利水电出版社,2009.

[2] 谢维成,杨加国.单片机原理与应用及C51程序设计[M].北京:清华大学出版社,2006.

[3] 张道德.单片机接口技术(C51版)[M].北京:中国水利水电出版社,2007.

[4] 李建忠.单片机原理及应用[M].西安:西安电子科技大学出版社,2002.

猜你喜欢
C语言
“新工科”背景下课程思政在《C语言程序设计》课程中的实践
基于C语言的计算机编程技术
“C语言程序设计”课程混合教学探索
浅谈基于C语言的计算机软件编程
基于C语言的计算机软件编程技术探究
中职计算机C语言教学的探讨与研究
中职C语言单片机课堂教学中的趣味性探讨
计算机原理中C语言的应用价值
高职单片机C语言教学三步曲
基于TI C6000系列DSP的C/C++程序优化技术