您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第14章--单片机C语言程序设计基础
1第14章单片机C语言程序设计基础122第14章目录14.1编程语言KeilC51简介14.1.1KeilC51简介14.1.2KeilC51的开发环境14.1.3C51与标准C的主要区别14.2C51语言程序设计基础14.2.1C51语言中的数据14.2.2C51的位变量定义14.2.3一个简单的C51程序14.2.4C51的运算符14.2.5C51的分支与循环程序结构314.2.6AT89S51不同存储区的C51定义14.2.7C51中断服务函数的定义14.3C51的程序设计举例14.3.1中断程序的编写14.3.2定时器程序的编写14.3.3串行口方式0应用程序的编写14.3.4独立式键盘查询方式14.3.5行列式键盘查询方式14.3.6DAC0832应用程序的编写414.3.7ADC0809应用程序的编写14.4C51的集成开发环境KeilµVision3介绍14.4.1集成开发环境KeilµVision3简介14.4.2KeilµVision3软件的安装、启动和运行14.4.3C51程序的开发流程14.5C51与汇编语言的混合编程14.5.1C51与MCS-51汇编语言的比较14.5.2C51与汇编语言混合编程的方法5内容概要本章在假定读者已掌握标准C语言前提下,初步介绍如何使用C51来编写AT89C51单片机的应用程序。C51是在标准C的基础上,根据单片机存储器硬件结构及内部资源,扩展了相应的数据类型和变量,而C51在语法规定、程序结构与设计方法上,都与标准C相同。本章重点介绍C51对标准C所扩展的部分,并通过一些例程来介绍C51的程序设计思想。最后还对C51的集成开发环境KeilµVision3以及C51与汇编语言的混合编程作以介绍。614.1编程语言KeilC51简介目前51系列单片机编程的C语言都采用KeilC51(简称C51),KeilC51是在标准C语言基础上发展起来的。14.1.1KeilC51简介C语言是美国国家标准协会(ANSI)制定的编程语言标准,1987年ANSI公布87ANSIC,即标准C语言。KeilC51语言是在ANSIC的基础上针对51单片机的硬件特点进行的扩展,并向51单片机上移植,经过多年努力,C51语言已经成为公认的高效、简洁而又贴近51单片机硬件的实用高级编程语言。67目前大多数的51单片机用户都在使用C51语言来进行程序设计。用C51进行单片机软件开发,有如下优点:(1)可读性好。C51语言程序比汇编语言程序的可读性好,因而编程效率高,程序便于修改。(2)模块化开发与资源共享。用C51开发出来的程序模块可以不经修改,直接被其他项目所用,这使得开发者能够很好地利用已有的大量的标准C程序资源与丰富的库函数,减少重复劳动。78(3)可移植性好。为某种型号单片机开发的C语言程序,只需将与硬件相关之处和编译连接的参数进行适当修改,就可以方便地移植到其他型号的单片机上。例如,为51单片机编写的程序通过改写头文件以及少量的程序行,就可以方便地移植到PIC单片机上。(4)代码效率高。当前较好的C51语言编译系统编译出来的代码效率只比直接使用汇编语言低20%左右,如果使用优化编译选项,效果会更好。8914.1.2KeilC51的开发环境KeilC51是德国Keilsoftware公司开发的用于51系列单片机的C51语言开发软件。KeilC51在兼容ANSIC的基础上,又增加很多与51单片机硬件相关的编译特性,使得开发51系列单片机程序更为方便和快捷,程序代码运行速度快,所需存储器空间小,完全可以和汇编语言相媲美。它支持众多的MCS-51架构的芯片,同时集编辑、编译、仿真等功能于一体,具有强大的软件调试功能,是众多的单片机应用开发软件中最优秀的软件之一。910Keil公司目前已推出V7.0以上版本的C51编译器,为51单片机软件开发提供了全新的C语言环境,同时保留了汇编代码高效、快速的特点。现在,KeilC51已被完全集成到一个功能强大的全新集成开发环境(IDE)µVision3中,该环境下集成了文件编辑处理、编译链接、项目(Project)管理、窗口、工具引用和仿真软件模拟器以及Monitor51硬件目标调试器等多种功能,这些功能均可在KeilµVision3环境中极为简便地进行操作。1011本章经常用到KeilC51和KeilµVision3两个术语。KeilC51一般简写为C51,指的是51单片机编程所用的C语言;而KeilµVision3,可简写为µVision3,指的是用于51单片机的C51程序编写、调试的集成开发环境。µVision3内部集成了源程序编辑器,并允许用户在编辑源文件时就可设置程序调试断点,便于在程序调试过程中快速检查和修改程序。此外,µVision3还支持软件模拟仿真(Simulator)和用户目标板调试(Monitor51)两种工作方式。在软件模拟仿真方式下不需任何51单片机及其外围硬件即可完成用户程序仿真调试。1112在用户目标板调试方式下,利用硬件目标板中的监控程序可以直接调试目标硬件系统,使用户节省购买硬件仿真器的费用。14.1.3C51与标准C的主要区别不同的嵌入式处理器的C编译系统与标准C的不同之处,主要是它们所针对的嵌入式处理器的硬件系统不同。KeilC51的基本语法与标准C相同,但对标准C进行了扩展。深入理解KeilC51对标准C的扩展部分是掌握KeilC51的关键之一。1213C51与标准C的主要区别如下:(1)头文件的差异。51系列单片机厂家有多个,它们的差异在于内部资源如定时器、中断、I/O等数量以及功能的不同,而对使用者来说,只需要将相应的功能寄存器的头文件加载在程序内,就可实现所具有的功能。因此,KeilC51系列的头文件集中体现了各系列芯片的不同资源及功能。(2)数据类型的不同。51系列单片机包含位操作空间和丰富的位操作指令,因此KeilC51与ANSIC相比又扩展了4种类型,以便能够灵活地进行操作。1314(3)数据存储类型的不同。C语言最初是为通用计算机设计的,在通用计算机中只有一个程序和数据统一寻址的内存空间,而51系列单片机有片内、外程序存储器,还有片内、外数据存储器。标准C并没有提供这部分存储器的地址范围的定义。此外,对于AT89C51单片机中大量的特殊功能寄存器也没有定义。(4)标准C语言没有处理单片机中断的定义。(5)KeilC51与标准C的库函数有较大的不同。由于标准C的中的部分库函数不适于嵌入式处理器系统,因此被排除在KeilC51之外,如字符屏幕和图形函数。1415有一些库函数可以继续使用,但这些库函数都必须针对51单片机的硬件特点来作出相应的开发,与标准C库函数的构成与用法有很大的不同。例如库函数printf和scanf,在标准C中,这两个函数通常用于屏幕打印和接收字符,而在KeilC51中,它们主要用于串行口数据的收发。(6)程序结构的差异。由于51单片机的硬件资源有限,它的编译系统不允许太多的程序嵌套。其次,标准C所具备的递归特性不被KeilC51支持,在C51中,要使用递归特性,必须用reentrant进行声明才能使用。1516但是从数据运算操作、程序控制语句以及函数的使用上来说,KeilC51与标准C几乎没有什么明显的差别。如果程序设计者具备了有关标准C的编程基础,只要注意KeilC51与标准C的不同之处,并熟悉AT89S51单片机的硬件结构,就能够较快地掌握KeilC51的编程。161714.2C51语言程序设计基础本节介绍C51语言程序设计的有关基础知识。14.2.1C51语言中的数据1.数据类型KeilC51的基本数据类型如表14-1所示。针对AT89S51单片机的硬件特点,C51在标准C的基础上,扩展了4种数据类型(见表中最后4行)。注意:扩展的4种数据类型,不能使用指针对它们存取。1718表14-1KeilC51支持的数据类型18数据类型位数字节数取值范围signedchar81-128~+127,有符号字符变量unsignedchar810~255,无符号字符变量signedint162-32768~+32767,有符号整型数unsignedint1620~65535,无符号整型数signedlong324-2147483648~+2147483647,有符号长整型数unsignedlong3240~+4294967295,无符号长整型数float324±3.402823E+38,浮点数(精确到7位)double648±1.175494E-308,浮点数(精确到15位)*241~3对象指针bit10或1sfr810~255sfr161620~65535sbit1可进行位寻址的特殊功能寄存器的某位的绝对地址192.C51的扩展数据类型下面对表14-1中扩展的4种数据类型进行说明。(1)位变量bitbit的值可以是1(true),也可以是0(false)。(2)特殊功能寄存器sfrAT89S51特殊功能寄存器在片内RAM区的80H~FFH之间,“sfr”数据类型占用一个内存单元。利用它可访问AT89S51内部的所有特殊功能寄存器。例如:sfrP1=0x90这一语句定义P1口在片内的寄存器,在后面语句中可用“P1=0xff”(使P1的所有引脚输出1920为高电平)之类的语句来操作特殊功能寄存器。(3)特殊功能寄存器sfr16“sfr16”数据类型占用两个内存单元。sfr16和sfr一样用于操作特殊功能寄存器。所不同的是它用于操作占两个字节的特殊功能寄存器。例如:sfr16DPTR=0x82语句定义了片内16位数据指针寄存器DPTR,其低8位字节地址为82H。在后面的语句中可以对DPTR进行操作。2021(4)特殊功能位sbitsbit是指AT89S51片内特殊功能寄存器的可寻址位。例如:sfrPSW=0xd0;/*定义PSW寄存器地址为0xd0*/sbitPSW^2=0xd2;/*定义OV位为PSW.2*/符号“^”前面是特殊功能寄存器的名字,“^”的后面数字定义特殊功能寄存器可寻址位在寄存器中的位置,取值必须是0~7。注意,不要把bit与sbit混淆。bit用来定义普通的位变量,值只能是二进制的0或1。而sbit定义的是特殊功能2122寄存器的可寻址位,其值是可进行位寻址的特殊功能寄存器的位绝对地址,例如PSW寄存器OV位的绝对地址0xd2。3.数据的存储类型C51完全支持51单片机硬件系统的所有部分。在51单片机中,程序存储器与数据存储器是完全分开的,且分为片内和片外两个独立的寻址空间,特殊功能寄存器与片内RAM统一编址,数据存储器与I/O端口统一编址。C51编译器通过将变量、常量定义成不同存储类型的方法将它们定义在不同的存储区中。2223C51存储类型与AT89S51的实际存储空间的对应关系见表14-2。下面对表14-2作以说明。(1)片内数据存储器片内RAM可分为3个区域:data:片内直接寻址区,位于片内RAM的低128字节。bdata:片内位寻址区,位于片内RAM位寻址区20H~2FH。idata:片内间接寻址区,片内RAM所有地址单元(00H~FFH)。242425(2)片外数据存储器pdata:片外数据存储器页,一页为256字节。xdata:片外数据存储器RAM的64KB空间。(3)片外程序存储器code:外部程序存储器的64KB空间。对单片机编程,正确地定义数据类型以及存储类型,是所有编程者在编程前都需要首先考虑的问题。在资源有限的条件下,如何节省存储单元并保证运行效率,是对开发者的一个考验。只有对C51中的各种数据类型以及存储类型非常熟练的掌握,才能运用自如。2526定义变量类型应考虑如下问题:程序运行时该变量可能的取值范围,是否有负值,绝对值有多大,以及相应需要的存储空间大小。在够用的情况下,尽量选择8位即一个字节的char型,特别是unsigedchar。对于51系列这样的定点机而言,浮点类型变量将明显增加运算时间和程序长度,如果可以的话,尽量使用灵活巧妙的算法来避免
本文标题:第14章--单片机C语言程序设计基础
链接地址:https://www.777doc.com/doc-5554748 .html