您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 单片机原理及应用教程
第9章单片机C语言程序设计9.1KeilC简介与环境设置9.2Cx51简介9.3Cx51开发工具简介9.4Cx51应用程序设计举例随着单片机应用的深入发展和强盛的社会需求,应用高级语言进行单片机程序设计正在逐渐增多,本章主要介绍如何用C语言开发单片机应用程序。一般情况下单片机常用的程序设计语言有两种:●汇编语言:汇编语言具有执行速度快、占存储空间少、对硬件可直接编程等特点,因而特别适合在对实时性能要求比较高的情况下使用。●C语言:C语言克服了汇编语言的不足之处,同时又增加了代码的可读性,C语言大多数代码被翻译成目标代码后,其效率和汇编语言相当。特别是C语言的内嵌汇编功能,使C语言对硬件操作更加方便。9.1KeilC简介与环境设置KeilCμVision2开发环境是德国KeilSoftware,Inc.andKeilElektronikGmbH开发的微处理器开发平台,可以开发多种8051兼容单片机程序。其界面如图9-1所示。图9-1:KeilCμVision2Cx51有两种使用方式。第一种方式是在μVision2IDE中使用,不用进行设置;第二种方式是在命令提示符下使用。如果使用命令方式,需要设置如下变量:①PATH=E:\Keilc\C51\BIN②TMP=E:\Keilc\Tmp③C51INC=E:\Keilc\C51\INC④C51LIB=E:\Keilc\C51\LIB在WindowsNT环境下设置方式为:我的电脑-属性-高级-环境变量-新建设置好运行环境后就可以在命令提示符下编译C语言源程序,其格式如下:C51源文件名[控制命令...]9.2Cx51简介9.2.1Cx51的扩展Cx51编译器兼容ANSIC标准,又扩展支持了8051微处理器,其扩展内容如下:①存储区;②存储区类型;③存储模型;④存储类型说明符;⑤变量数据类型说明符;⑥位变量和位可寻址数据;⑦SFR;⑧指针;⑨函数属性。9.2.2存储区8051单片机支持程序存储器和数据存储器的分离,存储器根据读写情况可以分为:程序存储区(ROM)、快速读写存储器(内部RAM)、随机读写存储器(外部RAM)。1.程序存储器(code)在8051中程序存储器是只读存储器,其空间为64K。2.内部数据存储器在8051单片机中,内部数据存储器属于快速可读写存储器,与51兼容的扩展型单片机最多有256字节内部数据存储区。3.外部数据存储器外部数据存储器又称随机读写存储器,访问存储空间为64KB。其访问速度要比内部RAM慢。访问外部RAM的数据要使用指针进行间接访问。9.2.3存储模式在Cx51中,存储器模式可以确定一些变量在缺省情况下的存储器类型。程序中可用编译器控制命令SMALL、COMPACT、LARGE指定存储器模式。1.SMALL模式SMALL模式中所有的变量在缺省的情况下位于单片机的内部数据区,这和用data存储类型标识符声明的变量是相同的。在本模式中变量访问非常有效,然而所有对象和堆栈必须适和内部RAM。2.COMPACT模式COMPACT模式中所有变量在缺省的情况下都存放在外部数据区的一页(256B)中,这和用pdata存储类型标识符声明的变量是相同的。3.Large模式LARGE模式下所有变量在缺省情况下存放在外部数据存储区(范围为64k字节),这和用xdata存储类型标识符声明的变量是一致的,该模式使用数据指针DPTR寻址。9.2.4数据类型在Cx51中不仅支持所有的C语言标准数据类型,而且还对其进行了扩展,增加了专用于访问8051硬件的数据类型,使其对单片机的操作更加灵活。1.bit类型bit用于声明位变量,其值为1或0。2.sbit类型sbit类型用于声明可位寻址变量中的某个位变量,其值为1或0。3.sfr类型sfr类型用于声明特殊功能寄存器(8位),位于内部RAM地址为0x80-0xFF的128字节存储单元,这些存储器一般用作对计时器、计数器、串口、并口和外围使用。4.sfr16类型sfr16类型用于声明两个连续地址的特殊功能寄存器(地址范围为0~65535)。9.2.5指针所谓指针就是存储单元的地址,指针变量就是存放地址的变量。在Cx51编译器中指针可以分为两种类型:通用指针和指定存储区地址指针。1.通用指针所谓通用指针是指未对指向的对象(变量)存储空间进行说明的指针。通用指针可以访问8051存储空间中与位置无关的任何变量。2.存储区域的指针所谓存储区域的指针是指在指针声明中包含存储器类型。程序中使用指定存储区域的指针速度要比通用指针快(指定存储区域指针在编译时Cx51编译器已知道其存储区域,而通用指针直到运行时才确定存储区域),在实时控制系统中应尽量使用指定存储区域的指针。9.2.6函数函数是C程序的基本单元,全部C都是由一个个函数组成的。在结构化程序设计中,函数作为独立的模块存在,增加了程序的可读性,为解决复杂问题提供了方便。C语言中的函数包括:主函数(main)、库函数和自定义函数。1.Cx51自定义函数Cx51具有自定义函数的功能,其自定义函数语法格式如下:return_typefunction_name([args,…])[small|compact|large][reentrant][interruptn][usingn]return_type:指返回类型,在默认情况下为int。function_name:函数的名字。args:函数的形式参数列表。smallcompactlarge:函数的存储模式。reentrant:函数是否可重入,要注意可重入函数中的变量的同步。interrupt:可以用interrupt告诉计算机这个函数是中断服务函数。using:指定函数所使用的寄存器组。2.中断函数在Cx51中提供了中断支持函数,中断服务程序在Cx51中是以中断函数的形式出现的。此类型函数用interrupt关键字进行描述。3.再入函数Cx51在调用函数时,函数的形式参数及函数内的局部变量将会动态地存储在固定的存储单元中,一旦函数在执行时被中断,若再次调用该函数时,函数的形式参数及函数内的局部变量将会被覆盖,导致程序不能正常运行,为此,可在定义函数时用reentrant属性引入再入函数。再入函数可以被递归调用,也可以被多个程序调用。9.3Cx51开发工具简介Cx51是专用于8051等嵌入式应用的开发工具套件。该软件可以对C源文件、汇编源文件进行编译、连接、生成并调试目标程序。Cx51以工程的形式组织各类资源文件,其程序开发步骤如下:1.创建工程选择Cx51开发环境Project菜单,选择NewProject菜单项来建立一个新的工程。2.选择目标芯片在工程建立完成后,器件选择窗口便会弹出,从器件库选择单片机应用系统所使用的8051芯片。3.创建并编写C51源文件选择Cx51开发环境的File菜单的New菜单项,这时会出现新建源程序编辑窗口,新建一个C语言源文件。4.把源程序文件加入到工程中在建立了源程序文件后,必须把源程序文件添加到工程中,以构成一个完整的工程项目。5.为目标芯片添加启动代码在main()函数执行前,首先应复位单片机内部RAM、完成对硬件初始化等操作,即执行一段初始化代码。在Cx51中,STARTUP.A51文件是启动代码文件,该文件适合大多数8051及其派生系列的目标芯片。6.设置编译、连接环境7.对工程进行编译和连接选择Cx51开发环境的Project菜单中的Buildtarget菜单项,则对工程中的文件进行编译、汇编和连接,生成二进制代码的目标文件(.obj)、列表文件(.lst)、绝对地址目标文件、绝对地址列表文件(.m51)、连接输入文件(.imp)。8.调试程序选择Debug菜单的Start/stopDebugSession菜单项,即可进入调试状态。在调试状态下,目标文件自动转换为HEX文件。在调试中可以对单片机的寄存器、内存、所产生的汇编代码、串口的输出情况等进行监视9.4Cx51应用程序设计举例9.4.1输入单片机中的I/O口(即P0,P1,P2,P3)可以单独的作为输入/输出口使用。在实际的开发过程中输入输出是单片机最基本的功能。【例9-11】根据图9-9所示实验电路,要求如下:①用输入电路中接入的4个按键分别控制对应的4个发光二极管的点亮。②判断按键是否被按下(进行去抖处理),如果按下判断按的是哪个键,如果没有键按下返回0xff。③根据所按下的按键点亮相应的发光二极管。在程序中for(j=0;j100;j++)是软件去抖处理,处理的方法是先读取P0口的状态经过for关键字的处理后再检查按键观察是否和for前一致,如果一致返回按键结果。否则,返回0xff。源程序代码如下:#includereg52.h#includeintrins.hsbitCLK=P1^1;sbitDATA=P1^0;图9-9单片机实验电路sbitCONTROL=P1^2;voiddelay(){unsignedintm;for(m=0;m500;m++);}unsignedintGetPressKey(){unsignedintj;unsignedintkey;P0=0xff;key=P0;for(j=0;j100;j++);if((key==P0)&&(key!=0xff)){returnkey;voidProcess(){unsignedintlsdata;unsignedintkeycode;lsdata=0xff;keycode=GetPressKey();CONTROL=0;if(keycode==0xfe){lsdata=0x7f;WriteData(lsdata);}if(keycode==0xfd)unsignedchari;for(i=0;i8;i++){CLK=1;lsdata=lsdata1;DATA=CY;CLK=0;}CLK=1;}}else{return0xff;}}voidWriteData(unsignedintlsdata){}{lsdata=0xbf;WriteData(lsdata);}if(keycode==0xfb){lsdata=0xdf;WriteData(lsdata);}if(keycode==0xf7){lsdata=0xef;WriteData(lsdata);}CONTROL=1;}intmain(void){while(1){Process();}return0;9.4.2输出实现单片机的输出操作就是将数据写入I/O口。【例9-12】如图9-9所示,同时点亮4个发光二极管时,对74LS164的完整控制程序。源程序代码如下:#includereg52.h#includeintrins.hsbitCLK=P1^1;sbitDATA=P1^0;sbitCONTROL=P1^2;voiddelay(){unsignedintm;for(m=0;m500;m++);}voidWriteData(unsignedintlsdata){unsignedchari;for(i=0;i8;i++){CLK=1;lsdata=lsdata1;DATA=CY;CLK=0;}CLK=1;}intmain(void){unsignedintlsdata;lsdata=0x00;while(1){CONTROL=0;/*所有发光二极管处于不发光状态*/WriteData(lsdata);delay();CONTROL=1;}return0;}9.4.3定时器/计数器【例9-13】用定时器来控制发光二极管的亮/灭,间隔时间为2秒。源程序代码如下:#includereg52.h#includeintrins.hsbitCLK=P1^1;sbitDATA=P1^0;sbitCONTROL=P1^2;unsignedcharcount;voidInitTimer(){TMOD=0x01;TH0=0x3c;TL0=0xB0;EA=1;ET0=1;TR0=1;}v
本文标题:单片机原理及应用教程
链接地址:https://www.777doc.com/doc-2606294 .html