第一部分 基本技能学习和实践
第1讲 一种新的C语言学习方式
学习背景
C 语言已经成为国内外广泛使用的一种计算机语言,几乎成为了工程学科的圣经,每个工程专业都将C语言作为必修的计算机课程。确实,C语言功能强大、使用灵活方便、应用面广、目标程序执行效率高、移植性好,既有高级语言的优点,又有低级语言的功能,特别适合编写系统软件。然而,尽管以往的同学们都十分重视C语言的学习,并倾注了大量的学习时间,但学习效果却不尽人意。究其原因,可归结为以下几点:
① C语言作为第一门计算机语言课程,牵涉的概念广,规则多,过于灵活,对初学编程的人而言确实很困难。
② 教学方式不符合工程类课程的教学规律。C语言是一门工程应用工具课程,最佳的学习方式是边做边学,放到项目中学。而以往的教学方式是课堂讲授为主,上机实验为辅,是一种典型的应试型教学方式,学习是为了去考取等级证书。以往的许多同学即使考取了各种等级证书,但是一到工作中面对具体问题,就无从下手,更谈不上灵活运用了。
③ 编程实践和项目训练课时不够,现有实践项目各自独立,没有系统性。即使实践编写了几十个小型项目,由于缺乏各种知识点的融会贯通项目,并不能真正掌握C语言的应用开发能力。一个学生只有能够自主编写上千行程序的系统软件,才算是真正基本掌握了C语言程序设计能力。
④ 大多数的课程和教材仍旧以各种数学算法编程为主,枯燥无味,没有挑战性和竞技性,提不起大家的学习兴趣,学习效果自然大打折扣。
针对以上问题,本教材将单片机控制的机器人引入C语言学习课程,让同学们在给机器人的编程过程中学习C语言,边做边学,最后完成几个具有复杂功能的智能机器人,在课堂竞赛、校内竞赛和全国比赛项目使用这些智能机器人进行竞技和比赛,让C语言的学习变成一个快乐的体验和挑战过程,提升学习效率,达到事半功倍的效果。使用单片机作为机器人的控制平台和C语言学习平台有以下优点:
① 单片机资源相对计算机(PC)较少,适合编写系统软件,能够迅速深入到 C 语言的各种核心概念和规则。
② 现有单片机价格低廉,编程方便,能够与教学机器人和智能传感器迅速结合,有非常大的扩展性。能够迅速开发出各种有趣的程序。
③ 可以为后续学习单片机等嵌入式系统课程打下基础,实现无缝结合,迅速提升系统开发能力。
④ 机器人项目趣味性好,实战性强,能够吸引同学们的注意力,辅以竞技项目的刺激和挑战,可以大大提高学习的趣味性,学习效果自然倍增。
单片机和微控制器
一台能够工作的计算机包括CPU(Central Processing Unit,中央处理单元:进行运算、控制)、RAM(Random Access Memory,随机存储器:数据存储)、ROM(Read Only Memory,只读存储器:程序存储)、输入/输出设备(串行口、并行口等)。在个人计算机上,这些部分被分成若干块芯片或者插卡,安装在一个称为主板的印制线路板上。而在单片机中,这些部分全部被做在一块集成电路芯片中,因此被称为单片机。单片机真正需要工作时,还需要稳定的电源、晶振、外部存储器和编程调试接口,就像计算机,需要工作时,也需要电源、晶振、硬盘或其他大容量外部存储器和操作系统。微控制器就是将单片机独立工作所需的电源适配器、晶振、外部存储器和串口转换电路等部门封装到一个模块上,这样,微控制器就能够直接与计算机连接进行编程开发,无需任何其他的芯片和电路。
采用单片机微控制器作为C语言学习实践的目标硬件,能够迅速深入学习C语言的各种灵活功能,了解如何编写程序让单片机与外围设备和电路进行交互,掌握C语言程序设计的开发思路。现在可以使用的单片机种类和型号琳琅满目,如何选择一款性价比最优的单片机作为我们初次学习C语言的平台需要仔细考虑。本书为了迎合现阶段大学教学的现状需要,采用C51系列单片机作为机器人控制和学习平台。
MCS51是由美国INTEL公司生产的一系列单片机的总称。该系列单片机包括很多品种,如8031、8051、8751等。其中8051是最典型的产品,其他单片机都是在8051的基础上进行功能的增减和改变而来的,所以人们习惯用8051来称呼MCS51系列单片机。
Intel公司将MCS51的核心技术授权给了很多公司,许多公司都在做以8051为核心的单片机,功能或多或少有些改变,以满足不同的需求。其中较典型的一款单片机 AT89C51(简称C51)是由美国ATMEL公司以8051为内核开发生产的。本书使用的AT89S52单片机就是在此基础上改进而来的。
AT89S52是一种高性能、低功耗的8位单片机,内含8KB ISP(In-system Programmable,系统在线编程)可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS51指令系统及其引脚结构。在实际工程应用中,功能强大的AT89S52已成为许多高性价比嵌入式控制应用系统的解决方案。
早期的单片机应用程序开发通常需要仿真机、编程器等配套工具,要配置这些工具需要一笔不小的投资。本书采用的AT89S52不需要仿真机和编程器,只需运用ISP电缆就可以对单片机的Flash反复擦写1000次以上,因此使用起来方便、简单,尤其适合初学者使用,配置十分灵活,可扩展性特别强。
In-system Programmable(ISP,系统在线编程)
In-system Programmable是指用户可把已编译好的程序代码通过一条“下载线”直接写入器件的编程(烧录)方法,已经编程的器件也可以用ISP方式擦除或再编程。ISP所用的“下载线”并非不需要成本,但相对于传统的“编程器”成本已经大大降低了。通常,Flash型芯片都具备ISP下载能力。
本书将引导读者如何使用C语言给AT89S52编程,使之成为机器人的大脑,控制机器人实现下述各种基本智能任务和综合竞赛任务:
① 人机对话,交换信息。
② 完成精确的运动轨迹。
③ 安装传感器,以探测周边环境。
④ 基于传感器信息做出决策。
⑤ 循线完成机器人游中国、智能搬运、擂台和灭火等任务。
通过这些任务的完成,同学们就可以在快乐的学习和挑战过程中,逐步掌握C语言程序设计技术和实践能力,轻松走上软件系统开发之路。
本书使用的C51单片机微控制器带有一个面包板,方便给机器人搭接各种传感器电路。同学们在动脑编程的过程中,还可以动手搭建电路,以做到手脑结合,相互促进。该电路板叫做51+AVR教学板,如图1-1所示。该教学板不仅可以用51单片机进行C语言编程学习,还可以用AVR单片机进行编程学习。(基于AVR单片机进行C语言编程学习,另有专门的学习教材。)本书使用的单片机微控制器只配备了AT89S52单片机。
图1-1 C51单片机教学板
正式开始本书的学习和实践前,读者需要获得51+AVR教学板套件,套件中包含了学习所需的几乎所有配件(后面会详细介绍)和配套软件光盘。该套件的唯一授权生产厂家为深圳市中科鸥鹏智能科技有限公司,可以从www.szopen.cn或者www.openirobot.com网站上与公司联系订购。
机器人与C语言学习平台
图1-2所示是本书使用的小型机器人平台,51+AVR 教学板安装在机器人底盘上。本书以此机器人作为平台,辅以各种简单的传感器,编程实现机器人的各种基本智能,完成相应的智能任务。
图1-2 采用51+AVR教学板的机器人
下面通过以下步骤来安装和使用C51单片机的C语言编程开发环境,讲述用C语言开发第一个简单机器人程序,并在机器人上如何运行编写的这个程序。具体任务包括:
① 寻找并安装开发编程软件。
② 连接机器人到电池或者供电的电源。
③ 连接教学板ISP接口到计算机,以便编程。
④ 连接教学板串行接口到计算机,以便调试和交互。
⑤ 运用C语言编写第一个单片机程序,运用编译器编译生成可执行文件,下载到单片机,通过串口观察机器人单片机教学板的执行结果。
⑥ 完成后断开电源。
任务1 获得软件
本书的学习实践过程将反复用到3款软件:Keil uVision IDE集成开发环境、AVR_fighter下载编程软件和串口调试软件。
1.Keil uVision IDE集成开发环境
该软件是德国KEIL公司出品的51系列单片机C语言集成开发环境。(可以在KEIL公司的网站http://www.keil.com上获得该软件的安装包(本书使用2.38a版))。利用该开发环境,可以快捷、方便地建立面向各种单片机的C语言编程项目,编写C语言源程序,并将C程序编译和生成可下载到目标单片机的执行程序。
2.AVR_fighter单片机ISP下载编程软件
该软件是一款免费下载的 ISP 下载编程软件,不需要专门的安装即可使用,非常方便。使用该软件,读者可以将C语言程序生成的可执行文件下载到机器人单片机上。使用时需要1个USBASP下载器和1个计算机的USB接口。
3.串口调试软件
SerialDebugTool.exe 是本书使用的串口调试软件。该软件提供单片机与计算机的交互信息窗口,包括显示单片机发给计算机的信息窗口和计算机发给单片机的数据输入窗口。在硬件上,计算机至少要有串行接口或USB接口来与单片机教学板的串口连接。
任务2 安装软件
现在,如果读者已从网站上获得了上述三个软件安装包或者拿到了配套的软件光盘,就可以开始安装软件了。软件的安装很简单,与安装其他软件过程一样。
安装Keil uVision2
(1)执行Keil uVision2安装程序,选择安装Eval Version版进行安装。
(2)在后续出现的窗口中全部选择 Next 按钮,将程序默认安装在 C:\Program Files\Keil文件目录下。
(3)将配套光盘“头文件”文件夹中的文件复制到C:\Program Files\Keil\C51\INC文件夹中。
Keil uVision IDE软件安装到计算机上的同时,会在计算机桌面建立一个快捷方式。
AVR_fighter下载编程软件与SerialDebugTool.exe串口调试软件都不需要安装,只需要将教学板配套光盘中的这些软件复制到你的PC上即可。
为了方便实用,建议建立桌面子目录将这三个工具软件全部放到里面。
任务3 硬件连接
C51教学板需要连接电源来运行,同时需要连接到计算机,以便编程和交互。
串口的连接
教学板通过串口电缆连接到计算机(或笔记本电脑),以便与用户交互。如果计算机有串行接口,直接使用串口连接电缆。如果没有,此时需要使用USB转串口适配器,如图1-3所示。需要将该串口线一端的串口连接到机器人教学板上,另一端连接到计算机的USB接口上,并安装对应的USB驱动程序。因为51+AVR教学板上有两个串口(一个用来与51单片机交互,另一个用来与AVR单片机交互),注意选择与51单片机最近的那个串口。
图1-3 USB转串口适配器
USBASP下载器的连接
机器人程序通过连接到计算机的 USBASP 下载器来下载到教学板上的单片机内。图1-4为本书使用的USBASP下载器。下载器一端通过一根USB线连接到计算机的USB接口上,另一端(小端)连接到教学板的程序下载口上。
图1-4 USBASP下载器
电源的连接
为了方便和节约电池,在一般的编程和调试时,建议使用一个6V/2A的电源适配器给单片机教学板供电。当需要机器人进行自主运动或者进行比赛时,使用3.7V锂电池给机器人供电。将锂电池装入专门的电池盒时,注意按照里面标记的电池极性(“+”和“-”)方向装入。如果没有选配锂电池套件,也可以直接用4节5号干电池给机器人供电。
给教学板和单片机进行通电检查
教学底板上有一个三位开关(如图1-5所示),开关拨到“0”位时断开教学板电源。无论是否将电池组或者其他电源连接到教学底板上,只要三位开关位于“0”位,那么设备就处于关闭状态。
图1-5 处于关闭状态的三位开关
现在将三位开关由“0”位拨至“1”位,打开教学板电源,如图1-6所示。检查教学底板上绿色LED电源指示灯是否变亮。如果没有,检查电源适配器或者电池盒里的电池和电池盒的接头是否已经插到教学板的电源插座上。
图1-6 处于1位状态的三位开关
开关“2”将会在后续学习中用到。将开关拨至“2”后,电源不仅给教学板供电,同时会给机器人的执行机构——伺服电动机供电,同样,此时绿色LED电源指示灯仍然会变亮。
任务4 第一个程序
第一个C语言程序将告诉AT89S52单片机控制器,让它在执行程序时通过串口发送一条信息给计算机,在计算机的串口调试窗口中显示出来。
创建与编辑你的第一个程序
双击Keil uVision IDE的图标,启动Keil uVision IDE程序,会得到如图1-7所示的Keil uVision2 IDE的主界面。通过Project菜单中的New Project命令建立项目文件,过程如下。
图1-7 Keil uVision2 IDE的主界面
(1)单击Project菜单,会出现如图1-8所示的菜单画面,选择“New Project”,将出现如图1-9所示的对话框。
图1-8 Project菜单
图1-9 Create New Project对话框
(2)在文件名中输入“HelloRobot”,保存在你想保存的位置(如 D:\C 语言程序设计\程序),可不用加后缀名。单击“保存”按钮,会出现如图1-10所示的窗口。
图1-10 单片机型号选择窗口
(3)这里要求选择项目芯片的类型。Keil uVision2 IDE几乎支持所有的51核心单片机,并以列表的形式给出。本书使用的是ATMEL公司的AT89S52,在Keil uVision2 IDE提供的数据库(Data base)列表中找到此款芯片,然后单击“确定”按钮,会出现如图1-11所示的窗口,询问是否加载 8051 启动代码,在这里我们选择“否”,不加载。(如果选择“是”,对你的程序没有任何影响。若你感兴趣,可选择“是”,看看编译器加载了哪些代码。)之后在界面左侧会出现如图1-12所示窗口Project Workspace(项目工作空间),此时就得到了目标项目文件Target 1。
图1-11 是否加载8051启动代码提示窗口
图1-12 目标工程窗口
Target 1项目文件创建后,还只有一个框架,紧接着需要向项目文件中编辑添加源程序。Keil uVision2支持编写C语言程序。可以是已经建立好的C程序文件,也可以是新建的C程序文件。如果是添加建立好的C程序文件,则直接用后面的方法添加道项目中;如果是新建立编辑的C程序文件,则先将程序文件存盘后再添加。
单击 按钮(或通过“File→New”操作),为该项目新建一个C语言程序文件,保存后弹出如图1-13所示的对话框,将文件保存在项目文件夹中(保存的源文件名称可以和项目名称一样,这样便于分别哪个源文件属于哪个项目。只是他们的扩展文件名不同),在文件类型中填写.c(这里.c为文件扩展名,表示此文件类型为C语言源文件),因为下面将采用C语言编写第一个程序。
图1-13 C语言源文件保存
第一个C程序:HelloRobot.c
#include<uart.h> int main(void) { uart_Init(); //串口初始化 printf("Hello,this is a message from your Robot\n"); while(1); }
将该例程输入Keil uVision IDE的编辑器,并以文件名HelloRobot.c保存。按照下面的步骤将该文件添加到目标工程项目中。
(1)单击图1-12中的“+”,将出现如图1-14所示的列表。
图1-14 添加C语言文件到目标工程
(2)右键单击“Source Group 1”,在出现的快捷菜单中选择“Add File To Group”→“Source Group 1”,出现Add Files to Group Source“Group1”对话框。从中选择需要添加的程序文件,如刚才建立的HelloRobot.c,单击“Add”按钮,把所选文件添加到项目文件中。
(3)程序文件添加到项目文件后,这时图1-14中“Source Group 1”的前面将出现一个“+”号;单击它,将出现刚才添加的源文件名,如图1-15所示(注意,图中显示的文件名是刚才输入的文件名)。
图1-15 添加了C语言文件的目标工程窗口和C程序源文件窗口
双击源文件,即可显示和编译源文件。
编译你的第一个程序
下面来生成下载需要的可执行文件。要生成可执行的.hex文件,需要对目标工程“Target 1”进行编译设置。右键单击“Target 1”,选择快捷菜单中的“Option for target‘Target 1’”。单击“output”,选择其中的“Create HEX Fi:”,如图1-16所示,单击“确定”按钮,关闭设置窗口。单击Keil uVision IDE快捷工具栏中的按钮,Keil的C编译器开始根据要生成的目标文件类型对目标工程项目中的C语言源文件进行编译。在编译过程中,我们可以观察到源文件有没有错误产生,如果没有错误产生,在 IDE 主窗口的下面的输出窗口(Output Window)出现如图1-17所示的提示信息,表明已成功生成了可下载的执行文件,并存储在C语言源程序存储的目录中,文件名就是HelloRobot.hex。
图1-16 设置目标工程的编译输出文件类型
图1-17 编译过程的输出提示信息
程序调试
如果程序在编译过程中出现了错误,就不能生成可下载的十六进制执行文件。C 语言的编写必须严格按照规定的规范,否则在编译过程中就会出现语法错误。比如,如果在录入程序时忘了在串口初始化语句的后面加分号:
uart_Init() //串口初始化
编译时就会出现如图1-18所示的语法错误。
图1-18 编译错误提示信息
其中的错误信息提行首先给出发生错误的文件名称,随后括号中的数字表示错误发生的行数,这里是指第5行。提示信息error C141:syntax error near‘printf’给出错误的编号C141,这是一种语法错误,并告知错误发生在’printf’附近。双击错误信息,编辑窗口中的光标回直接定位到错误位置。
C 语言函数对函数名称的大小写是敏感的,也就是同一个名字不同的大小写表示的是两个函数,标准的函数大小写写错也会提示语法错误。比如,如果将printf写成了Printf,那么编译时会出现如下警告和错误信息:
首先是警告程序中的Printf没有函数原型,随后就是错误信息,这个函数需要ANSI型函数原型。
如果字符串少加了一个双引号,比如在要显示的字符串中缺少了双引号:
printf(Hello,this is a message from your Robot\n");
系统居然给出了5个错误信息:
由此可见,一个小小的语法错误可以导致编译时出现很多错误信息。因此,在编写和录入程序时一定要特别的认真仔细,不仅不能错标点符号,也不能错大小写,更不能错名字。
总之,语法错误相对来说比较容易调试和修改,只要简单检查,就可以很快排除。特别是根据错误信息提示进行排除,就会更快。
程序没有任何编译和连接错误,就能够顺利生成可以下载到单片机的十六进制文件。
下载可执行文件到单片机
单击AVR_fighter下载编程软件图标,打开下载软件窗口,如图1-19所示。通常不需要更改任何选项,只需要在第一个列表框中选择正确的单片机型号。然后单击左上角的“装FLASH”按钮,选择要下载的可执行hex文件——HelloRobot.hex,再单击“编程”按钮,即可开始下载。如果下载成功,则在窗口左下角窗口中会显示“芯片编程”过程,最后显示“*芯片编程结束*”。程序在下载前会先自动擦除芯片中的原有程序。
图1-19 AVR_fighter软件下载窗口
举一反三
如果读者学习过《基础机器人制作与编程》这本书,并已经掌握了采用BASIC Stamp系列单片机模块的PBASIC语言开发技能,请与刚才介绍的C语言编程过程进行比较,看有何不同。并思考,这些不同对于初学者而言各有何优缺点。是不是复杂很多?
用串口调试软件查看单片机输出信息
打开串口调试软件SerialDebugTool.exe,出现串口调试窗口,参考图1-20所示,在左边的“通信设置”栏的串口号列表框中选择串口“COMXX”后,单击下面的“连接”按钮(注意,选择哪个串口要根据所使用的串口通信线来定。如果使用的是计算机的硬串口,即计算机上的串口就可以选择串口COM1;如果使用的是USB转RC-232串口线,则要在等待串口线准备好后,查询计算机的设备管理器,确定是哪一个串口,再在串口调试终端选择该串口,随后点击连接)。如果成功连接,“连接”按钮变成“断开”按钮。
图1-20 串口调试窗口
在“接收区”内你看到了什么?什么也没有!为什么呢?
注意:单片机的特点就是只要里面有程序,一开机就开始执行。因此当执行文件成功下载到单片机的那个时刻开始,程序就开始运行了。当你开着电给单片机连接上串口电缆时,单片机已经向计算机发送了信息。你错过了接收。怎么办呢?
机器人教学板提供了“Reset”按钮,可以让下载到单片机内的程序重新运行一次。单击“Reset”按钮两次,是不是出现如图1-20所示的画面呢?
HelloRobot.c是如何工作的
要讲清C语言的第一个程序是如何工作的,要比BASIC语言复杂很多。因为C语言是一个非常庞大的系统,是为开发大型程序而准备的。即使是最小的一个程序,其框架结构也很复杂。
例程中第一行代码是 HelloRobot.c 所包含的头文件。该头文件在编译过程中用来将下面程序中需要用到的标准数据类型和由C语言编译器提供的一些标准输入/输出函数、中断服务函数等包括进来,生成可执行代码。头文件中可以嵌套头文件,同时也可以直接定义一些常用的功能函数。本例程中的头文件 uart.h 在本书的后续任务中都要用到,它包含了本例程中及后面的例程中都要用到的uart_Init()函数的定义和实现代码。当然,它也将C语言的标准输入/输出函数定义和实现包含了进来,如本例程中的printf函数。
下面先介绍函数的概念。一个较大的C语言程序一般分成若干个模块,每个模块实现一定的功能,被称为函数。任何一个C语言程序本身就是一个大的函数,该函数以main函数作为程序的起点,通常称之为主函数。主函数可以调用任何子函数,子函数之间也可以相互调用(但是不可以调用主函数)。函数定义的一般格式为:
函数返回值的类型 函数名(形式参数1,形式参数2,……)
第二行就是程序的入口main函数。main前面的int是指定main的函数返回值类型为整数类型,括号中void或无内容表示没有形式参数。每个函数的主体都要用“{}”括起来(反思一下同PBASIC语言编程的区别)。
函数的具体应用将在第3讲中详细介绍。
main函数主体中有两行语句:第一行是串口初始化函数uart_Init( ),用来规定单片机串口是如何与计算机通信的。有兴趣的读者可以打开uart.h头文件,看看该函数是如何实现的。如果其中有很多内容不懂,不要紧,记住这个函数的功能就行,以后再逐步学习和理解。这行语句中“//”后的是注释。注释是一行会被编译器忽视的文字,不被编译,仅仅为了让自己或者别人阅读程序时理解起来比较方便。函数体中的第二行语句printf命令是要单片机通过串口向计算机发送一条信息。
printf函数
printf函数称为格式输出函数,其功能是按用户指定的格式,把指定的数据输出显示。该函数是C语言提供的标准输出函数,定义在C语言的标准函数库中,要使用它,必须包括定义标准函数库的头文件stdio.h。由于在uart.h头文件中包括了stdio.h,因此本例程无须另外包括该头文件。printf函数的一般形式为:
printf("格式控制字符串", 输出列表);
格式控制字符串可由格式字符串和非格式字符串组成。
格式字符串是以%开头的字符串;输出列表在格式输出时才用到,它给出了每个输出项,要求与格式字符串在数量和类型上一一对应。
非格式字符串在输出时原样输出,在显示中起提示作用。例程中用到的就是非格式字符串。
“\n”是一个向调试终端发送回车命令的控制符。也就是说,当单击“Reset”按钮再次运行程序时,将在下一行显示“Hello,this is a message from your Robot”;如果没有“\n”,则会在上一语句中的结尾,即“Robot”后面接着显示。
“while(1);”的作用
while是C语言里的循环控制语句,它的具体语法将在第3讲里介绍,这里解释为何要加上这个循环。
while(1)实际上是一个死循环。hex 文件加载到单片机 Flash 存储器上时,是从头开始往下加载的。当你把hex文件加载上去时,填满了整个Flash空间吗?当然没有!那么,当程序执行完printf函数之后,它还将向下执行,但后面的空间并没有存放程序代码,这时程序会乱运行,也就是发生了跑飞现象。加上 while(1);这个死循环语句,让程序一直停止在这里,就是为了防止程序跑飞。
该你了
在你的第一个程序中按照printf语句的样子,在其后面多加一些显示的内容或者语句,重新编译、连接、生成执行代码,下载到单片机,再通过串口调试软件观察显示结果。至少重复以上步骤 5 次,熟练掌握程序的修改、保存、编译、连接、生成执行代码、下载执行和观察显示结果等一系列过程。
注意,每次修改程序后都要立刻保存,这样当程序出现意外时不至于要重新输入。切记!
任务5 做完实验关断电源
做完实验后把电源从教学板上断开很重要,原因有几点:首先,系统不使用时不消耗电能,电池可以用得更久;其次,在以后的实验中,将在教学板的面包板上搭建电路,搭建电路时应使面包板断电。如果是在教室,老师可能会有额外的要求,如断开串口电缆,把教学底板存放到安全的地方,等等。总之,做完实验后最重要的一步是断开电源。
断开电源比较容易,只要三位开关拨到左边的0位即可。
工程素质和技能归纳
本讲涉及的主要技能
① C51系列单片机Keil uVision IDE(集成开发环境)软件的安装和使用。
② 机器人用C51教学板与计算机的连接。
③ 如何在集成开发环境中创建目标工程文件,并添加和编辑C语言源程序。
④ C语言程序的编译和可执行文件的生成。
⑤ AVR_fighter下载软件的使用和程序下载。
⑥ 程序的执行和串口调试终端的使用。
⑦ C语言程序的基本架构和printf格式输出函数的使用。
常见错误
第一次编写C语言程序,在编译程序时会遇到各种各样的问题,一些常见的问题如下:
① 函数名称的大小写问题。C语言程序区分各种函数名称的大小写,同一个名字如果大小写不一样,C语言都将其视为不同的函数。
② 由于可以在编辑窗口中用中文给程序作注释,中文与英文所占的字符数不一样,一个汉字要占两个英文字符的空间。与中文配套的标点符号(全角)与英文的标点符号(半角)在计算机里面也是不一样的。如果不小心在程序里面输入了全角的逗号或者分号等,会引起一系列的编译问题。
③ 修改的源文件不是加到了项目工程中的源文件,此时的任何修改都不会反映到项目执行结果中。有时加到项目工程中的源文件完全是一个空的文件。此时要将空的文件从项目工程中删掉,重新加入已编写好的源文件,或者直接在空文件中重新输入程序,并保存。确认编写的是加入到项目工程中的文件的方法是关闭所有C程序编辑窗口,在目标工程项目窗口中单击相应的C语言源文件来打开,再进行编辑和修改。
科学精神的培养
① 比较Keil uVision IDE与BASIC Stamp系列开发环境的优缺点,找出它们的共同特点。
② 比较第一个C语言程序与第一个PBASIC程序的异同,找出它们的共同点。
③ 比较BASIC Stamp的PBASIC调试指令和Keil C的输出指令printf的异同。
④ 查找C语言的标准输入输出库函数,了解printf的总体功能。本讲中用到了它的两个格式符和控制符,介绍了printf输出的各种数据类型。
⑤ 要了解和掌握C语言支持的各种数据类型和如何编写简单的程序,马上进入下一讲。