您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第五章 C51单片机C语言程序设计
Logo嵌入式系统第5章C51单片机C语言程序设计Logo本章内容:C51语言概述C51数据类型和数据存储类型C51运算符和表达式C51程序结构C51函数Logo【任务导入】基于C51语言的静态LED显示系统的实现:利用AT89C51单片机的I/O端口驱动两个八段数码管从“00”到“99”流水显示,即通电后,显示“00”,间隔一段时间后,显示“01”,再间隔一段时间后,显示“02”,直到“99”,然后再显示“00”,往复循环。【任务分析】要实现用两个数码管循环显示数字00~99的功能,我们可把两个数码管的段选线分别连接到单片机的两组I/O口的共16根I/O口线上,再通过程序让单片机的两组I/O口分时输出0~9对应的段码就可以了。LogoC51语言概述1、C语言和C51语言(1)C语言是由早期的BCPL语言发展而来的。1967年,剑桥大学的理查兹(MartinRichards)在对CPL语言进行简化的基础上设计了BCPL(BasicCombinedPogrammingLanguage)语言。1970年,美国贝尔实验室的汤普森(KenThompson)以BCPL语言为基础,设计出简单且接近硬件的B语言。1972年,美国贝尔实验室的里奇(D.M.Ritchie)又以B语言为基础,最终设计出了C的语言1978年,美国电话电报公司(AT&T)贝尔实验室正式发表了C语言。1983年,美国国家标准化协会制定了一个C语言标准通常称为ANSIC。ANSIC在被国际标准化组织ISO所接受后,又经过多次修正,形成了目前的C语言标准。Logo(2)C51语言用C51编写单片机程序时,需要根据单片机存储结构及内部资源定义相应的数据类型和变量,而标准的C语言不需要考虑这些问题。另外,C51包含的数据类型、变量存储模式、输入输出处理、函数等方面与标准的C语言也有一定的区别。其他的语法规则、程序结构及程序设计方法则与标准的C语言相同。C语言编译调试工具效率高,数据类型及运算符丰富,经过不断完善,能满足单片机的开发要求,形成了单片机C语言。为了和ANSIC区别,把51单片机C语言称为C51语言。Logo(3)C51特点●编程者不需要了解单片机的指令系统,仅要求对单片机的存储器结构有初步的了解,至于存储器的分配、寻址方式及数据类型等完全由编译器管理。●程序有规范化的结构,可以分为不同的函数,这种方式可以使程序结构化,将可变的选择与特殊操作组合在一起,增强程序的可读性。●编程和程序的调试时间显著缩短,从而提高了编程的效率,提供的库函数包含许多标准的子程序,具有较强的数据处理能力,可以将编好的程序很容易地移植到新程序。C51作为一种非常方便的语言得到了广泛的支持,目前已经成为单片机开发的主要编程语言。Logo简单C51程序介绍【例1】如图1所示,在P1.0口上接有一个LED发光二极管,要求让发光二极管发光。图1接有LED的单片机基本电路Logo#includereg51.hsbitP1_0=P1^0;voidmain(){P1_0=0;while(1);}程序如下:程序的开始是一个文件包含处理。这段程序中包含的是reg51.h文件,以.h为后缀的称为头文件,该头文件的作用是把特殊功能寄存器中的符号和地址对应起来,这里主要是应用到P1这个符号,如果没有包含reg51.h文件,C51编译器不知道P1具体指什么,在编译过程中就会发生错误。给P1.0取名为P1_0,是通过编译器中增加的关键字sbit来定义的程序最后是主函数,每一个C51程序有且只有一个主函数,函数后面使用一对大括号“{}”,在“{}”中书写具体内容。Logo【例2】如图1所示,要求P1.0口上接的LED发光二极管能闪烁发光。#includereg51.h#defineucharunsignedchar#defineuintunsignedintsbitP1_0=P1^0;voidMdelay(uintDelay);/*被调函数申明*/voidmain(void){for(;;){P1_0=!P1_0;//对P1_0取反Mdelay(1000);}}voidMdelay(uintDelay)//延时子程序,由Delay参数确定延时时间{uchari;for(;Delay0;Delay--){for(i=0;i124;i++){;}}}与上例相同宏定义,即用一个指定的标识符来代替一个字符串,如第二行用uchar来代替unsignedchar;函数申明,如果被调函数在主调函数后面,一般需要声明Logo小结(1)C51程序和C程序一样,也是由函数构成的。一个C51程序至有且只有一个main函数,可以有零个或多个其他函数,因此函数是C51程序的基本单位。main函数可以直接书写语句或者调用其他函数来实现功能,被调用的函数可以是编译器提供的库函数,也可以是用户根据需要编写的函数(如例4.2中的Mdelay函数)。使用KeilC编写的任何程序都可以直接调用其提供的库函数,调用时只需要包含具有该函数的头文件即可。KeilC提供了100多个库函数供用户直接使用。(2)一个函数由以下两部分组成。函数的首部,包括函数名、函数类型、函数参数名、参数类型。如例4.2中Mdelay函数的首部为voidMdelay(uintDelay)↓↓↓↓函数类型函数名参数类型参数名函数体,即函数首部下面大括号里的内容。Logo(3)一个C51程序从main函数开始执行,不管main函数在什么位置。(4)C51中字母区分大小写,如定义是sbitP1_0=P1^0,若后面写成P1_0,在编译时就会出现错误。(5)C51书写自由,一行可以写几个语句,一个语句也能写在几行上。(6)每个语句必须以分号结束。(7)C51中的注释可以采用两种符号。第一种是“/*…*/”符号,从“/*”开始直到“*/”为止,中间的内容都是注释。第二种是“//”引导的注释语句,这种注释只对本行有效。Logo2C51数据类型和数据存储类型2.1常量与变量1、常量和符号常量在程序运行过程中,其值不能改变的量称为常量,如10、0、0x45等。常量一般从字面形式即可以判断,这样的常量称为字面常量或者直接常量。常量也可以用一个标识符来表示,称之为符号常量。【例3】如图1所示,要求点亮P1.0口上接的LED灯。程序如下。#defineLIGHT0xfe#includereg51.hvoidmain(){P1=LIGHT;while(1);}定义符号常量LIGHT,在以后的程序中出现的所有LIGHT,实际上都是指0xfeLogo使用符号常量的优点如下:(1)含义清楚。如上面程序中,从LIGHT就知道它代表灯亮,因此定义符号常量时,应考虑“见名知意”。在一个规范的C51程序中不提倡使用很多直接常量。如若定义sum=10+20+30,则在检查程序时往往会搞不清楚各个常数代表什么含义。(2)在需要改变一个量时,可以做到一改全改。如#definePORTA0x7fff,在程序中要使用端口0x7fff,可以用PORTA来代替,如果端口地址发生变化,变成0x3fff,只要把定义语句改为#definePORTA0x3fff就行了。Logo变量值可以改变的量称为变量。图2变量Logo2.2整型数据1、整型常量的表示方法2、整型变量整型常量即整常数,包括正整数、负整数和0,不能是小数。可以是十进制、八进制(以0开头)和十六进制(以0x开头)。整型变量的基本类型是int,可以根据数值的范围将变量定义为基本整型、短整型或长整型,在int之前分别加上修饰符:short(短整型)或long(长整型)。在实际应用中,变量的值常常是正的(如年龄、学号等),为了充分利用变量的表数范围,可以将上面的三类定义成无符号型,即对以上三类分别加上修饰符unsigned。Logo表4-1整型变量的数据类型类型字节数数值范围int2-215~215-1unsigned[int]20~216-1short[int]2-215~215-1unsignedshort[int]20~216-1long[int]4-231~231-1unsignedlong[int]40~232-1LogoC51中变量必须先定义才能使用,定义整型变量的方式为修饰符变量名例如:inta;//定义一个整型变量aunsignedinta1,a2;//定义两个整型变量a1,a2longb;//定义一个长整型变量bunsignedlongb1,b2;//定义两个长整型变量b1,b2Logo2.3实型数据1、实型常量的表示方法2.实型变量实数又称为浮点数,实数有以下两种表示形式。(1)、十进制小数形式。由数字和小数点组成,如12.5、6.7等。(2)、指数形式。如34e2或34E2都代表34×102。标准C语言中的实型变量分为单精度(float)、双精度(double)和长双精度(longdouble)三种,但KeilC不支持后两种,所以这里不做介绍。float型占用4个字节,能提供的有效数字是有限的,在有效位以外的数字会被舍去。LogoC51中实型数的使用应该注意以下几点:(1)、在8位单片机中一般不要使用实型数,这样会降低程序的运行速度,增加程序的长度。(2)、程序中如果确实用到了实型数,一般不是因为要使用小数点,而是因为用其他类型的变量范围不够大。(3)、很多时候,可以用长整型来代替实型。Logo2.4字符型数据1、字符型常量的表示方法C51中字符型常量是用单引号括起来的一个字符,如‘a’、‘x’、‘?‘等都是字符型常量。C51还允许一些特殊形式的字符型常量,就是以一个“\”开头的字符序列。表2转义字符及其含义字符形式含义ASCII代码\n换行,将当前位置移到下一行开头10\t水平制表,跳到下一个Tab位置9\b退格,将当前位置移到前一列8\r回车,将当前位置移到本行开头13\f换页,将当前位置移到下页开头12\\反斜杠符“\”92\'单引号字符39\双引号字符34\ddd1~3位八进制数代表的字符—\xhh1~2位十六进制数代表的字符—Logo2、字符型变量的表示方法字符型变量用来存放字符常量,一个字符型变量只能存放一个字符。字符型变量的定义形式为:char变量名如:chara;表示定义了一个字符型变量a,a中可以存放一个字符,可以用下面的赋值语句给a赋值:a='c';定义一个字符型变量,系统会为其分配一个字节的存储空间,实际上,给字符型变量赋值后,并不是存储字符型变量本身,而是存储该字符型变量的ASCII码,如上面是将'c'的ASCII码99存储在a中。由于ASCII码也一定是整数,字符型变量可以和前面所叙述的整型变量一样,通过整型数据来赋值,如:chara=99;Logo2.5数组类型1、一维数组的定义数组的维数是指表示数组使用的下标个数,如果数组中每个元素只带有一个下标,称这样的数组为一维数组。一维数组的定义形式为:类型说明符数组名[常量表达式];如:inta[4];Logo2、一维数组的引用C51中,一个数组不能整体应用,数组名是一个地址常量,不能对其赋值,只能使用数组中的元素。方法如下:数组名[下标]下标可以是整型变量或整型表达式,如a[0]、a[i](i是一个整型变量)。Logo3、一维数组的初始化(1)、在定义数组时对数组元素初始化,如:inta[4]={1,2,3,4};经过初始化后,a[0]=1、a[1]=2、a[2]=3、a[3]=4。(2)、可以只给一部分元素赋值,如:inta[4]={1,2};经过初始化后,a[0]=1、a[1]=2、a[2]=0、a[3]=0。(3)、对全部数组元素赋值时,可以不指定数组长度。如:“inta[4]={1,2,3,4};”可以写成“inta[]={1,2,3,4};”。Logo4、字符数组字符数组是指数组中元素的数据类型是字符类型的一维数组。字符数组引用、初始化的方法都与一维数组相同,只是要注意字符数组的元素是字符,有特殊的字面表示格式。字符数组初始化的方法也和一维数组相同。如
本文标题:第五章 C51单片机C语言程序设计
链接地址:https://www.777doc.com/doc-3222079 .html