




已阅读5页,还剩114页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
4.1 C51程序的结构特点4.2 C51语法基础 4.3 C51的数据类型、存储类型及常量与变量 4.4 C51对单片机主要资源的定义4.5 C51的基本运算4.6 C51的构造数据类型4.7 C51的流程构造语句4.8 C51的函数4.9 指针4.10 C51程序设计举例实训四:单片机控制流水灯(C51程序)实训五:计数器的C51程序设计与制作小结习题与思考题,4.1 C51程序的结构特点,4.1.1 C语言与汇编语言的比较 单片机的C51编程与汇编语言编程相比,具有以下优点。(1)对单片机的指令系统不要求有任何的了解,就可以用C语言直接编程操作单片机。(2)寄存器分配、不同存储器的寻址以及数据类型等细节完全由编译器自动管理。(3)程序有规范的结构,可分成不同的函数,可使程序结构化。(4)库中包含许多标准函数,具有较强的数据处理能力,使用十分方便。(5)具有方便的模块化编程技术,使已编好的程序很容易移植。,4.1.2 C51程序的结构特点 举例: 设单片机AT89C51的P1.0口接有一个发光二极管,如图4-1所示。试用C51编程使该发光二极管间隔1s亮灭闪动。,#include /包含51系列单片机头文件#define uint unsigned int /宏定义sbit led1 = P10; /声明单片机P1口的第一位void delayms(uint); /声明延时子函数void main () /主函数 While(1) /大循环 led1= 0; /*点亮接在P1.0引脚上的LED*/ delayms(1000); /延时1秒 led1= 1; /*关闭接在P1.0引脚上的LED*/ delayms(1000); /延时1秒 void delayms(uint xms)/延时x毫秒子函数 uint i,j; for(i=xms;i0;i-)/*i=xms即延时约xms毫秒*/ for(j110;j;j-); ,由以上例子可看出C51程序结构具有以下特点:(1)C 语言程序是由函数构成的。(2)一个函数由两部份组成。函数首部,即函数的第一行。函数体,即函数首部下面的大括号“”内的部分。函数体一般包括:a声明部分:在这部分中定义所用到的变量,如“sbit led1 = P10;”。b执行部分:由若干个语句组成。(3)一个C语言程序,总是从main ()函数开始执行的,而不管物理位置上这个main ()放在什么地方。(4)C语言源程序的前面几行通常是以“#”开头的预处理命令。预处理命令包括文件包含(include)命令、宏(define)命令以及条件编译命令等。,(5)C 语言区分大小写。如将“include”写成“INCLUDE”就会编译出错。(6)C 语言书写的格式自由,可以在一行写多个语句,也可以把一个语句写在多行。(7)每个语句和资料定义的最后必须有一个分号“;”,分号“;”是C语句的必要组成部分,即语句结束标志。但预处理命令、函数头和花括号“”之后不能加分号“;”。(8)可以用/*/的形式为C程序的任何一部分作注释。 C51也支持C+风格的注释,即用“/”引导的后面的语句是注释。例如: P1_0 = !P1_0; /取反P1.0 这种风格的注释,只对本行有效,所以不会出现上面的问题,而且书写也比较方便。因此,程序在只需要一行注释的时候,建议采用这种格式。(9)一个C语言源程序可以由一个或多个源文件组成。,4.2 C51语法基础,4. 2. 1 C语言词汇(1)标识符 在程序中使用的变量名、函数名、标号等统称为标识符。C语言规定,标识符只能是字母(AZ,az)、数字(09)、下划线(_)组成的字符串,并且第一个字符必须是字母或下划线。标准C语言不限制标识符的长度,但它受各种版本的C语言编译系统限制,同时也受到具体机器的限制。在标识符中,大小写是有区别的。标识符虽然可由程序员随意定义,但标识符是用于标识某个量的符号。标识符不能使用系统保留的关键字。,(2)关键字(也叫保留字)数据类型关键字。用于定义或说明变量、函数或其他数据结构的类型。主要有char,double,float,int,long,short,signed,struct,union,unsigned,void,enum等12个。控制语句关键字。用于表示一个语句的功能。主要有break,case,continue,default,do,else,for,goto,if,return,switch,while等12个。存储类型关键字。用于说明变量或函数的存储类型。主要有auto,extern,register,static等4个。预处理命令关键字。用于表示一个处理命令。主要有include、define等2个。其他关键字。主要有const,sizeof,typedef,volatile等4个。(3)运算符 C语言中含有相当丰富的运算符。如强制类型转换运算符、算术运算符、关系运算符、逻辑运算符以及位运算符等。运算符与变量、函数一起组成表达式,表示各种运算功能。运算符由一个或多个字符组成。,(4)分隔符 逗号分隔符。 空格分隔符。4. 2. 2 编译预处理 编译预处理命令概念:计算机将C语言编译为机器语言时进行的预处理。这些命令只在编译时有效,不是计算机运行的可执行语句。编译预处理命令以“#”开头,末尾不加分号,包括头宏命令、文件包含命令、条件编译命令等。 (1)宏命令 作用:用标识符来代表一个字符串,系统在编译之前自动将标识符替换为字符串。主要用于定义常量。宏定义的标识符(常量)一般用大写字母,以便与变量相区别。 定义形式:#define 标识符 字符串 例如:#define PI 3.14 /*后续程序中所有的PI都用3.14代替。即凡是出现PI的地方即表示3.14,这样做有利于阅读程序和修改程序。*/,(2)文件包含 文件包含:指在一个文件中将另一个文件的全部内容包含进来,通常用来将程序中用到的系统函数、宏标识符、自定义函数等的文件包含进来。被包含的文件也叫头文件(以“.h”为扩展名的文件)。 格式:#include或#include“文件名”在Keil C51中常用的包含文件(头文件)有以下三种: reg51.h头文件。reg51.h是对51子系列单片机的特殊功能寄存器进行定义的头文件,使用汇编语言中的特殊功能寄存器名称,将各个特殊功能寄存器定义为该寄存器的直接地址,在C语言中可以通过寄存器名称直接对这些寄存器进行操作,特殊功能寄存器名称全部使用大写。reg51.h没有对单片机的四个输入输出端口进行位定义,如果程序中需要对并行端口进行位操作,可以使用regx51.h。对于52系列单片机,相应的头文件为reg52.h或regx52.h。stdio.h头文件。stdio.h是标准输入输出库函数头文件。该库函数文件是定义计算机键盘输入与计算机屏幕显示的库函数,单片机本身无需这些库函数,但为了方便利用计算机调试程序,需要包含该头文件。常用的标准输入、输出库函数有以下两种:,aprintf(格式控制,输出列表);。该函数按指定格式在屏幕上显示对应输出项的值。bscanf(格式控制,地址列表);。该函数接收计算机键盘输入的数据并赋值给对应的变量。例如: int x=3;char y3=“abc”; printf(“x=%d,y=%3sn”,x,y); scanf(“%d,%cn”,&x,&y); printf(“x=%d,y=%3sn”,x,y);其中,格式控制必须包含在一对双引号内,包括格式说明符(%d)、普通字符(x=,y=)和转义控制符(n)三种类型。格式说明符前必须用百分号“%”。常用的格式说明符的含义如表4-1所示。,常用的转义控制符有两个:n:换行。r:回车。他的前必须用反斜杠“”。 再如,在计算机屏幕上打印99乘法口诀表。参考程序如下所示:/*cfb.c*/#include /包含51系列单片机头文件#include /包含基本输入、输出头文件void cominit() /设置定时器、串行通信函数 SCON=0x50; /设置串行口控制寄存器 TMOD|=0x20; /设置定时器方式寄存器 TH1=0xf3; /设置定时器1(T1)高8位的初值 TR1=1; /启动定时器1 TI=1; /置位发送标志位,void main(void) /主函数 unsigned int i,j; /定义无符号整型变量i与j cominit(); /调用设置定时器、串行通信函数 for(i=1;i=9;i+) /外循环 for(j=1;j:右移运算符,字符或整数按位进行逻辑右移运算。例如:var1 = var26。,4.5.5 C51的赋值运算(1)赋值运算符赋值符号“=”完成的操作即为赋值运算,它是右结合性,且优先级最低。(2)赋值表达式将一个变量与表达式用赋值号连接起来就构成赋值表达式。形式如下:变量名=表达式功能:将“=”右边表达式的值赋给“=”左边的一个变量。例如:a = (b = 4) + (c = 6),该表达式的值为10,变量a的值也为10。(3)赋值的类型转换规则在赋值运算中,当赋值运算符“=”两侧的类型不一致时,系统自动将右边表达式的值转换成左侧变量的类型,再赋给该变量。转换规则如下。实型数据赋给整型变量时,舍弃小数部分。整型数据赋给实型变量时,数值不变,但以IEEE浮点数形式存储在变量中。,长字节整型数据赋给短字节整形变量时,实行截断处理。如将long型数据赋给int型变量时,将long型数据的低两字节数据赋给int型变量,而将long型数据的高两字节的数据丢弃。短字节整型数据赋给长字节整型变量时,进行符号扩展。如将int型数据赋给long型变量时,将int型数据赋给long型变量的低两字节,而将long型变量的高两字节的每一位都设为int型数据的符号值。(4)复合赋值运算符赋值符号前加上其它运算符即构成复合运算符。+=,=,*=,/=,%=,&=,|=,=,=。其功能是先进行加、减、乘、除、取余、与、或、异或、左移以及右移运算后再进行赋值操作。例如:a += b; /等价于a = (a + b),赋值表达式加上分号即“a + = b;”也叫赋值语句x *= a+b; /等价于x = x * (a + b)a &= b; /等价于a = (a & b)a= 4; /等价于a = (a 联合元素。例如:对于前面定义的联合变量a、b、c,下面的引用方法都是正确的:a.fval /* 引用联合变量a中float型元素fval */b.ival /* 引用联合变量b中int型元素ival */csval /* 引用联合变量c中char型元素sval */注意:在引用联合元素时,要注意联合变量用法的一致性。因为联合类型中定义的各个不同类型的元素都可以分时地赋给变量,而所读取变量的值是最近放入的某一元素的值,因此在表达式中对它进行处理时,必须注意其类型与表达式所要求的类型保持一致,否则将导致程序运行出错。不能只引用联合变量。例如,下面的写法就是错误的:printf(“%f”,a);因为变量a可能是float、int和char三种类型,分别占用不同长度的内存区域,若在引用时仅写联合变量名a,系统将难以确定究竟应该输出哪一个联合元素的值。正确的写法应为:printf(“%f”,a. ival);,联合类型的数据可以采用同一个内存段来存放几种不同类型元素的值,但是在每一瞬时只能存放其中一种类型的元素,而不能同时存放几种。换句话说,每一瞬时只有一个元素在起作用。起作用的是联合中最后一次存放的元素,如果存入了一个新的元素,则上次存入的元素就自动失去作用。例如,对于下列语句:a.fval = 100.25;a.ival = 200;a.sval = 10;在执行以上三条赋值语句之后,只有a.sval是有效的,而a. ival和a.fval都已失去作用。因此在引用联合变量时一定要十分注意当前在联合变量中存放的究竟是哪一个元素。不能直接对联合变量进行赋值,也不能在定义联合变量时对它进行初始化。,4.7 C51的流程控制语句,4.7.1 选择控制语句(有if语句和switch/case语句,用于设计分支结构程序)(1)if语句 if 语句是用来判定所给定的条件是否满足,再根据判定的结果(真或假)来决定执行给出的两种操作之一。C51提供了三种形式的if 语句。形式1。格式: if (表达式) 语句;功能:如果表达式的结果为真,则执行语句,否则不执行。形式2。格式: if (表达式) 语句1; else 语句2;功能:如果表达式的结果为真,则执行语句1,否则执行语句2。形式3。格式:if (表达式1) 语句1;else if (表达式2) 语句2;else if (表达式3) 语句3;else if (表达式m) 语句m;else 语句n;功能:这是if语句的嵌套,即一个if语句中又包含有一个或多个if语句。主要用于多分支选择程序。在if语句的嵌套中应注意if与else的对应关系,else总是与它前面最近的一个if语句相对应。,【例4.1】 某浮点数的范围在0.0009999之间,试编写一个函数返回浮点数的小数点位置。解:此题的基本思路是根据浮点数的4种不同取值范围给出4种不同的返回值。可以约定浮点数的大小在0.0009.999、10.0099.99、100.0999.9、10009999之间时,分别返回0、1、2和3。参考程序如下:int ftochar (float valp) int dotno = 0; if (valp10.00) dotno = 0; else if (valp= 10.0) & (valp100.0) dotno = 1; else if (valp= 100.0) & (valp1000.0) dotno = 2; else if (valp= 1000.0) dotno = 3;return dotno;根据小数点的位置,即可在实际的单片机系统中显示出浮点数或小数。,(2)switch/case语句(用于直接处理多分支选择)switch/case语句的一般形式如下:switch (表达式)case 常量表达式1:语句1;break;case 常量表达式2:语句2;break;case 常量表达式n:语句n;break;default:语句n+1;说明:当switch后面括号内的“表达式”的值与某一个case后面的常量表达式的值相等时,就执行此case 后面的语句(可以是复合语句),遇到break语句就退出switch语句。若所有的case中的常量表达式的值都没有与表达式的值匹配时,就执行default 后面的语句。【例4.2】 AT89C51单片机的P1. 1和P1. 0引脚接有两只按键,其4种逻辑组合分别点亮由P2.0P2.3控制的4只LED(高电平点亮),试编程实现此功能。,解:参考程序如下:#include /包含AT89x51系列单片机的头文件void main () char a;do a = P1; a = a&0x03; /屏蔽掉P1口的高6位 P2 = P2&0xf0; /开始4只LED全熄 switch(a) case 0:P2 =P2|0x01;break; case 1:P2 =P2|0x02;break; case 2:P2 =P2|0x04;break; case 3:P2 =P2|0x08; while(1); /循环继续读取按键,4.7.2 循环控制语句 循环程序可分为“当型”循环程序和“直到型”循环程序两种类型,这与其它语言的循环程序一样。在C51语言中,用来构成循环控制的语句有:while语句、do-while语句、for语句以及if和goto语句等。(1)基于while语句构成的循环采用while语句构成循环结构的一般格式如下:while (条件表达式) 内部语句; /内部语句可以是复合语句,也可以为空 意义:当条件表达式的结果为真(非0值)时,程序就重复执行后面的内部语句,一直执行到条件表达式的结果变为假(0值)时为止。也就是说,这种循环结构是先检查条件表达式所给出的条件,再根据检查的结果决定是否执行后面的内部语句。如果条件表达式的结果一开始就为假,则后面的内部语句一次也不会执行。因此属于“当型”循环。图4-4为while语句的执行过程。,【例4.3】 使用while语句计算自然数1100的累加和,并用printf ()函数通过单片机的串口显示在终端上。,解:参考程序如下:#include /*包含基本输入输出头文件stdio.h*/真内部语句条件表达式假图4-5 do-while语句循环结构的流程图void main () int i, sum = 0; i = 1; while (i=100) /*复合语句循环体开始*/ sum = sum+i; i+; /*复合语句循环体结束* /printf (“1+2+100 = %dn”, sum );while (1);,(2)基于do-while语句构成的循环do-while语句只能用来实现“直到型”循环,其一般格式如下:do 内部语句; /可以是复合语句 while(条件表达式);意义:先执行给定的循环体语句,然后再检查条件表达式的结果。当条件表达式的值为真(非0值)时,则重复执行循环体语句,直到条件表达式的值变为假(0值)时为止。因此,用do-while语句构成的循环结构在任何条件下,循环体语句至少会被执行一次,这就是“直到型”循环。图4-5给出了这种循环结构的流程图。,【例4.4】 实型数组sample存有10个采样值,编写一个函数返回其平均值(即平均值滤波程序)。解:参考程序如下:float avg (float *sample) float sum = 0; char no = 0; do sum += sampleno; no +; while (no10); return (sum/10); ,(3)基于for语句构成的循环采用for语句构成循环结构的一般格式如下:for(初值设定表达式;循环条件表达式;更新表达式) 内部语句; /可以是复合语句 意义:先计算出初值设定表达式的值作
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 4.2实现中华民族伟大复兴的中国梦 课件(内嵌视频) 统编版高中政治必修一
- 2025年民主党派机关招聘考试法律常识模拟题集及答案
- 病理科三基考试试题库及答案
- 2025年机关基建维修工程师招聘笔试要点
- 2025年篮球裁判员专业技能考试试卷及答案
- 2025年湖南省常德市试验检测师之交通工程考试题库及答案(考点梳理)
- 桥梁工程安全知识培训课件
- 2026届北京市朝阳外国语化学高一上期中经典模拟试题含解析
- 2026届河北省深州市长江中学高一化学第一学期期中经典模拟试题含解析
- 2025年制造业品质管理部经理招聘面试题集及解析
- 2026届高考山东省启思教育高三暑假线上第一次模拟考试数学试题
- 《俗世奇人》整本书导读课件
- 餐饮管理安全管理制度
- 传统白酒生产项目商业计划书
- 西柏坡景点讲解
- 2025年教师资格证考试综合素质(中学)试题及答案
- 江苏省淮安市2024-2025学年高一下学期期末考试物理试卷(解析版)
- 《基孔肯雅热防控技术指南(2025年版)》解读课件
- BMS基础知识培训课件
- 铁道概论(第八版)佟立本主编
- 施工现场签证单(模板)
评论
0/150
提交评论