教学课件课件第4章-C51的程序的编制.pptx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《教学课件课件第4章-C51的程序的编制.pptx》由会员分享,可在线阅读,更多相关《教学课件课件第4章-C51的程序的编制.pptx(182页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、PPT模板下载:/moban/行业PPT模板:/hangye/节日PPT模板:/jieri/PPT素材下载:/sucai/PPT背景图片:/beijing/PPT图表下载:/tubiao/优秀PPT下载:/xiazai/PPT教程:/powerpoint/Word教程:/word/Excel教程:/excel/资料下载:/ziliao/PPT课件下载:/kejian/范文下载:/fanwen/试卷下载:/shiti/教案下载:/jiaoan/字体下载:/ziti/课件第4章-C51的程序的编制第4章C51程序的编制知识目标:掌握C51的数据结构、存储类型、基本运算符、基本语句结构、程序结构,掌
2、握C51程序的编制方法。技能目标:能区分与运用C51的特殊数据结构,能够编制基于C51的中等程度的单片机控制程序。素质目标:养成在已有的基础上扩展知识的学习习惯。项目一任务5点亮一个发光二极管要求:在跑马灯电路中只点亮一只LED.6.1C51的特点C51的优点:C51与ASM-51(汇编语言)相比,有如下优点:一、对单片机的指令系统不要求了解,仅要求对8051的存贮器结构有初步了解;二、寄存器分配、不同存贮器的寻址及数据类型等细节可由编译器管理;三、程序有规范的结构,可分成不同的函数,这种方式可使程序结构化;四、具有将可变的选择与特殊操作组合在一起的能力,改善了程序的可读性;五、提供的库包含许
3、多标准子程序,具有较强的数据处理能力;六、由于具有方便的模块化编程技术,使已编好程序可容易地移植。C51使用要注意什么?需要根据单片机存储器结构及内部资源,定义相应的数据类型和变量。其它的语法规定、程序结构及程序设计方法,都与ANSIC相同。C51扩展的关键字_at_bdatabitcodedataidatainterruptpdatareentrantsbitsfrsfr16usingvolatilexdata这些关键字在后面会陆续接触到,此处先不给出它们的含义。项目一任务5点亮一个发光二极管解答方法一:#includemain()unsignedchara=0 xfe;P1=a;while
4、(1);显然,要使D1点亮就是要使P1.0为低电平,而其它管脚为高电平。程序解释:“#include”称为包含语句,其作用是将8051的特殊功能寄存器的地址及位地址加以定义,使得它们在程序中可识别;“main()”称作主函数,在一个程序中,必需要有且仅能有个主函数,程序启动时,总是最先从主函数开始运行的,单片机复位后也是如此。“unsignedchara=0 xfe;”称作变量定义语句,它指出变量“a”为无符号的字符型变量,其初始值为十六进制数“fe”,注意“;”是一条语句的结束标识符,不能省略。“P1=a;”是赋值语句,其作用是将“a”的值传递给了“P1”,故P1的最低位为,D1亮。“whi
5、le(1);”的作用是让程序停下来。因为程序如果不停下来,将一直往下运行,将跑飞,即运行到未知的区域,造成不可预测的结果。运行效果图将KeilC及Proteus放到一个界面中,在KeilC中运行程序,在Proteus中观察运行结果。在复位及刚启动仿真时可以看到P1口都为高电平(红色),如图6.1所示。然后,单步运行程序,当运行了语句“P1=a;”后,可以看到,P1.0处的电平弯为低电平(蓝色),面与此相连的LED亮了,如图所示。以后也可运行类似的方法观察程序的运行过程。方法二:#includesbitD1=P10;main()D1=;while(1);这种方法更简便,其中变量D1为位变量,那么
6、,变量有哪些类型,都有什么特点?下面将讨论的数据结构。6.2C51的数据结构C51变量定义的四个要素存储种类存储种类一、自动变量(auto)在函数内部定义的变量,退出函数后,分配给该变量的存储单元即自行消失(局部变量)。二、外部变量(extern)在函数外部定义的变量,可始终保持变量的数值(全局变量)。【强调】一个外部变量只能被定义一次,在定义文件之外的地方使用时需用extern进行声明。三、静态变量(static)静态局部变量/静态全局变量四、寄存器变量(register)以寄存器为存储空间的变量*若省略存储种类选项,则变量默认为自动变量基本数据类型C51扩充数据类型扩充数据类型C51扩充数
7、据类型:bit、sfr或sfr16、sbitsfr或sfr16型sfr定义特殊功能寄存器SFR的地址,语法规则如下:sfr或sfr16sfr_name=字节地址常数;例如,sfrP0=0 x80;/定义P0口地址80HsfrPCON=0 x87;/定义PCON地址87Hsfr16DPTR=0 x82;/定义DPTR的低端地址82H有些新型的单片机,有些新增的寄存器在KeilC的包含文件夹“inc”里可能没有,这是就需要在程序的最前面用此方法定义。如宏晶公司的单片机STC12C5A60S中为一个称作AUXR的寄存器,在内部RAM中的地址为0 x8E,可定义如下:sfrAUXR=0 x8E;这种定
8、义以后,在程序中就可对AUXR进行操作。sbit型sbt型是能够按位寻址的特殊功能寄存器中位变量。其定义的一般格式为:sbit位变量名位地址表达式位地址表达式有三种形式直接位地址;特殊功能寄存器名带位号;字节地址带位号。1、sbitbit_name=位地址常数;将位于SFR字节地址内的绝对位地址定义为位变量名。例如,sbitCY=0 xD7;2、sbitbit_name=sfr_name位位置;将已有定义的SFR的07位定义为位变量名。例如:sfrPSW=0 xD0;sbitCY=PSW7;3、sbitbit_name=sfr字节地址位位置;将SFR字节地址的相对位地址定义为位变量名。例如:s
9、bitCY=0 xD07;以上三种定义对于CY来讲是一样的,即等效.方法二:点亮一个发光二极管图6.1 复位时的仿真情况解答#includesbitD1=P10;main()D1=;while(1);对位变量的定义也可以是:“sbitD1=0 x900”,因为P1口的地址为0 x90.也可对位变量定义为:“sbitD1=0 x90”,因为P1.0的地址为0 x90C51编译器在头文件“reg51.h”中定义了全部sfr/sfr16和sbit变量。用一条预处理命令#include把这个头文件包含到C51程序中,无需重定义即可直接使用它们的名称。reg51.h中的内容如下:#ifndef_REG5
10、1_H_#define_REG51_H_/*BYTERegister*/sfrP0=0 x80;sfrP1=0 x90;/*BITRegister*/*PSW*/sbitCY=0 xD7;sbitAC=0 xD6;sbitRI=0 x98;#endif4、几点说明1)用sbit定义的位变量,必须能够按位操作,而不能够对无位操作功能的位定义位变量。2)用sbit定义位变量,必须放在函数外面作为全局位变量,而不能在函数内部定义。3)用sbit每次只能定义一个位变量。4)对其它模块定义的位变量(bit型或sbit型)的引用声明,都使用bit。5)用sbit定义的是一种绝对定位的位变量(因为名字是与确
11、定位地址对应的),具有特定的意义,在应用时不能像bit型位变量那样随便使用。三、bit型位变量的C51定义除了通常的C数据类型外,C51编译器还支持“bit”数据类型,称之为位变量,只有一位,其值只能是0或1,这对于记录系统状态是十分有用的,因为它往往需要使用某一位而不是整个数据字节。例如:bitdoor=0;/定义一个叫door的变量且初值为0与标准C的变量定义及初始化用法是一致的。在C51中定义位变量的一般语法形式如下:位类型标识符(bit)位变量名;bitmy_bit;/*把my_bit定义为位变量*/bitdirection_bit;/*把direction_bit定义为位变量*/函数
12、参数列表中可以包含类型为“bit”的参数,也可使用bit类型的返回值。例如:bitdone_flag=0;/*把done_flag定义为位变量*/bittestfunc(bitflag1,bitflag2)/*flag1和flag2为bit类型的参数*/return(flag);/*flag是bit类型的返回值*/对位变量定义的限制(1)位变量不能定义成一个指针,原因是不能通过指针访问“bit”类型的数据,如定义“bit*ptr;”是非法的。(2)不存在位数组,如不能定义bitSHOW_BUF6。(3)值得注意的是,使用中断禁止(#pragmadisable)或包含明确的寄存器组切换(usin
13、gn)的函数不能返回位值,否则编译器会给出一个错误信息。在位定义中,允许定义存储类型,位变量都被放入一个位段,此位段总位于51单片机片内的RAM中,因此存储器类型限制为data、bdata和idata。如果把位变量的存储类型定义为其他存储类型,将导致编译出错。数据的存储位置51系列单片机有三个逻辑存储空间:片内数据存储器(内部区),片外数据存储器(外部)和程序存储器(CODE区)。数据可任意存储到其中某一存储器中。一、code区用来存放可执行代码的存储区,用16位寻址空间可达64K代码段,是只读的。比较大型的数据一般存放在此区域,如用单片机控制电子屏显示汉字时,汉字字库要占据很大的存储空间,这
14、是就应把它存储在这一区域。如存储“武汉”两个字的数组定义如下:unsignedcharcodetab32=0 xFF,0 xFD,0 xFF,0 xF5,0 x03,0 xED,0 xFF,0 xFD,0 x00,0 x80,0 xFF,0 xFD,0 xDF,0 xFD,0 xDF,0 xFB,0 x1B,0 xFA,0 xDB,0 xFB,0 xDB,0 xFB,0 xDB,0 xF7,0 x1B,0 xB7,0 xE3,0 xAF,0 xF8,0 x9F,0 xFF,0 xBF,/*武*/0 xFB,0 xFF,0 xF7,0 xFF,0 x17,0 xC0,0 xBF,0 xEF,0
15、xBE,0 xEF,0 x6D,0 xF7,0 x6D,0 xF7,0 x77,0 xF7,0 xF7,0 xFA,0 xFB,0 xFA,0 xF8,0 xFD,0 xFB,0 xFA,0 x7B,0 xE7,0 x9B,0 x8F,0 xEB,0 xDF,0 xFF,0 xFF,/*汉*/将表格,数组等定义成code型常数,在KeilC编译后,会大大减少程序占用的存储空间,这一情况以后会碰到。二、data区是8051内128字节的内部RAM或8052的前128字节内部RAM存储区。这部分主要是作为数据段,称为data区。访问data区比访问xdata区要快。通常我们把使用比较频繁的变量或局
16、部变量存储在data段中,但是必须节省使用data段,因为它的空间毕竟有限。如例子中的变量“a”还可定为“unsignedchardataa=0 xfe;”其实,如果没有说明数据存储类型,默认数据存储在data区。三、bdata位寻址段bdata,包括16个字节,共128位,每一位都可单独寻址。位寻址段的这16个字节也可像数据段中其它字节一样进行字节寻址。unsignedchar bdataoperate;对operate的低4位作位变量定义:sbitflag_key=operate0;/键盘标志位sbitflag_dis=operate1;/显示标志位sbitflag_mus=operate
17、2;/音乐标志位sbitflag_run=operate3;/运行标志位四、idata区8051系列的一些单片机,如8052有附加的128字节的内部RAM,位于从80H开始的地址空间中,被称为idata。因为idata区的地址和SFRs的地址是重叠的,通过区分所访问的存储区,来解决地址重叠问题,因为idata区只能通过间接寻址来访问。五、xdata区存储空间为64K,和code区一样采用16位地址寻址称作外部数据区,简称xdata区。这个区通常包括一些RAM,如SRAM或一些需要通过总线接口的外围器件。如果要将变量“a”置于这一区域,则表示是:“unsignedcharxdataa=0 xfe
18、;”六、pdata区这一区域只是对xdata区进行了要页处理,每一页称作一个pdata区.unsigned char data system_status=0;/定义system_status为无符号字符型自动变量,该变量位于data区中且初值为0。变量名为system_status位与片内RAM区无符号字符型自动型初值为零小技巧:1、用局部变量代替全局变量把变量定义成局部变量比全局变量更有效率.编译器为局部变量在内部存储区中分配存储空间,而为全局变量在外部存储区中分配存储空间,这会降低你的访问速度.另一个避免使用全局变量的原因是,你必须在你系统的处理过程中调节使用全局变量,因为在中断系统和多
19、任务系统中不止一个过程会使用全局变量.2、为变量分配内部存储区局部变量和全局变量可被定义在你想要的存储区中.根据先前的讨论,当你把经常使用的变量放在内部RAM中时,可使你的程序的速度得到提高,除此之外,你还缩短了你的代码,因为外部存储区寻址的指令相对要麻烦.一些考虑到存储速度按下面的顺序使用存储器:dataidatapdataxdata小知识:关于变量名变量名可以由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线,变量名长度随编译系统而定。变量名具有字母大小写的敏感性,如SUM和sum代表不同的变量。强调:头文件中定义的变量都是大写的。变量名不得使用标准C语言和C51语言的关键字
20、。数据结构定义举例unsignedcharbdatastatus_byte;/定义status_byte为无符号字符型自动变量,该变量位于bdata区unsignedintcodeunit_id2=0 x1234,0 x89ab;/定义unit_id2为无符号整型自动量,该量位于code区中,是长度为2的数组,且初值为0 x1234和0 x89ab。staticcharm,n;/定义m和n为2个位于data区中的有符号字符型静态变量。项目一任务6根据由输入状态决定输出端口的状态.要求:用开关输入改变P0口的状态,并由此决定P1口输出电平任务分析:开关状态如何读入单片机,如何由P0口状态,选择P
21、1口的输出?这就涉及到C语言中常见的程序选择结构问题。有几种选择结构?它们是如何使用?6.3C51的程序结构与一般C语言的结构相同,以main()函数为程序人口,程序体中包含若干语句还可以包含若干函数。C51的包含的头文件除reg51.h外,通常有:math.h;absacc.h;intrins.h;ctype.h;stdio.h;stdlib.h.常用有:reg51.h(定义特殊功能寄存器和位寄存器);math.h(定义常用数学运算);C51的运算符一、算术与逻辑运算符与C语言基本相同:+-*/(加 减 乘 除)=0)/如果没有开关按下P1=0 x00;/LED都不亮elseP1=0 xff
22、;/有开关按下,LED都亮注释:at89x51.h与reg51.h基本相同,只是ATMEL公司产品的专用头文件.if-else语句的一般格式如下图6.6 if-else语句流程图if(表达式)语句组1;else 语句组2;if-else-if语句if(表达式1)语句组1;elseif(表达式2)语句组2;elseif(表达式n)语句组n;else语句组n+1;图6.7 if-else-if语句流程图项目一任务6另一解答#includemain()while(1)/按下P0口哪个按钮相对应的P1口LED亮.if(P0=0 x00)P1=0 x00;else if(P0=0 x01)P1=0 x0
23、1;else if(P0=0 x02)P1=0 x02;else if(P0=0 x04)P1=0 x04;else if(P0=0 x08)P1=0 x08;else if(P0=0 x10)P1=0 x10;else if(P0=0 x20)P1=0 x20;else if(P0=0 x40)P1=0 x40;else if(P0=0 x80)P1=0 x80;else P1=0 x00;/其它情况,LED都不亮.并行多分支结构(switch/case)switch(表达式)case常量表达式1:语句组1;break;case常量表达式2:语句组2;break;case常量表达式n:语句组
24、n;break;default :语句组n+1;该语句的执行过程是:首先计算表达式的值,并逐个与case后的常量表达式的值相比较,当表达式的值与某个常量表达式的值相等时,则执行对应该常量表达式后的语句组,再执行break语句,跳出switch语句的执行,继续执行下一条语句。如果表达式的值与所有case后的常量表达式均不相同,则执行default后的语句组。注意:各个case及default出现的次序,不影响执行的结果。各个情况的地位相同。break语句不可少。否则,不会退出,而会继续执行后面的case语句。每一case的常量表达式必须互不相同,以免造成混乱。上例可为并行多分支结构:#inclu
25、demain()unsignedchark;while(1)/建立死循环k=P0&0 xff;/读取P0口的值,即开关的状态switch(k)case0 xfe:P1=0 x01;break;/S0按下case0 xfd:P1=0 x02;break;/S1按下case0 xfb:P1=0 x04;break;/S2按下?case0 xf7:P1=0 x08;break;/S3按下case0 xef:P1=0 x10;break;/S4按下case0 xdf:P1=0 x20;break;/S5按下case0 xbf:P1=0 x40;break;/S6按下case0 x7f:P1=0 x80
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 教学 课件 C51 程序 编制
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内