单片机课件-第14章-C语言程序设计.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《单片机课件-第14章-C语言程序设计.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课件 14 语言程序设计
- 资源描述:
-
1、1 第第14章章 目录目录14.1 编程语言编程语言Keil C51简介简介 14.1.1 Keil C51简介 14.1.2 Keil C51的开发环境 14.1.3 C51与标准C的主要区别14.2 C51语言程序设计基础语言程序设计基础 14.2.1 C51语言中的数据 14.2.2 C51的位变量定义 14.2.3 一个简单的C51程序 14.2.4 C51的运算符 14.2.5 C51的分支与循环程序结构2 14.2.6 AT89S51不同存储区的C51定义 14.2.7 C51中断服务函数的定义14.3 C51的程序设计举例的程序设计举例 14.3.1 中断程序的编写 14.3.2
2、 定时器程序的编写 14.3.3 串行口方式0应用程序的编写 14.3.4 独立式键盘查询方式 14.3.5 行列式键盘查询方式 14.3.6 DAC0832应用程序的编写 3 14.3.7 ADC0809应用程序的编写14.4 C51的集成开发环境的集成开发环境Keil Vision3介绍介绍 14.4.1 集成开发环境Keil Vision3简介 14.4.2 Keil Vision3软件的安装、启动和运行 14.4.3 C51程序的开发流程14.5 C51与汇编语言的混合编程与汇编语言的混合编程 14.5.1 C51与MCS-51汇编语言的比较 14.5.2 C51与汇编语言混合编程的方
3、法4内容概要内容概要本章在假定读者本章在假定读者已掌握已掌握标准标准C语言前提下语言前提下,初步介绍如何使用如何使用C51来编写来编写AT89C51单片机的应用程序单片机的应用程序。C51是在是在标准标准C的基础上的基础上,根据单片机存储器硬件结,根据单片机存储器硬件结构及内部资源,构及内部资源,扩展了相应的数据类型和变量扩展了相应的数据类型和变量,而C51在在语法规定、程序结构语法规定、程序结构与与设计方法设计方法上,都与标准上,都与标准C相同。相同。本章重点介绍本章重点介绍C51对标准对标准C所扩展的部分所扩展的部分,并通过一些例程例程来介绍C51的程序设计思想。最后还对C51的集成开发环
4、境Keil Vision3以及C51与汇编语言的与汇编语言的混合编程混合编程作以介绍。14.1 编程语言编程语言Keil C51简介简介目前51系列单片机编程的C语言都采用Keil C51(简称C51),Keil C51是在标准是在标准C语言基础上发展起来的语言基础上发展起来的。14.1.1 Keil C51简介简介C语言是美国国家标准协会(ANSI)制定的编程语言标准,1987年ANSI公布87 ANSI C,即标准C语言。Keil C51语言语言是在是在ANSI C的基础上针对的基础上针对51单片机的硬件特单片机的硬件特点进行的扩展,点进行的扩展,并向51单片机上移植,经过多年努力,C51
5、语言已经成为公认的高效、简洁而又贴近51单片机硬件的实用高级编程语言。5目前大多数的51单片机用户都在使用C51语言来进行程序设计。用C51进行单片机软件开发,有如下优点:(1)可读性好。)可读性好。C51语言程序比汇编语言程序的可读性好,因而编程效率高,程序便于修改。(2)模块化开发与资源共享)模块化开发与资源共享。用C51开发出来的程序模块可以不经修改,直接被其他项目所用,这使得开发者能够很好地利用已有的大量的标准C程序资源与丰富的库函数,减少重复劳动。6(3)可移植性好。)可移植性好。为某种型号单片机开发的C语言程序,只需将与硬件相关之处和编译连接的参数进行适当修改,就可以方便地移植到其
6、他型号的单片机上。例如,为51单片机编写的程序通过改写头文件以及少量的程序行,就可以方便地移植到PIC单片机上。(4)代码效率高)代码效率高。当前较好的C51语言编译系统编译出来的代码效率只比直接使用汇编语言低低20%左右,如果使用优优化编译选项化编译选项,效果会更好。714.1.2 Keil C51的开发环境的开发环境Keil C51是德国德国Keil software公司开发的公司开发的用于用于51系列系列单片机的单片机的C51语言开发软件语言开发软件。Keil C51在兼容ANSI C的基础上,又增加很多与51单片机硬件相关的编译特性,使得开发51系列单片机程序更为方便和快捷,程序代码运
7、行速度快,所需存储器空间小,完全可以和汇编语言相媲美。它支持众多的MCS-51架构的芯片,同时集编辑、编译、仿真等功能于一体,具有强大的软件调试功能,是众多的单片机应用开发软件中最优秀的软件之一。8Keil公司目前已推出V7.0以上版本的以上版本的C51编译器编译器,为51单片机软件开发提供了全新的C语言环境,同时保留了汇编代码高效、快速的特点。现在,Keil C51已被完全集成完全集成到一个功能强大的全新集成开发环境(IDE)Vision3中,该环境下集成了集成了文件编辑处理、编译链接、项目(Project)管理、窗口、工具引用和仿真软件模拟器以及Monitor51硬件目标调试器等多种功能,
8、这些功能均可在Keil Vision3环境中极为简便地进行操作。9 本章经常用到Keil C51和Keil Vision3两个术语两个术语。Keil C51一般简写为简写为C51,指的是51单片机编程所用的C语言;而Keil Vision3,可简写为简写为Vision3,指的是用于51单片机的C51程序编写、调试的集成开发环境集成开发环境。Vision3内部集成了源程序编辑器,源程序编辑器,并允许用户在编辑源文件时就可设置程序调试断点,便于在程序调试过程中快速检查和修改程序。此外,Vision3还支持软件模拟仿真支持软件模拟仿真(Simulator)和用户目标板调试用户目标板调试(Monito
9、r51)两种工作方式两种工作方式。在软件模拟仿真方式下软件模拟仿真方式下不需任何51单片机及其外围硬件即可完成用户程序仿真调试。10在用户目标板调试方式用户目标板调试方式下,利用硬件目标板中的监控程序可以直接调试目标硬件系统,使用户节省购买硬件仿真器的费用。14.1.3 C51与标准与标准C的主要区别的主要区别不同的嵌入式处理器的C编译系统与标准与标准C的不同之的不同之处处,主要是它们所针对的嵌入式处理器的硬件系统不同。Keil C51的基本语法与标准C相同,但对标准C进行了扩展。深入理解Keil C51对标准C的扩展部分扩展部分是掌握Keil C51的关键之一。11C51与与标准标准C的主要
10、区别如下:的主要区别如下:(1)头文件的差异。)头文件的差异。51系列单片机厂家有多个,它们的差差异在于内部资源如定时器、中断、异在于内部资源如定时器、中断、I/O等数量以及功能的不等数量以及功能的不同同,而对使用者来说,只需要将相应的功能寄存器的头文件加载在程序内,就可实现所具有的功能。因此,Keil C51系系列的头文件列的头文件集中体现了各系列芯片的不同资源及功能。(2)数据类型的不同)数据类型的不同。51系列单片机包含位操作空间和丰富的位操作指令,因此Keil C51与ANSI C相比又扩展了4种类型,以便能够灵活地进行操作。12(3)数据存储类型的不同)数据存储类型的不同。C语言最初
11、是为通用计算机设计的,在通用计算机中只有一个程序和数据统一寻址的内存空间,而而51系列单片机系列单片机有片内、外程序存储器,还有片内、外有片内、外程序存储器,还有片内、外数据存储器。数据存储器。标准标准C并没有提供这部分存储器的地址范围的并没有提供这部分存储器的地址范围的定义。定义。此外,对于AT89C51单片机中大量的特殊功能寄存器也没有定义。(4)标准)标准C语言语言没有没有处理处理单片机中断单片机中断的定义的定义。(5)Keil C51与标准C的库函数库函数有较大的不同。由于标准C的中的部分库函数部分库函数不适于嵌入式处理器系统不适于嵌入式处理器系统,因此被排除在Keil C51之外,如
12、字符屏幕和图形函数。13有一些库函数可以继续使用,有一些库函数可以继续使用,但这些库函数都必须针对51单片机的硬件特点来作出相应的开发,与标准C库函数的构成与用法有很大的不同。例如库函数printf和scanf,在标准C中,这两个函数通常用于屏幕打印和接收字符,而在Keil C51中,它们主要用于串行口数据的收发。(6)程序结构的差异)程序结构的差异。由于51单片机的硬件资源有限,它的编译系统不允许太多的程序嵌套。其次,标准C所具备的递归特性不被Keil C51支持,在C51中,要使用递归特性,必须用reentrant进行声明才能使用。14但是从数据运算操作、程序控制语句以及函数的使用但是从数
13、据运算操作、程序控制语句以及函数的使用上来说,上来说,Keil C51与标准与标准C几乎没有什么明显的差别。几乎没有什么明显的差别。如果程序设计者具备了有关标准C的编程基础,只要注意Keil C51与标准C的不同之处,并熟悉AT89S51单片机的硬件结构,就能够较快地掌握Keil C51的编程。1514.2 C51语言程序设计基础语言程序设计基础本节介绍C51语言程序设计的有关基础知识。14.2.1 C51语言中的数据语言中的数据1. 数据类型数据类型Keil C51的基本数据类型如表表14-1所示。针对AT89S51单片机的硬件特点,C51在标准C的基础上,扩展扩展了了4种数据类型种数据类型
14、(见表中最后4行)。注意:注意:扩展的4种数据类型,不能使用指针对它们存取。16 表14-1 Keil C51支持的数据类型17数据类型位数字节数取值范围signed char81-128+127,有符号字符变量unsigned char810255,无符号字符变量signed int162-32768+32767,有符号整型数unsigned int162065535,无符号整型数signed long324-2147483648+2147483647,有符号长整型数unsigned long3240+4294967295,无符号长整型数float3243.402823 E+38,浮点数(精
15、确到7位)double6481.175494E-308,浮点数(精确到15位)*2413对象指针bit10或1sfr810255sfr16162065535sbit1可进行位寻址的特殊功能寄存器的某位的绝对地址2. C51的扩展数据类型的扩展数据类型下面对表表14-1中扩展的4种数据类型进行说明。(1)位变量)位变量bitbit的值可以是1(true), 也可以是0(false)。(2)特殊功能寄存器)特殊功能寄存器sfrAT89S51特殊功能寄存器在片内RAM区的80HFFH之间,“sfr” 数据类型数据类型占用一个内存单元。利用它可访问AT89S51内部的所有特殊功能寄存器。例如:例如:s
16、fr P1=0 x90这一语句定义P1口在片内的寄存器,在后面语句中可用“P1=0 xff”(使P1的所有引脚输出18为高电平)之类的语句来操作特殊功能寄存器。(3)特殊功能寄存器)特殊功能寄存器sfr16 “sfr16”数据类型数据类型占用两个内存单元。sfr16和sfr一样用于操作特殊功能寄存器。所不同的是它用于操作占两个字节的特殊功能寄存器。 例如:例如: sfr16 DPTR=0 x82语句定义了片内16位数据指针寄存器DPTR,其低8位字节地址为82H。在后面的语句中可以对DPTR进行操作。19(4)特殊功能位)特殊功能位 sbitsbit 是指AT89S51片内特殊功能寄存器的可寻
17、址位。例如:例如: sfr PSW=0 xd0;/*定义定义PSW寄存器地址为寄存器地址为0 xd0*/sbit PSW 2 = 0 xd2;/*定义定义OV位为位为PSW.2*/符号“”前面是特殊功能寄存器的名字,“”的后面数字定义特殊功能寄存器可寻址位在寄存器中的位置,取值必须是07。注意,不要把注意,不要把bit与与sbit混淆。混淆。bit用来定义普通的位变量,值只能是二进制的0或1。而sbit定义的是特殊功能20寄存器的可寻址位, 其值是可进行位寻址的特殊功能寄存器的位绝对地址,例如例如PSW寄存器OV位的绝对地址0 xd2。3. 数据的存储类型数据的存储类型C51完全支持51单片机
18、硬件系统的所有部分。在51单片机中,程序存储器与数据存储器是完全分开的,且分为片片内内和片外片外两个独立的寻址空间,特殊功能寄存器与片内RAM统一编址,数据存储器与I/O端口统一编址。C51编译器编译器通过将变量、常量定义成不同存储类型的方法将它们定义在不同的存储区中。2122C51存储类型存储类型与与AT89S51的实际存储空间的实际存储空间的对应关系见表表14-2。下面对表表14-2作以说明。(1)片内数据存储器)片内数据存储器片内RAM可分为3个区域个区域:data:片内直接寻址区片内直接寻址区,位于片内RAM的低128字节。bdata:片内位寻址区片内位寻址区,位于片内RAM位寻址区2
19、0H2FH。idata:片内间接寻址区片内间接寻址区,片内RAM所有地址单元 (00HFFH)。23(2)片外数据存储器)片外数据存储器pdata:片外数据存储器页,一页为256字节。xdata:片外数据存储器RAM的64KB空间。(3 3)片外程序存储器)片外程序存储器code:外部程序存储器的64KB空间。对单片机编程,正确地正确地定义数据类型定义数据类型以及以及存储类型存储类型,是所有编程者在编程前都需要都需要首先考虑首先考虑的问题。的问题。在资源有限的条件下,如何节省存储单元并保证运行效率,是对开发者的一个考验。只有对C51中的各种数据类型以及存储类型非常熟练的掌握,才能运用自如。24
20、定义定义变量类型变量类型应考虑如下问题:应考虑如下问题:程序运行时该变量可能的取值范围,是否有负值,绝对值有多大,以及相应需要的存储空间大小。在够用的情况下,尽量选择8位即一个字节的char型,特别是unsiged char。对于51系列这样的定点机而言,浮点类型变量将明显增加运算时间和程序长度,如果可以的话,尽量使用灵活巧妙的算法来避免浮点变量的引入。定义数据的存储类型通常遵循如下原则:定义数据的存储类型通常遵循如下原则:只要条件满足,尽量选择内部直接寻址的存储类型data,然后选择idata即内部间接寻址。对于那些经常使用的变量要使用内25部寻址。在内部数据存储器数量有限或不能满足要求的情
21、况在内部数据存储器数量有限或不能满足要求的情况下才使用外部数据存储器。下才使用外部数据存储器。选择外部数据存储器可先选择pdata类型,最后选用最后选用xdata类型类型。需指出,扩展片外存储器,原理上虽很简单,但在实际开发中,很多时候,会带来不必要的麻烦,如可能降低系统稳定性、增加成本、拉长开发和调试周期等,推荐充分利推荐充分利用片内存储空间。用片内存储空间。另外,通常的单片机应用都是面对小型的控制,代码比较短,对于程序存储区的大小要求很低,常常是片内RAM很紧张而片内Flash ROM很富裕,因此如果实时性26要求不高,可考虑使用可考虑使用宏宏,以及将一些子函数的常量数据做成数据表,放置在
22、程序存储区,当程序运行时,进入子函数动态调用下载至RAM即可,退出子函数后立即释放该内存空间。2714.2.2 C51的位变量定义的位变量定义由于AT89C51能够进行位操作,C51扩展了“bit”数据类型用来定义位变量,这是C51与标准C的不同之处。C51中位变量bit的具体定义如下:1. 位变量的位变量的C51定义方法定义方法C51通过关键字“bit”来定义位变量,格式格式为:bit bit-name;例如:例如:bit ov-flag;/* 将ov-flag定义为位变量*/282. C51程序函数的程序函数的“bit”参数及返回值参数及返回值C51程序函数可以包含类型为“bit”的参数,
23、也可将其作为返回值。例如:bit func(bit b0, bit b1); /* 位变量b0,b1作为函数func的参数*/return(b1); /* 位变量b1作为函数的返回值*/293. 位变量的限制位变量的限制位变量不能用来定义指针和数组位变量不能用来定义指针和数组。例如:bit *ptr;/* 错误,不能用位变量来定义指针错误,不能用位变量来定义指针*/bit a-array ;/* 错误,不能用位变量来定义数组错误,不能用位变量来定义数组*/在定义位变量时,允许定义存储类型,位变量都被放入一个位段,此段总是位于AT89S51片内RAM中,因此其存储器类型限制为bdata,data
24、 或idata,如果将位变量定义成其他类型都会在编译时出错。3014.2.3 一个简单的一个简单的C51程序程序一个C51源程序是由一个个模块化的函数一个个模块化的函数所构成,函数是指程序中的一个模块,main()函数()函数为程序的主函数,其他若干个函数可以理解为一些子程序。一个C51源程序无论包含了多少函数,它总是从总是从main()函数()函数开始执行开始执行,不论不论main()函数()函数位于程序的什么位位于程序的什么位置置。程序设计者就是编写一系列的函数模块编写一系列的函数模块,并在需要的时候调用这个函数,实现程序所要求的功能。311. C51程序与函数程序与函数下面通过一个简单C
25、51程序,认识认识C51程序与函数。程序与函数。【例例14-1】 在AT89S51的P1.0脚脚接有一只发光二极管,二极管的阴极接P1.0脚,阳极通过限流电阻接+5V,现在让发光二极管每隔800ms闪灭,占空比为50%。已知单片机时钟单片机时钟晶振为晶振为12MHz,即每个机器周期1s,采用软件延时的方法,参考程序如下:32#include /* 包含reg51.h 头文件*/sbit P10=P10; /* 定义位变量P1.0 ,也可使用sbit P10=0 x90*/void Delay(unsigned int i) /* 延时函数Delay( ),i是形式参数 */* 两个花括号之间为
展开阅读全文