当前位置:文档之家› 飞思卡尔软件应用与C语言编程要点

飞思卡尔软件应用与C语言编程要点

飞思卡尔软件应用与C语言编程要点
飞思卡尔软件应用与C语言编程要点

1.CodeWarrior中建立新项目

运行CodeWarrior(CW)集成开发平台,如图1-1所示在File菜单下点击New,弹出建立新项目的模板对话框,见图1-2。

一般的简便做法是在图1-2对话框左面的选择列表中选择“HC(S)08 New Project Wizard”,然后在右面的项目名“Project Name”输入条中,输入你要建立的新项目名字,再在“Location”一栏中用

确定项目存放的文件夹路经,完成后按“OK”进入下一步。

你也可以在图1-2对话框左侧列表中选择“Empty Project”,这样生成的项目不包含任何文件,你必须在CodeWarrior中自己添加所有相关的文件内容。我想除非有特殊理由,实际项目开发过程中很少采用这种麻烦的方式来建立自己的项目。

接下去是选择项目开发所用的编程语言,见图1-3。最常用的当然是C语言编程。有时因具体项目要求,除了C编程外还需要编写独立的汇编语言模块,那就再加选汇编工具(Assembly)。C++编程在免费版和标准版CW下都不支持,只有在专业版下才可以使用。编程语言选择完毕后按“Next”。

图1-1

图1-2

图1-3

这时将出现如图1-4的对话框,让你选择项目开发对应的MCU 型号。在CW5.x 版本下支持几乎所有的HC08和大部分HCS08单片机型号。在最新的CW6.x 中,增加了飞思卡尔最低端的8位机(RS08系列)和低端32位处理器(Coldfire V1系列)的支持,但HC08系列的有些型号没有被包含在内。由于

HC08为比较老的产品系列,已经不推荐在新项目设计中选用,因此影响不会

太大。对于新用户来说,请尽量直接安装CW6.x 或以后推出的更新版本。

以典型的9S08系列为例,当你选择了一个MCU 型号后,在图1-4右侧会显示出所有针对该型号芯片可用的项目调试场景。其中:

? “Full Chip Simulator ”是芯片全功能模拟仿真,即无需任何目标系统的硬件资源,直接在你的PC 机上模拟运行单片机的程序,在模拟运行过程中可以观察调试程序的各项控制和运行流程,分析代码运行的时间,观察各种变量,等等。CW 提供了功能强大的模拟激励功能,可以在模拟运行时模拟一些外部事件的输入,配合程序调试;

? “P&E Multilink/Cyclone Pro ”是基于P&E 公司的硬件调试工具实现实时在线硬件调试。实际就是我们经常说的BDM 调试。BDM 调试是基于芯片本身内含的在线调试功能,可实现程序下载,单步/全速运行,可以设若干个断点,可以观察和修改任意寄存器或RAM 内存空间。BDM 几乎是开发飞思卡尔8位(9S08和RS08系列)、16位(9S12系列)和32位(Coldfire V1系列)单片机的标准调试模式,运用最为广泛;

? “SofTec HCS08”是另外一家SofTec 公司提供的硬件调试工具,国内使用较少;

? “HCS08 Serial Monitor ”是基于芯片串口的监控调试开发模式。由于开发效率较低,现在几乎无人使用。

注意不同系列,不同型号的芯片,或不同版本的CW ,其所对应或支持的开发场景可能不同,在图1-4的项目建立模板中都可以显现出来。用户点击选择某一项场景后,该场景将在项目建立完成后作为首选配置。你可以在稍后调试过程中随意切换开发场景,不必太在意在这里的选择。

到此你如果按“Finish ”,整个项目建立过程将完成,剩下的一些项目设定将自动用缺省配置。如果你要自己选择调整,则按“Next ”进入下一步,往项目中添加现成的文件,见图1-5。

图1-4

如果你以前编写了很多代码文件现在想重复利用,那么可以通过图1-5对话框左面的文件树选择对应的文件,按中间的“Add ”逐个添加到右侧的“Project Files ”列表中。若加错了就用“Remove ”把列表中的文件移除。注意此列表下方的两个选项:“Copy files to project ”选择是否将所选的文件拷贝到现在的项目文件夹中。如果你准备在新的项目中修改这些文件,就选择拷贝,以免把

原始的文件改变后而影响先前的一些项

目;“Create main.c/main.asm file ”选择是否在本项目中生成全新的main.c 或main.asm 文件,一般的项目开发都需要生成新的main 文件。按用户自己的要求和目的自由选取。建议大家保留默认的选择状态。如果没有什么现成的文件需要加入,就直接按“Next ”进入下一步,选择处理器专家(Processor Expert 或简称PE )。

PE 是CW 集成开发平台内带的可实现芯片内部各种资源模块配置并自动生成相关代码的一个软件工具。不过只有专业版的CW 才支持该功能。通过PE ,用户可以快速实现芯片初始化代码的自动生成工作,而且PE 还提供了大量的软件库可供用户开发时嵌入或调用。因为8位单片机结构和功能相对简单,实现的控制项目复杂度也不是很高,故一般情况下8位机开发我们都不需要PE 的介入,自己直接编

写程序代码即可。关于PE 的详细介绍将耗费大量的文字,这里按下不提。所以在图1-6的对话框中选择“None ”,并直接按“Next ”进入下一步。

这是项目建立模板的最后一步。在这一步你可以决定有关C/C++的一些编译和代码生成模式,见图1-7。

启动代码选择。所有C 编译器会自动生成一些启动代码。单片机复位后的指令运行将首先执行这些启动代码,然后再进入到你自己的程序模块main 函数。这些启动代码主要完成堆栈指针初始化、全局和静态变量自

动清零

图1-5

图1-6

图1-7

或赋初值、调用main 函数等。ANSI 标准初始化“ANSI startup code ”即完成上述工作,是项目开发的标准选择;最小初始化“Minimal startup code ”除了初始化堆栈指针外就直接调用main 函数,代码最少,进入main 函数最快,但变量的清零和赋初值必须由用户自己编写代码实现。在这里请大家特别注意,即最小初始化将不会对全局或静态变量自动清零,这一点在单片机编程中有时非常重要。在实际产品中当单片机出现异常复位程序重新开始运行时,我们往往希望原先的控制过程得以延续,因此一些关键变量的内容要在复位后保留而不能不分青红皂白地一概清零。选择最小初始化代码可以实现这一特殊要求,但还有更合理更高级的方法,将在后面介绍prm 文件时详细说明。

? 编译内存模式选择。“Tiny ”模式是指所有程序不超过64KB ,RAM 变量不超过内存地址最前面的256字节(有时也被称作第0页);“Small ”模式程序空间一样不超过64KB ,但RAM 不限于第0页,可以覆盖整个64K 地址空间。如果你选择的芯片有超过第0页空间的RAM 并想在设计中充分利用,就应该选择该缺省的“Small ”模式。

? 浮点运算库选择。当你的程序设计决定用浮点运算时就应该选择加入浮点运算库。浮点运算库有两种:一是标准浮点float 和双精度浮点double 都用32位精度表示,换句话说float 和double 都看成是float 。这样做的目的是减少代码量,提高运算速度;另一种是double 用64位精度表示,毋庸置疑其运算精度将增加,但代码量也将增加,运算时间也会更长。用户可以按实际计算需求酌情选取。如果设计中无需浮点运算,就选择“None ”。

全部选择完成并确认后,按“Finish ”,恭喜你:你的项目已经成功建立,可以开始编写你自己的代码,调试你的目标系统了。完成后的项目范例如图1-8,其中: ? Sources 栏目下包含所有你的原程序文件,可以是C ,也可以是asm ,或C++。你可以在此栏下点击鼠标右键在弹出菜单中选择“Add Files ”添加其他源程序文件;

? Includes 栏目下包含本项目所有被引用的头文件。你可以自己编写项目相关的头文件并添加到本栏目下;

? Libs 栏目所包含的是本项目开发用到的代码库,可以是目标代码型式或C 源程序型式; ? Project Setting 下放的全是项目的配置

文件。Startup Code 下是刚才建项目时

自动生成的启动文件,你可以打开观察具体的程序代码,也可以在必要时自己添加或修改这些启动代码;Link Files 下的三个文件分别是:用于编程器下载的代码文件格式配置(bbl 文件)、机器代码连接定位用的内存说明和配置

文件

图1-8

(prm文件)、生成的目标代码在内存中的映射文件(map文件)。其中prm 文件最为关键,将在稍后重点专门介绍。

2.CodeWarrior中项目的基本管理和设定

现在项目已经成功建立,应该可以开始编写自己的代码了。但在写代码之前,先了解一下CW中最基本的项目管理和设定的方法还是很有必要。

在图1-8中项目窗口的右上角有一些小图标,这些图标代表了项目开发管理的最基本功能:

?

该图标可以即时改变目标单片机型号和开发调试场景。按下这一图标,将弹出图1-4所示的对话框,可以按照前面针对新项目建立模板的介绍,改变目标单片机的型号,或设定不同的当前目标开发调试场景。对于调试场景的改变,也可以直接点击当前场景右边的下拉菜单按纽,直接用鼠标点击选择所需的新场景,如图2-1;

?

该图标完成项目配置选项设定。点击该图标会弹出一个对话框,里面所含的

内容非常

繁杂,这里只解释几

个日常使用时最常用的选项配置:

1.最终目标代码类型设定(Target Setting)。在这里你可以选择最终编译连

接生成的代码直接用于单片机程序运行(Link for HC08),或将各个源代码文件编译连接生成一个库文件(Libmaker for HC08)。这些选择可以通过图2-2所示的下拉菜单选择;

图2-1

图2-2图2-3

2. C 编译选项设定(Complier for HC08),对话框内容如图2-3。在这里你可

以完成针对C 编译器的所有配置设定。几个选项按纽解释如下:

选择配置编译时产生的各种信息,其中包括普通一般信息

(Information )、告警信息(Warning )、错误信息(Error )和致命信息(Fatal )。出现一般或告警信息时编译能顺利完成,所以你可以有选择地将某些你不希望太关注的信息屏蔽掉(Disable );但如果有任何错误或致命信息出现,当前源程序的编译将立即终止,你必须按给出的信息提示解决这些错误,然后才能继续编译。

完成编译过程中代码生成的各类选项设定,所含内容也很多,

最需要关注的是优化栏“Optimization ”。你可以按实际需要打开或关闭某些特定的优化选项,但我们一般通过下面介绍的“Smart Sliders ”做综合的优化设定。

显示编译器当前设定的各类变量的长度和符号特性(针对字符

和枚举型变量),无特殊原因一般都不用对这些变量长度做任何修改。按常规,在满足功能要求的前提下,变量长度尽可能短,字符型变量尽量选择无符号型,以便提高代码编译效率和程序运行速度。

可以非常方便地实现代码优化

时的综合考虑。你可以用上面介绍的“Option ”对话框可以设定特定的优化选项,但用此“Smart Sliders ”对话框则可以针对不同的优化侧重面由系统自动配置具体的优化选项。具体的对话框见图2-4,你只需用鼠标拉动各项的滑块对其进行优化级别的设定:

“Code Density ”针对生成代码的长度进行优化,设定越高,生成的代码长度越

短,代码越高效紧凑;

“Execution Speed ”针对代码运行速度进行优化,设定越高,代码执行速度越快;

“Debug Complexity ”针对调试复杂度进行优化,设定越高,生成的的调试信息越丰富,调试越方便;

“Compilation Time ”针对编译时间进行优化,设定越高,表明编译过程所需时间越长(对应其他各项所做的优化程度越高);

“Information Level ”针对编译信息进行优化,设定越高,表明编译过程中产生的各类信息越丰富。

所有这些编译优化项目都是相互关联的。你移动任意一项滑块的位置,其他各项也会随之自动发生变化。你自己必须有针对性地改变某一项或两项的优化级别,从中作出平衡,无法将所有的优化级别都提到最高。最常用的优化侧重面是代码长度和代码速度这两项。

图2-4

3.连接器选项设定(Linker for

HC08),对话框内容见图

2-5,值得一提的是其中对

prm文件的选择。通过项目

模板建立的项目其中必含有

本项目专用的一个prm文

件。缺省设置是利用此prm

文件进行内存分配和连接定

位。但你也可以通过此对话

框选择使用其他prm文件。

当你的项目用的是纯汇编单

一文件且为绝对定位的编程

模式,则不能选择任何prm

文件,必须设定成“Absolute, Single File Assembly Project”。

?

该图标检查项目文件是否被更新。当你在CW环境中编辑项目中的各个文件时,只要文件内容发生变化,项目列表窗内该文件的左侧会出现此小图标,表明此文件已经被更新,它们在代码生成过程会被重新编译。有时你会用其它你熟悉或喜欢的文本编辑器编辑修改项目中各类文件,当编辑完成文件被保存后,在CW环境下按一下这个图标,所有被更新的文件在项目栏中都会得到显现。如果文件左侧没有出现此小图标,表明该文件最近没有被修改过,代码生成时可能不会对它进行重新编译,以节约时间。在任何时候你都可以用鼠标点击源文件左侧该小图标的位置以显现此图标(如果原本没有显现的话),让编译器在代码生成过程中无条件重新编译此文件。

?

该图标进行代码生成(make),鼠标点击该图标后进行源程序的编译和目标代码的连接定位。如果编译连接成功,最后将生成用于源程序符号调试的abs文件、用于芯片烧写的s19文件、所有变量和函数模块在内存中的映射map 文件。另外通过CW菜单“Project→Make”或键盘快捷键“F7”也可以实现相同功能。

?

该图标用于打开并进入代码调试

窗口。鼠标点击该图标后,如果你

的项目文件中有最新更新,CW会

自动调用make功能进行编译和连

接。然后将利用最新生成的abs文

件,激活一个独立的代码调试窗

口,进行源程序级的代码调试。CW

菜单“Project→Debug”或键盘快捷

键“F5”同效。因为关系到以后调

试程序的方便,在这里还要特别提到编译过程中调试信息的打开和关闭控制

图2-5

图2-6

请注意图2-6中的黑点,该黑点表明编译此文件时将产生调试信息,如果没有此黑点,生成的abs 文件中将没有对应的源程序调试信息,你就无法在调试窗口中进行源代码级调试,只能进行汇编代码级调试。你可以用鼠标点击此黑点位置打开或关闭调试信息。所以当你在编译连接结束后发现L1923号信息“xxx.o has no DWARF debug info ”,请检查对应的文件调试信息有没有打开。

现在,请你在所建立的项目中体会一下上面介绍的这些基本配置及其设定方法。最后按下

图标,看是否能进入调试窗口?应该没问题!

好了,该编写你自己的代码了。

3. C 语言编程要点

CW 中针对Freescale 的8位单片C 语言编程基本符合ANSI 规范,因此关于标准C 语言编程的话题就不再重复。这里主要介绍和单片机资源密切相关的一些编程要点。

3.1 变量类型和定义

CW 中08系列单片机C 编译器支持的基本变量类型及其缺省的长度位数由表3.1所示。有些变量的长度可以按实际项目需要而改变,见对话框图3-1。此对话框经由上面的图2-3中“Type Size ”配置按纽打开。

表3.1中所示的整形数变量char 、short 、int 、long 等都有对应的无符号型式(前面冠以unsigned )。CW 给定的头文件已经将最常用的一些无符号变量类型做了类型

表3.1

图3-1

名简化替换,例如用“byte”代替“unsigned char”,用“word”代替“unsigned int”。这样在程序编写是可以节约点敲键盘的时间。

在单片机程序设计中对于变量类型的选择确认有两条最基本的原则须遵循:能用短的变量就不用长的;能用无符号数就不用有符号数。这两条基本原则将在很大程度上决定你代码的长度和效率。因此请多多使用byte或word类型变量。

由于08系列单片机内部硬件寄存器定义的特点,对于多字节组成的变量,例如int、long等,C编译器缺省的变量内存排列方式是“big endian”模式,即高位字节放在低地址,低位字节放在高地址,又俗称“大头朝上”。这一点相比普通Intel格式,例如51系列和PIC系列正好相反,它们都是“little endian”模式,即“大头朝下”,在程序跨平台移植时请特别注意。当然CW编译器本身可以设定改变成“little endian”模式,但单片机内部寄存器地址排列顺序无法改变,故这样做将使最终的程序代码效率降低,特别是在存取一些16位长的寄存器组时,它们在硬件上都是由顺序排列的两个8位寄存器组成,高字节在前,低字节在后。

单片机程序设计中经常会用到的位变量作为一些标志。CW中没有特别的位变量定义关键词,位变量必须由位域结构体的型式来定义。例如:

struct {

unsigned powerOn : 1;

unsigned alarmOn : 1;

unsigned commActive : 1;

unsigned sysError : 1;

} myFlag;

若引用某个位变量,只需

myFlag.alarmOn = 1;

myFlag.sysError = 0;

这样定义的各个位变量将被顺序排放在一起,以字节为基本单位,字节的第0位放第一个位变量,一个字节含8个位变量。因此如果位域结构中定义的位变量数目很多,在最后内存分配上将占居多个字节。

有时为了编程方便,位变量需单独定义和操作但又希望一次整个字节一起初始化(清零或赋值),这时我们可以定义字节(或字)和位域结构的联合体:union {

byte flagByte;

struct {

unsigned powerOn : 1;

unsigned alarmOn : 1;

unsigned commActive : 1;

unsigned sysError : 1;

} bits;

} myFlag;

整字节操作可以

myFlag.flagByte = 0;

单独某一个位操作可以可以

myFlag.bits.powerOn = 1;

https://www.doczj.com/doc/395777900.html,mActive = !https://www.doczj.com/doc/395777900.html,mActive;

若嫌这样的位变量名称太长,大可以在你自己的头文件里用“#define”预定义,用更简洁易懂的名称进行替换。

最后要提醒的是在定义位变量时尽量将它们指定分配到内存空间的第0页(地址范围0x00-0xff),这样对位变量操作的C代码将直接被编译成对应的汇编位操作指令,代码效率最高。具体的定位方法将在介绍“#pragma”时说明。

3.2变量的特殊修饰

上面介绍的各类基本变量和由其合成的高级变量如数组、结构和联合,将满足95%以上的单片机程序设计工作。由于单片机资源的有限性和特殊型,还有一小部分因素需要在定义变量时加以考虑:

3.2.1变量的绝对定位

变量绝对定位是特别针对芯片内部的硬件寄存器定义的。所有的硬件寄存器在编写C程序时均被视为变量,它们都已在CW给定的头文件中预先定义。由于是硬件资源,其地址是唯一且不可改的,所以在头文件中定义这些寄存器时都采用绝对定位的方式,如定义9S08AW32的PORTA:

/*** PTAD - Port A Data Register; 0x00000000 ***/

typedef union {

byte Byte;

struct {

byte PTAD0 :1; /* Port A Data Register Bit 0 */

byte PTAD1 :1; /* Port A Data Register Bit 1 */

byte PTAD2 :1; /* Port A Data Register Bit 2 */

byte PTAD3 :1; /* Port A Data Register Bit 3 */

byte PTAD4 :1; /* Port A Data Register Bit 4 */

byte PTAD5 :1; /* Port A Data Register Bit 5 */

byte PTAD6 :1; /* Port A Data Register Bit 6 */

byte PTAD7 :1; /* Port A Data Register Bit 7 */

} Bits;

} PTADSTR;

extern volatile PTADSTR _PTAD@ 0x00000000;

#define PTAD _PTAD.Byte

#define PTAD_PTAD0 _PTAD.Bits.PTAD0

#define PTAD_PTAD1 _PTAD.Bits.PTAD1

#define PTAD_PTAD2 _PTAD.Bits.PTAD2

#define PTAD_PTAD3 _PTAD.Bits.PTAD3

#define PTAD_PTAD4 _PTAD.Bits.PTAD4

#define PTAD_PTAD5 _PTAD.Bits.PTAD5

#define PTAD_PTAD6 _PTAD.Bits.PTAD6

#define PTAD_PTAD7 _PTAD.Bits.PTAD7

在定义端口寄存器时用“@”给出其绝对地址为0x00。

理论上用户自己定义的变量也可以用这种方式对其分配一个固定地址来绝对定位。但这样定义的变量其地址不被保留,完全可能被其他变量覆盖。例如用绝对定位的方式定义一个变量k在地址0x70,同时还有其他变量定义,在最后连接定位后的内存映射文件中我们可以看到变量i和k的地址是重叠的。

- VARIABLES:

prjName 80B9 F 15 1 .rodata

x1 80C8 4 4 1 .rodata

i 70 1 1 3 MY_ZEROPAGE

j 71 1 1 1 MY_ZEROPAGE

k 70 1 1 0 .abs_section_70

所以你可以采用上面介绍的方法来绝对定位你自己的变量,但千万千万慎用。我自己实在找不到合适的理由去绝对定位程序中的各类变量。

3.2.2变量volatile声明

声明方法:

volatile byte msCounter;

volatile byte uartBuff[16];

volatile word adValue;

“volatile”型变量顾名思义就是这些变量是易变的,其值是不随你的程序代码运行而随意改变的。可见,基本所有的单片机片内硬件寄存器其性质是易变的,因为其值变化是由内部硬件模块运作或外部信号输入决定而不受程序代码的控制;你自己定义的变量如果在中断服务程序中被修改,对正常的代码运行流程来说它们也是易变的。“volatile”类型定义在单片机的C语言编程中是如此的重要,是因为它可以告诉编译器的优化处理器这些变量是实实在在存在的,在优化过程中不能无故消除。假定你的程序定义了一个变量并对其作了一次赋值,但随后就再也没有对其进行任何读写操作,如果是非volatile型变量,优化后的结果是这个变量将有可能被彻底删除以节约存储空间。另外一种情形是在使用某一个变量进行连续的运算操作时,这个变量的值将在第一次操作时被复制到中间临时变量中,如果它是非volatile型变量,则紧接其后的其它操作将有可能直接从临时变量中取数以提高运行效率,显然这样做后对于那些随机变化的参数就会出问题。只要将其定义成volatile类型后,编译后的代码就可以保证每次操作时直接从变量地址处取数。

任何类型的变量,都可以冠以“volatile”声明。

3.2.3const声明

const用以声明变量为永不变化的常数。一般来说这些变量都应该被放在ROM区(也就是Flash程序空间)以节约宝贵的RAM内存。但简单的一个const声明并不能保证变量最后会被分配到ROM区,安全的做法必须配合#pragma声明的“CONST_SEG”数据段或“INTO_ROM”一起实现,这将在稍后介绍。下面为const声明的一个范例:

const byte prjName[]=”This is a demo”;

任何类型的变量,都可以冠以“const”声明。

3.3重要的#pragma声明

#pragma声明是基于单片机开发的特点而对标准C语法的一个扩充。它对充分利用单片机内各类有限的资源起到不可或缺的关键作用。下面简单介绍几个最常用的#pragma声明。

3.3.1#pragma DATA_SEG

定义变量所处的数据段。其语法型式为:

#pragma DATA_SEG <属性> 名称

数据段名称可以自己任意命名,但习惯上有些约定的名称,其作用分别为:?DEFAULT-缺省的数据段,在08系列单片机中的地址为0x100以上。一

般的变量定义可以放在这一区域。

?MY_ZEROPAGE-特指第0页数据段,地址范围0x00-0xff,但实际用户可用的空间不到256字节,因为前面的一些地址空间已经分配给了片内寄存器。需要频繁或快速存取的变量应该指定放在这一特殊区域,特别是位变量。

数据段名称必须和prm文件中的数据段配置说明相关连才能真正发挥其定位作用。如果你自己命名的数据段在prm文件中没有特别说明,那此数据段的性质等同于“DEFAULT”。

数据段的“属性”可以缺省,它主要的目的是告诉编译器此段数据可适用的寻址模式。不同的寻址模式所花的指令数量和运行时间都不同。对于08系列单片机,关键的是第0页数据段可以用8位地址进行直接快速寻址,故对应此数据段应尽量指明其属性为“__SHORT_SEG”。对于一般数据段没有属性描述,其缺省是“__FAR_SEG”,将用16位地址间接寻址。

举几个数据段定义的例子加以进一步说明。

#pragma DATA_SEG __SHORT_SEG MY_ZEROPAGE //开始0页数据定义

volatile struct {

unsigned powerOn : 1;

unsigned alarmOn : 1;

unsigned commActive : 1;

unsigned sysError : 1;

} myFlag;

volatile word msCounter;

byte i,j,k;

#pragma DATA_SEG DEFAULT //开始普通数据段定义(结束0页数据段)

byte tmpBuff[16];

3.3.2#pragma CONST_SEG

定义一个常数数据段,必须和变量的const修饰关键词配合使用。其语法型式为:#pragma CONST_SEG 名称

该数据段下定义的所有数据将被放置在程序只读的ROM区,也就是08系列单片机内的Flash程序空间区。常数段名称可以用户自由定义,但一般都用“DEFAULT”,让连接器按可用的ROM区域自由分配变量位置。举例如下:#pragma CONST_SEG DEFAULT

const byte prjName[]=”This is a demo”;

const word version = 0x0301;

#pragma CONST_SEG DEFAULT

word version = 0x0301; //没有const该变量将被放置在RAM区!

#pragma DATA_SEG DEFAULT

const word version = 0x0301; //尽管有const但该变量将被放置在RAM区!

3.3.3#pragma INTO_ROM

功能类似于“CONST_SEG”,和变量修饰词“const”配合使用。但它只定义一个常数变量到ROM区,且只作用于紧接着的下一行定义。例如:

#pragma INTO_ROM

const byte prjName[]=”This is a demo”; //变量将被放置在ROM区

word verData = 0x0301; //变量将被放置在缺省RAM区

3.3.4#pragma CODE_SEG

用以定义程序段并赋以特定的段名,语法型式如下:

#pragma CODE_SEG <属性> 名称

一般的程序设计是无需对代码段做特殊处理的。因为所有传统的08系列单片机其程序空间都不超过64KB(16位寻址最大范围)且在内存地址中呈线性连续分布。对于项目中所有的代码文件或库文件,连接器会在最后按程序模块出现的先后顺序挨个自动安排所有程序函数在内存中所处的实际位置,用户不必太关心某一个函数的具体位置。但最新推出的几款8位机程序将超过64KB,这样必须在内存空间中以页面型式映射到首64KB地址范围,其对应的程序段属性要特殊声明。

某些特殊的设计需要将不同部分的程序分别定位到不同的地址空间,例如实现程序代码下载自动更新。这样的设计需要把负责应用程序下载更新的驱动代码固定放置在一个保留区域内,而把一般的应用程序放置在另外一个区域以便在需要时整体擦除后更新。这时就需要用“CODE_SEG”来分别指明不同的程序段,但还必须配合prm文件对程序空间进行分配和指派。

代码段的属性一般都用缺省的“__FAR_SEG”,表明所有的函数调用都是长调用(对应汇编指令为JSR)。但C08和S08系列单片机支持效率更高的函数短调用(对应汇编指令为BSR),如果你的某一个功能模块含有多个相互调用的小函数且函数调用间距不超过+127或-128字节,则可以将这部分代码段声明为短调用属性“__NEAR_SEG”。但实际编程时由于C代码对应的汇编指令长度不是很容易就能估测得到,所以短调用属性很少使用。

下面以几个实例进一步说明:

//定义缺省的代码段,缺省属性为远调用

#pragma CODE_SEG DEFAULT

void main(void)

{

...

}

//定义名字为FUNC_CODE的代码段,缺省属性为远调用

#pragma CODE_SEG FUNC_CODE

void MyApp(void)

{

}

//定义远调用的程序段,段名为BOOTLOAD

#pragma CODE_SEG __FAR_SEG BOOTLOAD

void BootLoader(void)

{

}

//定义近调用的程序段,段名为KEYBOARD

#pragma CODE_SEG __NEAR_SEG KEYBOARD

void KeyDebounce(void)

{

...

}

byte KeyCheck(void)

{

...

}

void KeyBoard(void)

{

if (keyCheck()) {

KeyDebounce();

...

}

}

3.3.5#pragma TRAP_PROC

用于定义一个函数为中断服务类型。此类型的函数编译器在将C代码编译成汇编指令时会在代码前后增加必要的现场保护和恢复汇编代码,同时函数的最后返回用汇编指令“RTI”而不是针对普通函数的“RTS”。例如:

#pragma TRAP_PROC

void SCI1_Int(void) { //定义SCI1的中断服务程序

...

}

注意用“TRAP_PROC”定义的中断服务函数其实际中断矢量地址必须通过prm文件指派。

3.3.6#pragma MESSAGE

这个声明用以控制编译信息的显示。一般情况下这些编译信息都是有用的,特别是告警和错误信息。但有时我们会按单片机的工作特性编写一些代码,但正常程序编写时这些代码会产生一些告警信息,例如

#pragma MESSAGE DISABLE C4002 //忽略“Result-not-used”告警

//==============================================================

// sci1 1 data receive interrupt service routine

// Assigned for full-duplex communication with Main board

//==============================================================

void interrupt 17 sci11_Receive_ISR(void)

{

SCI1S1; //读一次状态寄存器清除中断标志,会产生C4002告警

sci1RxFifo[sci1FifoPut] = SCI1D;

sci1FifoPut++;

sci1FifoPut &= (SCI1_RXFIFO_SIZE-1);

}

如果你不想每次都看见编译器给出的这一类信息,可以先确认这一信息的编号,然后用“#pragma MESSAGE”加上“DISABLE”关键词和信息号将它屏蔽。如果你想特别关注某类信息,可以用“ENABLE”让其永远显示出来。

3.4编写中断服务函数

编写中断函数几乎是每一个单片机项目开发必需的一个内容。CW针对08系列单片机的中断函数编写有三种方式可以实现。

3.4.1用关键词interrupt和中断矢量编号定义中断函数

这种方式最直观也最简单。缺点是程序的可移植性稍差。在上面的 3.3.6节中已经给出了实现的范例。关键词“interrupt”告诉编译器此函数为中断服务函数,数字“17”告诉连接器该中断矢量的偏移位置(以复位矢量偏移为0计)。某一个中断响应对应的矢量入口编号可以在该芯片的数据手册中查到。

3.4.2用关键词interrupt定义中断函数,中断矢量入口由prm文件指定

仍以上面的中断服务函数为例,这是函数的定义方式为

void interrupt sci11_Receive_ISR(void)

{

...

}

然后在项目对应的prm文件中添加一行矢量位置定义:

VECTOR 0 _Startup //系统缺省的复位矢量入口

VECTOR 17 sci11_Receive_ISR //指定的中断服务矢量入口

3.4.3用#pragma TRAP_PROC定义中断函数,中断矢量入口由prm文件指定

实际上就是用前面介绍的“#pragma TRAP_PROC”定义中断函数,再按照和“interrupt”相同的方法在prm文件中指定矢量入口,不再重复。

4.prm文件内容释疑

prm文件已经在前面反复多次提到。我们在这里仔细看看此文件内包含的详细内容,理解在项目开发过程中起到什么关键作用。

通过项目模板建立的新项目中都有一个名字为“project.prm”的文件,位于图1-8所示项目文件列表的“Linker Files”一栏。一个标准的prm文件起始内容如下:

例4.1 prm文件内容实例

/* This is a linker parameter file for the AW32 */

NAMES END /* CodeWarrior will pass all the needed files to the linker by command line. But here you may add your own files too. */

SEGMENTS /* Here all RAM/ROM areas of the device are listed. Used in PLACEMENT below. */

ROM = READ_ONLY 0x8000 TO 0xFFAF;

Z_RAM = READ_WRITE 0x0070 TO 0x00FF;

RAM = READ_WRITE 0x0100 TO 0x086F;

ROM1 = READ_ONLY 0xFFC0 TO 0xFFCB;

END

PLACEMENT /* Here all predefined and user segments are placed into the SEGMENTS defined above. */

DEFAULT_RAM INTO RAM;

DEFAULT_ROM, ROM_VAR, STRINGS INTO ROM;

_DATA_ZEROPAGE, MY_ZEROPAGE INTO Z_RAM;

END

STACKSIZE 0x50

VECTOR 0 _Startup /* Reset vector: this is the default entry point for an application. */

4.1prm文件组成结构

按所含的信息prm文件有五个组成部分构成:

?“NAMES – END”部分用以指定在连接时加入除本项目文件列表之外的额外的目标代码模块文件,这些文件都是事先经C编译器或汇编器编译好的机器码目标文件而不是源代码文件。不过这种用法比较少见,因为我们可以在图1-8所示项目文件列表的“Libs”一栏中添加这些目标代码文件来实现同样的任务,而且由项目列表管理这些模块文件比较直观方便。

?“SEGMENTS – END”部分定义和划分芯片所有可用的内存资源,包括程序空间和数据空间。一般我们将程序空间定义成“ROM”,把数据空间划分成第0页的“Z_RAM”和普通区域的“RAM”,但实际上这些名字都不是系统保留的关键词,可以由用户随意修改。用户也可以把内存空间按地址和属性随意分割成大小不同的块,每块可以自由命名。关于内存划分的具体方法在后面详解。

?“PLACEMENT – END”部分将指派源程序中所定义的各种段,例如数据段DATA_SEG、CONST_SEG和代码段CODE_SEG被具体放置到哪一个内存块中。它是将源程序中的定义描述和实际物理内存挂钩的桥梁。

?“STACKSIZE”定义系统堆栈长度,其后给出的长度字节数可以根据实际应用需要进行修改。堆栈的实际定位取决于RAM内存的划分和使用情况。

在常见的RAM线性划分变量连续分配的情况下,堆栈将紧挨在用户所定义的所有变量区域的高端。但如果你将RAM区分成几个不同的块,请确保其中至少有一个块能容纳已经定义的堆栈长度。

?“VECTOR”定义所有矢量入口地址。模板在生成prm文件时已经定义了复位矢量的入口地址。对于各类中断矢量用户必须自己按矢量编号和中断服务函数名相关联,请参考 3.4.2中代码范例。如果中断函数的定义是用“interrupt”加上矢量号,则无需在这里重复定义。

prm文件中可以添加注释,语法和C语言相同,可以是“/*…*/”或“//”。

4.2内存划分的具体方式

由“SEGMENTS”开始到“END”为止,中间可以添加任意多行内存划分的定义,每一行用分号“;”结尾。定义行的语法型式为:

[块名] = [属性] [起始地址 ] TO [结束地址];

其中,

?“块名”的定义和C语言变量定义相同,是以英文字母开头的一个字符串。

?“属性”可以有三种不同的类型。对于只读的Flash-ROM区属性一定是“READ_ONLY”,对于可读写的RAM区属性可以是“READ_WRITE”,也可以是“NO_INIT”。它们两者的关键区别是ANSI-C的初始化代码会把定位在“READ_WRITE”块中的所有全局和静态变量自动清零,而“NO_INIT”块中的变量将不会被自动清零。对于单片机系统,变量在复位时不被自动清零这一特性有时是很关键的。

?起始地址和结束地址决定了一内存块的物理位置,用16进制表示。

下面举几个例子来进一步说明:

例4.2 划分Flash-ROM区,定义512字节EEPROM模拟区

SEGMENTS

EEPROM = READ_ONLY 0x8000 TO 0x81FF;

ROM = READ_ONLY 0x8200 TO 0xFFAF;

Z_RAM = READ_WRITE 0x0070 TO 0x00FF;

RAM = READ_WRITE 0x0100 TO 0x086F;

END

例4.3 划分RAM区,定义16字节非自动清零的数据保留区

SEGMENTS

ROM = READ_ONLY 0x8000 TO 0xFFAF;

Z_RAM = READ_WRITE 0x0070 TO 0x00FF;

RAM_KEEP = NO_INIT 0x0100 TO 0x010F;

RAM = READ_WRITE 0x0110 TO 0x086F;

END

用“SEGMENTS”只是从单片机的物理内存这一角度对其进行空间划分。源程序本身并不知道物理内存被分割和属性定义的这些细节。它们两者之间必须通过下面的“PLACEMENT”建立联系。

4.3程序段和数据段的放置

“PLACEMENT - END”内所描述的信息是告诉连接器源程序中所定义的各类段应该被具体放置到哪一个内存块中去。其语法型式为:

[段名1], [段名2],... [段名n] INTO [内存块名];

其中

?段名就是在源程序中用“#pragma”声明的数据段、常数段或代码段的名字。如果用缺省名“DEFAULT”,则默认的数据段名为“DEFAULT_RAM”,代码段和常数段名为“DEFAULT_ROM”。若程序中定义的段名没有在PLACEMENT中提及,则将被视同为DEFAULT。几个相同性质但不同名字的段可以被放置到同一个内存块中,相互之间用逗号“,”分隔。

?INTO是系统保留的关键词,在这里为“放入”的意思。

?内存块名就是前面介绍的用“SEGMENTS”划分好的不同的内存块名字。

利用这样直观的定位描述文本可以方便灵活的将你的数据或代码定位到芯片内存任意可能的位置,实现某些特殊目的的应用。下面举几个例子,注意各种段名、PLACEMENT和SEGMENTS之间的对应关系。

例4.4 定义并保留512字节Flash字节作为EEPROM模拟

//prm文件SEGMENTS定义:

SEGMENTS

EEPROM = READ_ONLY 0x8000 TO 0x81FF;

ROM = READ_ONLY 0x8200 TO 0xFFAF;

Z_RAM = READ_WRITE 0x0070 TO 0x00FF;

RAM = READ_WRITE 0x0100 TO 0x086F;

END

//prm文件PLACEMENT定义:

PLACEMENT

DEFAULT_RAM INTO RAM;

DEFAULT_ROM, ROM_VAR, STRINGS INTO ROM;

_DATA_ZEROPAGE, MY_ZEROPAGE INTO Z_RAM;

EE_DATA INTO EEPROM;

END

//源程序编写:

#pragma CONST_SEG EE_DATA

const byte eeDataBuff[512]="123456";

例4.5 将不同的代码段分别放置于不同的程序区

//prm文件SEGMENTS定义:

SEGMENTS

BOOT_SECTOR = READ_ONLY 0x8000 TO 0x87FF; //2KB作为加载引导专用区 ROM = READ_ONLY 0x8800 TO 0xFFAF;

Z_RAM = READ_WRITE 0x0070 TO 0x00FF;

RAM = READ_WRITE 0x0100 TO 0x086F;

END

//prm文件PLACEMENT定义:

PLACEMENT

DEFAULT_RAM INTO RAM;

DEFAULT_ROM, ROM_VAR, STRINGS INTO ROM;

_DATA_ZEROPAGE, MY_ZEROPAGE INTO Z_RAM;

BOOT_LOADER INTO BOOT_SECTOR;

END

//源程序编写:

#pragma CODE_SEG BOOT_LOADER//定义专用的加载引导代码段

void CodeLoader(void)

{

...

}

#pragma CODE_SEG DEFAULT//普通代码段

void main(void)

{

...

}

例4.6 定义非自动清零的数据段

//prm文件SEGMENTS定义:

SEGMENTS

ROM = READ_ONLY 0x8000 TO 0xFFAF;

Z_RAM = READ_WRITE 0x0070 TO 0x00FF;

RAM_KEEP = NO_INIT 0x0100 TO 0x011F; //32字节非自动清零数据段 RAM = READ_WRITE 0x0120 TO 0x086F;

END

//prm文件PLACEMENT定义:

PLACEMENT

DEFAULT_RAM INTO RAM;

DEFAULT_ROM, ROM_VAR, STRINGS INTO ROM;

_DATA_ZEROPAGE, MY_ZEROPAGE INTO Z_RAM;

DATA_PERSISTENT INTO RAM_KEEP;

END

//源程序编写:

#pragma DATA_SEG DATA_PERSISTENT//定义复位时非自定清零数据段

byte sysState;

word pulseCounter;

建议阅读文档(英文版):

C编译器使用手册:Compiler_HC08.pdf

汇编器使用手册:Assembler_HC08.pdf

连接器使用手册:Build_Tools_Utilities.pdf

飞思卡尔单片机各种问题汇结

飞思卡尔问题汇结 一、flash/EEPROM的操作 Tips: a、HC08系列MCU中,很多Monitor ROM中固化了对flash操作的函数,用户只需调用即可,参考AN2874等应用笔记 b、HCS08系列和HCS12系列MCU对flash的操作十分类似,可以参考 AN2140 1、FLASH操作函数 (HCS08系列) https://www.doczj.com/doc/395777900.html,/dispbbs.asp?boardID=3&RootID=111907&ID= 111907 2、如何将flash中的程序copy至ram中 https://www.doczj.com/doc/395777900.html,/dispbbs.asp?boardID=3&RootID=104074&ID= 104074 3、S12内部寄存器的映射

https://www.doczj.com/doc/395777900.html,/dispbbs.asp?boardID=3&RootID=103261&ID= 103261 4、S12EEPROM的使用、 INITRG,INITRM,INITEE寄存器的说明https://www.doczj.com/doc/395777900.html,/dispbbs.asp?boardID=3&RootID=102260&ID= 102260 5.INITRM寄存器的使用 https://www.doczj.com/doc/395777900.html,/dispbbs.asp?boardID=3&RootID=103214&ID= 103214 二、编程技巧 Tips: a、一般Codewarrior用引导生成工程的话,器件的头文件中都定义好了各个位,C语言编程只需找到对应的位进行操作即可 b、用户自定义变量进行位操作,可以参考Codewarrior的格式 1、CW位操作定义结构 https://www.doczj.com/doc/395777900.html,/dispbbs.asp?boardID=3&RootID=87784&ID=8 7784

C语言程序设计

一、单选题 1. (4分)若调用fputc函数输出字符成功,则其返回值是( )。? A. EOF ? B. 1 ? C. 0 ? D. 输出的字符 得分:0知识点:C语言程序设计作业题收起解析 答案D 解析 2. (4分)若以下程序段: struct dent { int n; int*m; }; int a=1, b=2,c=3; struct dent s[3]={{101<&a},{102<&b},{103,&c}; main() { struct dent *p;

p=s; ….. } 则以下表达中值为2的是()。 ? A. (p++)->m ? B. *(P++)->m ? C. (*p).m ? D. *(++p)->m 得分:0知识点:C语言程序设计作业题收起解析 答案D 解析 3. (4分)在一个c源程序文件中,若要定义一个只允许本源文件中所有函数使用的全局变量,则该变量需要使用的存储类别是( ). ? A. extern ? B. register ? C. auto ? D. static 得分:0知识点:C语言程序设计作业题收起解析 答案D 解析

4. (4分)若二维数组a有m列,则在a[i][j]前面的元素个数为()。? A. j*m+i ? B. i*m+j ? C. i*m+j-1 ? D. i*m+j+1 得分:0知识点:C语言程序设计作业题收起解析 答案B 解析 5. (4分)下面程序的运行结果是(). main() { struct cmplx {int x; int y; } cnum[2]={1,3,2,7}; printf(“%d ”,cnum[0].y/cnum[0].x*cnum[1].x); } ? A. 0 ? B. 1 ? C. 3

从飞思卡尔SafeAssure功能安全保障方案看汽车安全设计概要

从飞思卡尔SafeAssure功能安全保障方案看汽车安全设计 就在您阅读完本文不到十分钟的时间内,全球大概有超过二十人已经因为车祸离开这个世界,而其中大约有90%是来自像中国这样的发展中国家(数据参考世界卫生组织统计。汽车造福人类的同时,在全球科技空前发达的今天,因为交通事故带来如此重大的公共安全威胁不啻为人类的一大悲剧。从汽车诞生开始,人们就没有停止过对汽车安全驾驶的追求。最早的安全带以及后来的安全气囊等被动安全措施挽救了数千万人的生命,后来发展起来的ABS(防抱死制动系统、ESP(电子稳定程序、EBD(电子制动力分配系等主动安全功能让汽车安全性再次大大提高。但尽管如此,交通事故依然是最大非自然死伤原因之一。图1 世界卫生组织统计:全球每年因交通事故死亡130万人,并有5000万人受伤“随着系统复杂性的提高,以及软件和机电设备的大量应用,因为系统失效和随机硬件失效导致的交通事故风险也日益增加。因此,近年开始出现了新的汽车安全概念——安全性预测。”在近日召开的“2012产业和技术展望媒体研讨会”上,飞思卡尔亚太区汽车及工业解决方案事业部全球产品市场经理郗蕴侠(Yolanda博士指出,“安全性预测即汽车里的一些系统能实时检测故障,在故障发生之前就能预警防止故障发生,这就是当前大家倡导的汽车功能安全的概念。”为此,飞思卡尔推出了命名为“SafeAssure”的安全保障方案,旨在帮助系统制造商更加轻松地满足汽车和工业市场中的功能安全标准要求,并大大降低开发难度、缩短开发周期。图2 汽车安全系统的演变——基于安全性预测的功能安全出现从IEC61508到ISO 26262,看汽车功能安全演变 2011年11月推出ISO 26262之前,汽车行业遵照的功能安全标准是电子、电气及可编程器件功能安全基本标准IEC 61508。然而,作为一种通用基础安全标准,对于汽车行业的特殊性而言,该标准有很多的不足,特别是近年来汽车系统的复杂性日益增长的条件下。从IEC 61508派生出来的ISO 26262为当前汽车行业量身定制,特别是ISO 26262对于硬件研发、软件研发的要求适合于当前先进的汽车工业的实际现状。 ISO 26262标准根据安全风险程度对系统或系统某组成部分确定划分由A到D的安全需求等级(汽车安全完整性等级——ASIL,其中ASIL D级为最高等级,具有最苛刻的安全要求。对系统供应商而言,必须满足这些因为安全等级提高而提出的更高的设计要求。安全事件总是和通常的功能、质量相关的研发活动以及产品生产伴随在一起。ISO26262强调了研

飞思卡尔杯智能车竞赛报告总结

1.1. 系统分析 智能车竞赛要求设计一辆以组委会提供车模为主体的可以自主寻线的模型车,最后成绩取决于单圈最快时间。因此智能车主要由三大系统组成:检测系统,控制系统,执行系统。其中检测系统用于检测道路信息及小车的运行状况。控制系统采用大赛组委会提供的16位单片机MC9S12XS128作为主控芯片,根据检测系统反馈的信息新局决定各控制量——速度与转角,执行系统根据单片机的命令控制舵机的转角和直流电机的转速。整体的流程如图1.1,检测系统采集路径信息,经过控制决策系统分析和判断,由执行系统控制直流电机给出合适的转速,同时控制舵机给出合适的转角,从而控制智能车稳定、快速地行驶。 图2.1 1.2. 系统设计 参赛小车将电感采集到的电压信号,经滤波,整流后输入到XS128单片机,用光电编码器获得实时车速,反馈到单片机,实现完全闭环控制。速度电机采用模糊控制,舵机采用PD控制,具体的参数由多次调试中获得。考滤到小车设计的综合性很强,涵盖了控制、传感、电子、电气、计算机和机械等多个学科领域,因此我们采用了模块化设计方法,小车的系统框图如图2.2。

第五届全国大学生智能汽车竞赛技术报告 图2.2 1.3. 整车外观 图2.3

1.4. 赛车的基本参数 智能车竞赛所使用的车模是东莞市博思公司生产的G768型车模,由大赛组委会统一提供,是一款带有摩擦式差速器后轮驱动的电动模型车。车模外观如图3.1。车模基本参数如表3.1。 图3.1 表3.1车模基本参数 1.5. 赛车前轮定位参数的选定

第五届全国大学生智能汽车竞赛技术报告 现代汽车在正常行驶过程中,为了使汽车直线行驶稳定,转向轻便,转向后能自动回正,减少轮胎和转向系零件的磨损等,在转向轮、转向节和前轴之间须形成一定的相对安装位置,叫车轮定位,其主要的参数有:主销后倾、主销内倾、车轮外倾和前束。模型车的前轮定位参数都允许作适当调整,故此我们将自身专业课所学的理论知识与实际调车中的赛车状况相结合,最终得出赛车匹配后的前轮参数[6]。 1.5.1. 主销后倾角 主销后倾角是指在纵向平面内主销轴线与地面垂直线之间的夹角γ,如图3-2。模型车的主销后倾角可以设置为0、 2°?3°、 4°?6°,可以通过改变上横臂轴上的黄色垫片来调整,一共有四个垫片,前二后二时为0°,前一后三为2°?3°,四个全装后面时为4°?6°。 由于主销后倾角过大时会引起转向沉重,又因为比赛所用舵机特性偏软,所以不宜采用大的主销后倾角,以接近0°为好,即垫片宜安装采用前二后二的方式,以便增加其转向的灵活性。如图3.3。 图3.2 图3.3 1.5. 2. 主销内倾角 主销内倾角是指在横向平面内主销轴线与地面垂直线之间的夹角β,如图3.4,它的作用也是使前轮自动回正。对于模型车,通过调整前桥的螺杆的长度可以改变主销内倾角的大小,由于前轴与主销近似垂直的关系,故主销内倾角

c语言程序设计文档格式

封面 此页统一购买注意本页以下两项的填写 指导老师:李筠虞闯 完成日期:2016-6-5

成绩评定表

课程设计任务书

目录 1、内容及要求 ................................................ 错误!未定义书签。 2、功能分析 .................................................... 错误!未定义书签。 3、设计 ............................................................ 错误!未定义书签。 4、运行与测试 ................................................ 错误!未定义书签。 5、总结 ............................................................ 错误!未定义书签。参考文献 .......................................................... 错误!未定义书签。

1、内容及要求 1.1内容: 人事档案管理:建立数据文件(职工、部门、职称)完成:①数据录入②查询③插入、删除、修改④排序等功能。 1.2要求: 1.程序代码完成,编译运行成功。 2.数据输入首选采用文件的方式,其次键盘输入。 3.分析采用哪种合适的存储结构来储存数据 4.设计一定的用户界面,简洁。 2、功能分析 2.1. 程序设计一般由两部分组成:算法和数据结构,合理地选择和实现一个数据结构和处理这些数据结构具有同样的重要性。在人事管理过程中,由于预计记录对于一个单位的人事数来说太大,操作除了能够增加、删除、修改、保存等外,更多的情况是查询,且能够实现快速查询。特别是当需要动态变化时利用指针,例如插入和删除数据等操作时,为方便插入和删除人事记录,通过数据的自动的移动数据,实现动态管理。 2.2本系统涉及的模块主要有:开始、系统管理、人事管理、信息查询等四大模块。 (1)开始界面主要包括: 各个功能的选择。 (1)人事管理主要包括: (编号、姓名等)基本内容的录入,增加等。 (2) 系统管理主要包括:员工信息的修改,排序等。 (3) 信息查询主要包括:员工信息的查找、删除等。 2.3功能模块图

飞思卡尔单片机问题总结

飞思卡尔单片机问题总结 常见问题回答精华列表 为了方便网友查询相关问题,特将常见问题精华帖整理归类 本帖不断更新,欢迎网友们给出建议 另外,在提问时,请在标题中选用具体问题的字眼避免使用请问某某、请教、紧急求助等作为标题。对于具体器件,可以直接把器件类型写上,比如HC08QY4等;对于具体技术,比如CAN/LIN/ZigBee等也直接写明,便于版主分类回答,也便于其他网友查询。 一、flash/EEPROM的操作 Tips: a、HC08系列MCU中,很多Monitor ROM中固化了对flash操作的函数,用户只需调用即可,参考AN2874等应用笔记 b、HCS08系列和HCS12系列MCU对flash的操作十分类似,可以参考 AN2140 1、FLASH操作函数 (HCS08系列)

https://www.doczj.com/doc/395777900.html,/dispbbs.asp?boardID=3&RootID=111907&ID= 111907 2、如何将flash中的程序copy至ram中 https://www.doczj.com/doc/395777900.html,/dispbbs.asp?boardID=3&RootID=104074&ID= 104074 3、S12内部寄存器的映射 https://www.doczj.com/doc/395777900.html,/dispbbs.asp?boardID=3&RootID=103261&ID= 103261 4、S12EEPROM的使用、 INITRG,INITRM,INITEE寄存器的说明https://www.doczj.com/doc/395777900.html,/dispbbs.asp?boardID=3&RootID=102260&ID= 102260 5.INITRM寄存器的使用 https://www.doczj.com/doc/395777900.html,/dispbbs.asp?boardID=3&RootID=103214&ID= 103214 二、编程技巧

飞思卡尔单片机LED控制例程详解

我的第一个LED程序 准备工作: 硬件:Freescale MC9S08JM60型单片机一块; 软件:集成开发环境codewarrior IDE; 开发板上有两个LED灯,如下图所示: 实验步骤: 1.首先,确保单片机集成开发环境及USBDM驱动正确安装。其中USBDM的安装步骤如下:?假设之前安装过单片机的集成开发环境6.3版本:CW_MCU_V6_3_SE; ?运行USBDM_4_7_0i_Win,这个程序会在c盘的程序文件夹下增加一个目录C:\Program Files\pgo\USBDM 4.7.0,在这个目录下: 1〉C:\ProgramFiles\pgo\USBDM 4.7.0\FlashImages\JMxx下的文件 USBDM_JMxxCLD_V4.sx是下载器的固件文件; 2〉C:\Program Files\pgo\USBDM 4.7.0\USBDM_Drivers\Drivers下有下载器的usb 驱动 所以在插入usb下载器,电脑提示发现新的usb硬件的时候,选择手动指定驱动 安装位置到以上目录即可。 ?运行USBDM_4_7_0i_Win之后,还会在目录: C:\Program Files\Freescale\CodeWarrior for Microcontrollers V6.3\prog\gdi 下增加一些文件,从修改时间上来看,增加了6个文件,这些文件是为了在codewarrior 集成开发环境下对usb下载器的调试、下载的支持。

2.新建一个工程,工程建立过程如下: ?运行单片机集成开发环境codewarrior IDE ?出现如下界面 ●Create New Project :创建一个新项目工程 ●Load Example Project :加载一个示例工程 ●Load Previous Project :加载以前创建过的工程 ●Run Getting started Tutorial:运行CodeWarrior软件帮助文档 ●Start Using CodeWarrior:立刻使用CodeWarrior ?点击Create New project按钮,以创建一个新的工程,出现选择CPU的界面 如下,请选择HCS08/HCS08JM Family/MC9S08JM60,在右边的Connection窗口

第六届“飞思卡尔”全国大学生智能车全国赛比赛规则

第六届全国大学生“飞思卡尔”杯智能汽车竞赛 比赛规则与赛场纪律 参赛选手须使用竞赛秘书处统一指定的竞赛车模套件,采用飞思卡尔半导体公司的8位、16位微控制器作为核心控制单元,自主构思控制方案进行系统设计,包括传感器信号采集处理、电机驱动、转向舵机控制以及控制算法软件开发等,完成智能车工程制作及调试,于指定日期与地点参加各分赛区的场地比赛,在获得决赛资格后,参加全国决赛区的场地比赛。参赛队伍的名次(成绩)由赛车现场成功完成赛道比赛时间为主,技术报告、制作工程质量评分为辅来决定。大赛根据车模检测路径方案不同分为电磁、光电与摄像头三个赛题组。车模通过感应由赛道中心电线产生的交变磁场进行路经检测的属于电磁组;车模通过采集赛道图像(一维、二维)进行进行路经检测的属于摄像头组;车模通过采集赛道上少数孤立点反射亮度进行路经检测的属于光电组。 竞赛秘书处制定如下比赛规则适用于各分赛区预赛以及全国总决赛,在实际可操作性基础上力求公正与公平。 一、器材限制规定 1. 须采用统一指定的车模。本届比赛指定采用三种车模,分别用于三个 赛题组: 编 号车模外观和规格 赛 题 组 供 应 厂 商 A 型车模 光 电 组 东 莞 市 博 思 电 子 数 码 科 技 有 限 公 司

车模:G768 电机:RS380-ST/3545, 舵机:FUTABA3010 B 型 车 模 车模型号 电机:540,伺服器:S-A6 电 磁 组 北 京 科 宇 通 博 科 技 有 限 公 司 C 型 车 模 车模型号:N286 电机:RN260-CN 38-18130 伺服器:FUTABA3010 摄 像 头 组 东 莞 市 博 思 电 子 数 码 科 技 有 限 公 司 细节及改动限制见附件一。

飞思卡尔硬件和部分软件部分笔记

常见稳压芯片和电路图 Modified by Taiyou 2011-1-27 硬件部分 一、总体模块框图 1、基本模块包括电源模块、测速模块、驱动模块、道路识别模块等,再加上调试模块部分,调试模块部分可单独设计,调试完后拆下,框图如下: 2、此外,还可以包括车速,车架速度、电池电压和舵机位置检测等电路,增加模型车运行参数检测,提高模型车控制性能,增加调试电路方便现场调试。下面的第二图为硬件模块与上面层的关系。 二、具体电路图 1、电源模块 主要包括以下几个部分的电源:

1)5V电压。主要为单片机、信号调理电路以及部分接口电路提供电源,电压要求稳定、 噪声小,电流容量大于500mA。 补充,一般在输出端并联一个大电容来解决稳定性问题 2)6V电压。主要是为舵机提供工作电压,实际工作时,舵机所需要的工作电流一般在几 十毫安左右,电压无需十分稳定。 3)7.2V电压。这部分直接取自电池两端电压,主要为后轮电机驱动模块提供电源。 4)12V电压。如果采用CCD/CMOS图像传感器来进行道路检测,则需要12V工作电压。 5)2V电压。为红外发光管提供工作电压,可以采用开关电源从电池降压而得,这样可以 提高红外检测电路的电源利用效率。需要根据红外发射管的参数确定该电压值。 补充,此电路为光电组所需电压,我们不需要。 除此之外,如果使用了其的芯片和传感器,它们的工作电压可能不在上述之内,还需要通过专门的稳压电路提供相应的工作电压。例如采用飞思卡尔公司的MC7260加速度传感器进行车轮打滑检测,该传感器需要3.3V的工作电压。 补充,由于今年增加了坡度的控制,我们队考虑了增加坡度检测方面的传感器。 降压稳压电路可以采用可以采用串联稳压可开关稳压两种芯片。开关稳压芯片的工作效率高,但有较高的电源噪声,耗电量比较大的电路适于采用开关稳压电路。例如采用大电流红外检测电路,由于红外发射管数量较多,总的消耗电流很大,采用开关电源将电池电压将至2V左右,作为红外发射管的工作电压,此时每个红外发射管工作时只需串联很小的限流电阻甚至不用串联电阻,采用这种方法,可大大提高电源利用效率。 稳压电路的设计需要简单可靠,在满足电压波动范围的要求下应尽量简化电路设计,例如舵机电源在4.5V~6V的范围内,电流100mA左右,可以从7.2V的电池电压通过串联两只硅二极管获得。此外,通过实验可发现,组委会所提供的舵机可以直接工作在7.2V的电压下,此时舵机的响应速度也会提高,所以可以直接使用电池电压作为舵机的电源。 如果采用CCD或CMOS摄像头作为道路传感器,它们工作电压在9~12V范围内,此工作电压高于电池的电压,需要借助于斩波升压电路获取,可以采用专门升压芯片进行设计,也可以利用单片机PWM输出端口控制大功率晶体管进行斩波升压。有些CMOS摄像头工作电压在6~9V之间,所以也可以直接使用电池电压提供电源,所以选择CMOS摄像头可以简化电源电路的设计。 消除电源中的噪声并减少电压波动,需要在各级电源模块中安装滤波电容,包括容量小的高频滤波电容以及大容量的电解电容。由于存在电机驱动,为了避免电机在启动和制动过程产生的冲击电流对电源的影响,应尽量加大电池两端的电容容量,但不要超过大赛规则允许的电容容量限制。 另一本书上的版本(2.5V、5V、6.5V、7.2V、12V): 1)采用稳压芯片LM2576将电源电压稳压到5V后,给单片机系统电路、车速检测

飞思卡尔智能车设计报告

飞思卡尔智能车设计报告

目录 1.摘要 (3) 2.关键字 (3) 3.系统整体功能模块 (3) 4.电源模块设计 (4) 5.驱动电路设计 (4) 6.干簧管设计 (5) 7.传感器模块设计 (6) 8.传感器布局 (6) 9.软件设计 (7) 9.1控制算法 (7) 9.2软件系统实现(流程图) (10) 10.总结 (11) 11.参考文献 (12)

1.摘要 “飞思卡尔”杯全国大学生智能汽车竞赛是由教育部高等自动化专业教学指导分委员会主办的一项以智能汽车为研究对象的创意性科技竞赛,是面向全国大学生的一种具有探索性工程实践活动,是教育部倡导的大学生科技竞赛之一。该竞赛以“立足培养,重在参与,鼓励探索,追求卓越”为指导思想,旨在促进高等学校素质教育,培养大学生的综合知识运用能力、基本工程实践能力和创新意识,激发大学生从事科学研究与探索的兴趣和潜能,倡导理论联系实际、求真务实的学风和团队协作的人文精神,为优秀人才的脱颖而出创造条件。该竞赛以汽车电子为背景,涵盖自动控制、模式识别、传感技术、电子、电气、计算机、机械等多个学科的科技创意性比赛。 本文介绍了飞思卡尔电磁组智能车系统。本智能车系统是以飞思卡尔32 位单片机K60为核心,用电感检测赛道导线激发的电磁信号, AD 采样获得当前传感器在赛道上的位置信息,通过控制舵机来改变车的转向,用增量式PID进行电机控制,用编码器来检测小车的速度,共同完成智能车的控制。 2.关键字 电磁、k60、AD、PID、电机、舵机 3.系统整体功能模块 系统整体功能结构图

4.电源模块设计 电源是一个系统正常工作的基础,电源模块为系统其他各个模块提供所需要的能源保证,因此电源模块的设计至关重要。模型车系统中接受供电的部分包括:传感器模块、单片机模块、电机驱动模块、伺服电机模块等。设计中,除了需要考虑电压范围和电流容量等基本参数外,还要在电源转换效率、噪声、干扰和电路简单等方面进行优化。可靠的电源方案是整个硬件电路稳定可靠运行的基础。 全部硬件电路的电源由7.2V,2A/h的可充电镍镉电池提供。由于电路中的不同电路模块所需要的工作电流容量各不相同,因此电源模块应该包含多个稳压电路,将充电电池电压转换成各个模块所需要的电压。 电源模块由若干相互独立的稳压电源电路组成。在本系统中,除了电机驱动模块的电源是直接取自电池外,其余各模块的工作电压都需要经电源管理芯片来实现。 由于智能车使用7.2V镍镉电池供电,在小车行进过程中电池电压会有所下降,故使用低压差电源管理芯片LM2940。LM2940是一款低压稳压芯片,能提供5V的固定电压输出。LM2940低压差稳压芯片克服了早期稳压芯片的缺点。与其它的稳压芯片一样,LM2940需要外接一个输出电容来保持输出的稳定性。出于稳定性考虑,需要在稳压输出端和地之间接一个47uF低等效电阻的电容器。 舵机的工作电压是6伏,采用的是LM7806。 K60单片机和5110液晶显示器需要3.3伏供电,采用的是LM1117。 5.驱动电路设计 驱动电路采用英飞凌的BTS7960,通态电阻只有16mΩ,驱动电流可达43A,具有过压、过流、过温保护功能,输入PWM频率可达到25KHz,电源电压5.5V--27.5V。BTS7960是半桥驱动,实际使用中要求电机可以正反转,故使用两片接成全桥驱动。如图下图所示。

全国大学生飞思卡尔杯智能汽车竞赛

第七届全国大学生“飞思卡尔”杯智能汽车竞赛 竞速比赛规则与赛场纪律 参赛选手须使用竞赛秘书处统一指定的竞赛车模套件,采用飞思卡尔半导体公司的8位、16位、32位微控制器作为核心控制单元,自主构思控制方案进行系统设计,包括传感器信号采集处理、电机驱动、转向舵机控制以及控制算法软件开发等,完成智能车工程制作及调试,于指定日期与地点参加各分(省)赛区的场地比赛,在获得决赛资格后,参加全国决赛区的场地比赛。参赛队伍的名次(成绩)由赛车现场成功完成赛道比赛时间来决定,参加全国总决赛的队伍同时必须提交车膜技术报告。大赛根据车模检测路径方案不同分为电磁、光电与摄像头三个赛题组。车模通过感应由赛道中心电线产生的交变磁场进行路经检测的属于电磁组;车模通过采集赛道图像(一维、二维)或者连续扫描赛道反射点的方式进行进行路经检测的属于摄像头组;车模通过采集赛道上少数孤立点反射亮度进行路经检测的属于光电组。 竞赛秘书处制定如下比赛规则适用于各分(省)赛区预赛以及全国总决赛,在实际可操作性基础上力求公正与公平。 一、器材限制规定 编 号 车模外观和规格赛题组供应厂商A 型 车 模 车模:G768 电机:RS380-ST/3545,摄像头 组 东莞市博 思电子数 码科技有 限公司

舵机:FUTABA3010 B 型 车 模 车模型号 电机:540,伺服器:S-D6光电组 北京科宇 通博科技 有限公司 C 型 车 模 车模型号:N286 电机:RN260-CN 38-18130 伺服器:FUTABA3010电磁组 东莞市博 思电子数 码科技有 限公司 各赛题组车模运行规则: a)光电组,摄像头组:车模正常运行。 车模使用A型车模(摄像头组)、B型车模(光电组)。车模运行方向为,转向轮在前,动力轮在后。如图1所示:

《C语言程序设计A》

《C语言程序设计a》期末复习题 一、单选题 1.在每个C语言程序中都必须包含有这样一个函数,该函数的函数名为( A )。 A. main B. MAIN C. name D. function 2.每个C语言程序文件的编译错误分为( B )类。 A.1 B.2 C.3 D.4 3. 字符串"a+b=12\n"的长度为( B )。 A. 6 B. 7 C. 8 D. 9 4. 在switch语句的每个case块中,假定都是以break语句结束的,则此switch语句容易被改写为( B )语句。 A. for B. if C. do D. while 5. 在下面的do-while循环语句中,其循环体语句被执行的次数为( D )。 int i=0; do i++; while(i<10); A. 4 B. 3 C. 5 D. 10 6. 将两个字符串连接起来组成一个字符串时,选用的函数为( C )。 A. strlen() B. strcap() C. strcat() D. strcmp() 7. 若用数组名作为函数调用的实参,传递给形参的是( A )。 A. 数组的首地址 B. 数组中第一个元素的值 C. 数组中全部元素的值 D. 数组元素的个数 8. 假定a为一个整数类型的数组名,整数类型的长度为4,则元素a[4]的地址比a数组的首地址大( C )个字节。 A. 4 B. 8 C. 16 D. 32 9. 假定s被定义为指针类型char *的变量,初始指向的字符串为"Hello world!",若要使变量p指向s 所指向的字符串,则p应定义为( A )。 A. char *p=s; B. char *p=&s; C. char *p;p=*s; D. char *p; p=&s; 10. 从一个数据文件中读入以换行符结束的一行字符串的函数为( B )。 A. gets() B. fgets() C. getc() D. fgetc() 11. 由C语言目标文件连接而成的可执行文件的缺省扩展名为( B )。 A. cpp B. exe C. obj D. c 12. 设有两条语句为“int a=12; a+=a*a;”,则执行结束后,a的值为( C )。 A. 12 B. 144 C. 156 D. 288 13. 带有随机函数调用的表达式rand()%20的值在( C )区间内。

c语言程序设计文件加密解密

程序报告设计 题目:加密解密处理 程序设计报告的电子文档(B10080128—程序设计.doc ) 一.老师对作业要求。 1:对学生课程设计两周的纪律及提交内容的要求: (1)规定上机的时间内不得无故缺勤,有事需要向指导老师书面请假; (2)上机时禁止玩游戏,屡教不改者,实习成绩可为不及格;(3)每人手头准备一至两本C/C++的有关工具书,上机前作好充分的准备,包括事先写好主要算法的程序 代码以保证充分利用上机的时间调试程序; (4)同组可以讨论思路,但是程序要自己完成,不可抄袭,若完全抄袭别人的,实习成绩可为不及格; (5)实习的最后阶段认真完成实习报告的电子文档。报告内容不得少于15页。 (6)每个学生最后提交的材料: 压缩文件一个,起名为:学号名_题目名.rar(如:B06020127_学生管理系统.rar)。该压缩文件中包含下列 几个文件:程序设计报告的电子文档(起名为:学号_程序设计.doc)、源程序文件(起名为:学号名_题目

名.cpp,如:B06020127_学生管理系统.cpp)、原始数据文件(如:stud.dat)、编译链接后得到的可执行 文件(起名为:学号名_题目名.exe) (7)请同学独立完成报告,若发现两份报告一模一样,则两人都按不及格论处,请各位同学珍惜自己的版权 ,也请指导老师严格把关。 附2:上机时间:每天上午8:00——11:20 附3:成绩的评定 根据学生平时的上机出勤情况、为上机所作的准备情况、上机时的表现、程序的完成情况、报告的完成情况 、验收答辩时的表现等综合打分。等级为:优秀、良好、中等、及格、不及格。 附4:课程设计报告具体内容要求 学生管理系统 (题目格式:宋体,3号,加粗,居中对齐) 一、课题内容和要求(格式:宋体,4号,加粗,两端对齐) 该部分可参考前面给出的问题描述再加以细化一些 (正文格式:宋体,小4号,不加粗,两端对齐,1.5倍行距)

飞思卡尔软件注意事项

飞思卡尔些许经验之软件设计 ------循迹基于电磁传感器,方向以及舵机调控基于B车模(仅供参考) 1、电感排布 先说下各种排布类型电感的特点: 左右竖直电感:对直角弯道十分敏感,可以清楚分辨出来十字弯与直角弯,但是对于曲率较大的S弯道会造成与直角弯道混淆。在直角弯的时候左右电感差异非常大,可以较早判别出直角弯道,与左右水平电感结合可排除竖直电感对直角弯与大曲率S弯的误判 左右水平电感:很适合判断直道以及小曲率弯道车子处在中心线的位置,但是对于曲率较大的S弯道与直角弯可能会造成左右判断相反的情况(即明明车子左偏赛道,但是根据电感差值却得出车子右偏赛道的结论),此时应该结合竖直电感或者斜电感来融合判断。 左右斜电感:对直角弯以及一切曲率的弯道敏感,缺点是过于敏感,若使用此电感差值作为误差偏移量会导致车子严重内切弯道,建议加入其余电感的权重,总体上不建议使用左右斜电感差值作为误差偏移量,但是作为一切弯道以及直道还有直角弯的方向判断是非常适合的。另外应该注意的是此电感排布对于十字弯道会误判,这是由于十字弯道磁场排布的影响,但是可以与左右水平电感或左右竖直电感结合排除对十字弯道的误判。 中间水平电感:此电感非常适合用于误差偏移量的计算,即误差量=直道中心线值-实时值;用此方法得到的差值在弯道的时候只用稍稍加以处理就可平滑的咬中线过弯。 电感的排布基本上就这几种方式了,下边要说的是车子电感排布选择左右竖直电感加左右水平电感:本次比赛太原理工大学的电感排布,个人感觉过弯时对赛道误差偏移量的处理有较高要求,处理不好很有可能让车子严重内切赛道导致出界。 左右竖直电感加左右水平电感加中心水平电感:用中心水平电感获取赛道误差偏移量,方法参考上面的描述。弯道方向判断用左右竖直电感。直道方向判断用左右水平电感,直角预判用竖直电感,具体是若竖直电感左右差值达到一定程度了就看左右水平电感,若左右水平电感差值较小且左右电感值都较大,说明快要进入直角弯,否则说明在大曲率的S弯。 左右斜电感加左右水平电感加中间水平电感:用中心水平电感获取赛道误差偏移量,方法参考上面的描述。斜电感判断弯道以及直角弯方向。区分十字与直角的方法是看左右水平电感与左右斜电感算出来的方向是否相反,若相反且左右水平电感差值较小且单个水平电感值较大,说明进入了十字区,方向判断应该用左右水平电感。进入直角弯前左右水平电感值会比直道上值稍小且差值较小,且中间水平电感值比处在中心线的时候稍小且左右斜电感差值较,此时基本可以判定是即将进入直角弯道了。 左右水平电感加中心水平电感:个人没有使用过,不过本次比赛有人用并且上届学长也有人用,并且还跑出了不错的成绩,这个排布方式下方向还有赛道误差偏移量的选取可结合上述方法以及自己开拓。

《C语言程序设计》复习 参考答案

第一章 【随堂练习1-2】 1.下面哪些标识符属于合法的用户自定义标识符: Main、void、_num、my$、a*、N4、3m、a-2 答:合法的用户自定义标识符是:Main、_num、N4 2.结合【例1.2】指出程序代码中所用到的标识符哪些是关键字,哪些是预定义标识符,哪些是用户自定义标识符。 答:关键字:void、int 预定义标识符:include、main、printf、scanf 用户自定义标识符:a、b、c 3.分析【例1.2】中函数的结构,包括函数首部(函数返回值类型、函数名、形式参数)、函数体语句(说明语句、可执行语句)。 答:函数首部:void main( ),其中函数返回值类型为void、函数名为main、形式参数无; 函数体语句:{}内的语句为函数体,其中:说明语句为int a,b,c;,其余为可执行语句。 3.标识符是用来标识程序中的某个对象名字的字符序列。C语言把标识符分为三类,即关键字、预定义标识符、用户自定义标识符。对于用户自定义标识符的命名C语言规定: (1)所有的用户标识符必须先定义后使用; (2)用户标识符由字母(A~Z,a~z)、数字(0~9)、下划线“_”组成,并且首字符不能是数字; (3)区分大小写; (4)不能用关键字作为用户自定义标识符,通常不使用预定义标识符作为用户自定义标识符。 4.理论上讲,程序开发过程分为四个步骤,分别为: (1)编辑源程序 (2)编译源程序,生成目标程序 (3)连接目标程序及其相关模块,生成可执行文件 (4)运行可执行文件

一.单元练习 一.选择题 1.构成C语言程序的基本单位是()。 A.框架B.预处理C.函数D.语句 2.在程序开发过程中,把文本文件格式源程序转化为二进制格式的目标程序的过程称之为()。 A.编辑B.编译C.连接D.运行 3.关于主函数,下列说法不正确的是()。 A.一个完整的C语言应用程序有唯一的主函数 B.主函数的名称只能是main C.主函数可以被其他自定义函数调用 D.C语言程序的运行从主函数开始,以主函数为核心展开 4.关于标识符,下列说法不正确的是()。 A.库函数名称为预定义标识符,不建议用作用户自定义标识符 B. 关键字不能作为用户自定义标识符 C.用户自定义标识符中不区分大小写字母 D.标识符中可以出现下划线,且可以出现在标识符的任意位置 5.以下可用作用户自定义标识符的一组是()。 A.void、return、if B.printf、include、fabs C.Max、_abc、Main D.2abc、pay$、sum-10 二.填空题 1.C语言程序一般由若干个函数构成,程序中应至少包含一个_________,其名称只能为_________。 2.C语言程序中每条语句必须以_________结束。 3.C语言程序的注释是以_________开头,以________结束的,在VC++6.0编程环境中,可使用_________作为注释的起始标识,注释对程序的执行不起任何作用。 4.最初编写的C语言程序称为_________,其扩展名为_________,编译后生成的文件为_________,其扩展名是_________,连接后生成的文件是_________,其扩展名是_________。5.C语言规定,标识符只能由_________、_________和_________三种字符组成,而且,首字符只能是_________或_________。

全国大学生飞思卡尔比赛规则

全国大学生“飞思卡尔”杯智能汽车竞赛 竞速比赛规则与赛场纪律 参赛选手须使用竞赛秘书处统一指定的竞赛车模套件,采用飞思卡尔半导体公司的8 位、16 位微控制器作为核心控制单元,自主构思控制方案进行系统设计,包括传感器信号采集处理、电机驱动、转向舵机控制以及控制算法软件开发等,完成智能车工程制作及调试,于指定日期与地点参加各分赛区的场地比赛,在获得决赛资格后,参加全国总决赛的场地比赛。参赛队伍的名次(成绩)由赛车现场成功完成赛道比赛时间为主,技术报告、制作工程质量评分为辅来决定。大赛根据车模检测路径方案不同分为电磁、光电与摄像头三个赛题组。车模通过感应由赛道中心电线产生的交变磁场进行路径检测的属于电磁组;车模通过采集赛道图像(一维、二维)进行路径检测的属于摄像头组;车模通过采集赛道上少数孤立点反射亮度进行路径检测的属于光电组。 竞赛秘书处制定如下比赛规则适用于各分赛区预赛以及全国总决赛,在实际可操作性基础上力求公正与公平。 一、器材限制规定 1.须采用统一指定的车模。本届比赛指定采用两种车模: A 型车模:广东博思公司提 供。限定电磁组比赛使用。 B 型车模:北京科宇通博科技有限公司提供。限定光电组、摄像头组使用。 细节及改动限制见附件一。 2.须采用飞思卡尔半导体公司的8 位、16 位处理器(单核)作为唯一的微控制器。 有关 细节及其它电子器件使用的限制见附件二; 3.参加电磁赛题组不允许使用传感器获取道路的光学信息进行路径检测。 参加光电赛 题组中不允许传感器获取道路图像信息进行路径检测。 参加摄像头赛题组可以使用光电管作为辅助检测手段。 4.其他事项 如果损毁车模中禁止改动的部件,需要使用相同型号的部件替换; 车模改 装完毕后,尺寸不能超过:250mm 宽和400mm 长。

飞思卡尔智能车大赛

飞思卡尔智能车大赛 目录[隐藏] 起源: 比赛规则: 起源: 比赛规则: [编辑本段] 起源: “飞思卡尔杯”智能车大赛起源于韩国,是韩国汉阳大学汽车控制实验室在飞思卡尔半导体公司资助下举办的以HCSl2单片机为核心的大学生课外科技竞赛。组委会提供一个标准的汽车模型、直流电机和可充电式电池,参赛队伍要制作一个能够自主识别路径的智能车,在专门设计的跑道上自动识别道路行驶,谁最快跑完全程而没有冲出跑道并且技术报告评分较高,谁就是获胜者。其设计内容涵盖了控制、模式识别、传感技术、汽车电子、电气、计算机、机械、能源等多个学科的知识,对学生的知识融合和实践动手能力的培养,具有良好的推动作用。 全国大学生“飞思卡尔”杯智能汽车竞赛是在规定的模型汽车平台上,使用飞思卡尔半导体公司的8位、16位微控制器作为核心控制模块,通过增加道路传感器、电机驱动电路以及编写相应软件,制作一个能够自主识别道路的模型汽车,按照规定路线行进,以完成时间最短者为优胜。因而该竞赛是涵盖了控制、模式识别、传感技术、电子、电气、计算机、机械等多个学科的比赛。 该竞赛以飞思卡尔半导体公司为协办方,自2006年首届举办以来,成功举办了三届,得到了教育部吴启迪副部长、张尧学司长及理工处领导、飞思卡尔公司领导与各高校师生的高度评价,已发展成全国30个省市自治区170余所高校广泛参与的全国大学生智能汽车竞赛。2008年第三届被教育部批准列入国家教学质量与教学改革工程资助项目中9个科技人文竞赛之一(教高函[2007]30号文,附件2),2009年第四届被邀申请列入国家教学质量与教学改革工程资助项目。 [编辑本段] 比赛规则: 参赛选手须使用竞赛秘书处统一指定并负责采购竞赛车模,采用飞思卡尔1 6位微控制器MC9S12DG128作为核心控制单元,自主构思控制方案及系统设计,包括传感器信号采集处理、控制算法及执行、动力电机驱动、转向舵机控制等,完成智能车工程制作及调试,于指定日期与地点参加各分赛区的场地比赛,在获得决赛资格

《C语言程序设计-文件》习题

《C语言程序设计-文件》习题 9.1 填空题 1.C语言中根据数据的ń= 52;织形式,把文件分为= 【= 】和【= 】两种。 2.C语言中文件的格式?= 70;输入输出函数对是 【= = 】;文件的数据块?= 55;入输出函数对是【<= span lang=3DEN-US style=3D'mso-bidi-font-size:10.5pt'> = 】;文件的字符串?= 55;入输出函数对是【<= span lang=3DEN-US style=3D'mso-bidi-font-size:10.5pt'> = 】。 9.2 选择题 1.当已存在一个= abc.txt文件时,&#= 25191;行函数fopen= (“abc.txt”, “r+”)的功能是( )。 A.打开abc.txt文件,清&#= 38500;原有内容 B.打开abc.txt文件,只&#= 33021;写入新的内容 C.打开abc.txt文件,只&#= 33021;读取原有内容 D.打开abc.txt文件,可&#= 20197;读取和写入新的内ê= 81; 2.fopen()函数的mode取值”r”和”w”时,它们之间的= 差别是( )。 A.”r”可向文件写入,= ”w”不可向文&#= 20214;写入 B.”r”不可向文件写入= ,”w”可向文件&#= 20889;入 C.”r”不可由文件读出= ,”w”可由文件&#= 35835;出 D.文件不&#= 23384;在时,”r”建立新文&#= 20214;,”w”出错3.以下程序的的= 功能是( )。 #include main( ) { &nb= sp; FILE *fp; &nb= sp; char str[]=3D”HELLO”;<= /p> &nb= sp; fp=3Dfopen(“PRNR= 21;, “w”);

C语言程序设计

C语言程序设计 Prepared on 22 November 2020

一、单选题1. (4分)若调用fputc函数输出字符成功,则其返回值是( )。 ? ? ? ? D.输出的字符 得分:0知识点:C语言程序设计作业题 D 2. (4分)若以下程序段: struct dent? { int n; int*m; }; int a=1, b=2,c=3; struct dent s[3]={{101<&a},{102<&b},{103,&c}; main() { struct dent *p;

….. }? 则以下表达中值为2的是()。 ? A.(p++)->m ? B.*(P++)->m ? C.(*p).m ? D.*(++p)->m 得分:0知识点:C语言程序设计作业题 D 3. (4分)在一个c源程序文件中,若要定义一个只允许本源文件中所有函数使用的全局变量,则该变量需要使用的存储类别是( ). ? ? ? ? 得分:0知识点:C语言程序设计作业题 D

(4分)若二维数组a有m列,则在a[i][j]前面的元素个数为()。 ?*m+i ?*m+j ?*m+j-1 ?*m+j+1 得分:0知识点:C语言程序设计作业题 B 5. (4分)下面程序的运行结果是( ). main() { struct cmplx {int x; int y; } cnum[2]={1,3,2,7}; printf(“%d ”,cnum[0].y/cnum[0].x*cnum[1].x); } ? ?

? ? 得分:4知识点:C语言程序设计作业题 6. (4分)下面程序段的运行结果是( ). for(x=3,x<6;x++) printf((x%2)(“##%d ”),x); ? A.**3 ?##4 ?**5 ? B.##3 ?**4 ?##5 ? C.##3 ?**4##5 ? D.**3##4 ?**5 得分:0知识点:C语言程序设计作业题 D 7. (4分)若I为整型变量,则以下循环执行次数是( ).

相关主题
文本预览
相关文档 最新文档