欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    教学课件课件第4章-C51的程序的编制.pptx

    • 资源ID:71827070       资源大小:1.79MB        全文页数:182页
    • 资源格式: PPTX        下载积分:40金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要40金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    教学课件课件第4章-C51的程序的编制.pptx

    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的数据结构、存储类型、基本运算符、基本语句结构、程序结构,掌握C51程序的编制方法。技能目标:能区分与运用C51的特殊数据结构,能够编制基于C51的中等程度的单片机控制程序。素质目标:养成在已有的基础上扩展知识的学习习惯。项目一任务5点亮一个发光二极管要求:在跑马灯电路中只点亮一只LED.6.1C51的特点C51的优点:C51与ASM-51(汇编语言)相比,有如下优点:一、对单片机的指令系统不要求了解,仅要求对8051的存贮器结构有初步了解;二、寄存器分配、不同存贮器的寻址及数据类型等细节可由编译器管理;三、程序有规范的结构,可分成不同的函数,这种方式可使程序结构化;四、具有将可变的选择与特殊操作组合在一起的能力,改善了程序的可读性;五、提供的库包含许多标准子程序,具有较强的数据处理能力;六、由于具有方便的模块化编程技术,使已编好程序可容易地移植。C51使用要注意什么?需要根据单片机存储器结构及内部资源,定义相应的数据类型和变量。其它的语法规定、程序结构及程序设计方法,都与ANSIC相同。C51扩展的关键字_at_bdatabitcodedataidatainterruptpdatareentrantsbitsfrsfr16usingvolatilexdata这些关键字在后面会陆续接触到,此处先不给出它们的含义。项目一任务5点亮一个发光二极管解答方法一:#includemain()unsignedchara=0 xfe;P1=a;while(1);显然,要使D1点亮就是要使P1.0为低电平,而其它管脚为高电平。程序解释:“#include”称为包含语句,其作用是将8051的特殊功能寄存器的地址及位地址加以定义,使得它们在程序中可识别;“main()”称作主函数,在一个程序中,必需要有且仅能有个主函数,程序启动时,总是最先从主函数开始运行的,单片机复位后也是如此。“unsignedchara=0 xfe;”称作变量定义语句,它指出变量“a”为无符号的字符型变量,其初始值为十六进制数“fe”,注意“;”是一条语句的结束标识符,不能省略。“P1=a;”是赋值语句,其作用是将“a”的值传递给了“P1”,故P1的最低位为,D1亮。“while(1);”的作用是让程序停下来。因为程序如果不停下来,将一直往下运行,将跑飞,即运行到未知的区域,造成不可预测的结果。运行效果图将KeilC及Proteus放到一个界面中,在KeilC中运行程序,在Proteus中观察运行结果。在复位及刚启动仿真时可以看到P1口都为高电平(红色),如图6.1所示。然后,单步运行程序,当运行了语句“P1=a;”后,可以看到,P1.0处的电平弯为低电平(蓝色),面与此相连的LED亮了,如图所示。以后也可运行类似的方法观察程序的运行过程。方法二:#includesbitD1=P10;main()D1=;while(1);这种方法更简便,其中变量D1为位变量,那么,变量有哪些类型,都有什么特点?下面将讨论的数据结构。6.2C51的数据结构C51变量定义的四个要素存储种类存储种类一、自动变量(auto)在函数内部定义的变量,退出函数后,分配给该变量的存储单元即自行消失(局部变量)。二、外部变量(extern)在函数外部定义的变量,可始终保持变量的数值(全局变量)。【强调】一个外部变量只能被定义一次,在定义文件之外的地方使用时需用extern进行声明。三、静态变量(static)静态局部变量/静态全局变量四、寄存器变量(register)以寄存器为存储空间的变量*若省略存储种类选项,则变量默认为自动变量基本数据类型C51扩充数据类型扩充数据类型C51扩充数据类型: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;这种定义以后,在程序中就可对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字节地址的相对位地址定义为位变量名。例如:sbitCY=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_REG51_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定义的是一种绝对定位的位变量(因为名字是与确定位地址对应的),具有特定的意义,在应用时不能像bit型位变量那样随便使用。三、bit型位变量的C51定义除了通常的C数据类型外,C51编译器还支持“bit”数据类型,称之为位变量,只有一位,其值只能是0或1,这对于记录系统状态是十分有用的,因为它往往需要使用某一位而不是整个数据字节。例如:bitdoor=0;/定义一个叫door的变量且初值为0与标准C的变量定义及初始化用法是一致的。在C51中定义位变量的一般语法形式如下:位类型标识符(bit)位变量名;bitmy_bit;/*把my_bit定义为位变量*/bitdirection_bit;/*把direction_bit定义为位变量*/函数参数列表中可以包含类型为“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)或包含明确的寄存器组切换(usingn)的函数不能返回位值,否则编译器会给出一个错误信息。在位定义中,允许定义存储类型,位变量都被放入一个位段,此位段总位于51单片机片内的RAM中,因此存储器类型限制为data、bdata和idata。如果把位变量的存储类型定义为其他存储类型,将导致编译出错。数据的存储位置51系列单片机有三个逻辑存储空间:片内数据存储器(内部区),片外数据存储器(外部)和程序存储器(CODE区)。数据可任意存储到其中某一存储器中。一、code区用来存放可执行代码的存储区,用16位寻址空间可达64K代码段,是只读的。比较大型的数据一般存放在此区域,如用单片机控制电子屏显示汉字时,汉字字库要占据很大的存储空间,这是就应把它存储在这一区域。如存储“武汉”两个字的数组定义如下: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 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区要快。通常我们把使用比较频繁的变量或局部变量存储在data段中,但是必须节省使用data段,因为它的空间毕竟有限。如例子中的变量“a”还可定为“unsignedchardataa=0 xfe;”其实,如果没有说明数据存储类型,默认数据存储在data区。三、bdata位寻址段bdata,包括16个字节,共128位,每一位都可单独寻址。位寻址段的这16个字节也可像数据段中其它字节一样进行字节寻址。unsignedchar bdataoperate;对operate的低4位作位变量定义:sbitflag_key=operate0;/键盘标志位sbitflag_dis=operate1;/显示标志位sbitflag_mus=operate2;/音乐标志位sbitflag_run=operate3;/运行标志位四、idata区8051系列的一些单片机,如8052有附加的128字节的内部RAM,位于从80H开始的地址空间中,被称为idata。因为idata区的地址和SFRs的地址是重叠的,通过区分所访问的存储区,来解决地址重叠问题,因为idata区只能通过间接寻址来访问。五、xdata区存储空间为64K,和code区一样采用16位地址寻址称作外部数据区,简称xdata区。这个区通常包括一些RAM,如SRAM或一些需要通过总线接口的外围器件。如果要将变量“a”置于这一区域,则表示是:“unsignedcharxdataa=0 xfe;”六、pdata区这一区域只是对xdata区进行了要页处理,每一页称作一个pdata区.unsigned char data system_status=0;/定义system_status为无符号字符型自动变量,该变量位于data区中且初值为0。变量名为system_status位与片内RAM区无符号字符型自动型初值为零小技巧:1、用局部变量代替全局变量把变量定义成局部变量比全局变量更有效率.编译器为局部变量在内部存储区中分配存储空间,而为全局变量在外部存储区中分配存储空间,这会降低你的访问速度.另一个避免使用全局变量的原因是,你必须在你系统的处理过程中调节使用全局变量,因为在中断系统和多任务系统中不止一个过程会使用全局变量.2、为变量分配内部存储区局部变量和全局变量可被定义在你想要的存储区中.根据先前的讨论,当你把经常使用的变量放在内部RAM中时,可使你的程序的速度得到提高,除此之外,你还缩短了你的代码,因为外部存储区寻址的指令相对要麻烦.一些考虑到存储速度按下面的顺序使用存储器:dataidatapdataxdata小知识:关于变量名变量名可以由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线,变量名长度随编译系统而定。变量名具有字母大小写的敏感性,如SUM和sum代表不同的变量。强调:头文件中定义的变量都是大写的。变量名不得使用标准C语言和C51语言的关键字。数据结构定义举例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口状态,选择P1口的输出?这就涉及到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;/有开关按下,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 x01;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:语句组n;break;default :语句组n+1;该语句的执行过程是:首先计算表达式的值,并逐个与case后的常量表达式的值相比较,当表达式的值与某个常量表达式的值相等时,则执行对应该常量表达式后的语句组,再执行break语句,跳出switch语句的执行,继续执行下一条语句。如果表达式的值与所有case后的常量表达式均不相同,则执行default后的语句组。注意:各个case及default出现的次序,不影响执行的结果。各个情况的地位相同。break语句不可少。否则,不会退出,而会继续执行后面的case语句。每一case的常量表达式必须互不相同,以免造成混乱。上例可为并行多分支结构:#includemain()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;break;/S7按下default:P1=0 x00;break;/其它情况,全灭三、循环结构主要包括while循环,dowhile循环for循环三种结构。项目一任务7跑马灯的控制1要求:如图6.9所示,当开关S闭合时,P2.0为低电平,D1-D8亮,断开时,P2.0为高电平,D1-D4亮。图6.9 跑马灯电路图1任务分析:除了前面的两种选择结构的方法外,还有没有其它方法,解决决定是否执行一段程序的问题?这一任务就是要处理这样一个问题。即由开关的状态决定P2.0的电平,如何根据P2.0的电平决定是否点亮全部LED。、while循环条件是否成立?程序段NY图6.8 while循环流程图#includemain()while(1)while(P2&0 x01)=0)/读取出P2.0的引脚状态P1=0 x00;/若P2.0为0,即即开关按下,则所有LED亮P1=0 x0f;/若P2.0为1,即即开关未按下,则仅D1-D4亮项目一任务8要求:试用dowhile循环结构编写一段程序,计算:1+2+3+102、dowhile循环特点是:先执行,后判断;至少执行一次;程序段NY条件成立立?图6.10 dowhile循环流程图main()intsum=0,a=0;dosum+=a;/累加a+;/修改控制量while(a=10);/判断是否结束,此处分号不能少while(1);项目一任务9跑马灯的控制2要求:如图6.11所示电路,试用dowhile循环编写一段程序,当P3.0闭合时,P1口的D1-D8闪烁,当断开时,全灭。图6.11 跑马灯电路图 2#includemain()unsignedinta;unsignedcharx;for(;)/建立死循环doP1=0 xff;/全灭for(a=0;a50000;a+);/延时x=P3;/读取P3,即开关的状态while(x&0 x01)!=0);/判断开关是否按下P1=0 x00;/开关按下,全亮for(a=0;a50000;a+);/延时三、for循环结构for语句的一般形式:for(循环变量赋初值;循环继续条件;循环变量增值)循环体语句组;for语句循环执行过程项目一任务10跑马灯的控制3编写一段程序从P1口输出数据0-255.图6.11 跑马灯电路图 2#includemain()unsignedchara;unsignedintb;while(1)for(a=0;a=255;a+)P1=a;for(b=0;b50000;b+);/延时项目一任务11流水灯设计流水灯设计图6.13跑马灯电路图3要求:电路图6.13所示,试用for循环结构编写一段程序,从P1口输出数据,依次点亮D1-D8.图 6.13 跑马灯电路图3任务分析:依次点亮8个LED,关键是如何改变P1口输出,即用怎样的规律去改变P1口的电平。可以使用算法,这比较简单,也可使用固定的图形模式,这样做虽然麻烦点,但应变起来就方便些。#includemain()unsignedinta;unsignedcharb,c;for(;)c=0 x80;for(b=0;b8;b+)P1=c;/点亮一只LED.for(a=0;a1;/准备点亮下一只LED.引伸程序设计要有思想思想如何体现?用流程图程序根据流程图编写没有标准答案没有最好适合自己的就是好的多读程序、多模仿、多实践就是学习方法。流水灯设计的核心问题是什么?其实是如何改变P1口的赋值有二种方法:“移动”方法“数组”改变方法/与此对应的电路图中应除掉与LED相连的非门.#includemain()voiddelay(unsignedint);unsignedchara,b,c,i;for(;)a=0 x7f;/最前一个LED亮.b=0 xfe;/最后一个LED亮.for(i=0;i1;/为下一个LED亮作准备.b=b1;/为下上一个LED亮作准备.voiddelay(unsignedintj)(省略)可见比较麻烦。那么,有没有其它更好的办法?第二种方法就是把要显示的图案做成一个数组,顺序读取数组的值就可以了,当图案改变时,程序不做太大修改,只是改变“图案数组”就可以了。#include#defineledP1/用led替换P1,如果LED放在其它端口,只需改变P1即可.voiddelay(unsignedintj)unsignedinti,t;for(t=j;t0;t-)for(i=0;i255;i+);main()unsignedcharlist=0 x7e,0 x3c,0 x18,0 x00,0 x18,0 x3c,0 x7e,0 xff;/所需要的图案for(;)unsignedchari;unsignedchar*T=list;for(i=0;i8;i+)led=*T;delay(50);T+;对这一程序经过编译后给出的结果如下ProgramSize:data=21.0 xdata=0code=395”可见,这一段程序占了395个字节的程序存储空间,而如果将数组存储位置定义为“code”,即将上面的数组数据类型改为“unsignedcharcodelist”,经过编译后,结果如下:“ProgramSize:data=13.0 xdata=0code=130”仅占程序存储器的130个字节,大大减少。课件,变量(或常数)的存储类型还是很重要的,使用恰当,会节省很多程序空间。为什么会这样呢?。因为我们编程使用的是语言,虽然其编译效率较高,但在它将语言变成在单片机上能运行的二进制代码时(先是变为汇编语言代码)时,还是会有效率的问题。上面程序中,如把数据放在内部中(data),由于数据在那里是可以改写的,编译器在处理时就不方便,产生了长的二进制代码。这也是为什么要掌握单片机存储器的道理项目一任务12跑马灯控制4要求:编写一段程序,使P1口驱动的8个LED亮1秒,再灭一秒。C51函数1、标准库函数C51除了提供标准C语言函数发外还有自己特有的九个库函数,都包含在intrins.h库中。其原型如下:/*-INTRINS.HIntrinsicfunctionsforC51.Copyright(c)1988-2002KeilElektronikGmbHandKeilSoftware,Inc.Allrightsreserved.-*/#ifndef_INTRINS_H_#define_INTRINS_H_externvoid_nop_(void);externbit_testbit_(bit);externunsignedchar_cror_(unsignedchar,unsignedchar);externunsignedint_iror_(unsignedint,unsignedchar);externunsignedlong_lror_(unsignedlong,unsignedchar);externunsignedchar_crol_(unsignedchar,unsignedchar);externunsignedint_irol_(unsignedint,unsignedchar);externunsignedlong_lrol_(unsignedlong,unsignedchar);externunsignedchar_chkfloat_(float);#endif_crol_字符循环左移_cror_字符循环右移_irol_整数循环左移_iror_整数循环右移_lrol_长整数循环左移_lror_长整数循环右移_nop_空操作8051NOP指令_testbit_测试并清零位8051JBC指令_chkfloat_:测试并返回源点数状态。函数名:_crol_,_irol_,_lrol_功能:_crol_,_irol_,_lrol_以位形式将val左移n位例:#includemain()unsignedinty;y=0 x00ff;y=_irol_(y,4);/将y左移4位,得到:*y=0 x0ff0*/函数名:_cror_,_iror_,_lror_功能:_cror_,_iror_,_lror_以位形式将val右移n位,该函数与8051“RRA”指令相关,上面几个函数不同于参数类型。例:#includemain()unsignedinty;y=0 x0ff00;y=_iror_(y,4);/将y右移4位,得到:*y=0 x0ff0*/函数名:_nop_原型:void_nop_(void);功能:_nop_产生一个NOP指令,该函数可用作C程序的时间延时。C51编译器在_nop_函数工作期间不产生函数调用,即在程序中直接执行了NOP指令。例:P0=1;_nop_();P0=0;函数名:_testbit_原型:bit_testbit_(bitx);功能:_testbit_产生一个JBC指令,该函数测试一个位,当置位时返回1,否则返回0。如果该位置为1,则将该位复位为0。8051的JBC指令即用作此目的。_testbit_只能用于可直接寻址的位;在表达式中使用是不允许的。2、用户自定义函数函数定义的一般形式函数定义的一般形式是:函数类型函数名(形式参数表)形式参数说明局部变量定义函数体语句函数调用函数调用就是在一个函数体中引用另外一个已经定义的函数,前者称为主调用函数,后者称为被调用函数,函数调用的一般格式为:函数名(实际参数列表);对于有参数类型的函数,若实际参数列表中有多个实参,则各参数之间用逗号隔开。实参与形参顺序对应,个数应相等,类型应一致。在一个函数中调用另一个函数需要具备如下条件:1)被调用函数必须是已经存在的函数(库函数或者用户自己已经定义的函数。如果函数定义在调用之后,那么必须在调用之前(一般在程序头部)对函数进行声明。图6.15跑马灯电路图42)如果程序使用了库函数,则要在程序的开头用include预处理命令将调用函数所需要的信息包含在本文件中。如果不是在本文件中定义的函数,那么在程序开始要用extern修饰符进行函数原型说明。项目一任务12跑马灯控制3解答图6.15 跑马灯电路图4#includevoiddelay();/先使用后定义的函数在使用前要作申明!main()while(1)P1=0;delay();/延时P1=0 xff;delay();/延时voiddelay(void)unsignedinta;a=0;while(a50000)a+;项目一任务13跑马灯控制5要求:试编写一段程序,使P1口驱动的LED亮1秒,再灭2秒。#includechardelay(char);main()while(1)P1=0;delay(20);P1=0 xff;delay(40);chardelay(chark)unsignedinta,b;for(a=0;ak;a+)for(b=0;b4000;b+);return0;程序的移植章节3.2仿真程序下载后,没有显示“012345”。该开发板相应部分的电路图如图4.16所示。这一电路中8只LED直接与P1口相连,没有如图4.13哪样连接非门,故是控制相应的引脚为低电平时,点亮相应的发光管。修改项目一任务11程序中的语句“c=0 x80;”为“c=0 x80;”即可达到与项目一任务11同样的效果。再分析图4.16可知,虽然4只发光管也是共阳极的,但它们要通过一个PNP型的三极管驱动,只有与它相连的P2口相应引脚为低电平,三极管才导通,相应的数码管阳极才为高电平,故对P2的控制与章节3.2仿真程序程序相反,还可以看到,数码管的各段也与之不同,是接到P0口的,而不是P1口。不需要修改程序的其它部分,只修改端口控制部分即可:P2=0;P1=LED_CODESi;P2=Selecti;改为:P2=0 xff;/关闭显示P0=LED_CODESi;/送段码P2=Selecti;/送位码效果上面做的其实就是程序的移植,即将控制程序移植到不同的电路中。很多时候,没有必要,时间急时也不允许对每一电路的控制程序进行从零开始的重编,而只需要将相似的电路的控制程序移植来即可。这就需要能看懂电路图,根据电路的不同,主要是端口的不同对被移植的程序相应的部分进行修改,而完全没有必要将移植来的整个程序全部读懂。这一方法既是在编写程序中常用的,也在很多实际工作岗位上经常用到,学会了会达到事半功倍的效果项目二交通灯控制器的设计南北方向红灯亮,东西方向绿灯亮,延时60s;南北方向红灯亮,东西方向黄灯亮,延时3s;南北方向绿灯亮,东西方向红灯亮,延时120s;南北方向黄灯亮,东西方向红灯亮,延时3s;周而复始,循环不止。图 6.16 十字路口光通灯示意图项目目的意义训练较复杂控制程序编制、调试;训练中断的应用;训练定时器的应用;训练硬件制作与调试;项目训练学习要求:掌握控制电路及开关电路的设计方法;掌握选择结构程序的运用方法;掌握程序流程图的运用;初步学会程序修改的技巧;项目描述-示意图南北方向绿灯亮,东西方向红灯亮,延时120S;东西方向红灯亮,南北方向黄灯亮,延时3S;周而复始,循环不止。当开关S1断开时,南北方向绿灯亮,东西方向红灯亮,强制性南北方向通行。当开关S2断开时,南北方向红灯亮,东西方向绿灯亮,强制性东西方向通行。项目二任务1交通灯控制要求:设计控制电路图;程序流程图;编写控制程序;调试程序,实现功能。交通灯控制流程图YNYN开始东西向通行60秒黄灯亮3秒S1按下南北通行S2按下东西通行南北向通行120秒黄灯亮3秒电路图上的对应关系:南北方向为红P1.0,黄P1.1,绿P1.2;东西方向为红P1.3,黄P1.4,绿P1.5;S1P1.6;S2P1.7(图中隐藏了连线,是为视觉更好)电路图上的对应关系:南北方向:红-P1.0;黄-P1.1;绿P1.2;东西方向:红-P1.3;黄-P1.4;绿-P1.5;S1-P1.6;S2-P1.7;只要控制LED的阴极为低电平,该交通灯亮,为高电平则灭。这里用C51特有的特殊位变量sbit控制实现:先在最前面对各位进行定义,在每一子程序中控制相应的位为0(低电平)或1(高电平)对S1及S2状态的判断也用特殊位变量sbit控制实现。特殊位变量force_east_west_run为低则说明S1按下,东西向强制通行;特殊位变量force_south_north_run为低则说明S2按下,南北向强制通行。)控制程序#includereg52.h#defineON0/定义交通灯亮,这里为低电平控制#defineOFF1/定义交通灯灭,这里为高电平控制#defineS_N_GO_time120/定义南北运行时间#defineE_W_GO_time60/定义东西运行时间#defineE_W_to_S_N_GO_time30/定义东西转南北运行时间#defineS_N_to_E_W_GO_time30/定义南北转东西运行时间case0 x40:P1=0 x61;for(j=0;j6;j+)/S2断开,强制性东西方向通行for(i=0;i5000;i+);/加上此延时,可实现所需功能*/break;case0 x80:P1=0 x8c;for(j=0;j6;j+)/S1断开,强制性南北方向通行for(i=0;i5000;i+);break;/*各端口与交通灯的连接关系:东西向红灯接P1.3,东西向黄灯接P1.4,东西向绿灯接P1.5;南北向红灯接P1.0,南北向黄灯接P1.1,南北向绿灯接P1.2;强制东西向通行开关接P1.6,强制南北向通行开关接P1.7*/sbitD_X_R=P13;sbitD_X_Y=P14;sbitD_X_G=P15;sbitN_B_R=P10;sbitN_B_Y=P11;sbitN_B_G=P12;sbitforce_east_west_run=P16;sbitforce_south_north_run=P17;delay(intx)/延时函数inti,j;for(j=0;jx;j+)for(i=0;i5000;i+);/*东西通行函数*/east_west_run()D_X_G=ON;/东西绿灯亮N_B_R=ON;/南北红灯亮D_X_R=OFF;D_X_Y=OFF;N_B_Y=OFF;N_B_G=OFF;delay(E_W_GO_time);/*东西通行转南北通行函数*/east_west_to_south_north_run()D_X_R=OFF;D_X_Y=ON;/东西黄灯亮D_X_G=OFF;N_B_R=ON;/南北红灯亮N_B_Y=OFF;N_B_G=OFF;delay(E_W_to_S_N_GO_time);/*南北通行函数*/south_north_run()D_X_R=ON;/东西红灯亮D_X_Y=OFF;D_X_G=OFF;N_B_R=OFF;N_B_Y=OFF;N_B_G=ON;/南北绿灯亮delay(S_N_GO_time);/*南北通行转东西通行函数*/south_north_to_east_west_run()D_X_R=ON;/东西红灯亮D_X_Y=OFF;D_X_G=OFF;N_B_R=OFF;N_B_Y=ON;/南北黄灯亮N_B_G=OFF;delay(S_N_to_E_W_GO_time);main()while(1)if(!force_east_west_run)/*如果强制东西通行按钮按下,则东西通行*/east_west_run();elseif(!force_south_north_run)/*如果强制南北通行按钮按下,则南北通行*/south_north_run();/*如果没有强制通行按钮按下,则两个方向转换通行:东西通行东西转南北通行南北通行南北转东西通行*/elseeast_west_run();east_west_to_south_north_run();south_north_run();south_north_to_east_west_run();以上是一中等难度的单片机系统设计,涉及硬件设计与软件设计,并且要将软、硬件结合起来,这是单片

    注意事项

    本文(教学课件课件第4章-C51的程序的编制.pptx)为本站会员(春哥&#****71;)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开