关闭

关闭

关闭

封号提示

内容

首页 单片机C语言入门.pdf

单片机C语言入门.pdf

单片机C语言入门.pdf

上传者: fang18684 2010-12-18 评分 0 0 0 0 0 0 暂无简介 简介 举报

简介:本文档为《单片机C语言入门pdf》,可适用于IT/计算机领域,主题内容包含WWWHUSOONCOM上海沪生电子产品使用说明书http:wwwhusooncom地址:上海市北京东路号上海赛格电子市场C电话:-传真:-(人工传符等。

WWWHUSOONCOM上海沪生电子产品使用说明书http:wwwhusooncom地址:上海市北京东路号上海赛格电子市场C电话:-传真:-(人工传真)EMAIL:SALESHUSOONCOM(销售)SERVICEHUSOONCOM单片机的C语言轻松入门随着单片机开发技术的不断发展目前已有越来越多的人从普遍使用汇编语言到逐渐使用高级语言开发其中主要是以C语言为主市场上几种常见的单片机均有其C语言开发环境。这里以最为流行的C单片机为例来学习单片机的C语言编程技术。本书共分六章每章一个专题以一些待完成的任务为中心围绕该任务介绍C语言的一些知识每一个任务都是可以独立完成的每完成一个任务都能掌握一定的知识等到所有的任务都完成后即可以完成C语言的入门工作。第章C语言概述及其开发环境的建立学习一种编程语言最重要的是建立一个练习环境边学边练才能学好。Keil软件是目前最流行开发C系列单片机的软件Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案通过一个集成开发环境(µVision)将这些部份组合在一起。在学会使用汇编语言后学习C语言编程是一件比较容易的事我们将通过一系列的实例介绍C语言编程的方法。图所示电路图使用S单片机作为主芯片这种单片机性属于C系列其内部有K的FLASHROM,可以反复擦写并有ISP功能支持在线下载非常适于做实验。S的P引脚上接个发光二极管P~P引脚上接个按钮开关我们的任务是让接在P引脚上的发光二极管按要求发光。.简单的C程序介绍例:让接在P引脚上的LED发光。*************************************************平凡单片机工作室http:wwwmcustudiocomCopyrightpingfan'smcustudioAllrightsReserved作者:周坚dddlc单灯点亮程序*************************************************图接有LED的单片机基本电路PEAVPPVCCXTALXTALGNDRSTVVREKUCYPPKPZDD#include“regh”sbitP=P^voidmain(){P=}这个程序的作用是让接在P引脚上的LED点亮。下面来分析一下这个C语言程序包含了哪些信息。)“文件包含”处理。程序的第一行是一个“文件包含”处理。所谓“文件包含”是指一个文件将另外一个文件的内容全部包含进来所以这里的程序虽然只有行但C编译器在处理的时候却要处理几十或几百行。这里程序中包含REGh文件的目的是为了要使用P这个符号即通知C编译器程序中所写的P是指C单片机的P端口而不是其它变量。这是如何做到的呢?打开regh可以看到这样的一些内容:*REGHHeaderfileforgenericCandCmicrocontrollerCopyright(c)KeilElektronikGmbHandKeilSoftware,IncAllrightsreserved**BYTERegister*sfrP=xsfrP=xsfrP=xAsfrP=xBsfrPSW=xDsfrACC=xEsfrB=xFsfrSP=xsfrDPL=xsfrDPH=xsfrPCON=xsfrTCON=xsfrTMOD=xsfrTL=xAsfrTL=xBsfrTH=xCsfrTH=xDsfrIE=xAsfrIP=xBsfrSCON=xsfrSBUF=x*BITRegister**PSW*sbitCY=xDsbitAC=xDsbitF=xDsbitRS=xDsbitRS=xDsbitOV=xDsbitP=xD*TCON*sbitTF=xFsbitTR=xEsbitTF=xDsbitTR=xCsbitIE=xBsbitIT=xAsbitIE=xsbitIT=x*IE*sbitEA=xAFsbitES=xACsbitET=xABsbitEX=xAAsbitET=xAsbitEX=xA*IP*sbitPS=xBCsbitPT=xBBsbitPX=xBAsbitPT=xBsbitPX=xB*P*sbitRD=xBsbitWR=xBsbitT=xBsbitT=xBsbitINT=xBsbitINT=xBsbitTXD=xBsbitRXD=xB*SCON*sbitSM=xFsbitSM=xEsbitSM=xDsbitREN=xCsbitTB=xBsbitRB=xAsbitTI=xsbitRI=x熟悉C内部结构的读者不难看出这里都是一些符号的定义即规定符号名与地址的对应关系。注意其中有sfrP=x这样的一行(上文中用黑体表示)即定义P与地址x对应P口的地址就是x(x是C语言中十六进制数的写法相当于汇编语言中写H)。从这里还可以看到一个频繁出现的词:sfrsfr并标准C语言的关键字而是Keil为能直接访问C中的SFR而提供了一个新的关键词其用法是:sfrt变量名=地址值。)符号P来表示P引脚。在C语言里如果直接写PC编译器并不能识别而且P也不是一个合法的C语言变量名所以得给它另起一个名字这里起的名为P可是P是不是就是P呢?你这么认为C编译器可不这么认为所以必须给它们建立联系这里使用了KeilC的关键字sbit来定义sbit的用法有三种:第一种方法:sbit位变量名=地址值第二种方法:sbit位变量名=SFR名称^变量位地址值第三种方法:sbit位变量名=SFR地址值^变量位地址值如定义PSW中的OV可以用以下三种方法:sbitOV=xd()说明:xd是OV的位地址值sbitOV=PSW^()说明:其中PSW必须先用sfr定义好sbitOV=xD^()说明:xD就是PSW的地址值因此这里用sfrP=P^就是定义用符号P来表示P引脚如果你愿意也可以起P一类的名字只要下面程序中也随之更改就行了。)main称为“主函数”。每一个C语言程序有且只有一个主函数函数后面一定有一对大括号“{}”在大括号里面书写其它程序。从上面的分析我们了解了部分C语言的特性下面再看一个稍复杂一点的例子。例让接在P引脚上的LED闪烁发光*************************************************平凡单片机工作室http:wwwmcustudiocomCopyrightpingfan'smcustudioAllrightsReserved作者:周坚ddssc单灯闪烁程序*************************************************#include"regh"#defineucharunsignedchar#defineuintunsignedintsbitP=P^*延时程序由Delay参数确定延迟时间*voidmDelay(unsignedintDelay){unsignedintifor(Delay>Delay){for(i=i<i){}}}voidmain(){for(){P=!P取反P引脚mDelay()}}程序分析:主程序main中的第一行暂且不看第二行是“P=!P”在P前有一个符号“!”符号“!”是C语言的一个运算符就像数学中的“”、“”一样是一种运算任号意义是“取反”即将该符号后面的那个变量的值取反。注意:取反运算只是对变量的值而言的并不会自动改变变量本身。可以认为C编译器在处理“!P”时将P的值给了一个临时变量然后对这个临时变量取反而不是直接对P取反因此取反完毕后还要使用赋值符号(“=”)将取反后的值再赋给P这样如果原来P是低电平(LED亮)那么取反后P就是高电平(LED灭)反之如果P是高电平取反后P就是低电平这条指令被反复地执行接在P上灯就会不断“亮”、“灭”。该条指令会被反复执行的关键就在于main中的第一行程序:for()这里不对此作详细的介绍读者暂时只要知道这行程序连同其后的一对大括号“{}”构成了一个无限循环语句该大括号内的语句会被反复执行。第三行程序是:“mDelay()”这行程序的用途是延时s时间由于单片机执行指令的速度很快如果不进行延时灯亮之后马上就灭灭了之后马上就亮速度太快人眼根本无法分辨。这里mDelay()并不是由KeilC提供的库函数即你不能在任何情况下写这样一行程序以实现延时。如果在编写其它程序时写上这么一行会发现编译通不过。那么这里为什么又是正确的呢?注意观察可以发现这个程序中有voidmDelay(…)这样一行可见mDelay这个词是我们自己起的名字并且为此编写了一些程序行如果你的程序中没有这么一段程序行那就不能使用mDelay()了。有人脑子快可能马上想到我可不可以把这段程序也复制到我其它程序中然后就可以用mDelay()了呢?回答是那当然就可以了。还有一点需要说明mDelay这个名称是由编程者自己命名的可自行更改但一旦更改了名称main()函数中的名字也要作相应的更改。mDelay后面有一个小括号小括号里有数据()这个被称之“参数”用它可以在一定范围内调整延时时间的长短这里用来要求延时时间为毫秒要做到这一点必须由我们自己编写的mDelay那段程序决定的详细情况在后面循环程序中再作分析这里就不介绍了。.Keil工程的建立要使用Keil软件首先要正确安装Keil软件该软件的Eval版本可以直接去http:wwwkeilcom下载安装时选择EvalVision其它步骤与一般Windows程序安装类似这里就不再赘述了。安装完成后将Ledkeydll文件复制到Keil安装目录下的CBIN文件夹下这是作者提供的键盘与LED实验仿真板可与Keil软件配合在计算机上模拟LED和按键的功能。启动µVison点击“FileÆNew…”在工程管理器的右侧打开一个新的文件输入窗口在这个窗口里输入例中的源程序注意大小写及每行后的分号不要错输及漏输。输入完毕之后选择“FileÆSave”给这个文件取名保存取名字的时候必须要加上扩展名一般C语言程序均以“C”为扩展名这里将其命名为examc保存完毕后可以将该文件关闭。Keil不能直接对单个的C语言源程序进行处理还必须选择单片机型号确定编译、汇编、连接的参数指定调试的方式而且一些项目中往往有多个文件为管理和使用方便Keil使用工程(Project)这一概念将这些参数设置和所需的所有文件都加在一个工程中只能对工程而不能对单一的源程序进行编译和连接等操作。点击“Project>NewProject…”菜单出现对话框要求给将要建立的工程起一个名字这里起名为exam不需要输入扩展名。点击“保存”按钮出现第二个对话框如图所示这个对话框要求选择目标CPU(即你所用芯片的型号)Keil支持的CPU很多这里选择Atmel公司的S芯片。点击ATMEL前面的“”号展开该层点击其中的S然后再点击“确定”按钮回到主窗口此时在工程窗口的文件页中出现了“Target”前面有“”号点击“”号展开可以看到下一层的“SourceGroup”这时的工程还是一个空的工程里面什么文件也没有需要手动把刚才编写好的源程序加入点击“SourceGroup”使其反白显示然后点击鼠标右键出现一个下拉菜单如图所示选中其中的“AddfiletoGroup”SourceGroup”出现一个对话框要求寻找源文件。双击examc文件将文件加入项目注意在文件加入项目后该对话框并不消失等待继续加入其它文件但初学时常会误认为操作没有成功而再次双击同一文件这时会出现如图所示的对话框提示你所选文件已在列表中此时应点击“确定”返回前一对话框然后点击“Close”即可返回主接口返回后点击“SourceGroup”前的加号examc文件已在其中。双击文件名即打开该源程序。.工程的详细设置工程建立好以后还要对工程进行进一步的设置以满足要求。首先点击左边Project窗口的Target然后使用菜单“Project>Optionfortarget‘target’”即出现对工程设置的对话框这个对话框共有个页面大部份设置项取默认值就行了。Target页图选择单片机型号图加入文件如图所示Xtal后面的数值是晶振频率值默认值是所选目标CPU的最高可用频率值该值与最终产生的目标代码无关仅用于软件模拟调试时显示程序执行时间。正确设置该数值可使显示时间与实际所用时间一致一般将其设置成与你的硬件所用晶振频率相同如果没必要了解程序执行的时间也可以不设。MemoryModel用于设置RAM使用情况有三个选择项:Small:所有变量都在单片机的内部RAM中Compact:可以使用一页(字节)外部扩展RAMLarget:可以使用全部外部的扩展RAM。CodeModel用于设置ROM空间的使用同样也有三个选择项:Small:只用低于K的程序空间Compact:单个函数的代码量不能超过K整个程序可以使用K程序空间Larget:可用全部K空间这些选择项必须根据所用硬件来决定由于本例是单片应用所以均不重新选择按默认值设置。Operating:选择是否使用操作系统可以选择Keil提供了两种操作系统:Rtxtiny和Rtxfull也可以不用操作系统(None)这里使用默认项None即不用操作系统。图设置目标图重复加入源程序得到的提示OutPut页如图所示这里面也有多个选择项其中CreatHexfile用于生成可执行代码文件,该文件可以用编程器写入单片机芯片其格式为intelHEX格式文件的扩展名为HEX默认情况下该项未被选中如果要写片做硬件实验就必须选中该项。工程设置对话框中的其它各页面与C编译选项、A的汇编选项、BL连接器的连接选项等用法有关这里均取默认值不作任何修改。以下仅对一些有关页面中常用的选项作一个简单介绍。Listing页该页用于调整生成的列表文件选项。在汇编或编译完成后将产生(*lst)的列表文件在连接完成后也将产生(*m)的列表文件该页用于对列表文件的内容和形式进行细致的调节其中比较常用的选项是“CCompileListing”下的“AssambleCode”项选中该项可以在列表文件中生成C语言源程序所对应的汇编代码建议会使用汇编语言的C初学者选中该项在编译完成后多观察相应的List文件查看C源代码与对应汇编代码对于提高C语言编程能力大有好处。C页该页用于对Keil的C编译器的编译过程进行控制其中比较常用的是“CodeOptimization”组如图所示该组中Level是优化等级C在对源程序进行编译时可以对代码多至级优化默认使用第级一般不必修改如果在编译中出现一些问题可以降低优化级别试一试。Emphasis是选择编译优先方式第一项是代码量优化(最终生成的代码量小)第二项是速度优先(最终生成的代码速度快)第三项是缺省。默认采用速度优先可根据需要更改。图设置输出文件Debug页该页用于设置调试器Keil提供了仿真器和一些硬件调试方法如果没有相应的硬件调试器应选择UseSimulator其余设置一般不必更改有关该页的详细情况将在程序调试部分再详细介绍。至此设置完成下面介绍如何编译、连接程序以获得目标代码以及如何进行程序的调试工作。.编译、连接下面我们通过一个例子来介绍C程序编译、连接的过程。这个例子使P口所接LED以流水灯状态显示。将下面的源程序输入命名为examc并建立名为exam的工程文件将examc文件加入该工程中设置工程在Target页将Xtal后的值由改为以便后面调试时观察延时时间是否正确本项目中还要用到我们所提供的实验仿真板为此需在Debug页对DialogDLL对话框作一个设置在进行项目设置时点击Debug打开Debug页可以看到DialogDLL对话框后的Parmeter:输入框中已有默认值pAT在其后键入空格后再输入dledkey如图所示。例使P口所接LED以流水灯状态显示**************************************************平凡单片机工作室http:wwwmcustudiocomCopyrightpingfan'sMcuStudioAllrightsReserved图C编译器选项作者:周坚lsdc流水灯程序**************************************************#include"regh"#include"intrinsh"#defineucharunsignedchar#defineuintunsignedint*延时程序由Delay参数确定延迟时间*voidmDelay(unsignedintDelay){unsignedintifor(Delay>Delay){for(i=i<i){}}}voidmain(){unsignedcharOutData=xfefor(){图Debug选项设置P=OutDataOutData=crol(OutData,)循环左移mDelay()*延时毫秒*}}设置好工程后即可进行编译、连接。选择菜单Project>Buildtarget对当前工程进行连接如果当前文件已修改将先对该文件进行编译然后再连接以产生目标代码如果选择RebuildAlltargetfiles将会对当前工程中的所有文件重新进行编译然后再连接确保最终生产的目标代码是最新的而Translate…项则仅对当前文件进行编译不进行连接。以上操作也可以通过工具栏按钮直接进行。图是有关编译、设置的工具栏按钮从左到右分别是:编译、编译连接、全部重建、停止编译和对工程进行设置。编译过程中的信息将出现在输出窗口中的Build页中如果源程序中有语法错误会有错误报告出现双击该行可以定位到出错的位置对源程序修改之后再次编译最终要得到如图所示的结果提示获得了名为examhex的文件该文件即可被编程器读入并写到芯片中同时还可看到该程序的代码量(code=)内部RAM的使用量(data=)外部RAM的使用量(xdata=)等一些信息。除此之外编译、连接还产生了一些其它相关的文件可被用于Keil的仿真与调试到了这一步后即进行调试。.程序的调试在对工程成功地进行汇编、连接以后按CtrlF或者使用菜单Debug>StartStopDebugSession即可进入调试状态Keil内建了一个仿真CPU用来模拟执行程序该仿真CPU功能强大可以在没有硬件和仿真机的情况下进行程序的调试。进入调试状态后Debug菜单项中原来不能用的命令现在已可以使用了多出一个用于运行和调试的工具条如图所示Debug菜单上的大部份命令可以在此找到对应的快捷按钮从左到右依次是复位、运行、暂停、单步、过程单步、执行完当前子程序、运行到当前行、下一状态、打开跟踪、观察跟踪、反汇编窗口、观察窗口、代码作用范围分析、#串行窗口、内存窗口、性能分析、工具按钮等命令。点击菜单Peripherals即会多出一项“键盘LED仿真板(K)”选中该项即会出现如图有关编译、连接、项目设置的工具条图调试工具条图编译、连接后得到目标代码图所示界面。使用菜单STEP或相应的命令按钮或使用快捷键F可以单步执行程序使用菜单STEPOVER或功能键F可以以过程单步形式执行命令所谓过程单步是指把C语言中的一个函数作为一条语句来全速执行。按下F键可以看到源程序窗口的左边出现了一个黄色调试箭头指向源程序的第一行。每按一次F即执行该箭头所指程序行然后箭头指向下一行当箭头指向“mDelay()”行时再次按下F会发现箭头指向了延时子程序mDelay的第一行。不断按F键即可逐步执行延时子程序。如果mDelay程序有错误可以通过单步执行来查找错误但是如果mDelay程序已正确每次进行程序调试都要反复执行这些程序行会使得调试效率很低为此可以在调试时使用F来替代F在main函数中执行到mDelay()时将该行作为一条语句快速执行完毕。Keil软件还提供了一些窗口用以观察一些系统中重要的寄存器或变量的值这也是很重要的调试方法。以下通过一个对延时程序的延迟时间的调整来对这些调试方法作一个简单的介绍。这个程序中用到了延时程序mDelay如果使用汇编语言编程每段程序的延迟时间可以非常精确地计算出来而使用C语言编程就没有办法事先计算了。为此可以使用观察程序执行时间的方法了来解。进入调试状态后窗口左侧是寄存器和一些重要的系统变量的窗口其中有一项是sec即统计从开始执行到目前为止用去的时间。按F以过程单步的形式执行程序在执行到mDelay()这一行之前停下查看sec的值(把鼠标停在sec后的数值上即可看到完整的数值)记下该数值然后按下F执行完mDelay()后再次观察sec值如图所示这里前后两次观察到的值分别是:和其差值为s如果将该值改为可获得更接近于s的数值而当该值取时所获得的延时值将小于s因此最佳的取值应该是。图单片机实验仿真板.C语言的一些特点通过上述的几个例子可以得出一些结论:、C程序是由函数构成的一个C源程序至少包括一个函数一个C源程序有且只有一个名为main()的函数也可能包含其它函数因此函数是C程序的基本单位。主程序通过直接书写语句和调用其它函数来实现有关功能这些其它函数可以是由C语言本身提供给我们的(如例中的crol(…)函数)这样的函数称之为库函数也可以是用户自己编写的(如例、中用的mDelay(…)函数)这样的函数称之为用户自定义函数。那么库函数和用户自定义函数有什么区别呢?简单地说任何使用KeilC语言的人都可以直接调用C的库函数而不需要为这个函数写任何代码只需要包含具有该函数说明的相应的头文件即可而自定义函数则是完全个性化的是用户根据自己需要而编写的。KeilC提供了多个库函数供我们直接使用。、一个函数由两部份组成:()函数的首部、即函数的第一行。包括函数名、函数类型、函数属性、函数参数(形参)名、参数类型。例如:voidmDelay(unsignedintDelayTime)一个函数名后面必须跟一对圆括号即便没有任何参数也是如此。()函数体即函数首部下面的大括号“{}”内的部份。如果一个函数内有多个大括号则最外层的一对“{}”为函数体的范围。函数体一般包括:声明部份:在这部份中定义所用到的变量例中unsignedcharj。执行部份:由若干个语句组成。在某此情况下也可以没有声明部份甚至即没有声明部份也没有执行部份如:voidmDelay(){}这是一个空函数什么也不干但它是合法的。在编写程序时可以利用空函数比如主程序需要调用一个延时函数可具体延时多少怎么个延时法暂时还不清楚我们可以主程序的框架结构弄清先编译通过把架子搭起来再说至于里面的细节可以在以后慢慢地填这时利用空函数先写这么一个函数这样在主程序中就可以调用它了。、一个C语言程序总是从main函数开始执行的而不管物理位置上这个main()放在什么地方。例中就是放在了最后事实上这往往是最常用的一种方式。图观察sec确定延时时间、主程序中的mDelay如果写成mdelay就会编译出错即C语言区分大小写这一点往往让初学者非常困惑尤其是学过一门其它语言的人有人喜欢有人不喜欢但不管怎样你得遵守这一规定。、C语言书写的格式自由可以在一行写多个语句也可以把一个语句写在多行。没有行号(但可以有标号)书写的缩进没有要求。但是建议读者自己按一定的规范来写可以给自己带来方便。、每个语句和资料定义的最后必须有一个分号分号是C语句的必要组成部份。、可以用*…*的形式为C程序的任何一部份作注释在“*”开始后一直到“*”为止的中间的任何内容都被认为是注释所以在书写特别是修改源程序时特别要注意有时无意之中删掉一个“*”结果从这里开始一直要遇到下一个“*”中的全部内容都被认为是注释了。原本好好的一个程序编译已过通过了稍作修改一下出现了几十甚至上百个错误初学C的人往往对此深感头痛这时就要检查一下是不是有这样的情况如果有的话赶紧把这个“*”补上。特别地KeilC也支持C风格的注释就是用“”引导的后面的语句是注释例:P=!P取反P这种风格的注释只对本行有效所以不会出现上面的问题而且书写比较方便所以在只需要一行注释的时候我们往往采用这种格式。但要注意只有KeilC支持这种格式早期的FranklinC以及PC机上用的TC都不支持这种格式的注释用上这种注释编译时通不过会报告编译错误。第章分支程序设计第一部分课程学习了如何建立KeilC的编程环境并了解了一些C语言的基础知识这一部分将通过一个键控流水灯程序的分析来学习分支程序设计。.程序功能与实现硬件电路描述如下:S单片机的P口接有个LED当某一端口输出为“”时相应的LED点亮P、P、P、P分别接有四个按钮K~K按下按钮时相应引脚被接地。现要求编写可键控的流水灯程序当K按下时开始流动K按下时停止流动全部灯灭K使灯由上往下流动K使灯由下往上流动。下面首先给出程序然后再进行分析。例:键控流水灯的程序#include"regh"#include"intrinsh"#defineucharunsignedcharvoidmDelay(unsignedintDelayTime){unsignedintj=for(DelayTime>DelayTime){for(j=j<j){}}}ucharKey(){ucharKeyVuchartmpP=P|xc四个按键所接位置KeyV=Pif((KeyV|xc)==xff)无键按下return()mDelay()延时去键抖KeyV=Pif((KeyV|xc)==xff)return()else{for(){tmp=Pif((tmp|xc)==xff)break}return(KeyV)}}voidmain(){unsignedcharOutData=xfebitUpDown=bitStart=ucharKValuefor(){KValue=Key()switch(KValue){casexfb:P=,Start{Start=break}casexf:P=,Stop{Start=break}casexef:P=Up{UpDown=break}casexdf:P=Down{UpDown=break}}if(Start){if(UpDown)OutData=crol(OutData,)elseOutData=cror(OutData,)P=OutData}elseP=xff否则灯全灭mDelay()}}单片机的C语言轻松入门输入源程序保存为examc建立名为exam的工程文件选择的CPU型号为ATS在Debug页加入ddpj以便使用单片机实验仿真板其他按默认设置。正确编译、链接后进入调试模式点击PeripheralsÆ实验仿真板打开实验仿真板选择Run(全速运行)此时实验仿真板没有变化用鼠标点击上方的K按钮松开后即可看到Led“流动”起来初始状态是由下往上流动点击K按钮可改变LED的流动方向改为由上往下流动点击K按钮又可将流动方向变换回来。点击K按钮可使流动停止所有LED“熄灭”。..程序分析本程序中运用到了两种选择结构的程序:if和switchif语句最常用的形式是:if(关系表达式)语句else语句..关系运算符和关系表达式所谓“关系运算”实际上是两个值作一个比较判断其比较的结果是否符合给定的条件。关系运算的结果只有种可能即“真”和“假”。例:>的结果为真而<的结果为假。C语言一共提供了种关系运算符:“<”(小于)、“<=”(小于等于)、“>”(大于)、“>=(大于等于)”、“==”(等于)和“!=”(不等于)。用关系运算符将两个表达式连接起来的式子称为关系表达式。例:a>bab>bc(a=)>=(b=)等都是合法的关系表达式。关系表达式的值只有两种可能即“真”和“假”。在C语言中没有专门的逻辑型变量如果运算的结果是“真”用数值“”表示而运算的结果是“假”则用数值“”表示。如式子:x=>的结果是x等于原因是>的结果是“真”即其结果为该结果被“=”号赋给了x这里须注意“=”不是等于之意(C语言中等于用“==”表示)而是赋值号即将该号后面的值赋给该号前面的变量所以最终结果是x等于。式子:x=<=的结果是x=请自行分析。.逻辑运算符和逻辑表达式用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。C语言提供了三种逻辑运算符:“”(逻辑与)、“||”(逻辑或)和“!”(逻辑非)。C语言编译系统在给出逻辑运算的结果时用“”表示真而用“”表示假但是在判断一个量是否是“真”时以代表“假”而以非代表“真”这一点务必要注意。以下是一些例子:()若a=则!a的值为因为被作为真处理取反之后为假系统给出的假的值为。()如果a=-结果与上完全相同原因也同上初学时常会误以为负值为假所以这里特别提醒注意。()若a=b=则ab的值为a||b的结果也为原因为参于逻辑运算时不论a与b的值究竟是多少只要是非零就被当作是“真”“真”与“真”相与或者相或结果都为真系统给出的结果是。单片机的C语言轻松入门.if语句if语句是用来判定所给定的条件是否满足根据判定的结果(真或假)决定执行给出的两种操作之一。C语言提供了三种形式的if语句if(表达式)语句如果表达式的结果为真则执行语句否则不执行if(表达式)语句else语句如果表达式的结果为真则执行语句否则执行语句.if(表达式)语句elseif(表达式)语句elseif(表达式)语句…elseif(表达式m)语句melse语句n这条语句执行如图所示。上述程序中的如下语句:if((KeyV|xc)==xff)无键按下return()是第一种if语句的应用。该语句中“|”符号是C语言中的位运算符按位相或的意思相当于汇编语言中“ORL”指令将读取的P口的值KeyV与xc(即B)按位或如果结果为xff(即B)说明没有键被按下因为中间位接有按键如果有键按下那么P口值的中间位中必然有一位或更多位是“”。该语句中的“return()”是返回之意相当于汇编语言中的“ret”指令通过该语句可以带返回值即该号中的数值返回值就是这个函数的值在这个函数被调用时用了如下的形式:KValue=Key()因此返回的结果是该值被赋给Kvalue这个变量。因此如果没有键被按下则直接返回并且Kvalue的值将变为。如果有键被按下那么return()将不会被执行。程序其他地方还有这样的用法请注意观察与分析。程序中:if(Start){…灯流动显示的代码}elseP=xff否则灯全灭是if语句的第二种用法其中Start是一个位变量该变量在main函数的中被定义并赋以初值该变量在按键K被按下后置为而K按下后被清为用来控制灯流动是否开始。这里就是判断该变量并决定灯流动是否开始的代码观察if后面括号中的写法与其他语言中写法很不一样并没有一个关系表达式而仅仅只有一个变量名C根据这个量是还是来决定程序的走向如果为则执行灯流动显示的代码如果为则执行P=xff语句。可见在C语言中数据类型的概念比其他很多的编程语言要“弱化”或者说C更着重从本质的角度去考虑问题if后面的括号中不仅可以是关系表达式也可以是算术表达式还可以就是一个变量甚至是一个常量不管怎样C总是根据这个表达式的值是零还是非零来决定程序的走向这个特点是其他中所没有的请注意理解。if语句的第三种用法在本程序中没有出现下面我们举一例说明。在上述的键盘处理函单片机的C语言轻松入门数Key中如果没键被按下返回值是如果有键被按下经过去键抖的处理将返回键值程序中的“return(KeyV)”即返回键值。当K被按下(P接地)时返回值是xfb(B)而K被按下(P接地)时返回值是xf(B)K被按下(P接地)时返回值是xef(B)K被按下(P接地)时返回值是xdf(B)该值将被赋给主程序中调用键盘程序的变量KValue。程序用了另一种选择结构switch进行处理关于switch将在稍后介绍。下面用if语句来改写:if(KValue==xfb){Start=}elseif(KValue==xf){Start=}elseif(KValue==xef){UpDown=}elseif(KValue==xdf){UpDown=}else{意外处理}……程序中第一条语句判断Kvalue是否等于xfb如果是就执行Start=执行完毕即退出if语句执行if语句下面的程序如果Kvalue不等于xfb就转去下一个elseif即判断Kvalue是否等于xf如果等于则执行Start=并退出if语句…这样一直到最后一个elseif后面的条件判断完毕为止如果所有的条件都不满足那么就去执行else后面的语句(通常这意味着出现了异常在这里来统一处理这种异常情况)。.if语句的嵌套在if语句中又包含一个或多个语句称为if语句的嵌套。一般形式如下if()if()语句else语句elseif()语句else语句应当注意if与else的配对关系else总是与它上面的最近的if配对。如果写成if()if()语句else语句编程者的本意是外层的if与else配对缩进的if语句为内嵌的if语句但实际上else将与缩进的那个if配对因为两者最近从而造迈岐义。为避免这种情况建议编程时使用大括号将内嵌的if语句括起来这样可以避免出现这样的问题。单片机的C语言轻松入门.swich语句当程序中有多个分支时可以使用if嵌套实现但是当分支较多时则嵌套的if语层数多程序冗长而且可读性降低。C语言提供了switch语句直接处理多分支选择。Switch的一般形式如下:switch(表达式){case常量表达式:语句case常量表达式:语句……case常量表达式n:语句ndefault:语句n}说明:switch后面括号内的“表达式”ANSI标准允许它为任何类型当表达式的值与某一个case后面的常量表达式相等时就执行此case后面的语句若所有的case中的常量表达式的值都没有与表达式值匹配的就执行default后面的语句每一个case的常量表达式的值必须不相同各个case和default的出现次序不影响执行结果。另外特别需要说明的是执行完一个case后面的语句后并不会自动跳出switch转而去执行其后面的语句如上述例子中如果这么写switch(KValue){casexfb:Start=casexf:Start=casexef:UpDown=casexdf:UpDown=}if(Start){……}假如KValue的值是xfb则在转到此处执行“Start=”后并不是转去执行switch语句下面的if语句而是将从这一行开始依次执行下面的语句即“Start=”、“UpDown=”“UpDown=”显然这样不能满足要求因此通常在每一段case的结束加入“break”语句使流程序退出switch结构即终止switch语句的执行。单片机的C语言轻松入门第章数据类型数据是计算机处理的对象计算机要处理的一切内容最终将要以数据的形式出现因此程序设计中的数据有着很多种不同的含义不同的含义的数据往往以不同的形式表现出来这些数据在计算机内部进行处理、存储时往往有着很大的区别。下面我们来了解C语言数据类型的有关知识。.C语言的数据类型概述C语言中常的数据类型有:整型、字符型、实型等。C语言中数据有常量与变量之分它们分别属于以上这些类型。由以上这此数据类型还可以构成更复杂的数据结构在程序中用到的所有的数据都必须为其指定类型。.常量与变量在程序运行过程中其值不能被改变的量称为常量。常量区分为不同的类型如、为整型常量、为实型常量‘a’、‘b’是字符型常量。例符号常量的使用在P口接有个LED执行下面的程序:#defineLIGHTxfe#include“regh”voidmain(){P=LIGHT}程序中用#defineLIGHTxfe来定义符号LIGHT等于xfe以后程序中所有出现LIGHT的地方均会用xfe来替代因此这个程序执行结果就是P=xfe即接在P引脚上的LED点亮。这种用标识符代表的常量称为符号常量。使用符号常量的好处是:.含义清楚。在单片机程序中常有一些量是具有特定含义的如某单片机系统扩展了一些外部芯片每一块芯片的地址即可用符号常量定义

用户评论(0)

0/200

精彩专题

上传我的资料

每篇奖励 +2积分

资料评价:

/49
0下载券 下载 加入VIP, 送下载券

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部