收藏 分销(赏)

第3章 单片机并行IO端口应用.ppt

上传人:xrp****65 文档编号:13219273 上传时间:2026-02-04 格式:PPT 页数:103 大小:3.07MB 下载积分:10 金币
下载 相关 举报
第3章 单片机并行IO端口应用.ppt_第1页
第1页 / 共103页
第3章 单片机并行IO端口应用.ppt_第2页
第2页 / 共103页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,本章内容,任务四 彩灯多方式控制,3.1,并行,I/O,端口电路结构,3.2,认识,C,语言,3.3 C,语言的基本语句,任务五 流水灯控制,3.4 C,语言数据与运算,3.5,数组的概念,任务六 简易密码锁设计,第,3,章 单片机并行,I/O,口应用,任务四 彩灯多方式控制,/,程序:,ex3_1.c,/,功能:控制八个信号灯闪烁程序,#include/,包含头文件,REG51.H,,定义了,MCS-51,单片机的特殊功能寄存器,void,delay(unsigned,char i);/,延时函数声明,void main()/,主函数,while(1),P1=0 x00;/,将,P1,口的八位引脚清,0,,点亮八个,LED,delay(200);/,延时,P1=0 xff;/,将,P1,口的八位引脚置,1,,熄灭八个,LED,delay(200);/,延时,/,函数名:,delay,/,函数功能:实现软件延时,/,形式参数:,unsigned char i;,/i,控制空循环的外循环次数,共循环,i*255,次,/,返回值:无,void,delay(unsigned,char i)/,延时函数,无符号字符型变量,i,为形式参数,unsigned char,j,k,;/,定义无符号字符型变量,j,和,k,for(k,=0;k,i;k,+)/,双重,for,循环语句实现软件延时,for(j,=0;j255;j+);,3.1,并行,I/O,口电路结构,MCS-51,系列单片机共有四个,8,位并行,I/O,口,分别用,P0,、,P1,、,P2,、,P3,表示。,每个,I/O,口既可以按位操作使用单个引脚,也可以按字节操作使用,8,个引脚。,一、,P0,口的结构,输出控制电路,输出驱,动电路,P0,口逻辑电路,51,单片机的,P1 P2 P3,口为准双向口,输出高电平是由内部开关管与地断开,上拉到高电平,如果内部的开关管与地是通的,那么输出的是低电平“,0”,,这样你怎么读端口都会一直是低电平,所以要先写个“,1”,,就是让它输出高电平,这样内部开关管就与地断开了,读到的电平就是外部的电平了。,(1),当,P0,口作为输出口使用时,,内部总线将数据送入锁存器,,。经过锁存器,,T2,反相后正好,是内部总线的数据,送到,P0,口,引脚输出。,(2),作输入端口使用,,分为读端口和读引脚,当,P0,口作为输入口使用时,应区分读引脚和读端口两种情况,所谓读引脚,就是读芯片引脚的状态,这时使用下方的数据缓冲器,由“读引脚”信号把缓冲器打开,把端口引脚上的数据从缓冲器通过内部总线读进来。,读端口是指通过上面的缓冲器读锁存器,Q,端的状态。读端口是为了适应对,I/O,口进行“读,-,修改,-,写”操作语句的需要。例如下面的,C51,语句:,P0=P0/,将,P0,口的低,4,位引脚清,0,输出,P0,口的结构,除了,I/O,功能以外,在进行单片机系统扩展时,,P0,口是作为单片机系统的地址,/,数据线使用的,一般称为地址,/,数据分时复用引脚。,当输出地址或数据时,由内部发出控制信号,使“控制”端为高电平,打开与门,并使多路开关,MUX,处于内部地址,/,数据线与驱动场效应管栅极反相接通状态。此时,输出驱动电路由于两个,FET,处于反相,形成推拉式电路结构,使负载能力大为提高。输入数据时,数据信号直接从引脚通过输入缓冲器进入内部总线。,P0,口的结构,P0,口作为一般,I/O,口输出口使用时,由于,T1,截止,输出电路是漏极开路,需再外接上拉电阻才有高电平输出。,P0,口作为输入口使用时,应区分读引脚和读端口。读引脚时,必须先向电路中的锁存器写入“,1”,,使输出级的,FET,截止引脚处于高阻态,以避免锁存器状态为“,0”,时对引脚读入的干扰。,P0,口应用注意事项,二、,P1,口的结构,P1,口逻辑电路,P1,口是准双向口,只能作为通用,I/O,口使用。,P1,口作为输出口使用时,无需再外接上拉电阻。,P1,口作为输入口使用时,应区分读引脚和读端口。读引脚时,必须先向电路中的锁存器写入“,1”,,使输出级的,FET,截止。,P1,口应用注意,三、,P2,口的结构,P2,口逻辑电路,P2,口是准双向口,在实际应用中,可以用于为系统提供高,8,位地址,也能作为通用,I/O,口使用。,P2,口作为通用,I/O,口的输出口使用时,与,P1,口一样无需再外接上拉电阻。,P2,口作为通用,I/O,口的输入口使用时,应区分读引脚和读端口。读引脚时,必须先向锁存器写入“,1”,。,P2,口应用注意,四、,P3,口的结构,P3,口逻辑电路,P3,口是准双向口,可以作为通用,I/O,口使用,还可以作为第二功能使用。作为第二功能使用的端口,不能同时当作通用,I/O,口使用,但其他未被使用的端口仍可作为通用,I/O,口使用。,P3,口作为通用,I/O,的输出口使用时,不用外接上拉电阻。,P3,口应用注意,1.2,认识,C,语言,C,语言程序以函数形式组织程序结构,,C,程序中的函数与其他语言中所描述的“子程序”或“过程”的概念是一样的。,C,程序基本结构,一、认识,C,语言,一个,C,语言源程序是由一个或若干个函数组成,每一个函数完成相对独立的功能。每个,C,程序都必须有(且仅有)一个主函数,main(),,程序的执行总是从主函数开始,调用其他函数后返回主函数,main(),,不管函数的排列顺序如何,最后在主函数中结束整个程序。,C,语言程序中可以有预处理命令,预处理命令通常放在源程序的最前面。,C,语言程序使用“;”作为语句的结束符,一条语句可以多行书写,也可以一行书写多条语句。,一、认识,C,语言,结构化语言,丰富的数据类型,便于维护管理,与汇编语言相比,,C,语言的优点如下:,不要求编程者详细了解单片机的指令系统,但需了解单片机的存储器结构;,寄存器分配、不同存储器的寻址及数据类型等细节可由编译器管理;,结构清晰,程序可读性强;,编译器提供了很多标准库函数,具有较强的数据处理能力。,3.3 C,语言的基本语句,语言程序的执行部分由语句组成。,C,语言提供了丰富的程序控制语句,按照结构化程序设计的基本结构:顺序结构、选择结构和循环结构,组成各种复杂程序。这些语句主要包括表达式语句、复合语句、选择语句和循环语句等。,一、表达式语句和复合语句,表达式语句是最基本的,C,语言语句。表达式语句由表达式加上分号“;”组成,其一般形式如下:,表达式;,执行表达式语句就是计算表达式的值。,在,C,语言中有一个特殊的表达式语句,称为空语句。空语句中只有一个分号“;”,程序执行空语句时需要占用一条指令的执行时间,但是什么也不做。在,C51,程序中常常把空语句作为循环体,用于消耗,CPU,时间等待事件发生的场合。,For(i=0;i100;i+);,一、表达式语句和复合语句,把多个语句用大括号,括起来,组合在一起形成具有一定功能的模块,这种由若干条语句组合而成的语句块称为复合语句。在程序中应把复合语句看成是单条语句,而不是多条语句。,复合语句在程序运行时,,中的各行单语句是依次顺序执行的。在,C,语言的函数中,函数体就是一个复合语句。,void main()/,主函数,bit,left,right,;/,定义位变量,left,、,right,表示左、右状态,while(1)/while,循环语句,由于条件一直为真,该语句为无限循环,left=P3_0;/,读取,P3.0,引脚的(左转向灯)状态并赋值给,left,right=P3_1;/,读取,P3.1,引脚的(右转向灯)状态并赋值给,right,P1_0=left;/,将,left,的值送至,P1.0,引脚,P1_1=right;/,将,right,的值送至,P1.1,引脚,delay(200);/,调用延时函数,实际参数为,200,P1_0=1;/,将,P1.0,引脚置,1,输出,(,熄灭,LED),P1_1=1;/,将,P1.1,引脚置,1,输出,(,熄灭,LED),delay(200);/,调用延时函数,实际参数为,200,二、选择语句,基本,if,语句的格式如下:,if(,表达式,),语句组;,if,语句执行过程:当“表达式”的结果为“真”时,执行其后的“语句组”,否则跳过该语句组,继续执行下面的语句。,二、选择语句,if,语句中的“表达式”通常为逻辑表达式或关系表达式,也可以是任何其他的表达式或类型数据,只要表达式的值非,0,即为“真”。以下语句都是合法的:,if(3),if(x,=8),if(P3_0),在,if,语句中,“表达式”必须用括号括起来。,在,if,语句中,花括号“,”,里面的语句组如果只有一条语句,可以省略花括号。如“,if(P3_0=0)P1_0=0;”,语句,但是为了提高程序的可读性和防止程序书写错误,建议读者在任何情况下,都加上花括号。,/,程序:,ex3_3.c,/,功能:采用,if,语句实现的模拟汽车转向灯控制程序,#include,sbit,P1_0=P10;/,定义,P1.0,引脚位名称为,P1_0,sbit,P1_1=P11;/,定义,P1.1,引脚位名称为,P1_1,sbit,P3_0=P30;/,定义,P3.0,引脚位名称为,P3_0,sbit,P3_1=P31;/,定义,P3.1,引脚位名称为,P3_1,void,delay(unsigned,char i);/,延时函数声明,void main()/,主函数,while(1)/while,循环,if(P3_0=0)P1_0=0;/,如果,P3.0,(左转向灯)状态为,0,,则点亮左转灯,if(P3_1=0)P1_1=0;/,如果,P3.1,(右转向灯)状态为,1,,则点亮右转灯,delay(200);/,延时,P1_0=1;/,左转灯回到熄灭状态,P1_1=1;/,右转灯回到熄灭状态,delay(200);/,延时,/,函数名:,delay,/,函数功能:实现软件延时,/,形式参数:,unsigned char i;,/i,控制空循环的外循环次数,共循环,i*255,次,/,返回值:无,void,delay(unsigned,char i)/,延时函数,无符号字符型变量,i,为形式参数,unsigned char,j,k,;/,定义无符号字符型变量,j,和,k,for(k,=0;k,i;k,+)/,双重,for,循环语句实现软件延时,for(j,=0;j255;j+);,二、选择语句,if-else,语句的一般格式如下:,if(,表达式,),语句组,1,;,else,语句组,2,;,if-else,语句执行过程:当“表达式”的结果为“真”时,执行其后的“语句组,1”,,否则执行“语句组,2”,二、选择语句,if-else-if,语句是由,if else,语句组成的嵌套,用来实现多个条件分支的选择,其一般格式如下:,if(,表达式,1),语句组,1,;,else if(,表达式,2),语句组,2,;,else if(,表达式,n),语句组,n,;,else,语句组,n+1,;,/,程序:,ex3_4.c,/,功能:采用,if-else-if,语句实现的模拟汽车转向灯控制程序,#include/,包含头文件,REG51.H,sbit,P1_0=P10;/,定义,P1.0,引脚位名称为,P1_0,sbit,P1_1=P11;/,定义,P1.1,引脚位名称为,P1_1,sbit,P3_0=P30;/,定义,P3.0,引脚位名称为,P3_0,sbit,P3_1=P31;/,定义,P3.1,引脚位名称为,P3_1,void,delay(unsigned,char i);/,延时函数声明,void main()/,主函数,while(1)/while,循环,if(P3_0=0&P3_1=0)/,如果,P3.0,和,P3.1,状态都为,0,P1_0=0;/,则点亮左转灯和右转灯,P1_1=0;,delay(200);,else if(P3_0=0)/,如果,P3.0,(左转向灯)状态为,1,P1_0=0;/,则点亮左转灯,delay(200);,else if(P3_1=0)/,如果,P3.1,(右转向灯)状态为,1,P1_1=0;/,则点亮右转灯,delay(200);,else,;/,空语句,P1_0=1;/,左转灯回到熄灭状态,P1_1=1;/,右转灯回到熄灭状态,delay(200);,/,函数名:,delay,/,函数功能:实现软件延时,/,形式参数:,unsigned char i;,/i,控制空循环的外循环次数,共循环,i*255,次,/,返回值:无,void,delay(unsigned,char i)/,延时函数,无符号字符型变量,i,为形式参数,unsigned char,j,k,;/,定义无符号字符型变量,j,和,k,for(k,=0;k,i;k,+)/,双重,for,循环语句实现软件延时,for(j,=0;j255;j+);,二、选择语句,(,switch,),二、选择语句,多分支选择的,switch,语句,其一般形式如下:,switch(,表达式,),case,常量表达式,1:,语句组,1;break;,case,常量表达式,2:,语句组,2;break;,case,常量表达式,n:,语句组,n;break,;,default :,语句组,n+1;,该语句的执行过程是:首先计算表达式的值,并逐个与,case,后的常量表达式的值相比较,当表达式的值与某个常量表达式的值相等时,则执行对应该常量表达式后的语句组,再执行,break,语句,跳出,switch,语句的执行,继续执行下一条语句。如果表达式的值与所有,case,后的常量表达式均不相同,则执行,default,后的语句组。,/,程序:,ex3_5.c,/,功能:采用,switch,语句实现的模拟汽车转向灯控制程序,#include/,包含头文件,REG51.H,sbit,P1_0=P10;,sbit,P1_1=P11;,void,delay(unsigned,char i);/,延时函数声明,void main()/,主函数,unsigned char,ledctr,;/,定义转向灯控制变量,ledctr,P3=0 xff;/P3,口作为输入口,必须先置全,1,while(1),ledctr,=P3;/,读,P3,口的状态送到,ledctr,ledctr,=ledctr/,与操作,屏蔽掉高,6,位无关位,取出,P3.0,和,P3.1,引脚的状态(,0 x03,即二进制数,00000011B,),switch(,ledctr,),case 0:P1_0=1;P1_1=0;break;/,如,P3.0,、,P3.1,都为,0,则点亮左、右灯,case 1:P1_1=0;break;/,如果,P3.1,(右转向灯)为,0,则点亮右灯,case 2:P1_0=0;break;/,如果,P3.0,(左转向灯)为,0,则点亮左灯,default:;/,空语句,什么都不做,delay(200);/,延时,P1_0=1;/,左转灯回到熄灭状态,P1_1=1;/,右转灯回到熄灭状态,delay(200);/,延时,/,函数名:,delay,/,函数功能:实现软件延时,/,形式参数:,unsigned char i;,/i,控制空循环的外循环次数,共循环,i*255,次,/,返回值:无,void,delay(unsigned,char i)/,延时函数,无符号字符型变量,i,为形式参数,unsigned char,j,k,;/,定义无符号字符型变量,j,和,k,for(k,=0;k,i;k,+)/,双重,for,循环语句实现软件延时,for(j,=0;j255;j+);,while,语句用来实现,“,当型,”,循环,,执行过程:首先判断表达式,,当表达式的值为真(非,0,)时,,反复执行循环体。为假(,0,)时,执行循环体外面的语句。,循环体,循环继续的条件表达式,下一条语句,非,0,(真),0,(,假),循环体语句组,while,执行过程,格式:,while,(,循环继续的条件表达式),语句组,;,花括号不能丢掉!,请问:下述程序实现了什么功能?,main(),int,i,sum=0;,while(i=10),sum=sum+i;,i+;,三、循环语句,do-while,语句用来实现,“,直到型,”,循环,执行过程:先无条件执行一次循环体,,然后判断条件表达式,当表达式的值,为真(非,0,)时,返回执行循环体直,到条件表达式为假(,0,)为止。,绝对不能少分号!,循环体,格式:,do,循环体语句组;,while(,循环继续条件,),;,花括号不能丢掉!,循环继续的条件表达式,下一条语句,非,0,(真),0,(,假),循环体语句组,请问:下述程序实现了什么功能?,main(),int,i,sum=0;,do,sum=sum+i;,i+;,while(i=100);,三、循环语句,总循环次数已确定,的情况下,,可采用,for,语句形式为:,for,语句的一般形式:,for(,循环变量赋初值,;,循环继续条件,;,循环变量增值,),循环体语句组;,分隔符为分号,请问:下述程序实现了什么功能?,main(),int,i,y=0;,for(i=1;i10)break;,sum=,sum+i,;,通过,break,退出整个循环结构,但对,if else,条件语句不起作用,在循环嵌套中只能向外跳一层。,Continue,语句,求出,1-20,之间不能被,5,整除的整数之和。,main(),int,i,sum,=0;,for(i,=1;i=20;i+),if(i%5=0)continue;/i,除,5,取余;即,i,能被,5,整除,,/,则跳过下面的求和语句,.,sum=,sum+i,;/i,不能被,5,整除,就求和,Continue,停止当前循环体的执行,跳过循环体中余下语句,再次进入循环条件判断,准备继续开始下一次循环体的执行。,任务五 流水灯控制,/,程序:,ex3_6.c,/,功能:采用顺序结构实现的流水灯控制程序,#include,void,delay(unsigned,char i);/,延时函数声明,void main()/,主函数,while(1),P1=0 xfe;/,点亮第,1,个发光二极管,delay(200);/,延时,P1=0 xfd;/,点亮第,2,个发光二极管,delay(200);/,延时,P1=0 xfb;/,点亮第,3,个发光二极管,delay(200);/,延时,P1=0 xf7;/,点亮第,4,个发光二极管,delay(200);/,延时,P1=0 xef;/,点亮第,5,个发光二极管,delay(200);/,延时,P1=0 xdf;/,点亮第,6,个发光二极管,delay(200);/,延时,P1=0 xbf;/,点亮第,7,个发光二极管,delay(200);/,延时,P1=0 x7f;/,点亮第,8,个发光二极管,delay(200);/,延时,/,函数名:,delay,/,函数功能:实现软件延时,/,形式参数:,unsigned char i;,/i,控制空循环的外循环次数,共循环,i*255,次,/,返回值:无,void,delay(unsigned,char i)/,延时函数,无符号字符型变量,i,为形式参数,unsigned char,j,k,;/,定义无符号字符型变量,j,和,k,for(k,=0;k,i;k,+)/,双重,for,循环语句实现软件延时,for(j,=0;j255;j+);,/,程序:,ex3_7.c,/,功能:采用循环结构实现的流水灯控制程序,#include/,包含头文件,REG51.H,void,delay(unsigned,char i);/,延时函数声明,void main()/,主函数,unsigned char,i,w,;,while(1),w=0 x01;/,信号灯显示字初值为,01H,for(i,=0;i8;i+),P1=w;/,显示字取反后,送,P1,口,delay(200);/,延时,w=1;/,显示字左移一位,/,函数名:,delay,/,函数功能:实现软件延时,/,形式参数:,unsigned char i;,/i,控制空循环的外循环次数,共循环,i*255,次,/,返回值:无,void,delay(unsigned,char i)/,延时函数,无符号字符型变量,i,为形式参数,unsigned char,j,k,;/,定义无符号字符型变量,j,和,k,for(k,=0;k,i;k,+)/,双重,for,循环语句实现软件延时,for(j,=0;j=,=!=,低,高,关系表达式,用,关系运算符,将两个表达式(可以是算术表达式、关系表达式、赋值表达式或逻辑表达式,),连接起来的式子,称为,关系表达式,。,关系表达式的值为,逻辑值“真”或“假”,,以,1,代表“真”,以,0,代表“假”。,例如:,(1),关系表达式“,8=4”,的值为,。,(2),关系表达式“,50”,的值为,。,4,、逻辑运算符及其优先级,逻辑运算符 优先级,!(,逻辑非,),&(,逻辑与,),|(,逻辑或,),注意:逻辑运算符与位操作运算符的区别。,逻辑表达式,用逻辑运算符将,一个或多个表达式,连接起来,进行逻辑运算的式子。,逻辑量的真判断,非,0,逻辑量的假判断,0,若,a=1,b=2,c=3,x=4,y=3,,,写出下各个表达式的值:,(,1,),a+b,c&b,=c,(,2,),!a,b&b,!=c|x+y,5,从左至右,关系运算,=,6,从左至右,=!=,7,从左至右,位运算,&,8,从左至右,9,从左至右,|,10,从左至右,逻辑与,&,11,从左至右,逻辑或,|,12,从左至右,赋值运算与复合赋值运算,=,、*,=,、,/=,、,&=,、,=,、,|=,、,=,14,从右至左,例如:,(1)xy&mn,等效于,(xy)&(mc,等效于,(!a)&(bc),5,、位运算,与操作,按位与操作符,:&,格式:,x&y,规则:对应位均为,1,时才为,1,,否则为,0,例如,,i=i,等同于,i,主要用途:取,(,或保留,)1,个数的某,(,些,),位,其余各位置,0,。,5,、位运算,或操作,按位或操作符,:|,格式:,x|y,规则:对应位均为,0,时才为,0,,否则为,1,例如,,i=i|0 x0f;,等同于,i|=0 x0f;,主要用途:将,1,个数的某,(,些,),位置,1,,其余各位不变,5,、位运算,异或操作,按位异或操作符,:,格式:,xy,规则:对应位相同时为,0,,不同时为,1,例如,,i=i0 x0f;,等同于,i=0 x0f;,主要用途:使,1,个数的某,(,些,),位翻转,(,即原来为,1,的位变为,0,,为,0,的变为,1),,其余各位不变。,5,、位运算,按位取反操作,按位取反操作符,:,格式:,x,规则:各位翻转,即原来为,1,的位变成,0,,原来为,0,的位变成,1,例如,,i=i;,主要用途:间接地构造一个数,以增强程序的可移植性。,左移运算符“,”,的功能,,是把“,”,左边的操作数的各二进制位全部左移若干位,移动的位数由“,”,右边的常数指定,,高位丢弃,低位补,0,。,例如:“,a”,的功能,,是把“,”,左边的操作数的各二进制位全部右移若干位,移动的位数由“,”,右边的常数指定。进行右移运算时,,如果是无符号数,则总是在其左端补“,0”,B2,5,、位运算,6,、,C51,的数据类型,C51,的数据类型分为基本数据类型和组合数据类型,情况与标准,C,中的数据类型基本相同,但其中,char,型与,short,型相同,,float,型与,double,型相同,另外,,C51,中还有专门针对于,MCS-51,单片机的特殊功能寄存器型和位类型。,一,字符型,char,有,signed char,和,unsigned char,之分,默认为,signed char,。,它们的长度均为一个字节,用于存放一个单字节的数据。,对于,signed char,,,它用于定义带符号字节数据,其字节的最高位为符号位,“,0”,表示正数,“,1”,表示负数,补码表示,所能表示的数值范围是,-128+127,;,对于,unsigned char,,,它用于定义无符号字节数据或字符,可以存放一个字节的无符号数,其取值范围为,0255,。,unsigned char,可以用来存放无符号数,也可以存放西文字符,一个西文字符占一个字节,在计算机内部用,ASCII,码存放。,二,int,整型,分,singed,int,和,unsigned,int,。,默认为,signed,int,。,它们的长度均为两个字节,用于存放一个双字节数据。对于,signed,int,,,用于存放两字节带符号数,补码表示,数的范畴为,-32768+32767,。对于,unsigned,int,,,用于存放两字节无符号数,数的范围为,065535,。,三,long,长整型,分,singed long,和,unsigned long,。,默认为,signed long,。,它们的长度均为四个字节,用于存放一个四字节数据。对于,signed long,,,用于存放四字节带符号数,补码表示,数的范畴为,-2147483648+2147483647,。对于,unsigned long,,,用于存放四字节无符号数,数的范围为,04294967295,。,四,float,浮点型,float,型数据的长度为四个字节,格式符合,IEEE-754,标准的单精度浮点型数据,包含指数和尾数两部分,最高位为符号位,“,1”,表示负数,“,0”,表示正数,其次的,8,位为阶码,最后的,23,位为尾数的有效数位,由于尾数的整数部分隐含为“,1”,,所以尾数的精度为,24,位。,任何一个,2,进制的实数可以写成,N=S*2P.p,是阶码,.S,是尾数,.,单精度浮点数实例:,对于内部存储数据(,00111111 01100110 01100110 01100110,),2,:符号位(最左侧),S=0,。这表示是个正数 指数(左侧第,2-9,位),E=(01111110)2=(126)10,,所以,P=126-127=-1,。尾数(最后的,23,位),M=(1100110 01100110 01100110)2,,,m=(1.M)2=(1.7999999523162841796875)10,该二进制小数转为,10,进制的计算方式为,1+(1/2+1/4)+(1/32+1/64)+(1/512+1/1024),实际值,N=1.7999999523162841796875*2-1=0.89999997615814208984375(,其实,这个数据是,0.9,的单精度浮点数的实际内部存储,可以看到有一定的误差),五*指针型,指针型本身就是一个变量,在这个变量中存放的指向另一个数据的地址。这个指针变量要占用一定的内存单元,对不同的处理器其长度不一样,在,C51,中它的长度一般为,13,个字节。,六特殊功能寄存器型,这是,C51,扩充的数据类型,用于访问,MCS-51,单片机中的特殊功能寄存器数据,它分,sfr,和,sfr16,两种类型。其中:,sfr,为字节型特殊功能寄存器类型,占一个内存单元,利用它可以访问,MCS-51,内部的所有特殊功能寄存器;,sfr16,为双字节型特殊功能寄存器类型,占用两个字节单元,利用它可以访问,MCS-51,内部的所有两个字节的特殊功能寄存器。,在,C51,中对特殊功能寄存器的访问必须先用,sfr,或,sfr16,进行声明。,Sfr P0=0 x80;,定义端口,P0,地址为,80H,Sfr16 T2=0 xCC;/,定义定时器,2,,地址为,CCH,CDH,七位类型,这也是,C51,中扩充的数据类型,用于访问,MCS-51,单片机中的可寻址的位单元。在,C51,中,支持两种位类型:,bit,型和,sbit,型。它们在内存中都只占一个二进制位,其值可以是“,1”,或“,0”,。,其中:用,bit,定义的位变量在,C51,编译器编译时,在不同的时候位地址是可以变化的,,而用,sbit,定义的位变量必须与,MCS-51,单片机的一个可以寻址位单元或可位寻址的字节单元中的某一位联系在一起,,在,C51,编译器编译时,其对应的位地址是不可变化的。,基本数据类型,长度,取值范围,unsigned char,1,字节,0255,signed char,1,字节,-128+127,unsigned,int,2,字节,065535,signed,int,2,字节,-32768+32767,unsigned long,4,字节,04294967295,signed long,4,字节,-2147483648+2147483647,float,4,字节,1.175494E-38,3.402823E+38,bit,1,位,0,或,1,sbit,1,位,0,或,1,sfr,1,字节,0255,sfr16,2,字节,065535,KEIL C51,编译器能够识别的基本数据类型:,在,C51,语言程序中,有可能会出现在运算中数据类型不一致的情况。,C51,允许任何标准数据类型的隐式转换,隐式转换的优先级顺序如下:,bit,char,int,long,float,signed,unsigned,也就是说,当,char,型与,int,型进行运算时,先自动对,char,型扩展为,int,型,然后与,int,型进行运算,运算结果为,int,型。,C51,除了支持隐式类型转换外,还可以通过强制类型转换符“()”对数据类型进行人为的强制转换。,C5l,编译器除了能支持以上这些基本数据类型之外,还能支持一些复杂的组合型数据类型,如数组类型、指针类型、结构类型、联合类型等这些复杂的数据类型,在后面将相继介绍。,一 常量,常量是指在程序执行过程中其值不能改变的量。在,C51,中支持整型常量、浮点型常量、字符型常量和字符串型常量。,1,整型常量,整型常量也就是整型常数,根据其值范围在计算机中分配不同的字节数来存放。在,C51,中它可以表示成以下几种形式:,十进制整数。如,234,、,-56,、,0,等。,十六进制整数。以,0 x,开头表示,如,0 x12,表示十六进制数,12H,。,长整数。在,C51,中当一个整数的值达到长整型的范围,则该数按长整型存放,在存储器中占四个字节,另外,如一个整数后面加一个字母,L,,,这个数在存储器中也按长整型存放。如,123L,在存储器中占四个字节。,C51,的运算量,2,浮点型常量,浮点型常量也就是实型常数。有十进制表示形式和指数表示形式。,十进制表示形式又称定点表示形式,由数字和小数点组成。如,0.123,、,34.645,等都是十进制数表示形式的浮点型常量。,指数表示形式为:,数字,.,数字,e,数字,例如:,123.456e-3,、,-3.123e2,等都是指数形式的浮点型常量。,3,字符型常量,字符型常量是用单引号引起的字符,如,a,、,1,、,F,等。可以是可显示的,ASCII,字符,也可以是不可显示的控制字符。对不可显示的控制字符须在前面加上反斜杠“,”,组成转义字符。利用它可以完成一些特殊功能和输出时的格式控制。常用的转义字符如下表所示。,转义字符,含,义,ASCII,码(十六进制数),o,空字符(,null,),00H,n,换行符(,LF,),0AH,r,回车符(,CR,),0DH,t,水平制表符(,HT,),09H,b,退格符(,BS,),08H,f,换页符(,FF,),0CH,单引号,27H,”,双引号,22H,反斜杠,5CH,4,字符串型常量,字符串型常量由双引号“”括起的字符组成。如“,D”,、“,1234”,、“,ABCD”,等。注意字符串常量与字符常量是不一样,一个字符常量在计算机内只用一个字节存放,而一个字符串常量在内存中存放时不仅双引号内的字符一个占一个字节,而且系统会自动的在后面加一个转义字符“,o”,作为字符串结束符。因此不要将字符常量和字符串常量混淆,如字符常量,A,和字符串常量“,A”,是不一样的。,二 变量,变量是在程序运行过程中其值可以改变的量。一个变量由两部分组成:变量名和变量值。,在,C51,中,变量在使用前必须对变量进行定义,,指出变量的数据类型和存储模式。,以便编译系统为它分配相应的存储单元。定义的格式如下:,存储种类,数据类型说明符,存储器类型,变量名,1=,初值,,变量名,2,初值,;,auto unsigned long data var3,;,/*,在片内,RAM128B,定义用直接寻址方式访问的自动无符号长整型变量,var3*/,一数据类型说明符,在定义变量时,必须通过数据类型说明符指明变量的数据类型,指明变量在存储器中占用的字节数。可以是基本数据类型说明符,也可以是组合数据类型说明符,还可以是用,typedef,定义的类型别名。,在,C51,中,为了增加程序的可读性,允许用户为系统固有的数据类型说明符用,typedef,起别名,格式如下:,typedef,c51,固有的数据类型说明符 别名;,定义别名后,就可以用别名代替数据类型说明符对变量进行定义。别名可以用大写,也可以用小写,为了区别一般用大写字母表示,。,【,例,】,typedef,的使用。,typedef,unsigned,int,WORD;,typedef,unsigned char BYTE;,BYTE a1=0 x12;,WORD a2=0 x1234;,变量名,变量名是,C51,区分不同变量,为不同变量取的名称。在,C51,中规定变量名可以由字母、数字和下划线三种字符组成,且第一个字母必须为字母或下划线。变量名有两种:普通变量名和指针变量名。它们的区别是指针变量名前面要带“*”号。,存储种类,存储种类是指变量在程序执行过程中的作用范围。,C51,变量的存储种类有四种,分别是自动,(auto),、,外部,(extern),、,静态,(static),和寄存器,(register),。,1,auto,:,auto unsigned long data var3,;,/*,在片内,RAM128B,定义用直接寻址方式访问的自动无符号长整型变量,var3*/,使用,auto,定义的变量称为自动变量,,其作用范围在定义它的函数体或复合语句内部,,当定义它的函数体或复合语句执行时,,C51,才为该变量分配内存空间,结束时占用的内存空间释放。自动变量一般分配在内存的堆栈空间中。定义变量时,,如果省略存储种类,则该变量默认为自动,(auto),变量。,2,extern,:,使用,extern,定义的变量称为外部变量。在一个函数体内,要使用一个已在该函数体外或别的程序中定义过的外部变量时,该变量在该函数体内要用,extern,说明。外部变量被定义后分配固定的内存空间,在程序整个执行时间内都有效,直到程序结束才释放。,3,static,:,使用,static,定义的变量称为静态变量。它又分为,内部静态变量和外部静态变量。,在函数体内部定义的静态变量为,内部静态变量,,它在对应的函数体内有效,一直存在,但在函数体外不可见,这样不仅使变量在定义它的函数体外被保护,还可以实现当离开函数时值不被改变。,外部静态变量,是在函数外部定义的静态变量。它在程序中一直存在,但在定义的范围之外是不可见的。如在多文件或多模块处理中,外部静态变量只在文件内部或模块内部有效。,4,register,:,使用,register,定义的变量称为寄存器变量。它定义的变量存放在,CPU,内部的寄存器中,处理速度快,但数目少。,C51,编译器编译时能自动识别程序中使用频率最高的变量,并自动将其作为寄存器变量,用户可以
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 百科休闲 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服