微机原理与单片机应用:5 单片机C51程序设计基础_第1页
微机原理与单片机应用:5 单片机C51程序设计基础_第2页
微机原理与单片机应用:5 单片机C51程序设计基础_第3页
微机原理与单片机应用:5 单片机C51程序设计基础_第4页
微机原理与单片机应用:5 单片机C51程序设计基础_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第5章 单片机C51程序设计基础5.1 C51数据与运算C语言中有如下几个基本数据类型: 5.1.1 C51的数据类型char: 单字节,可以存放一个字符。int: 整数,对大多数单片机开发软件而言是双字节大小float: 单精度浮点数。double:双精度浮点数。关键字:short int data;long int adder;16位32位unsigned charsigned char 0255-128 +127单片机特有的数据类型 bit位变量,值为0或1sbit声明可位寻址空间的一个位sfr特殊功能寄存器,8位sfr16特殊功能寄存器,16位例: bit YesOrNo; /定义bi

2、t类型变量,占用bdata区的一个位 sbit P0_1 = P01; /申明一个引用名P0_1,指向端口P0的第1位 /系统不会为sbit类型的数据分配额外的空间 sfr P0 = 0 x80; /用sfr定义8位的SFR sfr16 DPTR = 0 x82; /用sfr16定义16位的SFR sfr16 T2 = 0 xCC; /含TH2和TL2表5.1 C51数据类型数据类型位宽字节数数值范围bit101char81-128+127unsigned char810255short162-32768+32767unsigned short162065535int162-32768+327

3、67unsigned int162065535long324-2147483648+2147483647unsigned long32404294967295float3241.175494E-383.402823E+38(6位数字)double6481.175494E-383.402823E+38(10位数字)sbit101sfr810255sfr161620655355.1.2 C51的存储类型3种存储模式 :Small模式,所有缺省变量参数均装入内部RAM。 优点是速度快, 缺点在于空间有限,仅适用于小规模程序设计。Compact模式,所有缺省变量均位于外部RAM区的一页 (256个字节

4、),具体哪一页可由P2口指定 (在STARTUP.A51文件中说明,也可用pdata指定)。 优点是可用空间较Small宽裕, 速度比Small慢但比Large要快。Large模式,所有缺省变量可放在多达64KB的外部RAM区。 优点在于空间大,可存变量多, 缺点是速度较前两种模式要慢。表5.2 51单片机存储类型及存储区类型关键字存储区描述dataDATA单片机内部RAM空间的低128字节,可在一个周期内直接寻址。bdataBDATADATA区中可以字节、位混合寻址的16字节位寻址区。idataIDATA52系列的单片机内部RAM高128字节必须采用间接寻址。xdataXDATA片外RAM,

5、地址范围64KB,使用DPTR间接寻址。pdataPDATA片外RAM分页寻址的256字节,可通过P0口的地址对其寻址。codeCODE程序存储区,内容只读,使用DPTR变址寻址。5.1.3 8051特殊功能寄存器的C51定义(1)sfr:声明字节寻址的特殊功能寄存器,例如:sfr P0 = 0 x80;(2)sfr16该关键字对于一些8051派生系列单片机, 可以声明其内两个连续地址的特殊功能寄存器(SFR), 例如:sfr16 T2 = 0 xCC;(3)sbit:声明可位寻址的特殊功能寄存器和别的可位寻址目标。 “=”号后将绝对地址赋给变量名,其声明形式又有以下3种:用已声明的sfr寄存

6、器名 整数常量,例如: sfr KEYS = 0 x80;/ 声明KEYS为特殊功能寄存器,地址为0 x80。sbit KEY_UP = KEYS 1;/ 指定KEYS的第1位连接UP按键。sbit KEY_DOWN= KEYS 2;/ 指定KEYS的第2位连接DOWN按键。sbit KEY_SET= KEYS 3; 用一个整数常量作为基地址 后一个整数常量作为指定位, 例如: 地址0 x88对应的是TCON寄存器,第5位表示定时器0计数溢出标志位,第4位表示定时器0计数允许位,第1位表示定时器0中断允许位:sbit TF0= 0 x88 5;sbit TR0= 0 x88 4;sbit IE

7、0= 0 x88 1;sbit EA= 0 xA8 7;/ 指定0 xA8的第7位为EA,即全局中断允许 直接用一个整数常量作为绝对地址,例如: sbit TF0= 0 x8D;sbit TR0= 0 x8C;sbit IE0= 0 x89;5.1.4 8051并行接口及位变量的C51定义REG51.h和REG52.h这两个头文件 sfr P0 = 0 x80;sfr P1 = 0 x90;sfr P2 = 0 xA0;sfr P3 = 0 xB0;AT89X51.H头文件 sbit P0_0 = 0 x80;sbit P0_1 = 0 x81;sbit P0_2 = 0 x82;sfr SE

8、GDATA = P0;/* 数码管数据端口 */sbit SEL0 = P1 0;/* 数码管0片选端口 */sbit SEL1 = P1 1;/* 数码管1片选端口 */sbit KEY_SET = P1 7;/* 设置按键 */5.2 C51运算符、表达式及其规则5.2.1 (复合)赋值运算符例如: count=5; total1=total2=0;Total=Total+3;Total+=3;5.2.2 算术运算符5.2.3 自增和自减运算符例如: -Couter; Couter-; +Amount; Amount+;放前后都一样num1=4;num2=8; a=+num1;b=num2

9、+;放前后不一样5.2.4 关系运算符5.2.5 逻辑运算符5.2.6 位运算符& 运算的规则是当两个位都为1时,结果为1,否则为0; | 运算的规则是当两个位都为0时,结果为0,否则为1; 运算的规则是当两个位相同时,结果为0,否则为1; 运算的规则是当为1时结果为0,当为0时,结果为1。(1)设置位: 设置某位为1,而其他位保持不变,可以使用位逻辑或运算 char c; c = c | 0 x40;(2)清除位: 设置某位为0,而其他位保持不变,可以使用位逻辑与运算 c = c & 0 xBF; 5.2.7 条件运算符 ?:首先对第一个表达式进行检验,如果为真,则返回表达式2的值;如果为假

10、,则返回表达式3的值。5.2.8 指针和地址运算符指针数据类型是一种存放指向另一个数据的地址的变量类型。 变量 = * 指针变量 (将指针变量所指向的目标变量的值赋给等号左边的变量)指针变量 = & 目标变量 (将目标变量的地址赋给等号左边的变量)unsigned int data A _at_ 0 x0028;/ 变量A存放在地址0 x0028unsigned int data B _at_ 0 x002A;/ 变量B存放在地址0 x002Aunsigned int data *P _at_ 0 x002C;/ 指针变量P存放在地址0 x002CA = 10;/ 变量A初值为10B = 20

11、;/ 变量B初值为20P = &B;/ 指针P现在指向变量B*P = 100; / 指针P所指变量(变量B)存放内容更改为100P = &A;/ 指针P现在指向变量AB = *P;/ 变量B的值现在更改为10注:_at_关键字用于变量存储的绝对定位(Absolute Variable Location)还有另一种变量存储绝对定位方法,即使用宏(macro)主要有:CBYTE DBYTE PBYTE XBYTE CWORD DWORD PWORD XWORD例:#include rval = CBYTE0 x00002; sval = DBYTE0 x02; DBYTE0 x02 = 5;5.2

12、.9 优先级和结合性表5.3 C51运算符的优先级和结合性优先级运算符结合性最高( ) - .自左向右! + - + - * & sizeof自右向左* / %自左向右+ -自左向右自左向右 =自左向右= !=自左向右&自左向右自左向右|自左向右&自左向右|自左向右?:自右向左= += -= *= /= %= &= = |= =自右向左最低,自左向右5.3 C51流程控制语句5.3.1 C51程序的基本结构及其流程图三种基本结构:顺序结构、选择结构和循环结构 1. 顺序结构及其流程图 2. 选择结构及其流程图 选择结构还有两种派生结构:串行多分支结构和并行多分支结构 (1)串行多分支结构流程图

13、 (2)并行多分支结构 3.循环结构及其流程图 循环结构又有“while”型和“do while”型两类 (1)while型循环结构 (2)do while型循环结构 5.3.2 选择语句选择语句有三种:if语句、switch/case语句和条件表达式 5.3.3 循环语句三种基本的循环语句:for语句、while语句和do-while语句 5.4 C51构造数据类型5.4.1 数组5.4.2 指针5.4.3 结构体5.4.4 共用体5.4.5 枚举5.5 函数include / 预处理命令longfun1( );/ 函数说明floatfun2( );int x,y;/ 全程变量说明float

14、 z;func1( )/ 功能函数1 局部变量说明; 函数体;Main( )/主函数 局部变量说明; 主函数体;func2( )/功能函数2 局部变量说明; 函数体;对被调用函数的说明在一个函数中调用另一个函数必须具有以下条件:(1)被调用函数必须已经存在(库函数或用户自定义函数) (2)如果程序中使用了库函数,或使用了不在同一文件中的 自定义函数,则应该在程序的开头处使用include包含 语句,将所调用函数的信息包括到程序中来。 #include “stdio.h”/ 将标准输入、输出头文件(在函数库中)/包含到程序中,该文件中包含printf()等库函数。#include “math.h

15、”/ 将函数库中专用数学库的函数包含到/ 程序中来。(3)如果程序使用自定义函数,且该函数与调用它的函数同在 一个文件中,则应根据主调函数与被调函数在文件中的位 置,决定是否对被调用函数作出说明。 如果被调用函数出现在主调用函数之后调用之前,对被调用函数的返回值类型做出说明 返回值类型说明符 被调用函数的函数名( ); 如果被调用函数出现在主调用函数之前可以不对被调用函数加以说明 如果在所有函数定义之前,在文件的开头处,在函数的 外部已经说明了函数的类型 则在主调用函数中不必对所调用的函数再作返回值类型说明 5.5.3 函数的嵌套调用与递归调用 1.函数的嵌套调用 函数的嵌套调用,即在调用一个

16、函数的过程中,允许调用另外一个函数。 每次调用都将使8051系统把2字节(调用指令的下一条指令地址)压入内部堆栈,而C编译器通常依靠堆栈来频繁地进行参数传递。所以在一个函数内应将嵌套调用的层次限制在45层以内。 2.函数的递归调用 函数的递归调用,即在调用一个函数的过程中,又直接或间接地调用该函数本身。 举例:利用函数的递归调用计算一个数的阶乘! int factorial(int n) int result; if (n = = 0) result = 1; else result = n * factorial(n-1); / factorial函数的递归调用 return(result)

17、;5.5.4 中断服务函数 1.中断服务函数的定义 返回值类型标识符 函数名( ) interrupt 中断号 using 寄存器组号函数体语句; 中断函数不能进行参数传递; 中断函数没有返回值;建议定义为void类型 在任何情况下都不能直接调用中断函数,否则会产生编译错误。 如果在中断函数中调用了其它函数,则被调用函数所使用的 寄存器必须与中断函数不同。否则会产生不正确的结果。 C51编译器对中断函数编译时会自动在程序开始和结束处加上 相应的内容,具体如下: 在程序开始处对ACC、B、DPH、DPL和PSW入栈,结束时出栈。 中断函数未加using 修饰符的,开始时还要将R0R1入栈, 结束

18、时出栈。 如中断函数加using 修饰符,则在开始将PSW入栈后还要修改 PSW中的工作寄存器组选择位。 C51编译器从绝对地址8中断号3处产生一个中断向量, 中断号即是修饰符interrupt后面的数字。 该向量包含一个到中断函数入口地址的绝对跳转。 中断函数最好写在文件的尾部,并且禁止使用extern存储类型 说明。防止其它程序调用。2.修饰符interruptinterrupt是C51中非常重要的一个修饰符 在该修饰符后,中断号的取值为031, 0 外部中断01 定时/计数器T02 外部中断13 定时/计数器T14 串行口中断5 定时/计数器T2返回值类型标识符 函数名( ) inter

19、rupt 中断号 using 寄存器组号函数体语句;3.修饰符using using用于指定本函数内部使用的工作寄存器组,其后寄存器组号的取值为03,表示本函数使用的工作寄存器组号。 void int1( ) interrupt 2 using 1count +;/ count为全局变量统计外中断1的中断次数的中断服务程序 5.5.5指向函数的指针变量 指针变量可以指向变量、字符串和数组 指针变量还可以指向函数,即可以用函数的指针变量来调用函数 一个函数在编译时,C编译器会给它分配一个入口地址,该地址就称为函数的指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。举例:用函数的指针

20、变量调用函数int hcf(u,v);main( ) int sum; int (*func_pointer)( );/ 函数指针变量定义 func_pointer=hcf; / 将函数hcf的入口地址赋给指针变量func_pointer sum = 3 + (*func_pointer)(a,b);/ 用函数指针变量调用函数.5.5.6 局部变量和全局变量关于变量: 主函数中定义的变量也只能在主函数中使用,不能在其它 函数中使用。同时,主函数中也不能使用其它函数中定义 的变量。因为主函数也是一个函数,它与其它函数是平行 关系。这一点是与其它语言不同的,应予以注意。 形参变量是属于被调函数的局

21、部变量,实参变量是属于主调 函数的局部变量。 允许在不同的函数中使用相同的变量名,它们代表不同的对 象,分配不同的单元,互不干扰,也不会发生混淆。 如在前例(p135)中,形参和实参的变量名都为n,是完全允许的。 在复合语句中也可定义变量,其作用域只在复合语句范围内。5.6 C51的库函数 5.6.1一般I/O函数stdio.h表5.4 流输入和流输出函数函数说明getchar使用_getkey和putchar读入和回应一个字符_getkey通过8051串口读入一个字符gets使用getchar函数读入和回应一个字符printf/printf517使用putchar函数输出格式化的数据putc

22、har使用8051串口输出一个字符puts使用putchar函数输出字符串和换行符nscanf/scanf517使用getchar函数读取格式化数据sprintf/sprintf517将格式化数据输出到字符串Sscanf/sscanf517从字符串中读入格式化数据ungetchar将字符放回getchar输入缓冲区vprintf使用putchar函数输出格式化数据vsprintf将格式化数据输出到字符串中5.6.2字符函数库string.h 表5.5 字符串操作函数函数说明strcat连接两个字符串strchr返回指向字符串中指定字符首次出现位置的指针strcmp比较两个字符串strcpy将一

23、个字符串内容复制到另一个字符串中strcspn返回字符串第一个匹配另一字符串中字符的字符索引值strlen返回字符串的长度strncat将一个字符串中指定的字符连接到另一个字符串中strncmp比较两个字符串中指定数目的字符strncpy将一个字符串中指定数目的字符复制到另一个字符串中strpbrk返回一个指针,指向字符串中第一个匹配另一个字符串中任一字符的位置strops返回指定字符在字符串中首次出现的位置strrchr返回指向指定字符在字符串中最后出现的位置的指针strrpbrk返回一个指针,指向搜索字符串中最后一个匹配另一字符串中任一字符的位置strrpos返回指定字符在字符串中最后出现

24、的位置strspn返回字符串中第一个不匹配另一字符串中任一字符的索引strstr返回一个指针,指向字符串中与另一字符串相同的字符5.6.3标准函数库stdlib.h及其它头文件(1)标准函数库(STDLIB.H)头文件中包含类型转换和 存储器分配函数的原型和定义,如下所列: atof atoi atolcalloc init_ mempool mallocrand realloc strtod strtol strtoulfreerand (2)数学函数库(math.h)头文件中包含所有浮点运算函数 的定义和原型,其它的数学运算函数也包含在该文件中, 所有的数学运算函数如下: absacosasinstanstan2cabscoscoshexpfabsfloorfmodfprestore fpsaavelabsloglog10modfpowsinsinhsqrttantanh(3)绝对地址访问(absacc.h)头文件中包含的宏定义允许 用户直接访问8051单片机的不同存储区,所有的宏定义 如下: CBYTE CWORD DBYTE DWORD FA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论