您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第10章 单片机C语言程序设计
单片机资源的C51编程实例C51数据的存储类型和存储模式C51的数据类型与运算单片机C语言概述C51程序基本结构与相关语句51单片机系统开发常用工具软件keilC51C51的函数第10章单片机C语言程序设计•单片机C语言概述•C51的数据类型与运算•C51数据的存储类型和存储模式•C51程序基本结构与相关语句•C51的函数•单片机资源的C51编程实例•51单片机系统开发常用工具软件keilC51本章知识点随着单片机硬件性能的不断提高和应用技术的不断发展,开发者越来越注重目标系统的开发成效,而开发成效在很大程度上取决于程序本身的编写效率。为了适应这种要求,出现了单片机高级语言—C语言。10.1单片机C语言概述10.1.1C语言的特点及程序结构单片机的C语言编译器:德国的KEILC51开发平台、加拿大DAVEDUNFIELD的MICRO-C51、美国Franklin软件公司的FranklinC51等。目前最流行的是KeilC51编译器。一.C语言的特点1.语言简洁、紧凑,使用方便、灵活。2.运算符丰富。3.数据结构丰富。具有现代化语言的各种数据结构。4.可进行结构化程序设计。5.可以直接对计算机硬件进行操作。6.生成的目标代码质量高,程序执行效率高。7.可移植性好。C语言程序采用函数结构,每个C语言程序由一个或多个函数组成,在这些函数中至少应包含一个主函数main(),也可以包含一个main()函数和若干个其它的功能函数。不管main()函数放于何处,程序总是从main()函数开始执行,执行到main()函数结束则结束。二.C语言的程序结构用C51语言和汇编语言主要不同之处在于:用汇编语言编写51单片机程序必须要考虑其存储器结构,尤其必须考虑其片内数据存储器与特殊功能寄存器的使用以及按实际地址处理端口数据。而用C51语言编写的51单片机应用程序,则不用具体组织、分配存储器资源和处理端口数据。但在C51语言编程中,对数据类型与变量的定义,必须要与单片机的存储结构相关联,否则编译器不能正确地映射定位。10.1.2C语言与MCS-51单片机C51语言与标准C语言程序区别:(1)C51中定义的库函数和标准C语言定义的库函数不同。后者是按通用微型计算机来定义的,而C51中的库函数是按MCS-51单片机相应情况来定义的;(2)数据类型有一定的区别。在C51中增加了几种针对MCS-51单片机特有的数据类型;(3)C51中变量的存储模式与MCS-51单片机的存储器紧密相关;(4)C51中的输入输出是通过MCS-51串行口来完成的,输入输出指令执行前必须要对串行口进行初始化;(5)C51中有专门的中断函数。10.2C51的数据类型与运算10.2.1C51的数据类型分为基本数据类型和扩展(组合)数据类型。基本数据类型除了标准C中的字符型(char)、整型(int)、长整型(long)、单精浮点型(float)、双精浮点型(double)外,还有特殊功能寄存器型(sfr和sfr16两种)和位类型(bit和sbit两种)。扩展数据类型包括数组、指针型(*)以及结构(struct)和联合(union)等。表10-1KEILC51编译器支持的基本数据类型基本数据类型说明符长度取值范围无符号字符型unsignedchar1字节0~255有符号字符型signedchar1字节-128~+127无符号整型unsignedint2字节0~65535有符号整型signedint2字节-32768~+32767无符号长整型unsignedlong4字节0~4294967295有符号长整型signedlong4字节-2147483648~+2147483647单精度浮点型float4字节±1.175494E-38~±3.402823E+38位型bit1位0或1位型sbit1位0或1特殊功能寄存器型sfr1字节0~255特殊功能寄存器型sfr162字节0~65535一.字符型charsignedchar:用于定义带符号字节数据,其字节的最高位为符号位,“0”表示正数,“1”表示负数,补码表示,所能表示的数值范围是-128~+127;unsignedchar:用于定义无符号字节数据或字符,可以存放一个字节的无符号数,也可以存放西文字符,取值范围为0~255。二.int整型分singedint和unsignedint。默认为signedint。它们的长度均为两个字节,用于存放一个双字节数据。对于signedint,用于存放两字节带符号数,补码表示,数的范畴为-32768~+32767。对于unsignedint,用于存放两字节无符号数,数的范围为0~65535。三.long长整型分singedlong和unsignedlong。默认为signedlong。它们的长度均为四个字节,用于存放一个四字节数据。对于signedlong,用于存放四字节带符号数,补码表示,数的范畴为-2147483648~+2147483647。对于unsignedlong,用于存放四字节无符号数,数的范围为0~4294967295。四.float浮点型长度为四个字节,包含指数和尾数两部分。最高位为符号位,“1”表示负数,“0”表示正数。单片机中使用浮点应注意以下三点:①由于单片机中没有专门的浮点运算硬件,因此在运算时会比较慢。②由于51单片机本身是8位的,因此在计算中不可能达到太高的精度。③与单精浮点相比,双精浮点型(double)具有更高的计算精度,但计算时间会更长,速度更慢,C51不支持双精浮点型。五.特殊功能寄存器型分sfr和sfr16两种类型。sfr:字节型特殊功能寄存器类型,占一个内存单元。利用它可以访问MCS-51内部的所有特殊功能寄存器;sfr16:双字节型特殊功能寄存器类型,占用两个字节单元。利用它可以访问MCS-51内部的所有两个字节的特殊功能寄存器,如DPTR。头文件reg51.h:包含了所有特殊功能寄存器和对其相应位的定义,通过在程序开头用#includereg51.h语句包含头文件可以很容易地进行新的扩展。【例10-1】特殊功能寄存器型数据定义。sfrSCON=0X98;//定义SCONsbitSM0=0X9F;//定义SCON的各位sbitSM1=0X9E;sbitSM2=0X9D;sbitREN=0x9C;sbitTB8=0X9B;sbitRB8=0X9A;sbitTI=0X99;sbitRI=0X98;六.位类型功能:用于访问MCS-51单片机中的可寻址的位单元。bit型:定义的位变量在C51编译器编译时,在不同的时候位地址是可以变化的。sbit型:定义的位变量必须与MCS-51单片机的一个可以寻址位单元或可位寻址的字节单元中的某一位联系在一起。在C51编译器编译时,其对应的位地址是不可变化的。隐式转换:出现在运算中数据类型不一致时,按下列转换的优先级顺序:bitcharintlongfloatsignedunsigned例:当char型与int型进行运算时,先自动对char型扩展为int型,然后与int型进行运算,运算结果为int型。强制类型转换符“()”:对数据类型进行人为的强制转换。10.2.2关于指针型数据指针(*)是一种特殊的数据类型,指向变量的地址,实质上指针就是存储单元的地址。在C51中它的长度一般为1~3个字节。根据所指的变量类型不同,可以是字符型指针(char*)、整型指针(int*)、长整型指针(long*)、浮点型指针(float*)及结构指针(struct*)与联合指针(union*)。1.一般指针一般指针的声明和使用均与标准C相同,不过同时还能说明指针的存储类型,例如:long*state;//为一个指向long型整数的指针,而state本身则依存储模式存放。char*xdataptr;//ptr为一个指向char数据的指针,而ptr本身放于外部RAM区。一般指针本身用3个字节存放,分别为存储器类型、高位偏移量、低位偏移量。2.存储器指针基于存储器的指针说明时即指定了存储类型,例如:chardata*str;//str指向data区中char型数据。intxdata*pow;//pow指向外部RAM的int型整数。存放时,只需一个字节或2个字节就够了,因为只需存放偏移量。10.2.3C51的运算符运算符:完成某种特定运算的符号。C51常见的运算符有算术运算符、赋值运算符、关系运算符、逻辑运算符、按位运算符和联合(复合赋值)运算符。除此之外,还有一些用于完成特殊任务的运算符,如逗号运算符、条件运算符、指针与地址运算符。1.常见的运算符1).算术运算符符号意义+加或取正值运算符-减或取负值运算符*乘运算符/除运算符++变量自加1--变量自减1%取余运算符在实际编程中,为了程序的简练,经常使用i++与++i这样的语句。i++是先进行运算,再执行i=i+1的操作;而++i则是先执行i=i+1的操作,再进行运算。例:intx=0,y=0;y=x++;//执行后y的值仍为0而intx=0,y=0;y=++x;//执行后y的值则为12).赋值运算符“=”功能:将一个数据的值赋给一个变量,如x=10。赋值表达式:利用赋值运算符将一个变量与一个表达式连接起来的式子称为赋值表达式。赋值语句:在赋值表达式的后面加一个分号“;”就构成了赋值语句。一个赋值语句的格式如下:变量=表达式;执行时先计算出右边表达式的值,然后赋给左边的变量。例如:x=8+9;//将8+9的值赋绐变量x•x=y=5;//将常数5同时赋给变量x和y•在C51中,允许在一个语句中同时给多个变量赋值,赋值顺序自右向左。符号意义大于小于=大于等于=小于等于==等于!=不等于?3).关系运算符C51中有6种关系运算符:关系表达式通常用来作为判别条件构造分支或循环程序。关系表达式的一般形式如下:表达式1关系运算符表达式2关系运算的结果为逻辑量,成立为真(1),不成立为假(0)。其结果可以作为一个逻辑量参与逻辑运算。例如:53,结果为真(1),而10==100,结果为假(0)。注意:关系运算符等于“==”是由两个“=”组成。4).逻辑运算符C51有3种逻辑运算符:||逻辑或&&逻辑与!逻辑非关系运算符用于反映两个表达式之间的大小关系,逻辑运算符则用于求条件式的逻辑值,用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。逻辑与,格式:条件式1&&条件式2当条件式1与条件式2都为真时结果为真(非0值),否则为假(0值)。逻辑或,格式:条件式1||条件式2当条件式1与条件式2都为假时结果为假(0值),否则为真(非0值)。逻辑非,格式:!条件式当条件式原来为真(非0值),逻辑非后结果为假(0值)。当条件式原来为假(0值),逻辑非后结果为真(非0值)。例如:若a=8,b=3,c=0,则!a为假,a&&b为真,b&&c为假。5).位运算符位运算是按位对变量进行运算,但并不改变参与运算的变量的值。如果要求按位改变变量的值,则要利用相应的赋值运算。C51中位运算符只能对整数进行操作,不能对浮点数进行操作。C51中的位运算符有:符号意义&按位与|按位或~按位取反^按位异或左移右移【例10-1】设a=0x78=01111000B,b=0x0f=00001111B,则a&b、a|b、a^b、~a、a2、b2分别为多少?a&b=00001000b=0x08;a|b=01111111B=0x7f;a^b=01110111B=0x77;~a=10000111B=0x87;a2=11100000B=0xe0;b2=00000011B=0x03;6).联合(复合赋值)运算符C51语言中支持在赋值运算符“=”的前面加上其它运算符,组成联合(复合赋值)。+=加法赋值-=减法赋值*=乘法赋值/=除法赋值%=取模赋值&=逻辑与赋值|=逻辑或赋值^=逻辑异或赋值~=逻辑非赋值=右移位赋值=左移位赋值联合运算的一般格式如下:变量联合运算符表达式处理过程:先把变量与后面的表达式进
本文标题:第10章 单片机C语言程序设计
链接地址:https://www.777doc.com/doc-3405243 .html