当前位置:文档之家› 单片机C语言入门

单片机C语言入门

单片机C语言入门
单片机C语言入门

单片机的C语言轻松入门

随着单片机开发技术的不断发展,目前已有越来越多的人从普遍使用汇编语言到逐渐使用高级语言开发,其中主要是以C语言为主,市场上几种常见的单片机均有其C语言开发环境。这里以最为流行的80C51单片机为例来学习单片机的C语言编程技术。

本书共分六章,每章一个专题,以一些待完成的任务为中心,围绕该任务介绍C语言的一些知识,每一个任务都是可以独立完成的,每完成一个任务,都能掌握一定的知识,等到所有的任务都完成后,即可以完成C语言的入门工作。

第1章 C语言概述及其开发环境的建立

学习一种编程语言,最重要的是建立一个练习环境,边学边练才能学好。Keil软件是目前最流行开发80C51系列单片机的软件,Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部份组合在一起。

在学会使用汇编语言后,学习C语言编程是一件比较容易的事,我们将通过一系列的实例介绍C语言编程的方法。图1-1所示电路图使用89S52单片机作为主芯片,这种单片机性属于80C51系列,其内部有8K的FLASH ROM,可以反复擦写,并有ISP功能,支持在线下载,非常适于做实验。89S52的P1引脚上接8个发光二极管,P3.2~P3.4引脚上接4个按钮开关,我们的任务是让接在P1引脚上的发光二极管按要求发光。

1.1简单的C程序介绍

例1-1:让接在P1.0引脚上的LED发光。

/*************************************************

平凡单片机工作室

https://www.doczj.com/doc/c611243848.html,

Copyright 2003 pingfan's mcustudio

All rights Reserved

作者:周坚

dddl.c

单灯点亮程序

*************************************************/

#include “reg51.h”

sbit P1_0=P1^0;

void main()

{ P1_1=0;

}

这个程序的作用是让接在P1.0引脚上的LED点亮。下面来分析一下这个C语言程序包含了哪些信息。

1)“文件包含”处理。

程序的第一行是一个“文件包含”处理。

所谓“文件包含”是指一个文件将另外一个文件的内容全部包含进来,所以这里的程序虽然只有4行,但C编译器在处理的时候却要处理几十或几百行。这里程序中包含REG51.h 文件的目的是为了要使用P1这个符号,即通知C编译器,程序中所写的P1是指80C51单片机的P1端口而不是其它变量。这是如何做到的呢?

打开reg51.h可以看到这样的一些内容:

/*-------------------------------------------------------------------------

REG51.H

Header file for generic 80C51 and 80C31 microcontroller.

Copyright (c) 1988-2001 Keil Elektronik GmbH and Keil Software, Inc.

All rights reserved.

--------------------------------------------------------------------------*/

/* BYTE Register */

sfr P0 = 0x80;

sfr P1 = 0x90;

sfr P2 = 0xA0;

sfr P3 = 0xB0;

sfr PSW = 0xD0;

sfr ACC = 0xE0;

sfr B = 0xF0;

sfr SP = 0x81;

sfr DPL = 0x82;

sfr DPH = 0x83;

sfr PCON = 0x87;

sfr TCON = 0x88;

sfr TMOD = 0x89;

sfr TL0 = 0x8A;

sfr TL1 = 0x8B;

sfr TH0 = 0x8C;

sfr TH1 = 0x8D;

sfr IE = 0xA8;

sfr IP = 0xB8;

sfr SCON = 0x98;

sfr SBUF = 0x99;

/* BIT Register */ /* PSW */

sbit CY = 0xD7; sbit AC = 0xD6; sbit F0 = 0xD5; sbit RS1 = 0xD4; sbit RS0 = 0xD3; sbit OV = 0xD2; sbit P = 0xD0;

/* TCON */

sbit TF1 = 0x8F; sbit TR1 = 0x8E; sbit TF0 = 0x8D; sbit TR0 = 0x8C; sbit IE1 = 0x8B; sbit IT1 = 0x8A; sbit IE0 = 0x89; sbit IT0 = 0x88;

/* IE */

sbit EA = 0xAF; sbit ES = 0xAC; sbit ET1 = 0xAB; sbit EX1 = 0xAA; sbit ET0 = 0xA9; sbit EX0 = 0xA8;

/* IP */

sbit PS = 0xBC; sbit PT1 = 0xBB; sbit PX1 = 0xBA; sbit PT0 = 0xB9; sbit PX0 = 0xB8;

/* P3 */

sbit RD = 0xB7; sbit WR = 0xB6; sbit T1 = 0xB5; sbit T0 = 0xB4; sbit INT1 = 0xB3; sbit INT0 = 0xB2; sbit TXD = 0xB1;

sbit RXD = 0xB0;

/* SCON */

sbit SM0 = 0x9F;

sbit SM1 = 0x9E;

sbit SM2 = 0x9D;

sbit REN = 0x9C;

sbit TB8 = 0x9B;

sbit RB8 = 0x9A;

sbit TI = 0x99;

sbit RI = 0x98;

熟悉80C51内部结构的读者不难看出,这里都是一些符号的定义,即规定符号名与地址的对应关系。注意其中有

sfr P1 = 0x90;

这样的一行(上文中用黑体表示),即定义P1与地址0x90对应,P1口的地址就是0x90(0x90是C语言中十六进制数的写法,相当于汇编语言中写90H)。

从这里还可以看到一个频繁出现的词:sfr

sfr并标准C语言的关键字,而是Keil为能直接访问80C51中的SFR而提供了一个新的关键词,其用法是:

sfrt 变量名=地址值。

2)符号P1_0来表示P1.0引脚。

在C语言里,如果直接写P1.0,C编译器并不能识别,而且P1.0也不是一个合法的C 语言变量名,所以得给它另起一个名字,这里起的名为P1_0,可是P1_0是不是就是P1.0呢?你这么认为,C编译器可不这么认为,所以必须给它们建立联系,这里使用了Keil C 的关键字sbit来定义,sbit的用法有三种:

第一种方法:sbit 位变量名=地址值

第二种方法:sbit 位变量名=SFR名称^变量位地址值

第三种方法:sbit 位变量名=SFR地址值^变量位地址值

如定义PSW中的OV可以用以下三种方法:

sbit OV=0xd2 (1)说明:0xd2是OV的位地址值

sbit OV=PSW^2 (2)说明:其中PSW必须先用sfr定义好

sbit OV=0xD0^2 (3)说明:0xD0就是PSW的地址值

因此这里用sfr P1_0=P1^0;就是定义用符号P1_0来表示P1.0引脚,如果你愿意也可以起P10一类的名字,只要下面程序中也随之更改就行了。

3)main称为“主函数”。

每一个C语言程序有且只有一个主函数,函数后面一定有一对大括号“{}”,在大括号里面书写其它程序。

从上面的分析我们了解了部分C语言的特性,下面再看一个稍复杂一点的例子。

例1-2 让接在P1.0引脚上的LED闪烁发光

/*************************************************

平凡单片机工作室

https://www.doczj.com/doc/c611243848.html,

Copyright 2003 pingfan's mcustudio

All rights Reserved

作者:周坚

ddss.c

单灯闪烁程序

*************************************************/

#include "reg51.h"

#define uchar unsigned char

#define uint unsigned int

sbit P10=P1^0;

/*延时程序

由Delay参数确定延迟时间

*/

void mDelay(unsigned int Delay)

{ unsigned int i;

for(;Delay>0;Delay--)

{ for(i=0;i<124;i++)

{;}

}

}

void main()

{ for(;;)

{ P10=!P10; //取反P1.0引脚

mDelay(1000);

}

}

程序分析:主程序main中的第一行暂且不看,第二行是“P1_0=!P1_0;”,在P1_0前有一个符号“!”,符号“!”是C语言的一个运算符,就像数学中的“+”、“-”一样,是一种运算任号,意义是“取反”,即将该符号后面的那个变量的值取反。

注意:取反运算只是对变量的值而言的,并不会自动改变变量本身。可以认为C编译器在处理“!P1_0”时,将P1_0的值给了一个临时变量,然后对这个临时变量取反,而不是直接对P1_0取反,因此取反完毕后还要使用赋值符号(“=”)将取反后的值再赋给P1_0,这样,如果原来P1.0是低电平(LED亮),那么取反后,P1.0就是高电平(LED灭),反之,如果P1.0是高电平,取反后,P1.0就是低电平,这条指令被反复地执行,接在P1.0上灯就会不断“亮”、“灭”。

该条指令会被反复执行的关键就在于main中的第一行程序:for(;;),这里不对此作详细的介绍,读者暂时只要知道,这行程序连同其后的一对大括号“{}”构成了一个无限循环语句,该大括号内的语句会被反复执行。

第三行程序是:“mDelay(1000);”,这行程序的用途是延时1s时间,由于单片机执行指令的速度很快,如果不进行延时,灯亮之后马上就灭,灭了之后马上就亮,速度太快,人眼根本无法分辨。

这里mDelay(1000)并不是由Keil C提供的库函数,即你不能在任何情况下写这样一行程序以实现延时。如果在编写其它程序时写上这么一行,会发现编译通不过。那么这里为什么又是正确的呢?注意观察,可以发现这个程序中有void mDelay(…)这样一行,可见,

mDelay这个词是我们自己起的名字,并且为此编写了一些程序行,如果你的程序中没有这么一段程序行,那就不能使用mDelay(1000)了。有人脑子快,可能马上想到,我可不可以把这段程序也复制到我其它程序中,然后就可以用mDelay(1000)了呢?回答是,那当然就可以了。还有一点需要说明,mDelay这个名称是由编程者自己命名的,可自行更改,但一旦更改了名称,main()函数中的名字也要作相应的更改。

mDelay后面有一个小括号,小括号里有数据(1000),这个1000被称之“参数”,用它可以在一定范围内调整延时时间的长短,这里用1000来要求延时时间为1000毫秒,要做到这一点,必须由我们自己编写的mDelay那段程序决定的,详细情况在后面循环程序中再作分析,这里就不介绍了。

1.2Keil工程的建立

要使用Keil软件,首先要正确安装Keil软件,该软件的Eval版本可以直接去https://www.doczj.com/doc/c611243848.html,下载,安装时选择Eval Vision,其它步骤与一般Windows程序安装类似,这里就不再赘述了。安装完成后,将Ledkey.dll文件复制到Keil安装目录下的C51\BIN文件夹下,这是作者提供的键盘与LED实验仿真板,可与Keil软件配合,在计算机上模拟LED 和按键的功能。

启动μVison,点击“File?New…”在工程管理器的右侧打开一个新的文件输入窗口,在这个窗口里输入例1-2中的源程序,注意大小写及每行后的分号,不要错输及漏输。

输入完毕之后,选择“File?Save”,给这个文件取名保存,取名字的时候必须要加上扩展名,一般C语言程序均以“.C”为扩展名,这里将其命名为exam2.c,保存完毕后可以将该文件关闭。

Keil不能直接对单个的C语言源程序进行处理,还必须选择单片机型号;确定编译、汇编、连接的参数;指定调试的方式;而且一些项目中往往有多个文件,为管理和使用方便,Keil使用工程(Project)这一概念,将这些参数设置和所需的所有文件都加在一个工程中,只能对工程而不能对单一的源程序进行编译和连接等操作。

点击“Project->New Project…”菜单,出现对话框,要求给将要建立的工程起一个名字,这里起名为exam2,不需要输入扩展名。点击“保存”按钮,出现第二个对话框,如图1-2所示,这个对话框要求选择目标CPU(即你所用芯片的型号),Keil支持的CPU很多,这里选择Atmel公司的89S52芯片。点击ATMEL前面的“+”号,展开该层,点击其中的89S52,然后再点击“确定”按钮,回到主窗口,此时,在工程窗口的文件页中,出现了“Target 1”,前面有“+”号,点击“+”号展开,可以看到下一层的“Source Group1”,这时的工程还是一个空的工程,里面什么文件也没有,需要手动把刚才编写好的源程序加入,点击“Source Group1”使其反白显示,然后,点击鼠标右键,出现一个下拉菜单,如图1-3所示,选中其中的“Add file to Group”Source Group1”,出现一个对话框,要求寻找源文件。

双击exam2.c文件,将文件加入项目,注意,在文件加入项目后,该对话框并不消失,等待继续加入其它文件,但初学时常会误认为操作没有成功而再次双击同一文件,这时会出现如图1-4所示的对话框,提示你所选文件已在列表中,此时应点击“确定”,返回前一对话框,然后点击“Close”即可返回主接口,返回后,点击“Source Group 1”前的加号,exam3.c 文件已在其中。双击文件名,即打开该源程序。

图1-2 选择单片机型号

1.3工程的详细设置

工程建立好以后,还要对工程进行进一步的设置,以满足要求。

首先点击左边Project窗口的Target 1,然后使用菜单“Project->Option for target ‘target1’”

即出现对工程设置的对话框,这个对话框共有8个页面,大部份设置项取默认值就行了。

Target页

如图1-5所示,Xtal 后面的数值是晶振频率值,默认值是所选目标CPU 的最高可用频率值,该值与最终产生的目标代码无关,仅用于软件模拟调试时显示程序执行时间。正确设置该数值可使显示时间与实际所用时间一致,一般将其设置成与你的硬件所用晶振频率相同,如果没必要了解程序执行的时间,也可以不设。

Memory Model 用于设置RAM 使用情况,有三个选择项:

Small : 所有变量都在单片机的内部RAM 中;

Compact :可以使用一页(256字节)外部扩展RAM ;

Larget : 可以使用全部外部的扩展RAM 。

Code Model 用于设置ROM 空间的使用,同样也有三个选择项:

Small :只用低于2K 的程序空间;

Compact :单个函数的代码量不能超过2K ,整个程序可以使用64K 程序空间;

Larget :可用全部64K 空间;

这些选择项必须根据所用硬件来决定,由于本例是单片应用,所以均不重新选择,按默认值设置。

Operating :选择是否使用操作系统,可以选择Keil 提供了两种操作系统:Rtx tiny 和

Rtx full ,也可以不用操作系统(None ),这里使用默认项None ,即不用操作系统。

1-5 设置目标

图1-4 重复加入源程序得到的提示

如图1-6所示,这里面也有多个选择项,其中Creat Hex file 用于生成可执行代码文件,该文件可以用编程器写入单片机芯片,其格式为intelHEX 格式,文件的扩展名为.HEX ,默认情况下该项未被选中,如果要写片做硬件实验,就必须选中该项。

工程设置对话框中的其它各页面与C51编译选项、A51的汇编选项、BL51连接器的连接选项等用法有关,这里均取默认值,不作任何修改。以下仅对一些有关页面中常用的选项作一个简单介绍。

Listing 页

该页用于调整生成的列表文件选项。在汇编或编译完成后将产生(*.lst )的列表文件,在连接完成后也将产生(*.m51)的列表文件,该页用于对列表文件的内容和形式进行细致的调节,其中比较常用的选项是“C Compile Listing ”下的“Assamble Code ”项,选中该项可以在列表文件中生成C 语言源程序所对应的汇编代码,建议会使用汇编语言的C 初学者选中该项,在编译完成后多观察相应的List 文件,查看C 源代码与对应汇编代码,对于提高C 语言编程能力大有好处。

C51页

该页用于对Keil 的C51编译器的编译过程进行控制,其中比较常用的是“Code Optimization ”组,如图1.7所示,该组中Level 是优化等级,C51在对源程序进行编译时,可以对代码多至9级优化,默认使用第8级,一般不必修改,如果在编译中出现一些问题,可以降低优化级别试一试。Emphasis 是选择编译优先方式,第一项是代码量优化(最终生

成的代码量小);第二项是速度优先(最终生成的代码速度快);第三项是缺省。默认采用速度优先,可根据需要更改。 图

1-6 设置输出文件

该页用于设置调试器,Keil提供了仿真器和一些硬件调试方法,如果没有相应的硬件调试器,应选择Use Simulator,其余设置一般不必更改,有关该页的详细情况将在程序调试部

图1-7C51编译器选项

分再详细介绍。

至此,设置完成,下面介绍如何编译、连接程序以获得目标代码,以及如何进行程序的调试工作。

1.4编译、连接

下面我们通过一个例子来介绍C程序编译、连接的过程。这个例子使P1口所接LED 以流水灯状态显示。

将下面的源程序输入,命名为exam3.c,并建立名为exam3的工程文件,将exam3.c文件加入该工程中,设置工程,在Target页将Xtal后的值由24.0改为12.0,以便后面调试时观察延时时间是否正确,本项目中还要用到我们所提供的实验仿真板,为此需在Debug页对Dialog DLL对话框作一个设置,在进行项目设置时点击Debug,打开Debug页,可以看到Dialog DLL对话框后的Parmeter:输入框中已有默认值-pAT52,在其后键入空格后再输入-dledkey,如图1-8所示。

例1-3使P1口所接LED以流水灯状态显示

/**************************************************

; 平凡单片机工作室

;https://www.doczj.com/doc/c611243848.html,

; Copyright 2003 pingfan's McuStudio

; All rights Reserved

图1-8Debug选项设置

;作者:周坚

;lsd.c

;流水灯程序

**************************************************/ #include "reg51.h"

#include "intrins.h"

#define uchar unsigned char

#define uint unsigned int

/*延时程序

由Delay参数确定延迟时间

*/

void mDelay(unsigned int Delay)

{ unsigned int i;

for(;Delay>0;Delay--)

{ for(i=0;i<124;i++)

{;}

}

}

void main()

{ unsigned char OutData=0xfe;

for(;;)

{

P1=OutData;

OutData=_crol_(OutData,1); //循环左移

mDelay(1000); /*延时1000毫秒*/

}

}

设置好工程后,即可进行编译、连接。选择菜单Project->Build target ,对当前工程进行连接,如果当前文件已修改,将先对该文件进行编译,然后再连接以产生目标代码;如果选择Rebuild All target files 将会对当前工程中的所有文件重新进行编译然后再连接,确保最终生产的目标代码是最新的,而Translate ….项则仅对当前文件进行编译,不进行连接。以上操作也可以通过工具栏按钮直接进行。图1-9是有关编译、设置的工具栏按钮,从左到右分别是:编译、编译连接、全部重建、停止编译和对工程进行设置。

编译过程中的信息将出现在输出窗口中的Build 页中,如果源程序中有语法错误,会有错误报告出现,双击该行,可以定位到出错的位置,对源程序修改之后再次编译,最终要得到如图1-10所示的结果,提示获得了名为exam3.hex 的文件,该文件即可被编程器读入并写到芯片中,同时还可看到,该程序的代码量(code=63),内部RAM 的使用量(data=9),外部RAM 的使用量(xdata=0)等一些信息。除此之外,编译、连接还产生了一些其它相关的文件,可被用于Keil 的仿真与调试,到了这一步后即进行调试。

1.5 程序的调试

在对工程成功地进行汇编、连接以后,按Ctrl+F5或者使用菜单Debug->Start/Stop Debug Session 即可进入调试状态,Keil 内建了一个仿真CPU 用来模拟执行程序,该仿真CPU 功能强大,可以在没有硬件和仿真机的情况下进行程序的调试。

进入调试状态后,Debug 菜单项中原来不能用的命令现在已可以使用了,多出一个用于运行和调试的工具条,如图1-11所示,Debug 菜单上的大部份命令可以在此找到对应的快捷按钮,从左到右依次是复位、运行、暂停、单步、过程单步、执行完当前子程序、运行到

当前行、下一状态、打开跟踪、观察跟踪、反汇编窗口、观察窗口、代码作用范围分析、1#串行窗口、内存窗口、性能分析、工具按钮等命令。

点击菜单Peripherals ,即会多出一项“键盘LED 仿真板(K )”,选中该项,即会出现如

1-9 有关编译、连接、项目设置的工具条

图1-11 调试工具条

图1-10 编译、连接后得到目标代码

图1-12所示界面。

使用菜单STEP或相应的命令按钮或使用快捷键F11可以单步执行程序,使用菜单STEP OVER或功能键F10可以以过程单步形式执行命令,所谓过程单步,是指把C语言中的一个函数作为一条语句来全速执行。

按下F11键,可以看到源程序窗口的左边出现了一个黄色调试箭头,指向源程序的第一行。每按一次F11,即执行该箭头所指程序行,然后箭头指向下一行,当箭头指向“mDelay(1000);”行时,再次按下F11,会发现,箭头指向了延时子程序mDelay的第一行。不断按F11键,即可逐步执行延时子程序。

如果mDelay程序有错误,可以通过单步执行来查找错误,但是如果mDelay程序已正确,每次进行程序调试都要反复执行这些程序行,会使得调试效率很低,为此可以在调试时使用F10来替代F11,在main函数中执行到mDelay(1000)时将该行作为一条语句快速执行完毕。

图1-1251单片机实验仿真板

Keil软件还提供了一些窗口,用以观察一些系统中重要的寄存器或变量的值,这也是很重要的调试方法。

以下通过一个对延时程序的延迟时间的调整来对这些调试方法作一个简单的介绍。

这个程序中用到了延时程序mDelay,如果使用汇编语言编程,每段程序的延迟时间可以非常精确地计算出来,而使用C语言编程,就没有办法事先计算了。为此,可以使用观察程序执行时间的方法了来解。进入调试状态后,窗口左侧是寄存器和一些重要的系统变量的窗口,其中有一项是sec,即统计从开始执行到目前为止用去的时间。按F10,以过程单步的形式执行程序,在执行到mDelay(1000)这一行之前停下,查看sec的值(把鼠标停在sec 后的数值上即可看到完整的数值),记下该数值,然后按下F10,执行完mDelay(1000)后再次观察sec值,如图1-13所示,这里前后两次观察到的值分别是:0.00040400和1.01442600,其差值为1.014022s,如果将该值改为124可获得更接近于1s的数值,而当该值取123时所获得的延时值将小于1s,因此,最佳的取值应该是124。

1.6 C 语言的一些特点

通过上述的几个例子,可以得出一些结论:

1、C 程序是由函数构成的,一个C 源程序至少包括一个函数,一个C 源程序有且只有一个名为main()的函数,也可能包含其它函数,因此,函数是C 程序的基本单位。主程序通过直接书写语句和调用其它函数来实现有关功能,这些其它函数可以是由C 语言本身提供给我们的(如例3中的_crol_(…)函数),这样的函数称之为库函数,也可以是用户自己编写的(如例

2、3中用的mDelay (…)函数),这样的函数称之为用户自定义函数。那么库函数和用户自定义函数有什么区别呢?简单地说,任何使用Keil C 语言的人,都可以直接调用C 的库函数而不需要为这个函数写任何代码,只需要包含具有该函数说明的相应的头文件即可;而自定义函数则是完全个性化的,是用户根据自己需要而编写的。Keil C 提供了100多个库函数供我们直接使用。

2、一个函数由两部份组成:

(1)函数的首部、即函数的第一行。包括函数名、函数类型、函数属性、函数参数(形参)名、参数类型。

例如:void mDelay (unsigned int DelayTime)

一个函数名后面必须跟一对圆括号,即便没有任何参数也是如此。

(2)函数体,即函数首部下面的大括号“{}”内的部份。如果一个函数内有多个大括号,则最外层的一对“{}”为函数体的范围。

函数体一般包括:

声明部份:在这部份中定义所用到的变量,例1.2中unsigned char j 。

执行部份:由若干个语句组成。

在某此情况下也可以没有声明部份,甚至即没有声明部份,也没有执行部份,如: void mDelay()

{}

这是一个空函数,什么也不干,但它是合法的。

在编写程序时,可以利用空函数,比如主程序需要调用一个延时函数,可具体延时多少,怎么个延时法,暂时还不清楚,我们可以主程序的框架结构弄清,先编译通过,把架子搭起来再说,至于里面的细节,可以在以后慢慢地填,这时利用空函数,先写这么一个函数,这样在主程序中就可以调用它了。

3、一个C 语言程序,总是从main 函数开始执行的,而不管物理位置上这个main()放在什么地方。例1.2中就是放在了最后,事实上这往往是最常用的一种方式。

图1-13 观察sec 确定延时时间

4、主程序中的mDelay如果写成mdelay就会编译出错,即C语言区分大小写,这一点往往让初学者非常困惑,尤其是学过一门其它语言的人,有人喜欢,有人不喜欢,但不管怎样,你得遵守这一规定。

5、C语言书写的格式自由,可以在一行写多个语句,也可以把一个语句写在多行。没有行号(但可以有标号),书写的缩进没有要求。但是建议读者自己按一定的规范来写,可以给自己带来方便。

6、每个语句和资料定义的最后必须有一个分号,分号是C语句的必要组成部份。

7、可以用/*…..*/的形式为C程序的任何一部份作注释,在“/*”开始后,一直到“*/”为止的中间的任何内容都被认为是注释,所以在书写特别是修改源程序时特别要注意,有时无意之中删掉一个“*/”,结果,从这里开始一直要遇到下一个“*/”中的全部内容都被认为是注释了。原本好好的一个程序,编译已过通过了,稍作修改,一下出现了几十甚至上百个错误,初学C的人往往对此深感头痛,这时就要检查一下,是不是有这样的情况,如果有的话,赶紧把这个“*/”补上。

特别地,Keil C也支持C++风格的注释,就是用“//”引导的后面的语句是注释,例:

//取反P1.0

P1_0=!P1_0;

这种风格的注释,只对本行有效,所以不会出现上面的问题,而且书写比较方便,所以在只需要一行注释的时候,我们往往采用这种格式。但要注意,只有Keil C支持这种格式,早期的Franklin C以及PC机上用的TC都不支持这种格式的注释,用上这种注释,编译时通不过,会报告编译错误。

第2章 分支程序设计

第一部分课程学习了如何建立Keil C的编程环境,并了解了一些C语言的基础知识,这一部分将通过一个键控流水灯程序的分析来学习分支程序设计。

2.1程序功能与实现

硬件电路描述如下:89S52单片机的P1口接有8个LED,当某一端口输出为“0”时,相应的LED点亮,P3.2、P3.3、P3.4、P3.5分别接有四个按钮K1~K4,按下按钮时,相应引脚被接地。现要求编写可键控的流水灯程序,当K1按下时,开始流动,K2按下时停止流动,全部灯灭,K3使灯由上往下流动,K4使灯由下往上流动。

下面首先给出程序,然后再进行分析。

例2-1:键控流水灯的程序

#include "reg51.h"

#include "intrins.h"

#define uchar unsigned char

void mDelay(unsigned int DelayTime)

{ unsigned int j=0;

for(;DelayTime>0;DelayTime--)

{ for(j=0;j<125;j++)

}}

{;}

uchar Key()

KeyV;

{ uchar

tmp;

uchar

P3=P3|0x3c;

//四个按键所接位置

KeyV=P3;

//无键按下

if((KeyV|0xc3)==0xff)

return(0);

mDelay(10); //延时,去键抖

KeyV=P3;

if((KeyV|0xc3)==0xff)

return(0);

else

{ for(;;){ tmp=P3;

if((tmp|0xc3)==0xff)

break;}

return(KeyV);}}

void main()

{ unsigned char OutData=0xfe;

UpDown=0;

bit

bit Start=0;

KValue;

uchar

for(;;)

{ KValue=Key();

(KValue)

switch

{ case 0xfb: //P3.2=0,Start

{ Start=1;

break; }

0xf7: //P3.3=0,Stop

case

{ Start=0;

break; }

Up

0xef: //P3.4=0

case

{ UpDown=1;

break; }

//P3.5=0

Down

0xdf:

case

{ UpDown=0;

break; }

}

if(Start)

{ if(UpDown)

OutData=_crol_(OutData,1);

else

OutData=_cror_(OutData,1);

P1=OutData;

}

else

P1=0xff; //否则灯全灭

mDelay(1000);

}

}

输入源程序,保存为exam21.c,建立名为exam21的工程文件,选择的CPU型号为AT89S52,在Debug页加入-ddpj6,以便使用单片机实验仿真板,其他按默认设置。正确编译、链接后进入调试模式,点击Peripherals?51实验仿真板,打开实验仿真板,选择Run (全速运行),此时实验仿真板没有变化,用鼠标点击上方的K1按钮,松开后即可看到Led “流动”起来,初始状态是由下往上流动,点击K3按钮,可改变LED的流动方向,改为由上往下流动,点击K4按钮,又可将流动方向变换回来。点击K2按钮,可使流动停止,所有LED“熄灭”。

2.1.1程序分析

本程序中运用到了两种选择结构的程序:if和switch,if语句最常用的形式是:

if(关系表达式)语句1else 语句2

2.1.2关系运算符和关系表达式

所谓“关系运算”实际上是两个值作一个比较,判断其比较的结果是否符合给定的条件。关系运算的结果只有2种可能,即“真”和“假”。例:3>2的结果为真,而3<2的结果为假。

C语言一共提供了6种关系运算符:“<”(小于)、“<=”(小于等于)、“>”(大于)、“>=(大于等于)”、“==”(等于)和“!=”(不等于)。

用关系运算符将两个表达式连接起来的式子,称为关系表达式。例:

a>b,a+b>b+c,(a=3)>=(b=5)等都是合法的关系表达式。关系表达式的值只有两种可能,即“真”和“假”。在C语言中,没有专门的逻辑型变量,如果运算的结果是“真”,用数值“1”表示,而运算的结果是“假”则用数值“0”表示。

如式子:x1=3>2的结果是x1等于1,原因是3>2的结果是“真”,即其结果为1,该结果被“=”号赋给了x1,这里须注意,“=”不是等于之意(C语言中等于用“==”表示),而是赋值号,即将该号后面的值赋给该号前面的变量,所以最终结果是x1等于1。

式子:x2=3<=2的结果是x2=0,请自行分析。

2.2逻辑运算符和逻辑表达式

用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。C语言提供了三种逻辑运算符:“&&”(逻辑与)、“||”(逻辑或)和“!”(逻辑非)。

C语言编译系统在给出逻辑运算的结果时,用“1”表示真,而用“0”表示假,但是在判断一个量是否是“真”时,以0代表“假”,而以非0代表“真”,这一点务必要注意。以下是一些例子:

(1) 若a=10,则!a的值为0,因为10被作为真处理,取反之后为假,系统给出的假的值为0。

(2) 如果a=--2,结果与上完全相同,原因也同上,初学时常会误以为负值为假,所以这里特别提醒注意。

(3) 若a=10,b=20,则a&&b的值为1,a||b的结果也为1,原因为参于逻辑运算时不论a与b的值究竟是多少,只要是非零,就被当作是“真”,“真”与“真”

相与或者相或,结果都为真,系统给出的结果是1。

2.3if语句

if语句是用来判定所给定的条件是否满足根据判定的结果(真或假)决定执行给出的两种操作之一。

C语言提供了三种形式的if语句

1. if(表达式) 语句

如果表达式的结果为真,则执行语句,否则不执行

2. if(表达式) 语句1else 语句2

如果表达式的结果为真,则执行语句1,否则执行语句2

3.if(表达式1)语句1

else if(表达式2) 语句2

else if(表达式3) 语句3

else if(表达式m)语句m

else 语句n

这条语句执行如图2所示。

上述程序中的如下语句:

if((KeyV|0xc3)==0xff) //无键按下

return(0);

是第一种if语句的应用。该语句中“|”符号是C语言中的位运算符,按位相或的意思,相当于汇编语言中“ORL”指令,将读取的P3口的值KeyV与0xc3(即11000011B)按位或,如果结果为0xff(即11111111B)说明没有键被按下,因为中间4位接有按键,如果有键按下,那么P3口值的中间4位中必然有一位或更多位是“0”。该语句中的“return(0)”是返回之意,相当于汇编语言中的“ret”指令,通过该语句可以带返回值,即该号中的数值,返回值就是这个函数的值,在这个函数被调用时,用了如下的形式:KValue=Key();因此,返回的结果是该值被赋给Kvalue这个变量。因此,如果没有键被按下,则直接返回,并且Kvalue的值将变为0。如果有键被按下,那么return(0)将不会被执行。

程序其他地方还有这样的用法,请注意观察与分析。

程序中:

if(Start)

{… 灯流动显示的代码}

else

//否则灯全灭

P1=0xff;

是if语句的第二种用法,其中Start是一个位变量,该变量在main函数的中被定义,并赋以初值0,该变量在按键K1被按下后置为1,而K2按下后被清为0,用来控制灯流动是否开始。这里就是判断该变量并决定灯流动是否开始的代码,观察if后面括号中的写法,与其他语言中写法很不一样,并没有一个关系表达式,而仅仅只有一个变量名,C根据这个量是0还是1来决定程序的走向,如果为1则执行灯流动显示的代码,如果为0,则执行P1=0xff;语句。可见,在C语言中,数据类型的概念比其他很多的编程语言要“弱化”,或者说C更着重从本质的角度去考虑问题,if后面的括号中不仅可以是关系表达式,也可以是算术表达式,还可以就是一个变量,甚至是一个常量,不管怎样,C总是根据这个表达式的值是零还是非零来决定程序的走向,这个特点是其他中所没有的,请注意理解。

if语句的第三种用法在本程序中没有出现,下面我们举一例说明。在上述的键盘处理函

C语言打字练习程序课程设计报告

青岛理工大学 《C语言程序设计》 题目打字练习程序 指导教师:李兰老师 姓名: 学号:2011 班级: 专业:计算机科学 地点:现代教育中心机房201 时间:2012.6.26 至2012.6.29

一、内容 本程序主要实现的是对使用者的打字速度进行练习和提高。因为界面友好亲和,因此能让使用者在轻松愉快中练习并快速提高自己的打字速度和准确性。程序主要的功能有记录使用者在本次使用中的击中数和总下落字母的个数之比。并且游戏设置了九个等级,随着数字的增加,等级越高,字母下落的速度逐步提高,这样能够更好的迎合不同水平的用户需求。使用本程序很简单,因为在写代码时,我很注重的是界面的友好,所以,在用户的每次操作前,界面上都有详细的操作提醒,只要跟着提示输入就能很快速地进入并开始练习。 二、上机环境 操作系统:windows XP(win7兼容) 开发工具:VC6.0 三、函数调用关系图 void main( ) start( ) printfScreen( ) levelChoice( ) newWord ( ) moving( ) wordHit( ) result( ) leave( )

四、各函数功能说明 1、void main( ) 主函数 2、void printScreen( ) 刷新屏幕函数 3、int levelChoice( ) 游戏等级选择函数 4、int newWord( ) 生成新字符函数 5、int moving( ) 字符下降函数 6、int wordHit( ) 击中字符函数 7、int result ( ) 结果输出函数 8、int start( ) 程序开始提示操作 9、void leave( ) 函数结束

C语言入门经典(第四版)8-程序的结构

本文由泽五令贡献 ppt文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。 C入门经典(第4版) 入门经典( 第08章 程序的结构 08章 如第1 如第1章所述,将程序分成适度的自包含单元是开发任一程序的基本方式. 当工作很多时,最明智的做法就是把它分成许多便于管理的部分,使每一部分 能很轻松地完成,并确保正确完成整个工作.如果仔细设计各个代码块,就可 以在其他程序中重用其中的一些代码块. . C入门经典(第4版) 入门经典( 8.1 程序的结构 如概述所言,C程序是由许多函数组成的,其中最重要的就是函数main(), 如概述所言,C程序是由许多函数组成的,其中最重要的就是函数main(), 它是执行的起点.本书介绍库函数printf()或scanf()时,说明了一个函数可以调 它是执行的起点.本书介绍库函数printf()或scanf()时,说明了一个函数可以调 用另一个函数,完成特定的工作,然后调用函数继续执行.不考虑存储在全局 变量中的数据的负面影响,程序中的每个函数都是一个执行特定操作的自包含 单元 . 变量的作用域和生存期 变量的作用域和函数 C入门经典(第4版) 入门经典( 8.1.1 变量的作用域和生存期 .1.1 在前面所有的例子中,都是在定义main()函数体的起始处声明程序的变量. 在前面所有的例子中,都是在定义main()函数体的起始处声明程序的变量. 事实上,可以在任何代码块的起始处定义变量.这有什么不同吗?这是绝对不 同的.变量只存在于定义它们的块中.它们在声明时创建,在遇到下一个闭括 号时就不存在了 . C入门经典(第4版) 入门经典( 8.1.2 变量的作用域和函数 .1.2 在讨论创建函数的细节之前,最后要讨论的是,每个函数体都是一个块 (当然,它可能含有其他块).因此,在一个函数内声明的自动变量是这个函数 当然,它可能含有其他块) 的本地变量,在其他地方不存在.所以在一个函数内部声明的变量完全独立于 在其他函数内声明的变量.可以在不同的函数内使用相同的变量名称,它们是 完全独立的. C入门经典(第4版) 入门经典( 8.2 变量的作用域和函数 本书的程序广泛使用了内置函数,例如printf()或strcpy().还介绍了在按 本书的程序广泛使用了内置函数,例如printf()或strcpy().还介绍了在按 名称引用内置函数时如何执行它们,如何通过函数名称后括号内的参数,给函 数传递信息.例如printf()函数的第一个参数通常是一个字符串,其后的参数 数传递信息.例如printf()函数的第一个参数通常是一个字符串,其后的参数 (可能没有)是一系列变量或要显示其值的表达式 . 可能没有) 定义函数 Return语句 Return语句 C入门经典(第4版) 入门经典( 8.2.1 定义函数 创建一个函数时,必须指定函数头作为函数定义的第一行,跟着是这个 函数放在括号内的执行代码.函数头后面放在括号内的代码块称为函数体. C入门经典(第4版) 入门经典( 8.2.2 return语句 return语句 return语句允许退出函数,从调用函数中发生调用的那一点继续执行. return语句允许退出函数,从调用函数中发生调用的那一点继续执行. return语句最简单的形式如下: return语句最简单的形式如下: return; C入门经典(第4版) 入门经典( 8.3 按值传递机制 这个重点是:valuel和value2的副本作为变元传送给函数,而没有传送变 这个重点是:valuel和value2的副本作为变元传送给函数,而没有传送变 量本身.也就是说,函数不能改变存储在value1或value2中的值.例如,如果 量本身.也就是说,函数不能改变存储在value1或value2中的值.例如,如果 给两变量输入4.0和6.0,编译器会在堆栈上创建这两个值的副本,在调用 给两变量输入4.0和6.0,编译器会在堆栈上创建这两个值的副本,在调用 average()函数时,average()函数会访问这些副本.这个机制是C average()函数时,average()函数会访问这些副本.这个机制是C语言中给函 数传送变元值

c语言入门经典必背个程序

c语言入门经典必背个程序 c语言入门经典必背18个程序 1 、/* 输出9*9 口诀。共9 行9 列,i 控制行,j 控制列。*/ #include "stdio.h" main() {int i,j,result; for (i=1;i<10;i++) { for(j=1;j<10;j++) { result=i*j; printf("%d*%d=%-3d",i,j,result);/*-3d 表示左对齐,占3 位*/ } printf("\n");/* 每一行后换行*/ } } 2 、/* 古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔 子都不死,问每个月的兔子总数为多少? 兔子的规律为数列1,1,2,3,5,8,13,21....*/ main() { long f1,f2; int i; f1=f2=1; for(i=1;i<=20;i++) { printf("%12ld %12ld",f1,f2); if(i%2==0) printf("\n");/* 控制输出,每行四个*/ f1=f1+f2; /* 前两个月加起来赋值给第三个月*/ f2=f1+f2; /* 前两个月加起来赋值给第三个月*/ } } 3 、/* 判断101-200 之间有多少个素数,并输出所有素数及素数的个数。 程序分析:判断素数的方法:用一个数分别去除 2 到sqrt( 这个数) ,如果能被整除, 则表明此数不是素数,反之是素数。*/ #include "math.h" main()

(完整word版)(整理)C语言入门经典案例及源代码.

循环控制输出图案 【程序1】 题目:输出9*9口诀。 1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列。 2.程序源代码: #include "stdio.h" main() { int i,j,result; printf("\n"); for (i=1;i<10;i++) { for(j=1;j<10;j++) { result=i*j; printf("%d*%d=%-3d",i,j,result);/*-3d表示左对齐,占3位*/ } printf("\n");/*每一行后换行*/ } } 【程序2】 题目:要求输出国际象棋棋盘。 1.程序分析:用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方格,还是白方格。 2.程序源代码: #include "stdio.h" main() { int i,j; for(i=0;i<8;i++) { for(j=0;j<8;j++) if((i+j)%2==0) printf("%c%c",219,219); else printf(" "); printf("\n"); } } ============================================================== 【程序3】 题目:打印楼梯,同时在楼梯上方打印两个笑脸。 1.程序分析:用i控制行,j来控制列,j根据i的变化来控制输出黑方格的个数。 2.程序源代码: #include "stdio.h"

main() { int i,j; printf("\1\1\n");/*输出两个笑脸*/ for(i=1;i<11;i++) { for(j=1;j<=i;j++) printf("%c%c",219,219); printf("\n"); } } 【程序4】 题目:打印出如下图案(菱形) * *** ****** ******** ****** *** * 1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重 for循环,第一层控制行,第二层控制列。 2.程序源代码: main() { int i,j,k; for(i=0;i<=3;i++) { for(j=0;j<=2-i;j++) printf(" "); for(k=0;k<=2*i;k++) printf("*"); printf("\n"); } for(i=0;i<=2;i++) { for(j=0;j<=i;j++) printf(" "); for(k=0;k<=4-2*i;k++) printf("*"); printf("\n"); } }

51单片机及C语言入门教程

51单片机 及C语言入门教程 注:排成16开版式,是为了方便自已打印阅读。请不要用于非法用途。 2007.12.20

51单片机及C语言入门教程 第一课 建立您的第一个C项目 使用C语言肯定要使用到C编译器,以便把写好的C程序编译为机器码,这样单片机才能执行编写好的程序。KEIL uVISION2是众多单片机应用开发软件中优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,它集编辑,编译,仿真等于一体,同时还支持,PLM,汇编和C语言的程序设计,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。因此很多开发51应用的工程师或普通的单片机爱好者,都对它十分喜欢。 以上简单介绍了KEIL51软件,要使用KEIL51软件,必需先要安装它。KEIL51是一个商业的软件,对于我们这些普通爱好者可以到KEIL中国代理周立功公司的网站上下载一份能编译2K的DEMO版软件,基本可以满足一般的个人学习和小型应用的开发。(安装的方法和普通软件相当这里就不做介绍了) 安装好后,你是不是迫不及待的想建立自己的第一个C程序项目呢?下面就让我们一起来建立一个小程序项目吧。或许你手中还没有一块实验板,甚至没有一块单片机,不过没有关系我们可以通过KEIL软件仿真看到程序运行的结果。 首先当然是运行KEIL51软件。怎么打开?噢,天!那你要从头学电脑了。呵呵,开个玩笑,这个问题我想读者们也不会提的了:P。运行几秒后,出现如图1-1的屏幕。 图1-1启动时的屏幕

接着按下面的步骤建立您的第一个项目: (1)点击Project菜单,选择弹出的下拉式菜单中的New Project,如图1-2。接着弹出一个标准Windows文件对话窗口,如图1-3,这个东东想必大家是见了N次的了,用法技巧也不是这里要说的,以后的章节中出现类似情况将不再说明。在"文件名"中输入您的第一个C程序项目名称,这里我们用"test",这是笔者惯用的名称,大家不必照搬就是了,只要符合Windows文件规则的文件名都行。"保存"后的文件扩展名为uv2,这是KEIL uVision2项目文件扩展名,以后我们可以直接点击此文件以打开先前做的项目。 图1-2New Project菜单 图1-3文件窗口 (2)选择所要的单片机,这里我们选择常用的Ateml公司的AT89C51。此时屏幕如图1-4

计算机C语言基础提高试题(附答案)

计算机基础提高资料:C语言篇 一、基础知识专项练习 1、以下标识符中,不能作为合法的C用户定义标识符的是()。 (点击查看答案>>>>>>>>) A、a3_b3 B、void C、_123 D、IF 难度:★ 2、在C语言中,引用数组元素时,其数组下标的数据类型允许是()。(点击查看答案>>>>>>>>) A、整型常量 B、整型表达式 C、整型常量或整型表达式 D、任何类型的表达式 难度:★ 3、枚举类型中的每个枚举常量的值都是一个()。 (点击查看答案>>>>>>>>) A、整数 B、浮点数 C、字符 D、记录 难度:★ 4、下列关于C语言的自增和自减运算符的使用中,正确的是()。(点击查看答案>>>>>>>>) A、15++ B、(x+y)-- C、++(a-b) D、s+++t+++u++ 难度:★★

5、设int x[]={1,2,3,4,5,6},*p=x; 则值为3 的表达式是( ) (点击查看答案>>>>>>>>) A、p+=2,*++p; B、p+=2,*p++ C、p+=3,*p D、p+=2,++*p 难度:★★ 6、下面函数的功能是()(点击查看答案>>>>>>>>) A、计算字符串的位(bit)数 B、复制一个字符串 C、求字符串的长度 D、求字符串存放的位置 难度:★★ 7、下面程序的输出是什么()(点击查看答案>>>>>>>>) A、2 1 B、2 5 C、1 2 D、5 2 难度:★★★

8、能把函数处理结果的二个数据返回给主调函数,在下面的方法中不正确的是()(点击查看答案>>>>>>>>) A、return这二个数 B、形参用数组 C、形参用二个指针 D、用二个全局变量 难度:★★★ 9、若要求在if后一对圆括号中表示a不等于0的关系,则能正确表示这一关系的表达式为( )。(点击查看答案>>>>>>>>) A、a<>0 B、!a C、a=0 D、a 难度:★★★ 10、请找出下面代码中的所有错误。说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”( )。(点击查看答案>>>>>>>>) A、第7行要为'\0'分配一个空间 B、第9行改成char * s = &src[len-1] C、第12行前要加上*d = '\0' D、第13行前要加上free(dest)释放空间 难度:★★★

计算机C语言基础知识总结

C语言知识要点复习资料 总体上必须清楚的: 1)程序结构是三种: 顺序结构、选择结构(分支结构)、循环结构。 2)读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择),有且只有一个main函数。 3)计算机的数据在电脑中保存是以二进制的形式. 数据存放的位置就是他的地址. 4)bit是位是指为0 或者1。byte 是指字节, 一个字节= 八个位. 概念常考到的: 1、编译预处理不是C语言的一部分,不占运行时间,不要加分号。C语言编译的程序称为源程序,它以ASCII数值存放在文本文件中。 2、define PI 3.1415926; 这个写法是错误的,一定不能出现分号。 3、每个C语言程序中main函数是有且只有一个。 4、在函数中不可以再定义函数。 5、算法:可以没有输入,但是一定要有输出。 6、break可用于循环结构和switch语句。 7、逗号运算符的级别最低,赋值的级别倒数第二。 第一章C语言的基础知识 第一节、对C语言的基础认识 1、C语言编写的程序称为源程序,又称为编译单位。 2、C语言书写格式是自由的,每行可以写多个语句,可以写多行。 3、一个C语言程序有且只有一个main函数,是程序运行的起点。 第二节、熟悉vc++ 1、VC是软件,用来运行写的C语言程序。 2、每个C语言程序写完后,都是先编译,后链接,最后运行。(.c---→.obj---→.exe)这个过程中注意.c和.obj文件时无法运行的,只有.exe文件才可以运行。(常考!)第三节、标识符 1、标识符(必考内容): 合法的要求是由字母,数字,下划线组成。有其它元素就错了。 并且第一个必须为字母或则是下划线。第一个为数字就错了 2、标识符分为关键字、预定义标识符、用户标识符。 关键字:不可以作为用户标识符号。main define scanf printf 都不是关键字。迷惑你的地方If是可以做为用户标识符。因为If中的第一个字母大写了,所以不是关键字。 预定义标识符:背诵define scanf printf include。记住预定义标识符可以做为用户标识符。 用户标识符:基本上每年都考,详细请见书上习题。 第四节:进制的转换

C语言基础教程经典100例

【程序1】 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。 2.程序源代码: main() { int i,j,k; printf("\n"); for(i=1;i<5;i++)/*以下为三重循环*/ for(j=1;j<5;j++) for (k=1;k<5;k++) { if (i!=k&&i!=j&&j!=k) /*确保i、j、k三位互不相同*/ printf("%d,%d,%d\n",i,j,k); } } =========================================================== === 【程序2】

题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高 于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提 成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于 40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于 100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数? 1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。 2.程序源代码: main() { long int i; int bonus1,bonus2,bonus4,bonus6,bonus10,bonus; scanf("%ld",&i); bonus1=100000*0.1;bonus2=bonus1+100000*0.75; bonus4=bonus2+200000*0.5; bonus6=bonus4+200000*0.3; bonus10=bonus6+400000*0.15;

C语言入门经典(第四版)1-C语言编程

本文由meng5056贡献 ppt文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。 C入门经典(第4版) 入门经典( 第01章 C语言编程 01章 语言编程 C语言是一种功能强大、简洁的计算机语言,通过它可以编写程序,指挥 计算机完成指定的任务。我们可以利用C语言创建程序(即一组指令) 计算机完成指定的任务。我们可以利用C语言创建程序(即一组指令),并让计 算机依指令行事。 用C语言编程并不难,本书将用浅显易懂的方法介绍C语言的基础知识, 语言编程并不难,本书将用浅显易懂的方法介绍C 读完本章,读者就可以编写第一个C语言程序了,其实C 读完本章,读者就可以编写第一个C语言程序了,其实C语言很简单。 。 C入门经典(第4版) 入门经典( 1.1 创建 程序 创建C程序 C程序的创建过程有4个基本步骤或过程:编辑,编译,链接,执行。这 程序的创建过程有4 些过程很容易完成(就像翻转手臂一样简单,而且可以随时翻转) 些过程很容易完成(就像翻转手臂一样简单,而且可以随时翻转),首先介绍每 个过程,以及它们对创建C 个过程,以及它们对创建C程序的作用 。 编辑 编译 链接 执行 C入门经典(第4版) 入门经典( 1.1.1 编辑 编辑过程就是创建和修改C程序的源代码——我们编写的程序指令称为源 编辑过程就是创建和修改C程序的源代码——我们编写的程序指令称为源 代码。有些C 代码。有些C编译器带一个编辑器,可帮助管理程序。通常,编辑器是提供了 编写、管理、开发与测试程序的环境,有时也称为集成开发环境(缩写为IDE)。 编写、管理、开发与测试程序的环境,有时也称为集成开发环境(缩写为IDE)。 C入门经典(第4版) 入门经典( 1.1.2 编译 编译器可以将源代码转换成机器语言,在编译的过程中,会找出并报告 错误。这个阶段的输入是在编辑期间产生的文件,常称为源文件。 编译器能找出程序中很多无效或无法识别的错误,以及结构错误,例如 程序的某部分永远不会执行。编译器的输出结果称为对象代码(object code), 程序的某部分永远不会执行。编译器的输出结果称为对象代码(object code), 存放它们的文件称为对象文件(object file),这些文件的扩展名在Windows环境 存放它们的文件称为对象文件(object file),这些文件的扩展名在Windows环境 中通常是.obj,在Linux/UNIX环境中通常是.o。编译器可以在转换过程中找出 中通常是.obj,在Linux/UNIX环境中通常是.o。编译器可以在转换过程中找出 几种不同类型的错误,它们大都会阻止对象文件的创建 C入门经典(第4版) 入门经典( 1.1.3 链接 链接器(linker)将源代码文件中由编译器产生的各种模块组合起来,再从C 链接器(linker)将源代码文件中由编译器产生的各种模块组合起来,再从C语 言提供的程序库中添加必要的代码模块,将它们组合成一个可执行的文件。 言提供的程序库中添加必要的代码模块,将它们组合成一个可执行的文件。链 接器也可以检测和报告错误,例如,遗漏了程序的某个部分, 接器也可以检测和报告错误,例如,遗漏了程序的某个部分,或者引用了一个 根本不存在的库组件。 根本不存在的库组件。 C入门经典(第4版) 入门经典( 1.1.4 执行 执行阶段就是当成功完成了前述3 执行阶段就是当成功完成了前述3个过程后,运行程序。但是,这个阶段 可能会出现各种错误,包括输出错误及什么也不做,甚至使计算机崩溃。不管 出现哪种情况,都必须返回编辑阶段,检查并修改源代码。 C入门经典(第4版) 入门经典( 1.2 创建第一个程序 本节先浏览一下创建C语言程序的流程,从输入代码到执行程序的所有4 本节先浏览一下创建C语言程序的流程,从输入代码到执行程序的所有4 个步骤。在这个阶段,若不了解所键入的代码信息,别担心,笔者会解释每一 个步骤。 C入门经典(第4版) 入门经典( 1.3 编辑第一个程序 我们可以修改程序,在屏幕上输出其他信息,例如可以将程序改成: /*Progra

基础篇1 51单片机最小系统

手把手教你学51单片机 ——之MCS-51基础篇 主讲: 尹延辉 策划:张勇 开发板:LT-Super51 QQ群:31646346 网址:https://www.doczj.com/doc/c611243848.html, E-Mail:litianmcu@https://www.doczj.com/doc/c611243848.html, litianmcu@https://www.doczj.com/doc/c611243848.html,

基础篇第一讲 ——51单片机最小系统◆本讲内容提要 ●单片机技术简介 ●单片机应用实例 ●单片机的主要技术指标 ●常用单片机系列型号 ●51单片机相关知识 ●51单片机最小系统 ●51单片机的开发方法 ●51开发软件的设置 ●习题

温故知新 ——入门篇知识温习 ◆个人电脑使用入门 ●电脑在电子工程中的应用,包括其外部接口、开发工具简介等。 ◆硬件技术基础知识 ●电路基础、模拟电路基础知识,元器件基本应用,微电子与PCB技术简介等。◆数字电路基础知识 ●逻辑代数基础、基本门电路、数字芯片、可编程逻辑器件、英特尔总线时序等。 ◆C语言基础知识 ●程序开发语言简介、由源代码到可执行代码的过程、C语言的基本结构与特点等。

——个人电脑使用入门(1) ◆填空题 ●单片机/ARM/DSP的IDE开发软件主要集成了文本编辑、编译、链接三个主要功能 ,某些IDE软件还集成了下载功能。 ●单片机常用的目标代码文件扩展名为bin、hex两种。 ●可编程器件固化代码的三类工具:下载器、编程器,以及Jtag仿真器 ●两台电脑之间串口通讯应该用交叉(交叉,直连)线,电脑对与单片机之间串口通讯 也应该交叉连接。 ◆简答题 ●列举三种PCB设计软件 ?答:AltiumDesigner、PowerPCB、Cadence ●简述ISP下载器与Jtag仿真器的联系与区别 ?答:相同点:都可以在目标板上固化代码不同点:Jtag可以完成仿真调试功能,而ISP只能简单的固化代码。 ●比较并陈述PCI、USB2.0、串口这三种电脑接口的传输速度 ?答:PCI速度最快(133MX8bpS),USB2.0次之(480Mbps),串口最慢<1MbpS

C语言入门(一般)

《C语言(一般)》试卷 得分 一、单选题(每题2分,共计30分) 1.| 若要求在后一对圆括号中表示a不等于0的关系,则能正确表示这一关系的表达式为()。()A、;0 B、 C、0 D、a 2.| 关于C语言中的栈,下列描述中正确的是()() A、顺序存储的线性结构 B、链式存储的非线性结构 C、限制存取点的线性结构 D、限制存储点的非线性结构 3.| 关于C语言中的全局变量,下列描述中正确的是()() A、全局变量的作用域一定比局部变量的作用域范围大 B、静态类别变量的生存周期贯穿于整个程序的运行期间 C、函数的形参都属于全局变量 D、未在定义语句中赋初值的变量和变量的初值都是随机值4.| 若有定义和语句:**,*1020("\n",*p,**);那么输出结果是()。() A、10,20 B、10,10 C、20,10 D、20,20 5.| 在执行[][3] = {1,2,3,4,5,6}:语句后,[1][0]的值为()() A、4 B、1 C、2 D、5 6.| 若是指向某文件的指针,且已读到文件末尾,则库函数()的返回值是()() A、 B、-1 C、非零值 D、 7.| 若要打开A盘上子目录下名为、的文本文件进行读、写操作,下面符合此要求的函数调用是()() A、(:\\\\\\\\;); B、(:\\\\\\\\;); C、(:\\\\\\\\;); D、(:\\\\\\\\;); 8.| 若有定义,*f();则下列描述中正确的是()() 总分题号一二三四五题分 得分

A、一个用于指向整型数据的指针变量 B、一个用于指向一维数组的指针 C、一个用于指向函数的指针变量 D、一个返回值为指针型的函数名 9.| 若用一个大小为6的数组来实现循环队列,且当前和的值分别为0和3,当从队列中删除一个元素,再加入两个元素后,和的值分别为()() A、1和5 B、2和4 C、4和2 D、5和1 10.|与顺序栈相比,链栈有一个较为明显的优势是()() A、通常不会出现栈满的情况 B、通常不会出现栈空的情况 C、插入操作更容易实现 D、删除操作更容易实现 11.|为了避免嵌套的语句的二义性,C语言规定总是与()组成配对关系。() A、缩排位置相同的 B、在其之前未配对的 C、在其之前尚未配对的最近的 D、同一行上的 12.|下面程序的输出结果为()。{ x; *y;} * [4]={10,20,30,40} [4]={50[0],60[1],70[2],80[3]} (){ ; (" ", >x); (" ", ()->x); (" ", (*>y));}()A、10 20 20 B、50 60 21 C、51 60 21 D、60 70 31 13.|在C程序中,判逻辑值时,用;非0;表示逻辑值;真;,又用;0;表示逻辑值;假;。在求逻辑值时,用()表示逻辑表达式值为;真;,又用()表示逻辑表达式值为;假;。() A、1 0 B、0 1 C、非0 非0 D、1 1 14.|若是某文件的指针,且已读到文件的末尾,则表达式()的返回值是()() A、 B、-1 C、非零值 D、 15.|下列选项中,属于栈和队列共同点的是()() A、都是先进先出 B、都是先进后出 C、没有共同点 D、只允许在端点处插入和删除元素 得分

C语言基础、经典:交换a、b值较好的方法

交换a、b的值在C语言的学习中是很常见的问题。最常用的方法就是引入一个中间变量当做中间介质来交换a、b的值。 代码如下: v o id c ha ng e_ab(i n t*a,in t*b) { in t te mp=0; te mp=*a; *a=*b; *b=t em p; } 注意不能写为: v o id c ha ng e_ab(i n t a,i nt b) { in t te mp=0; te mp=a; a=b; b=te mp; } 普通的变量传递,则不会改变内存内容,以为普通变量作为参数时,其实是在内存块(栈空间)中新申请了一块空闲块,不是原来的内存块,而函数调用完毕之后,这块新申请的内存块会由于变量的作用域失效而被系统回收。 如果把指针作为实参进行传递,也就是把内存地址传了过去,那么操作这个指针所指向的内存块,必然会改变这个内存的内容了。 以上这种方法就是最常见的方法。那么,你知道如何将a、b的值进行交换,并且不使用任何其他的中间变量? 方法一:采用算术的方法 v o id c ha ng e_ab(i n t*a,in t*b) { *a=*a +*b; *b=*a -*b; *a=*a -*b; } 方法二:采用异或的方法 v o id c ha ng e_ab(i n t*a,in t*b) { *a=*a ^*b; *b=*a ^*b; *a=*a ^*b; } 方法一存在一个潜在的危险,当形参的类型改为无符号16位时,若a、b的值很大,那么a+b的值就有可能超出16位整数所能表示的范围,从而造成程序运行错误。方法二则没有这个问题,这是一种比较好的方法。

C语言入门经典(第4版)课后练习参考答案

目录 第1章C语言编程............................................................................... 错误!未定义书签。 练习1.1 .............................................................................................. 错误!未定义书签。 练习1.2 .............................................................................................. 错误!未定义书签。 练习1.3 .............................................................................................. 错误!未定义书签。第2章编程初步 .................................................................................. 错误!未定义书签。 习题2.1 .............................................................................................. 错误!未定义书签。 习题2.2 .............................................................................................. 错误!未定义书签。 习题2.3 .............................................................................................. 错误!未定义书签。 习题2.4 .............................................................................................. 错误!未定义书签。第3章条件判断 .................................................................................. 错误!未定义书签。 习题3.1 .............................................................................................. 错误!未定义书签。 习题3.2 .............................................................................................. 错误!未定义书签。 习题3.3 .............................................................................................. 错误!未定义书签。 习题3.4 .............................................................................................. 错误!未定义书签。第4章循环 .......................................................................................... 错误!未定义书签。 习题4.1 .............................................................................................. 错误!未定义书签。 习题4.2 .............................................................................................. 错误!未定义书签。 习题4.3 .............................................................................................. 错误!未定义书签。 习题4.4 .............................................................................................. 错误!未定义书签。 习题4.5 .............................................................................................. 错误!未定义书签。第5章数组 .......................................................................................... 错误!未定义书签。 习题5.1 .............................................................................................. 错误!未定义书签。 习题5.2 .............................................................................................. 错误!未定义书签。

C语言入门教程

51 单片机 C 语言入门教程(磁动力工作室) 51 单片机 C 语言学习杂记
学习单片机实在不是件易事,一来要购买高价格的编程器,仿真器,二来要学习编程语 言,还有众多种类的单片机选择真是件让人头痛的事.在众多单片机中 51 架构的芯片风行 很久,学习资料也相对很多,是初学的较好的选择之一.51 的编程语言常用的有二种,一 种是汇编语言,一种是 C 语言.汇编语言的机器代码生成效率很高但可读性却并不强,复 杂一点的程序就更是难读懂,而 C 语言在大多数情况下其机器代码生成效率和汇编语言相 当,但可读性和可移植性却远远超过汇编语言,而且 C 语言还可以嵌入汇编来解决高时效 性的代码编写问题.对于开发周期来说,中大型的软件编写用 C 语言的开发周期通常要小 于汇编语言很多.综合以上 C 语言的优点,我在学习时选择了 C 语言.以后的教程也只是 我在学习过程中的一些学习笔记和随笔,在这里加以整理和修改,希望和大家一起分享,一 起交流,一起学习,一起进步. *注:可以肯定的说这个教程只是为初学或入门者准备的,笔者本人也只是菜鸟一只, 有望各位大侠高手指点错误提出建议. 明浩 2003-3-30 pnzwzw@https://www.doczj.com/doc/c611243848.html,
第一课 建立您的第一个 C 项目
使用 C 语言肯定要使用到 C 编译器,以便把写好的 C 程序编译为机器码,这样单片机 才能执行编写好的程序.KEIL uVISION2 是众多单片机应用开发软件中优秀的软件之一, 它支持众多不同公司的 MCS51 架构的芯片,它集编辑,编译,仿真等于一体,同时还支持, PLM,汇编和 C 语言的程序设计,它的界面和常用的微软 VC++的界面相似,界面友好,易 学易用,在调试程序,软件仿真方面也有很强大的功能.因此很多开发 51 应用的工程师或 普通的单片机爱好者,都对它十分喜欢. 以上简单介绍了 KEIL51 软件,要使用 KEIL51 软件,必需先要安装它.KEIL51 是一个 商业的软件,对于我们这些普通爱好者可以到 KEIL 中国代理周立功公司的网站上下载一份 能编译 2K 的 DEMO 版软件,基本可以满足一般的个人学习和小型应用的开发. (安装的方 法和普通软件相当这里就不做介绍了) 安装好后,您是不是迫不及待的想建立自己的第一个 C 程序项目呢?下面就让我们一 起来建立一个小程序项目吧.或许您手中还没有一块实验板,甚至没有一块单片机,不过没 有关系我们可以通过 KEIL 软件仿真看到程序运行的结果. 首先当然是运行 KEIL51 软件.怎么打开?噢,天!那您要从头学电脑了.呵呵,开个 玩笑,这个问题我想读者们也不会提的了:P.运行几秒后,出现如图 1-1 的屏幕.
图 1-1 启动时的屏幕
-1-

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