您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 片机应用技术(C语言版)王静霞主编ch3
本章内容并行I/O口电路结构认识C语言C语言的基本语句C语言数据与运算数组的概念第3章单片机并行I/O口应用并行I/O口电路结构MCS-51系列单片机共有四个8位并行I/O口,分别用P0、P1、P2、P3表示。每个I/O口既可以按位操作使用单个引脚,也可以按字节操作使用8个引脚。P0口的结构输出控制电路输出驱动电路P0口逻辑电路当P0口作为输出口使用时,内部总线将数据送入锁存器,内部的写脉冲加在锁存器时钟端CP上,锁存数据到Q、端。经过MUX,T2反相后正好是内部总线的数据,送到P0口引脚输出。当P0口作为输入口使用时,应区分读引脚和读端口两种情况,所谓读引脚,就是读芯片引脚的状态,这时使用下方的数据缓冲器,由“读引脚”信号把缓冲器打开,把端口引脚上的数据从缓冲器通过内部总线读进来。读端口是指通过上面的缓冲器读锁存器Q端的状态。读端口是为了适应对I/O口进行“读-修改-写”操作语句的需要。例如下面的C51语句:P0=P0&0xf0;//将P0口的低4位引脚清0输出P0口的结构除了I/O功能以外,在进行单片机系统扩展时,P0口是作为单片机系统的地址/数据线使用的,一般称为地址/数据分时复用引脚。当输出地址或数据时,由内部发出控制信号,使“控制”端为高电平,打开与门,并使多路开关MUX处于内部地址/数据线与驱动场效应管栅极反相接通状态。此时,输出驱动电路由于两个FET处于反相,形成推拉式电路结构,使负载能力大为提高。输入数据时,数据信号直接从引脚通过输入缓冲器进入内部总线。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口的结构认识C语言C语言程序以函数形式组织程序结构,C程序中的函数与其他语言中所描述的“子程序”或“过程”的概念是一样的。C程序函数i函数1预编译命令……函数定义函数体主函数C程序基本结构认识C语言一个C语言源程序是由一个或若干个函数组成,每一个函数完成相对独立的功能。每个C程序都必须有(且仅有)一个主函数main(),程序的执行总是从主函数开始,调用其他函数后返回主函数main(),不管函数的排列顺序如何,最后在主函数中结束整个程序。C语言程序中可以有预处理命令,预处理命令通常放在源程序的最前面。C语言程序使用“;”作为语句的结束符,一条语句可以多行书写,也可以一行书写多条语句。认识C语言结构化语言丰富的数据类型便于维护管理与汇编语言相比,C语言的优点如下:不要求编程者详细了解单片机的指令系统,但需了解单片机的存储器结构;寄存器分配、不同存储器的寻址及数据类型等细节可由编译器管理;结构清晰,程序可读性强;编译器提供了很多标准库函数,具有较强的数据处理能力。C语言的基本语句C语言程序的执行部分由语句组成。C语言提供了丰富的程序控制语句,按照结构化程序设计的基本结构:顺序结构、选择结构和循环结构,组成各种复杂程序。这些语句主要包括表达式语句、复合语句、选择语句和循环语句等。表达式语句和复合语句表达式语句是最基本的C语言语句。表达式语句由表达式加上分号“;”组成,其一般形式如下:表达式;执行表达式语句就是计算表达式的值。在C语言中有一个特殊的表达式语句,称为空语句。空语句中只有一个分号“;”,程序执行空语句时需要占用一条指令的执行时间,但是什么也不做。在C51程序中常常把空语句作为循环体,用于消耗CPU时间等待事件发生的场合。表达式语句和复合语句把多个语句用大括号{}括起来,组合在一起形成具有一定功能的模块,这种由若干条语句组合而成的语句块称为复合语句。在程序中应把复合语句看成是单条语句,而不是多条语句。复合语句在程序运行时,{}中的各行单语句是依次顺序执行的。在C语言的函数中,函数体就是一个复合语句。选择语句基本if语句的格式如下:if(表达式){语句组;}if语句执行过程:当“表达式”的结果为“真”时,执行其后的“语句组”,否则跳过该语句组,继续执行下面的语句。语句组表达式真(非0)假(0)选择语句if语句中的“表达式”通常为逻辑表达式或关系表达式,也可以是任何其他的表达式或类型数据,只要表达式的值非0即为“真”。以下语句都是合法的:if(3){……}if(x=8){……}if(P3_0){……}在if语句中,“表达式”必须用括号括起来。在if语句中,花括号“{}”里面的语句组如果只有一条语句,可以省略花括号。如“if(P3_0==0)P1_0=0;”语句,但是为了提高程序的可读性和防止程序书写错误,建议读者在任何情况下,都加上花括号。选择语句if-else语句的一般格式如下:if(表达式){语句组1;}else{语句组2;}if-else语句执行过程:当“表达式”的结果为“真”时,执行其后的“语句组1”,否则执行“语句组2”语句组1表达式真(非0)语句组2假(0)选择语句if-else-if语句是由ifelse语句组成的嵌套,用来实现多个条件分支的选择,其一般格式如下:if(表达式1){语句组1;}elseif(表达式2){语句组2;}…elseif(表达式n){语句组n;}else{语句组n+1;}选择语句语句组1表达式1语句组2表达式2语句组…表达式…语句组n表达式n语句组n+1真(非0)假(0)真(非0)假(0)真(非0)假(0)真(非0)选择语句多分支选择的switch语句,其一般形式如下:switch(表达式){case常量表达式1:语句组1;break;case常量表达式2:语句组2;break;……case常量表达式n:语句组n;break;default:语句组n+1;}该语句的执行过程是:首先计算表达式的值,并逐个与case后的常量表达式的值相比较,当表达式的值与某个常量表达式的值相等时,则执行对应该常量表达式后的语句组,再执行break语句,跳出switch语句的执行,继续执行下一条语句。如果表达式的值与所有case后的常量表达式均不相同,则执行default后的语句组。while语句用来实现“当型”循环,执行过程:首先判断表达式,当表达式的值为真(非0)时,反复执行循环体。为假(0)时执行循环体外面的语句。循环体循环继续的条件表达式下一条语句非0(真)0(假)循环体语句组while执行过程格式:while(循环继续的条件表达式){语句组;}花括号不能丢掉!请问:下述程序实现了什么功能?main(){inti,sum=0;while(i=10){sum=sum+i;i++;}}循环语句do-while语句用来实现“直到型”循环执行过程:先无条件执行一次循环体,然后判断条件表达式,当表达式的值为真(非0)时,返回执行循环体直到条件表达式为假(0)为止。绝对不能少分号!循环体格式:do{循环体语句组;}while(循环继续条件);花括号不能丢掉!循环继续的条件表达式下一条语句非0(真)0(假)循环体语句组请问:下述程序实现了什么功能?main(){inti,sum=0;do{sum=sum+i;i++;}while(i=100);}循环语句总循环次数已确定的情况下,可采用for语句形式为:for语句的一般形式:for(循环变量赋初值;循环继续条件;循环变量增值){循环体语句组;}分隔符为分号请问:下述程序实现了什么功能?main(){inti,y=0;for(i=1;i=10;i++){y=y+i;}}循环语句循环继续条件for的下一条语句非0(真)0(假)循环体语句组循环变量赋初值循环变量增值for语句循环执行过程只求解一次要执行若干次,具体次数由“循环继续条件”决定for语句不仅可用于循环次数已经确定的情况,也可用于循环次数虽不确定,但给出了循环继续条件的情况,它完全可以代替while语句和do-while语句。for(循环变量赋初值;循环继续条件;循环变量增值){循环体语句组;}3.4.1基本数据类型数据类型是指变量的内在存储方式,即存储变量所需的字节数以及变量的取值范围。C51语言中变量的基本数据类型见表3.6,其中bit、sbit、sfr、sfr16为C51语言新增的数据类型,可以更加有效地利用51系列单片机的内部资源。所谓变量,是指在程序运行过程中其值可以改变的量。变量应该先定义后使用,定义格式如下:数据类型变量标识符[=初值]表3-1KeilCx51的数据类型数据类型长度值域unsignedchar1字节(Byte)0~255signedchar1字节-128~+127unsignedint2字节0~65535signedint2字节-32768~+32767unsignedlong4字节0~4294967295signedlong4字节-2147483648~+2147483647float4字节±1.176E-38~±3.40E+38*1~3字节对象的地址bit1位(bit)0或1sbit1位0或1sfr1字节0~255sfr162字节0~65536变量定义通常放在函数的开头部分,但也可以放在函数的外部或复合语句的开头。以unsignedint为例,变量的定义方式主要有以下3种:unsignedintk;//定义一个变量unsignedinti,j,k;//定义多个变量unsignedinti=6,j;//定义变量的同时给变量赋初值当在一个表达式中出现不同数据类型的变量时,必须进行数据类型转换。C51语言中数据类型的转换有两种方式:自动类型转换和强制类型转换。(1)自动类型转换不同数据类型的变量在运算时,由编译系统自动将它们转换成同一数据类型,再进行运算。自动转换规则如下:bit→char→int→long→floatsigned→unsigned当赋值运算符左右两侧类型不一致时,编译系统会按上述规则,自动把右侧表达式的类型转换成左侧变量的类型,再赋值。(2)强制类型转换根据程序设计的需要,可以进行强制类型转换。强制类型转换是利用强制类型转换符将一个表达式强制转换成所需要的类型。其格式如下:(类型)表达式例如,(int)5.87=5。注意:无论是自动转换还是强制转换,都局限于某次运算,并不改变数据说明时对变量规定的数据类型。下面重点介绍C51语言中新增的数据类型bit、sbit、sfr和sfr16。为方便讲解,图2.2给出了一个简单的、基于AT89C52的、用ProteusISIS绘制的单片机应用系统原理图。图2.2某单片机应用系统原理图1.bit在51系列单片机的内部RAM中,可以位寻址的单元主要有两大类:低128字节中的位寻址区(20H~2FH),高128字节中的可位寻址的SFR,有效的位地址共210个(其中位寻址区有128个,可位寻址的SFR中有82个).关键字bit可以定义存储于位寻址区中的位变量。位变量的值只能是0或1。bit型变量的定义方法如下:bitflag;//定义一个位变量flagbitflag=1;//定义一个位变量flag并赋初值1KeilC51编译器对关键字bit的使用有如下限制:(1)不能定义位指针。如bit*P;//非法定义,关键字bit不能定义位指针(2)不能定义位数组。如bitP[8];//非法定义,关键字bit不能定义位数组(3)
本文标题:片机应用技术(C语言版)王静霞主编ch3
链接地址:https://www.777doc.com/doc-3319218 .html