APP下载

Proteus和C51在单片机课程教学改革中的应用

2011-04-14集美大学信息工程学院福建厦门361021

长江大学学报(自科版) 2011年19期
关键词:汇编语言调试处理器

舒 剑 (集美大学信息工程学院,福建 厦门361021)

单片机应用技术是高等院校电子信息类专业的一门重要课程,随着微控制器技术广泛深入地应用于工农业生产和日常消费电子领域,该课程的重要性越显突出。该课程学习的目的是为了工程应用,教学必须以此目的为出发点❶❶集美大学校级精品课程建设立项 (C14615)。。这决定了这门课程在学习过程中的2个重要特点,一是以基本原理和设计思想为主导的理论学习,二是要有培养实践动手能力的强烈意识。两者相互相成,实验教学提供的实践机会能让学生找到 “感觉”,对理论的理解将更形象和深刻,而实践能力的加强也需要理论作为基础。

1 对课程教学改革的思考

在课堂教学环节,考虑到电子信息专业学生在第5学期已学习过微机原理与接口技术课程,以8086汇编讲授软件编程部分,且在更早以前学习过计算机C语言课程,因此第6学期的单片机应用技术可采用C51来讲授MCS-51的软件编程部分,以充分借助已有基础,更好地扩展更高更新的知识。在实践教学环节,通行的做法是学生在实验之前预习,也就是根据书本理论编写代码,实际是否可行需等到实验室的实验箱上验证。这种方式有2个弊端,一是除了实验上课时间外,学生平时难得有机会,尤其是需要在实验箱上进行的硬件实验;二是实验室采用的实验硬件平台大多是实验箱,是为了满足大多数专业对单片机课程实验环节的需要,但这种成品实验箱却限制了学生对硬件的了解,无法真实参与细节设计,另外实验项目也基本固定,限制了自主学习兴趣的发挥。采用支持全面的Proteus仿真软件进行辅助可在很大程度上弥补上述弊端。

2 采用C51进行教学

MCS-51单片机汇编语言与8086汇编语言有许多共通点,但也有一些明显差异,如寻址方式、存储器访问方式等,这是2种处理器的体系结构差异造成的。在教学过程中必须鲜明、重点地提出这些差异,这些差异并不复杂,也不难,只要交代清楚,完全可达到满意的效果,没有必要重复完整讲授MCS-51的汇编指令。在教学上突出MCS-51汇编与8086汇编的差异,然后把主要精力转向C51编程。这样可充分利用以往学过的计算机C语言基础,以及微机原理与接口技术课程的基础,在单片机应用技术课程中再上新高度。

2.1 Keil C51的优势

Keil C51是Keil Software公司出品的51系列兼容单片机C语言,与汇编相比,C语言在功能、结构性、可读性、可维护性上有明显的优势。Keil uVision3是基于C51的集成开发环境,支持汇编和C51编程,可编译生成HEX下载文件。若挂接与目标处理器相应的硬件仿真器可直接进行软硬件联合调试,若纯软件实验还可完全不需要硬件而单独调试程序。与汇编语言相比,C51可简洁地实现码制转换、多字节四则运算、浮点数运算,而这些在8位MCS-51上用汇编语言实现还需要一定的编程量。C51完全采用C风格,面向过程编程,即利用函数 (子程序)来规划整体软件,虽然汇编语言编程时也大量采用子程序,但需谨慎处理现场保护和参数传递问题,远不如C函数调用方便。

2.2 C51编程要点

在讲授C51编程时,须着重提醒学生C51与早先学习的计算机C语言的异同,尤其是它们的差异,防止学生把两者混淆。差异主要在以下方面。

1)存储器模型 用于指定自动变量的默认位置,C51提供Small Model、Compact Model和Large Model 3种模型。优先考虑Small Model,使用片内RAM,生成的代码更简洁,若片内RAM不够用可使用Compact Model或Large Model,但同时要求硬件在CPU外部以总线方式扩展RAM作为配合。

2)存储器类型 由于MCS-51的存储器有程序存储器、片内低128BRAM、片内高128BRAM、外部RAM、片内可位寻址单元,因此一个变量的存储位置可以位于上述任何一个之中,对应类型为code、data、idata、xdata、bdata。如以下方法将变量存储在片内低128BRAM中:

char data var1=100;

将字符串存储在程序存储器中:

char code text1 []= “This is a string in ROM.”;

将数组存储在片外RAM:

unsigned int xdata vec1 [2][3];

3)数据类型 MCS-51是8位处理器,因此数据类型定义与计算机不同,char类型是8位,short和int类型是16位,long和float类型是32位,bit和sbit类型是1位,sfr类型是8位,sfr16是16位。可见后4种是ANSI C所没有的。数据类型是编程的基础,熟悉它们才能正确表达数值并实施运算,避免溢出等错误结果。

4)中断 MCS-51有5个中断源6个中断标志,按优先级从高到低依次为/INT0、T0、/INT1、T1、串行口,对应在C51中的中断编号为0~4。如T0的中断服务子程序应写为:

当CPU发生T0中断事件时,硬件自动转入哪个中断子程序是依靠 “interrupt 1”来确定的,与函数名无关,函数名可任意。后面的 “using 2”用来指明函数跳转时保护现场使用4组工作寄存器中的第2组,可用其他组,此部分也可不写,则C51将中断程序中用到的寄存器全部压入堆栈保护。

5)指针 如变量的存储位置有多种,指针本身也是变量,需要占用存储空间。因此需要讨论指针存放在哪里,以及它所指向的变量存放在哪里。如下例,指针ptr存放在片内低128BRAM,所指向的int变量位于片外RAM:

int xdata* data ptr;

可以看出,这些差异均与MCS-51单片机体系结构和硬件组成密切相关,因此课堂上讲授这部分原理和理论很重要,否则无法深刻理解C51语言。

2.3 应用举例

采用MCS-51串行口扩展16位并行输出口,显示2位数码值。串行口使用方式0,片外扩展一片74HC164移位寄存器芯片。图1为原理图[1]。

图1 MCS-51扩展并行口

采用C51编写程序,为节省篇幅省略delay()延时函数体。

以上C51代码在Keil uVision3下可直接反编译汇编代码,如图2所示,可见C51生成的代码紧凑,效率高,不亚于人工编写的高质量汇编代码。

3 采用Proteus仿真软件辅助教学

3.1 Proteus仿真软件的特点

Proteus ISIS是英国 Labcenter Electronics公司出品的电路分析与仿真软件。软件特点如下:①单片机仿真与SPICE电路仿真相结合;②支持示波器、信号发生器、逻辑分析仪等虚拟仪器,器仪具有理想参数指标,例如极高输入阻抗或极低输出阻抗,这些都尽可能减少了仪器对测量结果的影响[2],支持众多外部模拟和数字器件,支持68000、51、PIC、AVR等众多系列处理器;③自身提供软件调试功能,也支持Keil C51等外部编译和调试环境。

图2 反编译C51代码

3.2 采用Proteus辅助设计的优势

在模拟和数字电路设计中,常用的仿真软件如MultiSim可实现器件和电路整体的仿真分析,但不支持可内装用户自定义程序的微处理器。而Keil uVision3等仿真软件可实现单纯的处理器仿真,也就是仅支持对处理器本身仿真,不支持或极少支持处理器扩展外围电路。

Proteus软件集中了这两者的优点,允许用户搭建以单片机为核心的完整的电路系统,并进行整体硬件仿真和软件调试,能真正对单片机系统进行辅助设计。Proteus还支持与Keil联合调试,在联调时,Keil作为软件调试界面,Proteus作为硬件仿真和调试界面。如可以在Keil中单步执行程序,在Proteus看到硬件系统的反应。

Proteus软件的这些优势对于学生的学习具有积极意义,很好地弥补了前文所述的课程实践环节的限制。学生即使离开实验室,脱离实验箱也可以进行完整的系统设计,而且能通过仿真看到结果,这对学习是一个鼓励,有助于激励和培养兴趣。另外,学生还可以不受成品实验箱实验项目相对固定的限制,可以自由发挥设计灵感。

3.3 应用举例

继续前文的例子,将MCS-51串行口扩展16位并行输出用Proteus进行仿真。首先在Proteus ISIS中绘制完整电路,如图3所示。

然后在Keil uVision3中输入并编译上文所列C51程序。回到ISIS中,在Source菜单中添加该程序,接下来就可以运行并观察到仿真结果。改变段码的值,可立即在Proteus中看到变化。

在Proteus与Keil联合调试时,Keil的调试方法全部可用,在Keil调试程序的同时,在Proteus中可观察到硬件状态的变化。为实现联合调试,需对Keil和Proteus软件做一些设置[3-4],在此不赘述。

图3 Proteus中的电路设计

4 C51程序设计的若干经验

C51程序与汇编程序有1个显著不同,C51程序语句与最终机器码不会一一对应,也不会固定,相同的语句在不同的设置下会得到不同的机器码,而汇编语言则不会,它与最终的机器码明确对应,所以采用汇编语言编程时,用户直接决定了最终的机器码。而采用C51编程时,用户则必须熟悉编译器的规则,以使得编译器编译出尽可能简洁的机器码。因此在C51编程中有一个代码优化的问题。

1)选择合适的算法 例如将比较慢的顺序查找法用较快的二分查找法代替,冒泡排序用快速排序、合并排序或根排序代替。数组与指针关系密切,对大部分编译器而言使用指针比使用数组生成的代码更简洁,但Keil相反,使用数组比使用指针生成的代码更简洁。

2)使用小数据类型 MCS-51是8位处理器,应尽可能使用8位变量,如char,尽量避免使用浮点数据类型。

3)使用自增自减语句 用a+=1或a-=1时,编译器通常能够生成INC或DEC指令,而使用a=a+1或a=a-1时,C编译器通常会生成2~3个字节的指令。

4)避免复杂运算 这里所说的复杂运算是对MCS-51而言的。MCS-51有加减乘除指令,因此应尽量将复杂运算变换为四则运算或逻辑运算。例如,使用乘法代替平方和立方函数,用移位实现乘除运算 (如a=a*17可改用a= (a≪4)+a实现)。

5)善于运用查表 如浮点数的乘除和开方、数学模型插补运算等复杂运算,应尽量使用查表解决,这是对MCS-51的扬长避短,MCS-51的复杂运算会耗费大量CPU时间。

[1]张毅刚 .单片机原理及应用 [M].北京:高等教育出版社,2004:224.

[2]周润景,张丽娜 .基于PROTEUS的电路及单片机系统设计与仿真 [M].北京:北京航空航天大学出版社,2006:182-183.

[3]孙凌燕,黄允千.Proteus与Keil软件的整合在单片机实验开发中的应用 [J].实验室研究与探索,2008(4):59-61.

[4]伍冯洁,谢陈跃,谢斌.Proteus与Keil在单片机开放性实验中的应用 [J].电子测量技术,2008(6):100-103.

猜你喜欢

汇编语言调试处理器
高等学校计算机专业课程教学改革实践——以汇编语言与接口技术课程为例
汇编语言与C语言的混合程序设计技术研究
基于航拍无人机的设计与调试
FOCAS功能在机床调试中的开发与应用
提高《汇编语言程序设计》教学效率的思考与实践
无线通信中频线路窄带临界调试法及其应用
调压柜的调试与试运行探讨
试论汇编语言与C语言的混合程序设计技术
Imagination的ClearCallTM VoIP应用现可支持Cavium的OCTEON® Ⅲ多核处理器
ADI推出新一代SigmaDSP处理器