第四章单片机C语言程序设计 教学目的和要求 本章主要介绍C51的基本数据类型、运算、函数和基本编程方法。 重点要求掌握C51的数据类型、变量存储模式、输入输出处理和函数 等与ANSIC的区别,理解中断函数和重入函数的使用方法,掌握常 用标准库函数的使用。 重点:数据类型、基本编程方法、变量存储模式、输入输出处理 难点:数据类型、基本编程方法 学时:2 1.1概述 一、编程语言 1、机器语言一机器语言是二进制的(例:MCS一51中MOV 的机器语言为0111),不易被人理解,太难掌握:而且因机器而异 程序不易移植。(早期用过) 2、汇编语言一将每条机器指令配上一个助记符(例:MCS 一51中0111的汇编指令为MOV),简单汇编语言中的语句与机器指 令一一对应。汇编语言比机器语言容易一些,但仍然很难掌握:而且 因机器而异,程序不易移植。 3、高级语言一与机器语言和汇编语言相比较,高级语言与具 体计算机无关,是一种能方便描述算法过程的程序设计语言。 (BASIC、PASCAL、C、FORTRAN等) 二、汇编语言的特点: 1.面向机器的低级语言,通常是为特定的计算机专门设计的。 1
2.保持了机器语言的优点,具有直接和简捷的特点。 3.可有效地访问、控制计算机的各种硬件设备,如磁盘、存储器、CU、 I/O端口等。 4目标代码简短,占用内存少,执行速度快。 5.经常与高级语言配合使用。 三、C语言的特点: 1.可以对硬件进行直接操作,和汇编语言一样对位、字节和地 址进行操作。 2.与汇编相比,编写程序方便,可读性强,开发时间短,方便 移植 3.缺点是占用资源较多,执行效率没有汇编高(低10%一20%), 但目前一般都能满足要求。 说明: 1、目前,C与汇编联合编程是单片机开发的趋势。 2、不论是什么语言最终都要由编译器(C编译器,汇编编译器) 翻译成机器语言,才能由计算机执行。 3、针对51单片机的C语言叫C51,他和传统的C有些区别, 尤其是函数库。 2.2C51基本语法 一、C51基本数据类型 C51支持的变量通常有如下类型: l、字符型(char)一字符变量的长度为1byte,即8位。默认的 char为无符号型。 2
cunsigned char;数据范围0—255(8位数据) signed char:数据范围-l28—127(第1位符号:0正1负, 后7位是数据) 2、整型(int)一整型变量的长度为l6位,即两字节。默认的int 为无符号型 unsigned int;065535(16位数据) signed int::一32768—32767(第一位0正,1负,后15位是数 据) 3、长整型(1 ong int)一长整型变量占用4个字节,32位。默 认的long int为无符号型,数据范围与int相似 4、浮点型(oa)—浮点型变量占4个字节,它用符号位表示数 的符号,用阶码和尾数表示数的大小。(存储时:第一位符号位:0 正1负,2一9位是阶码,共8位,后23位是尾数,)实际书写中写 成10进制。 5、指针型(*)一与C中一样,在此变量中存放的是另一数据的 地址。 6、特殊功能寄存器型(sff和sff16) 8051单片机的内部高128个字节内离散的分布着专用寄存器区 (SFR),对SFR的操作,只能采用直接寻址方式。为了能直接访问 这些特殊功能寄存器,C51扩充了两个数据类型:“sfr”、“sfr16”, 这种定义方法与标准C51语言不兼容。 Sf:单字节(8): sf16:双字节(16):在使用特殊功能寄存器时,必须先用sfr或 3
sf16声明。 例:变量的定义 sf特殊功能寄存器名=特殊功能寄存器地址常数; $f16特殊功能寄存器名=特殊功能寄存器地址常数 对于8051片内I/O口,定义方法如下: sfP1=0x90:/定义P1口,地址90H sffP2=0xA0:∥定义P1口,地址A0H 说明:①sf是定义8位的特殊功能寄存器,sf16定义16位特 殊功能寄存器,如8052的T2定时器,可以定义为 sf16T2=0xCC;∥这里定义8052定时器2,地址为 T2L-CCH,T2H-CDH ②用sf16定义16位特殊功能寄存器时,等号后面是它的低位地 址,高位地址一定要位于物理低位地址之上。 ③所以sf16不能用于定时器0和1的定义。 7、位类型(bit和sbit)一占1位(0,1) bit型:用来定义变化的位地址,定义的自变量可在位寻址区变 化。 sbit型:用来定义绝对地址不变的位地址,即:与MCS一51的 可位寻址物理位联系起来,可为寻址的特殊功能寄存器用sbt定义。 sbt'定义某些持殊位,并接受任何符号名,“=”号后将绝对地 址赋给变量名 这种地址分配,有三种方法: ①sbit位变量名=位地址例:sbit P11=Ox91;
同sf一样,sbit的位地址必须位于80H~FFH之间。 ②Sbit位变量名=特殊功能寄存器名位位置 例:sfP3=0xB0: sbit P31=P3^1;∥先定义一个特殊功能寄存器名,再指定位变 量名所在的位置。 ③sbit位变量名=字节地址^位位置例:sbit P31=0xB0A1; 注意:字节地址与位号、特殊功能寄存器与位号之间用分开。 定义位变量时应注意以下问题: 1)位变量不能定义成一个指针,如不能定义:bit*aa。 2)不能定义位数组,如不能定义:bit array[2] 3)bit与sbit的不同。bit不能指定位变量的绝对地址,当需要指 定位变量的绝对地址(范围必须在0x80-0xf)时,需要使用sbit来定 义。例:sbit flag=P10; 4)变量的存储类型为bdata时,该变量的某一位可以用sbit来定 义,当然可用bit型。 bdata char jj;/*i定义为bdata整型变量*/ sbit mybit7=ij7: /*mybit'7定义为ii的第7位*/ 说明:①综上,C51的数据类型如下表: 数据类型 长 度 值域范围 bit 1 bi 0,1 sbit I bit 0,1 unsigned cha 1byte 0-255 signed char 1 byte -128-127