单片机原理与接口技术 教学课件 ppt 作者 朱玉红 单元14

上传人:E**** 文档编号:89503271 上传时间:2019-05-26 格式:PPT 页数:21 大小:289KB
返回 下载 相关 举报
单片机原理与接口技术 教学课件 ppt 作者 朱玉红 单元14_第1页
第1页 / 共21页
单片机原理与接口技术 教学课件 ppt 作者 朱玉红 单元14_第2页
第2页 / 共21页
单片机原理与接口技术 教学课件 ppt 作者 朱玉红 单元14_第3页
第3页 / 共21页
单片机原理与接口技术 教学课件 ppt 作者 朱玉红 单元14_第4页
第4页 / 共21页
单片机原理与接口技术 教学课件 ppt 作者 朱玉红 单元14_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《单片机原理与接口技术 教学课件 ppt 作者 朱玉红 单元14》由会员分享,可在线阅读,更多相关《单片机原理与接口技术 教学课件 ppt 作者 朱玉红 单元14(21页珍藏版)》请在金锄头文库上搜索。

1、单元14 单片机C51程序设计,学习目的:掌握C51程序设计方法 重点难点:熟悉C51语法基础和程序结构,掌握采用C51对单片机硬件访问和编程方法,掌握C51与汇编语言的混合编程方法。 外语词汇:Integer(整型)、Character(字符)、Structure(结构)、Union(联合)、 Pointer(指针)。,14.1 C51概述,在实际的系统设计中,当设计对象只是一个小的嵌入式系统时,汇编语言是一个很好的选择,因为代码一般都不超过2KB,而且都比较简单。当一个系统对时钟要求很严格时,使用汇编语言成了唯一的方法。 随着单片机开发技术的不断发展,目前已有越来越多的人从普遍使用汇编语言

2、到逐渐使用高级语言开发,其中主要是以C语言为主,市场上几种常见的单片机均有其C语言开发环境。除此之外,包括硬件接口的操作都应该用C来编程。C语言的特点可以尽量少地对硬件进行操作,是一种功能性和结构性很强的语言。C语言程序比汇编更符合人们的思考习惯,开发者可以更专心的考虑算法而不是考虑一些细节问题,这样就减少了开发和调试的时间。 使用像C这样语言的程序员,不必十分熟悉处理器的运算过程,这意味着对新的处理器也能很快上手。不必知道处理器的具体内部结构,使得用C编写的程序比汇编程序有更好的可移植性。目前很多处理器都支持C编译器。 应用于51系列单片机的C语言,一般称之为C51。C51是由标准C语言衍生

3、而来,所以大部分的数据结构和语法都和标准C语言一样。但是C51毕竟是专用于51系列单片机的语言,也有其特殊之处。,14.2 C51数据结构和语法,在程序运行过程中,其值不能被改变的量称为常量。常量分为几种不同的类型,如12、0为整型常量,3.14、2.55 为实型常量,a、b是字符型常量。下面是常量使用的示例: /* 在P1 口接有8个LED,执行下面的程序: */ #define LIGHT0 0xfe #include “reg51.h” void main() P1 = LIGHT0; 程序中用“#define LIGHT0 0xfe”来定义符号LIGHT0 等于0xfe,以后程序中所有

4、出现LIGHT0 的地方均会用0xfe 来替代,因此,这个程序执行结果就是P1 = 0xfe,即接在P1.0引脚上的LED 点亮。,14.2.1 常量与变量,这种用标识符代表的常量,称为符号常量。使用符号常量的好处如下: (1)含义清楚 在单片机程序中,常有一些量是具有特定含义的,如某单片机系统扩展了一些外部芯片,每一块芯片的地址即可用符号常量定义,如: #define PORTA 0x7fff #define PORTB 0x7ffe 程序中可以用PORTA、PORTB 来对端口进行操作,而不必写0x7fff、0x7ffe。显然,这两个符号比两个数字更能令人明白其含义。在给符号常量起名字时,

5、尽量要做到“见名知意”以充分发挥这一特点。 (2)在需要改变一个常量时能做到“一改全改” 如果由于某种原因,端口的地址发生了变化(如修改了硬件),由0x7fff 改成了0x3fff,那么只要将所定义的语句改动一下即可,如: #define PORTA 0x3fff 这样不仅方便,而且能避免出错。设想一下,如果不用符号常量,要在成百上千行程序中把所有表示端口地址的0x7fff 找出来并改掉可不是件容易的事。,符号常量不同于变量,它的值在整个作用域范围内不能改变,也不能被再次赋值。比如下面的语句是错误的: LIGHT = 0x01; 值可以改变的量称为变量。一个变量应该有一个名字,在内存中占据一定

6、的存储单元,在该存储单元中存放变量的值。 用来标识变量名、符号常量名、函数名、数组名、类型名等的有效字符序列称为标识符。 简单地说,标识符就是一个名字。C语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线,要注意的是C语言中大写字母与小写字母被认为是两个不同的字符,即Sum与sum是两个不同的标识符。标准的C语言并没有规定标识符的长度,但是各个C编译系统有自己的规定,在Keil C51编译器中可以使用长达数十个字符的标识符。在C语言中,要求对所有用到的变量作强制定义,也就是“先定义,后使用”。,常量和变量在程序中各有什么用途,可通过一个延时程序的调用例子加以说明

7、。如:“mDelay(1000)”,其中括号中参数1000 决定了延时时间的长短,如果直接将1000写入程序中,这就是常量。如果要求在现场有修改延时时间要求,括号中就不能写入一个常数,为此可以定义一个变量(如Speed),程序可以改写为:“mDelay(Speed)”, 然后再编写一段程序,使得Speed的值可以被通过按键被修改,那么延时时间就可以在现场修改了。,14.2.2 整型变量与字符型变量,1.整型变量 整型变量的基本类型是int,可以加上有关数值范围的修饰符。这些修饰符分两类,一类是short和long,另一类是unsigned,这两类可以同时使用。在int前加上short或long

8、是表示数的大小的,对于Keil C51来说,加short和不加short是一模一样的(在有一些C 语言编译系统中是不一样的)。如果在int 前加上long 的修饰符,那么这个数就被称之为长整数,在Keil C51中,长整数要用B来存放(基本的int 型是B)。显然,长整数所能表达的范围比整数要大,一个长整数表达的范围为-231 x 2311。而不加long修饰的int型数据的范围是-3276832767,可见,二者相差很远。,第二类修饰符是unsigned 即无符号的意思,如果加上了这样的一个修饰符,就说明其后的数是一个无符号的数,无符号、有符号的差别还是数的范围不一样。对于unsigned

9、int而言,仍是用2B(16 bit)表示一个数,但其数的范围是065535;对于unsigned long int 而言,仍是用4B(32 bit)表示一个数,但其数的范围是0232-1。 整型数据在内存中的存放形式总是以补码的形式存放,如果定义了一个int型变量i,如: int i=10; /*定义i为整型变量,并将10赋给该变量*/ 在Keil C51中规定使用两个字节表示int型数据,因此变量i在内存中的实际占用情况如:0000 0000 0000 1010。 也就是整型数据总是用2字节存放, 不足部分用0补齐。事实上,数据是以补码的形式存在的,一个正数的补码和其原码的形式是相同的。如

10、果数值是负的,补码的形式就不一样了。求负数的补码的方法是:将该数的绝对值的二进制形式取反加1。例如,-10,第一步取-10的绝对值10,其二进制编码是1010,由于是整型数占2个字节,所以其二进制形式实为0000 0000 0000 1010,取反,即变为1111 1111 1111 0101,然后再加1变成了1111 1111 1111 0110,这个就是数-10 在内存中的存放形式.,2.字符型变量 字符型变量只有一个修饰符unsigned即无符号的。对于一个字符型变量来说,其表达的范围是-128127,而加上了unsigned后,其表达的范围变为0255。其实对于二进制形式而言,char

11、型变量表达的范围都是0000 00001111 1111,而int型变量表达的范围都是0000 0000 0000 00001111 1111 1111 1111,只是对这些二进制数的理解不一样而已。 使用Keil C51时,不论是char型还是int型,编程人员都非常喜欢用unsigned型的数据,这是因为在处理有符号的数时,程序要对有符号数的符号进行判断和处理,系统的运算速度会减慢。对单片机而言,速度比不上PC,又工作于实时状态,任何提高效率的手段都要考虑。 字符型数据在内存中是以二进制形式存放的,如果定义了一个char型变量c,如: char c = 10; /*定义c为字符型变量,并将

12、10赋给该变量*/ 十进制数10 的二进制形式为1010,在Keil C51中规定使用一个字节表示char型数据,因此,变量c在内存中的实际占用情况为0000 1010。 3.数的溢出 一个字符型数的最大值是255,一个整型数的最大值是32767,如果再加1,会出现什么情况呢?下面用一个例子来说明。,#include “reg51.h” void main( ) unsigned char a,b; int c,d; a = 255; c = 32767; b = a + 1; d = a + 1; 用Keil C51软件运行后可以看到b和d 在加1之后分别变成了0和-32768,这是为什么呢

13、?其实只要从数字在内存中的二进制存放形式分析,就不难理解。 首先看变量a,该变量的值是255,类型是无符号字符型,该变量在内存中以8位来存放,将255转化为二进制即为1111 1111,如果将该值加1,结果是1 0000 0000,由于该变量只能存放8位,所以最高位的1丢失,于是该数字就变成了0000 0000,自然就是十进制的0了。 在理解了无符号的字符型数据的溢出后,整型变量的溢出也不难理解。32767在内存中存放的形式是0111 1111 1111 1111,当其加1后就变成了1000 0000 0000 0000,而这个二进制数正是-32768在内存中的存放形式,所以加1后就变成了-3

14、2768。,14.2.3 关系运算符和关系表达式,所谓“关系运算”实际上是两个值作一个比较,判断其比较的结果是否符合给定的条件。关系运算的结果只有2 种可能,即“真”和“假”。例如,3 2 的结果为真,而3 b、a + b b + c、(a = 3)=(b = 5)等都是合法的关系表达式。关系表达式的值只有两种可能,即“真”和“假”。在C语言中,没有专门的逻辑型变量,如果运算的结果是“真”,用数值“1”表示,而运算的结果是“假”则用数值“0”表示。 如式子“x1 = 3 2”的结果是x1等于1,原因是3 2 的结果是“真”,即其结果为1,该结果被“”号赋给了x1,这里须注意,“”不是等于之意(

15、C语言中等于用“”表示),而是赋值号,即将该号后面的值赋给该号前面的变量,所以最终结果是x1等于1。,用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。C语言提供了三种逻辑运算符:“&”(逻辑与)、“|”(逻辑或)和“!”(逻辑非)。 C语言编译系统在给出逻辑运算的结果时,用“1”表示真,而用“0”表示假。但是在判断一个量是否是“真”时,以0代表“假”,而以非0代表“真”,这一点务必要注意。比如: 若 a = 10,则 !a 的值为0,因为10被作为真处理,取反之后为假,系统给出的假的值为0。 若 a = -2,结果与上完全相同,原因也同上,不要误以为负值为假。 若 a = 10,

16、b = 20,则 a & b 的值为1,a | b 的结果也为1,原因为参与逻辑运算时不论a与b的值究竟是多少,只要是非零,就被当作是“真”,“真”与“真”相与或者相或,结果都为真,系统给出的结果是1。,14.2.4 逻辑运算符和逻辑表达式,一般采用Keil C51软件进行C51编程,Keil C51编译器除了少数一些关键地方外,基本类似于ANSI C。差异主要是Keil C51可以让用户针对8051的结构进行程序设计,其他差异则是8051的一些局限引起的。,14.3 Keil C51的数据结构和语法,14.3.1 C51数据类型,Keil C51有ANSI C的所有标准数据类型。除此之外,为了更加有利的利用8051的结构,还加入了一些特殊的数据类型。标准数据类型在8051中占据的字节数见表14-4。注意整型和长整型的符号位字节在最低的地址中(可以看作先存放高字节后存放低字节)。,表14-4 标准数据类型在8051中占据的字节数,8051系列单片机拥有特殊功能寄存器,特殊功能寄存器用sfr来定义。而sfr

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号