单片机C语言程序设计基础.ppt
《单片机C语言程序设计基础.ppt》由会员分享,可在线阅读,更多相关《单片机C语言程序设计基础.ppt(143页珍藏版)》请在三一办公上搜索。
1、第14章 单片机C语言程序设计基础,1,成都理工大学工程技术学院自动化工程系,2,第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的分支与循环程序结构,3,14.2.6 AT89S51不同存储区的C51定义 14.2.7 C51中断服务函数的定义14.3 C51的程序设计举例 14.3.1
2、 中断程序的编写 14.3.2 定时器程序的编写 14.3.3 串行口方式0应用程序的编写 14.3.4 独立式键盘查询方式 14.3.5 行列式键盘查询方式 14.3.6 DAC0832应用程序的编写,4,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与汇编语言混合编程的方法,5,
3、内容概要本章在假定读者已掌握标准C语言前提下,初步介绍如何使用C51来编写AT89C51单片机的应用程序。C51是在标准C的基础上,根据单片机存储器硬件结构及内部资源,扩展了相应的数据类型和变量,而C51在语法规定、程序结构与设计方法上,都与标准C相同。本章重点介绍C51对标准C所扩展的部分,并通过一些例程来介绍C51的程序设计思想。最后还对C51的集成开发环境Keil Vision3以及C51与汇编语言的混合编程作以介绍。,14.1 编程语言Keil C51简介目前51系列单片机编程的C语言都采用Keil C51(简称C51),Keil C51是在标准C语言基础上发展起来的。14.1.1 K
4、eil C51简介C语言是美国国家标准协会(ANSI)制定的编程语言标准,1987年ANSI公布87 ANSI C,即标准C语言。Keil C51语言是在ANSI C的基础上针对51单片机的硬件特点进行的扩展,并向51单片机上移植,经过多年努力,C51语言已经成为公认的高效、简洁而又贴近51单片机硬件的实用高级编程语言。,6,目前大多数的51单片机用户都在使用C51语言来进行程序设计。用C51进行单片机软件开发,有如下优点:(1)可读性好。C51语言程序比汇编语言程序的可读性好,因而编程效率高,程序便于修改。(2)模块化开发与资源共享。用C51开发出来的程序模块可以不经修改,直接被其他项目所用
5、,这使得开发者能够很好地利用已有的大量的标准C程序资源与丰富的库函数,减少重复劳动。,7,(3)可移植性好。为某种型号单片机开发的C语言程序,只需将与硬件相关之处和编译连接的参数进行适当修改,就可以方便地移植到其他型号的单片机上。例如,为51单片机编写的程序通过改写头文件以及少量的程序行,就可以方便地移植到PIC单片机上。(4)代码效率高。当前较好的C51语言编译系统编译出来的代码效率只比直接使用汇编语言低20%左右,如果使用优化编译选项,效果会更好。,8,14.1.2 Keil C51的开发环境Keil C51是德国Keil software公司开发的用于51系列单片机的C51语言开发软件。
6、Keil C51在兼容ANSI C的基础上,又增加很多与51单片机硬件相关的编译特性,使得开发51系列单片机程序更为方便和快捷,程序代码运行速度快,所需存储器空间小,完全可以和汇编语言相媲美。它支持众多的MCS-51架构的芯片,同时集编辑、编译、仿真等功能于一体,具有强大的软件调试功能,是众多的单片机应用开发软件中最优秀的软件之一。,9,Keil公司目前已推出V7.0以上版本的C51编译器,为51单片机软件开发提供了全新的C语言环境,同时保留了汇编代码高效、快速的特点。现在,Keil C51已被完全集成到一个功能强大的全新集成开发环境(IDE)Vision3中,该环境下集成了文件编辑处理、编译
7、链接、项目(Project)管理、窗口、工具引用和仿真软件模拟器以及Monitor51硬件目标调试器等多种功能,这些功能均可在Keil Vision3环境中极为简便地进行操作。,10,本章经常用到Keil C51和Keil Vision3两个术语。Keil C51一般简写为C51,指的是51单片机编程所用的C语言;而Keil Vision3,可简写为Vision3,指的是用于51单片机的C51程序编写、调试的集成开发环境。Vision3内部集成了源程序编辑器,并允许用户在编辑源文件时就可设置程序调试断点,便于在程序调试过程中快速检查和修改程序。此外,Vision3还支持软件模拟仿真(Simul
8、ator)和用户目标板调试(Monitor51)两种工作方式。在软件模拟仿真方式下不需任何51单片机及其外围硬件即可完成用户程序仿真调试。,11,在用户目标板调试方式下,利用硬件目标板中的监控程序可以直接调试目标硬件系统,使用户节省购买硬件仿真器的费用。14.1.3 C51与标准C的主要区别不同的嵌入式处理器的C编译系统与标准C的不同之处,主要是它们所针对的嵌入式处理器的硬件系统不同。Keil C51的基本语法与标准C相同,但对标准C进行了扩展。深入理解Keil C51对标准C的扩展部分是掌握Keil C51的关键之一。,12,C51与标准C的主要区别如下:(1)头文件的差异。51系列单片机厂
9、家有多个,它们的差异在于内部资源如定时器、中断、I/O等数量以及功能的不同,而对使用者来说,只需要将相应的功能寄存器的头文件加载在程序内,就可实现所具有的功能。因此,Keil C51系列的头文件集中体现了各系列芯片的不同资源及功能。(2)数据类型的不同。51系列单片机包含位操作空间和丰富的位操作指令,因此Keil C51与ANSI C相比又扩展了4种类型,以便能够灵活地进行操作。,13,(3)数据存储类型的不同。C语言最初是为通用计算机设计的,在通用计算机中只有一个程序和数据统一寻址的内存空间,而51系列单片机有片内、外程序存储器,还有片内、外数据存储器。标准C并没有提供这部分存储器的地址范围
10、的定义。此外,对于AT89C51单片机中大量的特殊功能寄存器也没有定义。(4)标准C语言没有处理单片机中断的定义。(5)Keil C51与标准C的库函数有较大的不同。由于标准C的中的部分库函数不适于嵌入式处理器系统,因此被排除在Keil C51之外,如字符屏幕和图形函数。,14,有一些库函数可以继续使用,但这些库函数都必须针对51单片机的硬件特点来作出相应的开发,与标准C库函数的构成与用法有很大的不同。例如库函数printf和scanf,在标准C中,这两个函数通常用于屏幕打印和接收字符,而在Keil C51中,它们主要用于串行口数据的收发。(6)程序结构的差异。由于51单片机的硬件资源有限,它
11、的编译系统不允许太多的程序嵌套。其次,标准C所具备的递归特性不被Keil C51支持,在C51中,要使用递归特性,必须用reentrant进行声明才能使用。,15,但是从数据运算操作、程序控制语句以及函数的使用上来说,Keil C51与标准C几乎没有什么明显的差别。如果程序设计者具备了有关标准C的编程基础,只要注意Keil C51与标准C的不同之处,并熟悉AT89S51单片机的硬件结构,就能够较快地掌握Keil C51的编程。,16,14.2 C51语言程序设计基础本节介绍C51语言程序设计的有关基础知识。14.2.1 C51语言中的数据1.数据类型Keil C51的基本数据类型如表14-1所
12、示。针对AT89S51单片机的硬件特点,C51在标准C的基础上,扩展了4种数据类型(见表中最后4行)。注意:扩展的4种数据类型,不能使用指针对它们存取。,17,表14-1 Keil C51支持的数据类型,18,2.C51的扩展数据类型下面对表14-1中扩展的4种数据类型进行说明。(1)位变量bitbit的值可以是1(true),也可以是0(false)。(2)特殊功能寄存器sfrAT89S51特殊功能寄存器在片内RAM区的80HFFH之间,“sfr”数据类型占用一个内存单元。利用它可访问AT89S51内部的所有特殊功能寄存器。例如:sfr P1=0 x90这一语句定义P1口在片内的寄存器,在后
13、面语句中可用“P1=0 xff”(使P1的所有引脚输出,19,为高电平)之类的语句来操作特殊功能寄存器。(3)特殊功能寄存器sfr16“sfr16”数据类型占用两个内存单元。sfr16和sfr一样用于操作特殊功能寄存器。所不同的是它用于操作占两个字节的特殊功能寄存器。例如:sfr16 DPTR=0 x82语句定义了片内16位数据指针寄存器DPTR,其低8位字节地址为82H。在后面的语句中可以对DPTR进行操作。,20,(4)特殊功能位 sbitsbit 是指AT89S51片内特殊功能寄存器的可寻址位。例如:sfr PSW=0 xd0;/*定义PSW寄存器地址为0 xd0*/sbit PSW 2
14、=0 xd2;/*定义OV位为PSW.2*/符号“”前面是特殊功能寄存器的名字,“”的后面数字定义特殊功能寄存器可寻址位在寄存器中的位置,取值必须是07。注意,不要把bit与sbit混淆。bit用来定义普通的位变量,值只能是二进制的0或1。而sbit定义的是特殊功能,21,寄存器的可寻址位,其值是可进行位寻址的特殊功能寄存器的位绝对地址,例如PSW寄存器OV位的绝对地址0 xd2。3.数据的存储类型C51完全支持51单片机硬件系统的所有部分。在51单片机中,程序存储器与数据存储器是完全分开的,且分为片内和片外两个独立的寻址空间,特殊功能寄存器与片内RAM统一编址,数据存储器与I/O端口统一编址
15、。C51编译器通过将变量、常量定义成不同存储类型的方法将它们定义在不同的存储区中。,22,23,C51存储类型与AT89S51的实际存储空间的对应关系见表14-2。下面对表14-2作以说明。(1)片内数据存储器片内RAM可分为3个区域:data:片内直接寻址区,位于片内RAM的低128字节。bdata:片内位寻址区,位于片内RAM位寻址区20H2FH。idata:片内间接寻址区,片内RAM所有地址单元(00HFFH)。,24,(2)片外数据存储器pdata:片外数据存储器页,一页为256字节。xdata:片外数据存储器RAM的64KB空间。(3)片外程序存储器code:外部程序存储器的64KB
16、空间。对单片机编程,正确地定义数据类型以及存储类型,是所有编程者在编程前都需要首先考虑的问题。在资源有限的条件下,如何节省存储单元并保证运行效率,是对开发者的一个考验。只有对C51中的各种数据类型以及存储类型非常熟练的掌握,才能运用自如。,25,定义变量类型应考虑如下问题:程序运行时该变量可能的取值范围,是否有负值,绝对值有多大,以及相应需要的存储空间大小。在够用的情况下,尽量选择8位即一个字节的char型,特别是unsiged char。对于51系列这样的定点机而言,浮点类型变量将明显增加运算时间和程序长度,如果可以的话,尽量使用灵活巧妙的算法来避免浮点变量的引入。定义数据的存储类型通常遵循
17、如下原则:只要条件满足,尽量选择内部直接寻址的存储类型data,然后选择idata即内部间接寻址。对于那些经常使用的变量要使用内,26,部寻址。在内部数据存储器数量有限或不能满足要求的情况下才使用外部数据存储器。选择外部数据存储器可先选择pdata类型,最后选用xdata类型。需指出,扩展片外存储器,原理上虽很简单,但在实际开发中,很多时候,会带来不必要的麻烦,如可能降低系统稳定性、增加成本、拉长开发和调试周期等,推荐充分利用片内存储空间。另外,通常的单片机应用都是面对小型的控制,代码比较短,对于程序存储区的大小要求很低,常常是片内RAM很紧张而片内Flash ROM很富裕,因此如果实时性,2
18、7,要求不高,可考虑使用宏,以及将一些子函数的常量数据做成数据表,放置在程序存储区,当程序运行时,进入子函数动态调用下载至RAM即可,退出子函数后立即释放该内存空间。,28,14.2.2 C51的位变量定义由于AT89C51能够进行位操作,C51扩展了“bit”数据类型用来定义位变量,这是C51与标准C的不同之处。C51中位变量bit的具体定义如下:1.位变量的C51定义方法C51通过关键字“bit”来定义位变量,格式为:bit bit-name;例如:bit ov-flag;/*将ov-flag定义为位变量*/,29,2.C51程序函数的“bit”参数及返回值C51程序函数可以包含类型为“b
19、it”的参数,也可将其作为返回值。例如:bit func(bit b0,bit b1);/*位变量b0,b1作为函数func的参数*/return(b1);/*位变量b1作为函数的返回值*/,30,3.位变量的限制位变量不能用来定义指针和数组。例如:bit*ptr;/*错误,不能用位变量来定义指针*/bit a-array;/*错误,不能用位变量来定义数组*/在定义位变量时,允许定义存储类型,位变量都被放入一个位段,此段总是位于AT89S51片内RAM中,因此其存储器类型限制为bdata,data 或idata,如果将位变量定义成其他类型都会在编译时出错。,31,14.2.3 一个简单的C51
20、程序一个C51源程序是由一个个模块化的函数所构成,函数是指程序中的一个模块,main()函数为程序的主函数,其他若干个函数可以理解为一些子程序。一个C51源程序无论包含了多少函数,它总是从main()函数开始执行,不论main()函数位于程序的什么位置。程序设计者就是编写一系列的函数模块,并在需要的时候调用这个函数,实现程序所要求的功能。,32,1.C51程序与函数下面通过一个简单C51程序,认识C51程序与函数。【例14-1】在AT89S51的P1.0脚接有一只发光二极管,二极管的阴极接P1.0脚,阳极通过限流电阻接+5V,现在让发光二极管每隔800ms闪灭,占空比为50%。已知单片机时钟晶
21、振为12MHz,即每个机器周期1s,采用软件延时的方法,参考程序如下:,33,#include/*包含reg51.h 头文件*/sbit P10=P10;/*定义位变量P1.0,也可使用sbit P10=0 x90*/void Delay(unsigned int i)/*延时函数Delay(),i是形式参数*/*两个花括号之间为函数Delay()的函数体*/unsigned int j;/*定义变量j*/for(;i0;i-)/*如果i0,则i减1*/for(j=0;j333;j+)/*如果j 333,则j加1*/;/*空函数*/,34,void main(void)/*主函数main()*
22、/while(1)/*主程序轮询*/P10=1;/*P1.0输出高电平,发光二极管灭*/Delay(800);/*将实际参数800传递给形式参数i,延时800ms*/P10=0;/*P1.0输出低电平,发光二极管亮*/Delay(800)/*将实际参数800传递给形式参数i,延时800ms*/,35,下面对程序进行简要说明。程序的第1行是“文件包含”,是将另一个文件“reg51.h”的内容全部包含进来。文件“reg51.h”包含了51单片机全部的特殊功能寄存器的字节地址及可寻址位的位地址定义。程序包含reg51.h的目的就是为了使用P1这个符号,即通知程序中所写的P1是指AT89S51的P1端
23、口,而不是其他变量。,36,打开reg51.h文件可以看到“sfr P1=0 x90;”,即定义符号P1与地址0 x90对应,而P1口的地址就是0 x90。虽然这里的“文件包含”只有一行,但C编译器在处理的时候却要处理几十行或几百行。程序的第2行用符号P10来表示P1.0引脚。在C51中,如果直接写“P1.0”编译器并不能识别,而且P1.0也不是一个合法的C51语言程序变量名,所以必须给它起一个另外的名字,这里起的名字是P10,可是P10是否就是P1.0呢,所以必须给它们建立联系,这里使用了C51的关键字“sbit”来进行定义。,37,第3行第9行对函数Delay进行了事先定义,只有这样,才能
24、在主程序中被主函数main()调用。自行编写的函数Delay()的用途是软件延时,调用时使用的这个“800”被称为“实际参数”,以延时800ms的时间。注意,内层循环for(j=0;j333;j+);这条语句在反汇编时对应的汇编代码如下:CLR A/*1个机器周期*/MOV R7,A/*2个机器周期*/HERE:INC R7/*1个机器周期*/CJNE R7,#333,HERE/*2个机器周期*/,38,其中;在反汇编时不对应任何语句,即不占用机器周期。因而,该for循环共需1+2+333*(1+2)=1002个机器周期,约为1ms。相比之下调用外层循环for(;i0;i-)时的这1+2+i*
25、(1002+1+2)可以近似为 i*1002,即i个ms。编程者可在一定范围内对i、j调整(不超过i、j的取值范围),来控制延时时间的长短。注意,若Delay()的定义写在main函数的后面,则需要先作出声明,否则编译无法通过,因为编译到main函数中的Delay()语句时,找不到相应的函数体。,39,main为“主函数”,每一个C语言程序有且只有一个主函数,主函数后面一定有一对花括号“”,在花括号里面书写该函数的代码行。2.用户自定义函数与库函数从结构上划分,函数分为主函数main()和普通函数两种。对普通函数,从用户使用的角度划分有两种:一种是标准库函数;另一种是用户自定义函数。(1)标准
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 语言程序设计 基础
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-6449638.html