1内容概要本章在读者已掌握标准C语言前提下,初步介绍如何使用C51来编写AT89C51单片机的应用程序。C51是在标准C的基础上,根据单片机存储器硬件结构及内部资源,扩展了相应的数据类型和变量,而C51在语法规定、程序结构与设计方法上,都与标准C相同。本章重点介绍C51对标准C所扩展的部分,并通过一些例程来介绍C51的程序设计思想。2单片机入门主要掌握以下知识和应用最小系统能够运行起来的必要条件。1.电源2.晶振3.复位电路对单片机任意IO口的随意操作1.输出控制电平高低2.输入检测电平高低。定时器:重点掌握最常用的方式2中断:外部中断、定时器中断、串口中断串口通信:单片机之间、单片机与计算机间3目前51系列单片机编程的C语言都采用KeilC51(简称C51),KeilC51是在标准C语言基础上发展起来的。C语言是美国国家标准协会(ANSI)制定的编程语言标准,1987年ANSI公布87ANSIC,即标准C语言。KeilC51语言是在ANSIC的基础上针对51单片机的硬件特点进行的扩展,并向51单片机上移植,经过多年努力,C51语言已经成为公认的高效、简洁而又贴近51单片机硬件的实用高级编程语言。3.1编程语言KeilC51简介4C语言具有结构化和模块化特点,便于阅读和维护。C语言可移植性好,很多微控制器都支持C编译器。功能化的代码能够很方便的从一个工程移植到另一个工程,从而减少了开发时间。提供的库函数包含许多标准子程序,具有较强的数据处理能力。使用C语言的优点5使用C语言的优点C语言编写的程序比汇编语言编写的程序更符合人们的思考习惯,寄存器分配,不同存储器的寻址及数据类型等细节交由编译器管理,开发者可以更专心的考虑算法,而不是考虑一些细节问题。这样可以减少编程出错的机率,从而提高开发效率,减少调试的时间。C语言和微控制器是相对独立的,开发者不必知道处理器的具体内部结构和处理过程。当用新型的微控制器开发程序时,可以很快上手,减少学习时间和程序开发时间。6C51与标准C的主要区别(1)头文件的差异。51系列单片机厂家有多个,它们的差异在于内部资源如定时器、中断、I/O等数量以及功能的不同,而对使用者来说,只需要将相应的功能寄存器的头文件加载在程序内,就可实现所具有的功能。因此,KeilC51系列的头文件集中体现了各系列芯片的不同资源及功能。(2)数据类型的不同。51系列单片机包含位操作空间和丰富的位操作指令,因此KeilC51与ANSIC相比又扩展了4种类型,以便能够灵活地进行操作。电脑CPU是32位或64位,运算能力强,内存大,大量使用float型与longint型变量,单片机一般为8位或16位,运算能力较弱,以char型为主,int型为辅7(3)数据存储类型的不同。C语言最初是为通用计算机设计的,在通用计算机中只有一个程序和数据统一寻址的内存空间,而51系列单片机有片内、外程序存储器,还有片内、外数据存储器。标准C并没有提供这部分存储器的地址范围的定义。此外,对于AT89S51单片机中大量的特殊功能寄存器也没有定义。(4)标准C语言没有处理单片机中断的定义。(5)KeilC51与标准C的库函数有较大的不同。由于标准C的中的部分库函数不适于嵌入式处理器系统,因此被排除在KeilC51之外,如字符屏幕和图形函数。8(6)目标代码电脑生成.exe格式,编译完成后直接在电脑上运行,单片机编译生成.bin代码文件,需要烧写到单片机中并结合外围电路执行。(7)仿真调试单片机的C程序在电脑上进行编译,然后需通过仿真器连接后进行仿真调试,近年来随着电路仿真软件的不断完善,也可通过proteus等软件直接在电脑上进行仿真调试。9但是从数据运算操作、程序控制语句以及函数的使用上来说,KeilC51与标准C几乎没有什么明显的差别。如果程序设计者具备了有关标准C的编程基础,只要注意KeilC51与标准C的不同之处,并熟悉AT89S51单片机的硬件结构,就能够较快地掌握KeilC51的编程。10(1)编译器:由源代码文件生成目标文件(2)开发套件:包含了编译器、链接器等开发工具的组合包(3)IDE(IntegratedDevelopmentEnvironment集成开发环境)将项目管理、源代码编辑和程序编译、链接、调试等各种工具组合在一个功能强大的环境中,具有良好人机界面。8051单片机所使用的C语言编译器简称为Cx51例如包含Cx51、Ax51、BL51、LIB51、OH51、RTX51等KEILC51KeilμVision3IDE3.2KeilC51的开发工具11KeilμVision3IDECx51.exeKeilC51开发套件v7.5012C语言结构特点一个C程序由一个或多个函数组成,其中必须有一个用main命名的主函数。每个函数由头部和函数体两部分组成。每个C语句以“;”结尾。C程序的书写格式比较自由。可以在程序的任何位置用/*……….*/对C程序中的任何部分作注释。可以在行末用//追加注释。13C51的程序结构#includereg51.hvoiddelay(){……;}voidmain(){delay();P0=0x33;}例:文件led.c内的代码如下:头文件(一个或若干个)主函数程序的入口函数名固定,且与书写的位置无关有且仅有一个函数声明或定义库函数或用户自定义的函数可以有若干个C51程序大体上是若干函数的集合14单片机控制LED(电路图)XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.0/T21P1.1/T2EX2P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C52C122pFC222pFC310uFX1CRYSTALD1LED-REDR1220R210k15我的第一个程序(单片机控制LED点亮)#includereg52.hsbitLED=P1^0;voidmain()//主程序{LED=0;//点亮LEDwhile(1);}16单片机控制LED闪烁(程序)#includereg51.h#defineucharunsignedchar#defineuintunsignedintsbitLED=P1^0;voiddelay(uintx)//延时程序{uchari;while(x--){for(i=0;i120;i++);}}voidmain()//主程序{while(1){LED=~LED;//LED灯闪烁delay(400);}}17KEIL与PROTEUS快速入门KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用C来开发,体会更加深刻。KeilC51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。181、建立一个新工程单击Project菜单,在弹出的下拉菜单中选中NewProject选项,如图3所示。图3新建工程文件KEILC51快速入门192、然后选择你要保存的路径,输入工程文件的名字,如图4所示,然后点击保存。图4新建工程文件的保存路径KEILC51快速入门203、这时会弹出一个对话框,要求你选择单片机的型号,你可以根据你使用的单片机来选择,keilc51几乎支持所有的51内核的单片机,如图所示,选择89C51之后,右边栏是对这个单片机的基本的说明,然后点击确定。图5选择单片机的型号KEILC51快速入门214、完成上一步骤后,屏幕如图6所示。图6完成新建工程文件KEILC51快速入门22下面可以编写程序。5、在图2-7中,单击“File”菜单,再在下拉菜单中单击“New”选项。新建文件后屏幕如图8所示。图7新建文档图8完成新建文档KEILC51快速入门23此时光标在编辑窗口里闪烁,这时可以键入应用程序了,建议首先保存该空白的文件,单击菜单上的“File”,在下拉菜单中选中“SaveAs”选项单击,屏幕如下图所示,在“文件名”栏右侧的编辑框中,键入欲使用的文件名,用C语言编写扩展名为(.c)如果用汇编语言编写扩展名必须为(.asm)。然后,单击“保存”按钮。如图8所示。图8保存新建文档KEILC51快速入门246、回到编辑界面后,单击“Target1”前面的“+”号,然后在“SourceGroup1”上单击右键,弹出菜单9。图9打开添加文档界面KEILC51快速入门25然后单击“AddFiletoGroup‘SourceGroup1’”,屏幕如图10所示。图10添加文档KEILC51快速入门26选中main.c,然后单击“Add”屏幕如下图所示。注意到“SourceGroup1”文件夹中多了一个子项“main.c”子项的多少与所增加的源程序的多少相同。7、现在便可输入程序了,输入完毕进行调试便可运行。图10完成添加文档KEILC51快速入门27Proteus快速入门Proteus软件和我们手头的其他电路设计仿真软件最大的不同即它的功能不是单一的。它的强大的元件库可以和任何电路设计软件相媲美;它的电路仿真功能可以和Multisim相媲美,且独特的单片机仿真功能是Multisim及其他任何仿真软件都不具备的;它的PCB电路制版功能可以和Protel相媲美。它的功能不但强大,而且每种功能都毫不逊于Protel,是学习电子设计难得的一个工具软件。28ISIS——智能原理图输入系统,系统设计与仿真的基本平台。ARES——高级PCB布线编辑软件。在Proteus中,从原理图设计、单片机编程、系统仿真到PCB设计一气呵成,真正实现了从概念到产品的完整设计。Proteus从原理图设计到PCB设计,再到电路板完成的流程如图所示。29数据数据类型、数据结构、存储类型运算算术运算、关系运算、逻辑运算、位操作控制顺序结构、选择结构、循环结构、函数3.3C51语言程序设计基础C51语言程序设计的三大要素303.3.1C51数据类型与存储类型常量与变量常量:程序运行中值不能改变的量称为常量,常量存在于ROM中。变量:变量代表存贮器中的一个或多个存储单元,用来存放数据,一般来讲这些值在程序运行中可以改变(只读变量除外)变量名命名规则:变量名只能由半角的字母、数字、下划线组成,且第一个字符不能是数字。变量存在的类型称为数据类型。31C51数据类型与标准C数据类型的最大不同之处:位型。位型(bit)字符型(char)整型(int)长整型(long)浮点型(float)双精度浮点型(double)数组类型(array)结构体类型(struct)共用体(union)枚举(enum)基本类型构造类型指针类型空类型数据类型①数据类型32C51数据类型数据类型C51专用长度取值范围signedchar单字节-128to+127unsignedchar单字节0to255signedint2字节-32768to+32767unsignedint2字节0to65535signedlong4字节-2147483648to+214746483647unsignedlong4字节0to4294967295float4字节±1.17