您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第三章 单片机C51程序设计
第三章单片机C51程序设计本章要点了解KeilC51编译器的功能掌握C51的数据类型及变量定义掌握KeilC51编译环境的使用方法单片机常用的编程语言有汇编语言和C语言。C语言的结构性、可读性和可维护性好,已成为单片机应用系统开发的主流语言。支持MCS-51用C语言编程的编译器主要有两种:1)FranklinC51编译器2)KeilC51编译器,简称C51。其中:C51是专为MCS-51开发的一种高性能的C编译器本章内容C51程序结构C51的数据类型存储器类型及存储区C51对特殊功能寄存器的定义KeilC5指针与函数绝对地址访问宏定义与C51常用的头文件单片机的IO口编程3.1C51程序结构C51程序结构与一般的C程序没有差别。C51源程序必须包含一个main()函数C51源程序文件,还可以包含若干个其他函数C51程序必须包含C51的库文件如果使用中断,需要单独编写中断函数如果使用中断、定时器和串口等外设或特殊功能模块,一般要先进行初始化设置主函数中,while(1){…}是必须的。3.1C51程序结构预处理命令:#include….H//全程变量定义//函数声明//函数定义charfunl()//函数定义{//函数体}//中断函数定义void函数名()interruptx{……//函数体}#includereg51.hvoidmain()//主函数{//局部变量定义//单片机寄存器的初始化函数while(1){……//主函数体}}关于While(1)是单片机程序必须的部分C51对标准ANSIC的扩展C51除ANSIC标准的32个关键字之外,C51还扩展以下的关键字:_at_、sfr16、alien、sfridata、bdata、pdatacode、bit、sbit、interrupt3.2C51的数据类型表3-3存储器类型关键字关键字描述DATA片内RAM的低128个字节BDATA片内RAM的DATA区的16个字节的可位寻址区IDATA片内RAM区的高128个字节PDATA外部RAM的1页(256字节),通过P0口的地址对其寻址XDATA外部RAM的64KB存储区CODE程序存储区3.3存储器类型及存储区1.DATA段unsignedchardatasys=0;unsignedintdataunit_id[2];2.BDATA段unsignedcharbdatastatus_byte;unsignedintbdatastatus_word;3.IDATA段unsignedcharidatasystem_status=0;unsignedintidataunit_id[2];3.3存储器类型及存储区4.PDATA和XDATA段unsignedcharxdatasystem_status=0;unsignedintpdataunit_id[2];charxdatainp_string[16];floatpdataoutp_value;5.CODE段unsignedintcodeunit_id[2]=1234;存储模式指定缺省类型存储模式说明SMALL默认的存储类型是data,参数及局部变量放入可直接寻址片内RAM的用户区中(最大l28字节)。COMPACT默认的存储类型是pdata,参数及局部变量放入分页的外部数据存储区LARGE默认的存储类型是xdata,参数及局部变量直接放入片外数据存储区。用此数据指针进行访问效率较低,尤其对两个或多个字节的变量,这种数据类型的访问机制直接影响代码的长度这个模式选择是在Keil开发环境中设置的3.4C51对特殊功能寄存器(SFR)的定义C51编译器使用sfr与sfr16两个关键词,将这些特殊功能寄存器的名字与其绝对地址联系起来;将单片机的硬件与C语言编程结合起来。1.使用“sfr”关键字定义SFR特殊功能寄存器C51定义的一般语法格式如下:sfrname=intconstant【例3-1】使用“sfr”关键字定义SFRsfrSCON=0x98;//声明SCON为串口控制器,地址为0x98sfrP0=0x80;//声明P0为特殊功能寄存器,地址为0x80//声明TMOD为定时器器的模式寄存器,地址为0x89sfrTMOD=0x89;sfrPSW=0xD0;//声明PSW为特殊功能寄存器,地址为0xD0这些寄存器,Keil提供的头文件默认都定义好添加头文件REGX51.H图3-1加入REGX51.H的例子2.使用“sbit”关键字定义SFR的每一位语法格式如下:sbitbitname=sfrname^intconstant;【例3-2】使用“sbit”关键字定义SFR的每一位sfrPSW=0xD0;//定义PSW寄存器地址为DOHsbitOV=PSW^2;//定义0V位为PSW.2,地址为D2HsbitP2_7=P2^7;//定义P2.7位为P2_73.5KeilC51指针与函数1.通用指针2.存储器指针3.KeilC51函数1.通用指针通用指针的声明和使用均与标准C相同,不过同时还可以说明指针的存储类型。如:char*s;/*字符指针*/int*numptr;/*整型指针*/long*state;/*长整型指针*/通用指针总是需要三个字节来存储:第一个字节表示存储器类型,第二个字节是指针的高字节,第三个字节是指针的低字节。2.存储器指针存储器指针或类型确定的指针在定义时包括一个存储器类型说明,并且总是指向此说明的特定存储器空间。例如:chardata*str;/*str指向data区中char型数据*/intxdata*pow;/*pow指向外部RAM的int型整数*/。3.KeilC51函数格式:函数类型函数名(形式参数)[reentrant]函数的格式与标准C语言相同3.6绝对地址访问使用“#includeabsacc.h”语句即可使用其中定义的宏来访问绝对地址。该文件中实际只定义了几个宏,以确定各存储空间的绝对地址,使用方法如下:1.绝对宏包括:CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD。例如:rval=CBYTE[0x0002];//指向程序存贮器的0002h地址rval=XWORD[0x0002];//指向外RAM的0004h地址3.6绝对地址访问2._at_关键字直接在数据定义后加上_at_const即可例如:idatastructlinklist_at_0x40;//指定list结构从40h开始。xdatachartext[25b]_at_0xE000;//指定text数组从0E000H开始注意:(1)绝对变量不能被初使化;(2)bit型函数及变量不能用_at_指定。3.7宏定义与C51中常用的头文件C51中常用的头文件通常有reg5l.h、reg52.h、math.h、ctype.h、stdio.h、stdlib.h、absacc.h、intrins.h等。常用的却只有reg5l.h或reg52.h,math.h。例如:#includereg51.h#includemath.h3.7宏定义与C51中常用的头文件reg5l.h和reg52.h是定义51单片机或52单片机特殊功能寄存器和位寄存器的,这两个头文件中大部分内容是一样的,52单片机比51单片机多一个定时器T2,因此,reg52.h中也就比reg5l.h中多几行定义T2寄存器的内容。math.h是定义常用数学运算,比如求绝对值、求方根、求正弦和余弦等,该头文件中包含有各种数学运算函数,当我们需要使用时可以直接调用它的内部函数。平时常用如下头文件#includereg51.h#includemath.h3.8C语言的数制与常用运算符1.C语言的数制计算机中常用的数制有三种十进制数是我们最熟悉的一种数制,基数为10,逢十进一。二进制数是计算机内的基本数制,其主要特点是:任何二进制数都只由0和1两个数码组成,其基数是2。进位规则是“逢二进一”。十六进制数是微型计算机软件编程时常采用的一种数制其主要特点:基数是16,“逢十六进一”。2.常用的C语言运算符与标准C相同表3-5常用的C语言的运算符&&a&&ba和b作逻辑AND运算||a||ba和b作逻辑OR运算!!a将a按位取反ab按位右移b个位ab按位左移b个位,右侧补0|a|a和b的按位做OR运算&a&ba和b的按位做AND运算^a^ba和b的按位做XOR运算~~a将a的每一位取反&=a&=b将变量的地址存人a存入寄存器**a用来取寄存器所指地址内的值3.9C51的流程控制语句1.分支结构●选择语句if●switch/case语句2.循环语句●while语句●do-while语句●for循环语句3.10单片机的I/O口编程语句介绍(重点)51系列单片机共有四个8位并行I/O口,分别是P0、P1、P2、P3。一条编程语句即可以操作单个引脚,也可以按字节来操作8个引脚。数字电路中只有两种电平特性,即高电平和低电平,因此单片机的引脚只有0、1两种逻辑状态。逻辑“0”的电压值是0V,逻辑“1”的电压值是5V。因为P1~P3口内部有上拉电阻,所以引脚在没有外围电路时读时,单片机读端口的值是逻辑“1”。表3-6C51读写单片机的I/O端口操作例子描述读I/O端口temp=P1;读P1口接收到的逻辑信息,并送到变量BB中写I/O端口P1=0x55;将0x55送到P1口,此时P1口的对应引脚显示该逻辑信息读I/O口b=P1_3;读出引脚P1_3的逻辑状态,并送到位变量C1中写I/O口P1_0=0;将P1口的第0个引脚设置为低电平输出3.11简单控制单片机引脚输出(实训二)1.实训题目:简单发光二极管流水灯程序2.实训内容练习写单片机的I/O口编程;理解如何编程发出逻辑信息,并控制外围电路;程序1:8个发光二极管L1~L8分别接在单片机的P1.0~P1.7接口程序2:LED跑马灯利用for语句编辑一个的延时函数,并使用该延时函数让第一个发光二极管亮灭闪动。程序3:LED移位显示下面程序可以使8个发光二极管动起来,点亮顺序为P1.0→P1.1→P1.2→P1.3→┅→P1.7,并重复循环。编程方法同样:编程使单片机引脚输出“0”、“1”逻辑电平。3.12使用C语言高级语句控制引脚输出1.实训题目:发光二极管流水灯程序2.实训内容本程序主要练习写单片机的I/O口编程,将C语言的判断、循环语句与引脚输出结合起来。3.13KeiluVision5集成开发编程环境使用实际操作演示3.14KeilC51编译器使用及程序下载1.实训题目:控制LED灯闪烁2.实训目的:熟悉KeilC51编译器的使用方法3.实训原理电路图如图2-6所示。将电源最小系统板、发光二极管板用杜邦线连接起来。发光二极管使用单片机的P1.0引脚来控制。当控制信号为低电平时(逻辑0)发光二极管亮,控制信号为高电平(逻辑1)时发光二极熄灭。思考与练习1、C51编程与ANSIC编程主要有什么区别?2、51单片机能直接进行处理的C51数据类型有哪些?3、简述C51存储类型与51单片机存储空间的对应关系。4、C51中51单片机的特殊功能寄存器如何定义?试举例说明。5、C51中51单片机的并行口如何定义?试举例说明。6、C51中51单片机的位单元变量如何定义?试举例说明。7、C51中指针的定义与ANSIC有何异同?本章作业:3,6,7题热释红外防盗报警器(第3章演示例程1)实验用到的材料人体热释红外防盗报警器注:单片机型号换面任意一款51单片机都通用人体热释红外防盗报警器软件设计51单片机
本文标题:第三章 单片机C51程序设计
链接地址:https://www.777doc.com/doc-3786306 .html