版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、单片机编程实例等第1页,共138页,2022年,5月20日,18点3分,星期二2、硬件设计(单片机+外围器件)外围器件:一个发光二极管、三个电阻、三个电容一个按钮开关第2页,共138页,2022年,5月20日,18点3分,星期二3、 搭建硬件平台在面包板上插入器件,用导线完成电气连接。 4、 软件设计 ORG 00H ; 设置起始地址START: MOV R0, #5 ; 循环闪烁5次,R0为计数器LOOP: MOV P1,#00H ; P1口输出全0,点亮二极管 CALL DELAY ; 调用延时子程序 MOV P1,#0FFH ; P1口输出全1,熄灭二极管 CALL DELAY ; 调用
2、延时子程序 DJNZ R0, LOOP ; R0减1,若不为0转LOOP处第3页,共138页,2022年,5月20日,18点3分,星期二 JB P2.0, $ ; 测P2.0为高电平(无按键)则执行本行 JMP START ; 否则,有键按下,跳到START处重新开 始执行DELAY: ; 延时子程序(500ms) RET ; 返回主程序 END ; 汇编程序结束第4页,共138页,2022年,5月20日,18点3分,星期二5 、下载程序到单片机并调试(1) 在Vision中把目标程序编辑好,(2)编译、连接无错后生成单片机可执行的代码文件,(3) 用下载线下载到单片机系统板中,(4)运行程序
3、(5)根据运行结果检查功能实现情况,若未达系统要求,则在Vision中修改程序,然后重复步骤 (2)(5),直至达到系统要求.在程序反复检查无逻辑错误时,应检查硬件电路是否有问题.第5页,共138页,2022年,5月20日,18点3分,星期二 3.2 Vision Vision软件的使用1、新建一个工程(项目),并为该项目选定合适的CPU然后保存该工程。具体步骤:选Project New Project保存工程第6页,共138页,2022年,5月20日,18点3分,星期二在弹出窗口中选所需CPU(如选ATMEL),双击该.CPU.第7页,共138页,2022年,5月20日,18点3分,星期二选
4、AT89S51, 并确定。第8页,共138页,2022年,5月20日,18点3分,星期二2、设置工程,使编译、连接后能生成可执行代码文件右击Options for Target 1选择Create HEX 在弹出的窗口选第9页,共138页,2022年,5月20日,18点3分,星期二3、新建源文件选FileNew输入源程序保存(汇编程序:文件名.asm; C程序:文件名.c(存在工程文件夹)第10页,共138页,2022年,5月20日,18点3分,星期二4、为工程中添加源程序文件在右边Project窗口单击 Source Group 1,在下拉菜单中选 Add Files to GroupSou
5、rce Group 1选项,第11页,共138页,2022年,5月20日,18点3分,星期二在弹出的框中选择你的源文件和文件类型,然后点击ADD,再点击close。 第12页,共138页,2022年,5月20日,18点3分,星期二5、编译工程中的源程序,生成 .HEX(可执行)文件 在Project窗口中选 Target 1Build Target F7, (点击 )对源程序编译连接。(或点击 RBuild Target )第13页,共138页,2022年,5月20日,18点3分,星期二 程序有语法错误时,会在输出窗口(Output Windows)中显示错误信息和警告信息,修改编译成功后生成
6、 HEX文件生成.HEX文件后,可利用专门的下载程序,将此可执行程序下载到单片机内的ROM中运行第14页,共138页,2022年,5月20日,18点3分,星期二 3、在窗口中点击 , 打开你系统的.hex文件 3.3 STC-ISP V3.91 软件的使用1、双击 , 打开在线烧录程序 2、在窗口的“MCU TYPE ”下拉菜单中选择(STC89C51RC)第15页,共138页,2022年,5月20日,18点3分,星期二4、在COM栏选下载端口(一般是COM1)5、关电路板上的电源6、点击Download,打开电路板上的电源,烧录程序,若烧录出现问题,点击stop。注意: 5、6 两步骤的顺序
7、不能颠倒!即在点击Download之前要先关掉板上的电源。7、打开电路板上的电源 ,程序即开始运行。第16页,共138页,2022年,5月20日,18点3分,星期二 3.4 单片机应用系统C语言程序设计 单片机应用系统的程序设计有两种方法:一种是基于汇编语言的,另一种是基于C语言的。 汇编语言程序的机器代码生成效率高,但可读性较差,而C语言程序的可读性和可移植性远超过汇编语言。 C51是一种专门为51单片机设计的高级语言C编译器,支持符合ANSI标准的C语言,同时针对51单片机的特点做了一些特殊扩展。第17页,共138页,2022年,5月20日,18点3分,星期二 C语言的主要特点: 语言简洁
8、,使用方便灵活。它是程序设计语言中规模最小的语言之一。 ANSI标准C语言只有32个关键字,9种流程控制语句。程序可移植性好。所设计的程序不依赖机器硬件。第18页,共138页,2022年,5月20日,18点3分,星期二表达方式灵活。 利用 C语言的多种运算符可组成各种表达式,还可采用多种方法来获得表达式的值,使程序设计具有更大的灵活性。表达能力强。 具有丰富的数据结构类型和多种运算符。用户可灵活采用多种数据类型和使用各种运算符,实现复杂运算。第19页,共138页,2022年,5月20日,18点3分,星期二可直接操作计算机硬件。 C语言具有直接访问机器物理地址的能力,C51的编译器都可直接对单片
9、机内部的SFR和I/O端口进行操作,可以直接访问片内、片外存储器,还可以进行各种为操作。生成的目标代码质量较高。可进行结构化程序设计。 C语言以函数作为程序设计的基本单位,非常适合结构化程序设计。第20页,共138页,2022年,5月20日,18点3分,星期二 用C51语言编写单片机应用程序,不用具体组织、分配存储器资源和处理端口数据,但对数据类型与变量的定义,必须要与单片机的存储结构相关联,否则编译器不能正确地映射定位。 与标准C语言相比,C51包含的数据类型、变量存储模式、输入输出处理、函数等方面有一定差异,需根据单片机存储结构及内部资源来定义相应的数据类型和变量,而其它语法规则、程序结构
10、及设计方法等与标准C语言相同。 3.4.1 C51的程序结构 一、 C51语言概述 第21页,共138页,2022年,5月20日,18点3分,星期二 C语言程序由若干函数组成,其中有且仅有一个主函数,每个函数都是完成某个特殊任务的子程序段。 组成程序的若干函数可保存在一个源程序文件中,也可保存在几个源程序文件中,最后将它们连接在一起。 函数之间可以互相调用,但主函数只能调用其它函数而不能被其它函数调用。 主函数是程序的入口,主函数中的所有语句执行完毕,则程序结束。二. 、C51语言程序结构 第22页,共138页,2022年,5月20日,18点3分,星期二可实现一个LED闪烁控制功能的C51源程
11、序第23页,共138页,2022年,5月20日,18点3分,星期二C51语言程序的基本结构: 式中: func1()funcN()代表用户定义的函数,程序体指C51提供的任何库函数调用语句、控制流程语句或其它函数调用语句。第24页,共138页,2022年,5月20日,18点3分,星期二3.4.2 C51的数据结构 1. C51的变量 变量的基本属性是变量名和变量值。在程序中定义了变量,C51编译器就会给这个变量分配相应的存储单元。此后变量名就与存储单元地址相对应,变量值就与存储单元的内容相对应。 定义一个变量的格式如下:存储种类数据类型存储类型变量名第25页,共138页,2022年,5月20日
12、,18点3分,星期二C51的变量概念示意图 图中引用变量a实现了对分配内存20H单元的数据操作 第26页,共138页,2022年,5月20日,18点3分,星期二(1)存储种类 存储种类是指变量在程序执行过程中的作用范围。变量的存储种类有四种:自动(auto) 用存储种类说明符auto定义的变量外部(extern) 用外部种类存储符extern定义的变量静态(static) 用存储种类说明符static定义的变量寄存器(register)用存储种类说明符register定义的 变量第27页,共138页,2022年,5月20日,18点3分,星期二自动变量: 自动变量作用范围在定义它的函数体或复合语
13、句内部,在定义它的函数体或复合语句被执行时,C51才为该变量分配内存空间,当函数调用结束或复合语句执行结束时,自动变量占用的内存空间被释放。 定义变量时若省略存储种类,则变量默认为自动变量。通常将函数体内和复合语句中使用频繁的变量放在片内RAM中,且定义为自动变量,可有效利用片内RAM资源。第28页,共138页,2022年,5月20日,18点3分,星期二外部变量: 在一个函数内,要使用已在本函数外或别的程序模块文件中定义过的外部变量时,在本函数体内要用extern说明该变量。 通常将多个函数或模块共享的变量定义为外部变量。 外部变量是全局变量,在程序执行期间一直占有固定的内存空间。当片内RAM
14、资源紧张时,不建议将外部变量放在片内RAM。 外部变量被定义后,即分配了固定的内存空间,在程序的整个执行时间内都是有效的。 第29页,共138页,2022年,5月20日,18点3分,星期二静态变量: 静态变量又分为内部静态变量和外部静态变量。 在函数体内定义的静态变量为内部静态变量,它在该函数体内有效,但在该函数体外不可见,这使变量在定义它的函数体外被保护,实现了离开函数时值不会被改变。 第30页,共138页,2022年,5月20日,18点3分,星期二寄存器变量: 通常将使用频率最高的那些变量定义为寄存器变量,但目前已不推荐使用这种方式。 外部静态变量是在函数外部定义的静态变量。它在程序中一直
15、可见,但在定义的范围之外是不可见的。 在多文件或多模块处理中,外部静态变量只在定义其的文件内部或模块内部有效。第31页,共138页,2022年,5月20日,18点3分,星期二(2)数据类型 数据的不同格式叫做数据类型 有符号数据类型可以忽略signed标识符,如int 等价于signed int , char 等价于signed char等。 第32页,共138页,2022年,5月20日,18点3分,星期二 为了更有效地利用51单片机的内部结构, C51还增加了一些特殊的数据类型,它们分别对应于bit、sfr、sfr16和sbit四个关键字。bit 位型 利用bit 位型,可定义一个位变量或位
16、函数,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0 就是1。C51增加的特殊数据类型第33页,共138页,2022年,5月20日,18点3分,星期二sfr特殊功能寄存器型 51系列单片机内的21个特殊功能寄存器(SFR),分散在片内RAM区的高128字节,地址为80HFFH。为了能直接访问这些SFR,需要通过关键字“sfr”对其进行定义,语法如下: sfr sfr_name = 地址常数; sfr_name是一个特殊功能寄存器名,“=”后面必须是常数,其数值范围必须在特殊功能寄存器地址范围内,即位于0 x80-0 xFF之间。例如, sfr P1 = 0 x90; /定义P
17、1口地址90H sfr PSW = 0 xD0; /定义PSW地址D0H第34页,共138页,2022年,5月20日,18点3分,星期二 对于16位SFR,要使用关键字“sfr16”,定义的地址必须是16位SFR的低端地址。 sfr16 DPTR = 0 x82;/定义DPTR,其DPL = 82H DPH=83H 注意:不能用sfr16定义定时器/计数器0和1。 第35页,共138页,2022年,5月20日,18点3分,星期二sbit可寻址位 在单片机应用中,经常要访问特殊功能寄存器中的某些位,用关键字sbit定义可位寻址的特殊功能寄存器的位寻址对象。定义方法有如下三种:sbit 位变量名
18、= 位地址 将位的绝对地址赋给位变量名,位地址必须位于0 x80H0 xFF之间。 例:sbit CY=0 xD7; /将位的绝对地址赋给变量第36页,共138页,2022年,5月20日,18点3分,星期二sbit 位变量名 = SFR名称 位位置 当可寻址位位于特殊功能寄存器中时,可采用这种方法。其中SFR名称必须是已定义的SFR的名字,位位置是一个07之间的常数。例: sfr PSW = 0 xD0; sbit CY=PSW7; /定义CY位为PSW.7,位地址为 0 xD7sbit 位变量名 = 字节地址 位位置 这种方法是以一个字节地址作为基地址,该地址必须在0 x80H0 xFF之间
19、。例如,sbit CY = 0 xD07; /将位的相对地址赋给变量第37页,共138页,2022年,5月20日,18点3分,星期二 注:C51编译器把51单片机常用特殊功能寄存器和特殊位进行了统一定义,并存放在 “reg51.h”或“reg52.h” 头文件中,只须在使用前用预处理命令#include 把这头文件包含到程序中,就可使用殊功能寄存器名和特殊位名称。第38页,共138页,2022年,5月20日,18点3分,星期二(3)存储类型 51系列单片机有三个逻辑存储空间:片内低128B RAM,片外64KB RAM和片内外统一编址的64KB ROM。51系列单片机逻辑存储空间示意图 第39
20、页,共138页,2022年,5月20日,18点3分,星期二C51的存储类型与存储空间对应关系表 注:一个变量除了与存储单元相对应外,还与它所在的存储空间有关,即还需要指出其存储类型。 第40页,共138页,2022年,5月20日,18点3分,星期二 如果在定义变量时省略了存储类型标识符,C51编译器会根据当前编译模式自动认定默认的存储类型。编译模式共分为:小编译模式(SMALL)、紧凑编译模式(COMPACT)和大编译模式(LARGE)三种模式 编译模式与存储类型第41页,共138页,2022年,5月20日,18点3分,星期二(4)变量名 C51对变量名的规定与标准C类似,由字母、数字和下划线
21、三种字符组成,且第一个字符必须为字母或下划线,变量名长度无统一规定,随编译系统而定。 注意:大写和小写字母是两个不同的标识符,习惯上变量用小写表示。变量名除了不可使用标准C语言的32个关键字外,还要不可使用C51扩展的新关键字。 第42页,共138页,2022年,5月20日,18点3分,星期二C51扩展的21个关键字一览表 第43页,共138页,2022年,5月20日,18点3分,星期二C51扩展的21个关键字一览表(续) 注: 所有变量在使用前必须说明,即必须“先定义,后使用”,凡未被定义的,不作为变量名。第44页,共138页,2022年,5月20日,18点3分,星期二unsigned ch
22、ar data system_status=0; /定义system_status为无符号字符型自动变量,该变量位于data区中且初值为0。 unsigned char bdata status_byte; /定义status_byte为无符号字符型自动变量,该变量位于bdata区中。unsigned int code unit_id2=0 x1234, 0 x89ab; /定义unit_id2为无符号整型自动变量,该变量位于code区中,为长度为2的数组,初值为0 x1234和0 x89ab。static char m, n; /定义m和n为2个位于data区中的有符号字符型静态变量。ext
23、ern float xdata var4; /在片外RAM 空间定义外部实型变量var4。第45页,共138页,2022年,5月20日,18点3分,星期二 C51的指针与标准C的指针几乎是一样的,都可以简单理解为“存储某个地址的变量”。 2. C51的指针 例如要存取变量a中的值时,可以先将变量a的地址放在另一个变量b中,访问时先找到变量b,从中取出变量a的地址,然后根据这个地址从内存单元中取出变量a的值。在这里,变量b称为指针变量。上述说法相当于 int a=AA; int *b=&a第46页,共138页,2022年,5月20日,18点3分,星期二在C51里定义指针,还需要额外指明两个问题:
24、 1)指针变量自身位于哪个存储区域; 2)该指针的值代表的是哪个存储区域里的地址。在SMALL编译模式下的例子例1 char xdata a = A; char * ptr = &a; ptr是一个char型的指针变量,它本身位于默认的data存储区(因为它省略了存储类型),它的值是xdata存储区里变量a的地址。 第47页,共138页,2022年,5月20日,18点3分,星期二例2 char xdata a = A; char * ptr = &a; char idata b = B; * ptr = &b; 变量b位于idata存储区中,执行完*ptr=&b之后,ptr里的值就是idata
25、空间里的b变量的地址。 例3 char idata a = A; 变量a是idata区域里的变量; char idata * ptr = &a; 定义指针时就限定它只能指向某一个区域,例如idata 第48页,共138页,2022年,5月20日,18点3分,星期二例4 若例3中的ptr指针自身位于xdata存储区,由于指针变量本质上也是变量,所以,可在例3的“char idata * ptr”里,为ptr加上指明所在区域的xdata即可 char idata a = A; char idata * xdata ptr = &a; xdata指明了ptr本身是在xdata存储区里的,而它是一个(
26、char idata *)类型的变量,即指向idata区域的一个char类型的指针。 第49页,共138页,2022年,5月20日,18点3分,星期二3. 4. 3 C51的运算符说明 : (1)关于/ (除)运算的结果, 若: 两个整数相除 ,运算结果的值为整数(如 5 / 3,结果为1) 两数中有一个为负值时,结果向零取整。(如-5/3为 -1 两数中有一个为实数时,结果为 double 型1 C51的基本算术运算符基本算术运算符有5种:,* (乘),/ (除), (模运算符,又称求余)。-7 % 4 ,7 % -4 ,-7 % -4的值为多少?(2)参加/(模)运算的两数为整型数据结果,
27、 结果为整型数如 7 % 4 的值为 3(-3,3,-3) 第50页,共138页,2022年,5月20日,18点3分,星期二关系运算符有6种:(小于)、(大于)、(小于或等于)、(大于或等于)(相等),!(不等于)。2 C51的关系运算符前4种运算符的优先级别高(彼此间优先级相同),后两种运算符的优先级较低(彼此间优先级相同)。关系运算的结果只有两种:“真”(1)和“假”(0)。例:设a5,b4,c3,则ab的值为“真”,表达式的值为1若有赋值语句 d(ab)c按优先级,先算ab,表达式的值为1;再算1c,表达式的值为0,所以d0。第51页,共138页,2022年,5月20日,18点3分,星期
28、二逻辑运算符有3种:&(逻辑与),(逻辑或),!(逻辑非)。逻辑运算结果只有两个:“真”(1)和“假”(0)。3 C51的逻辑运算符C51的算术、关系、逻辑运算符的优先级别见右图。第52页,共138页,2022年,5月20日,18点3分,星期二位操作运算符有6种:&(按位与), (按位或),(按位异或), (位取反),(位右移,当操作数为无符号数时,高位补零,为有符号数,则高位保持原状态)。【例3-4】 设X1001 1110B,Y1010 0101B,则XY的运算过程为:XY的值为0011 1011B。4 C51位操作运算符第53页,共138页,2022年,5月20日,18点3分,星期二自增
29、减运算符有4种:+i(先将i加1,再使用i),-i (先将i减1,再使用i),i+(使用i后,再将i加1),i-(使用i后,再将i减1)。【例3-6】 设i值为8,则j+i,使用前i为8,加1后为9,则i、j值都是9;ji+,使用前i为8,先将8赋给j,使用后使i加1,所以i9,j8。5C51自增、减运算符第54页,共138页,2022年,5月20日,18点3分,星期二复合赋值运算符有10种:,* ,/,。6C51赋值运算符7C51复合赋值运算符用赋值运算符将变量与表达式连接起来,就构成了赋值表达式,在赋值表达式 之后加上分号“;”便构成了赋值语句。X=Y=8;复合赋值运算首先对变量进行某种运
30、算,然后将运算结果再赋给变量。采用复合赋值运算符,可使程序简化和提高程序编译效率。例如, x*y+8 等价于x x *( y+8 )第55页,共138页,2022年,5月20日,18点3分,星期二8C51的条件运算符条件运算符 ? :它是C语言中唯一一个三目运算符逻辑表达式 ?表达式1 :表达式2逻辑表达式结果为真时,表达式的值等于表达式1的值 ,否则,等于表达式2的值 。此外,还有逗号运算符、指针和地址运算符、强制类型转换运算符、取数据类型运算符。第56页,共138页,2022年,5月20日,18点3分,星期二 一个表达式后加上“;”就构成了表达式语句,如算术表达式、关系表达式等。最典型的是
31、用赋值表达式组成的赋值语句。例如: i = 1; i+;1、表达式语句C 语言所有的操作都是通过表达式来实现的。表达式语句: 表达式 ; 2、函数调用语句函数调用语句由函数名、括号、实际参数加上分号“;”组成。其一般形式为: 函数名( 实际参数表 ); 例: printf (Hello , worldn);“函数调用语句”也可以看成是表达式语句,C语言称为“表达式语言”。 3.4.4 C语句概述第57页,共138页,2022年,5月20日,18点3分,星期二3、控制语句 控制语句用于控制程序流程,以实现程序的各种基本结构。共有9种控制语句,分成三类:选择语句 、循环语句 和转移语句 。C 使用
32、控制语句控制程序的执行,常用的控制语句有:if else switch 选择控制for while do while 循环控制continue break return goto 转移控制条件语句有三种格式:格式1: If (条件表达式) 语句1格式2: If (条件表达式) 语句1 else 语句2第58页,共138页,2022年,5月20日,18点3分,星期二格式3: If (条件表达式1) 语句1 else if (条件表达式2)语句2 else if (条件表达式3)语句3 . else if (条件表达式m)语句m else 语句 n注意: 1) 当条件后面的语句多于一句时,要用一对
33、 “ ”把这些语句括起来。 2)用格式3实现多重if else 嵌套时, 注意if-else的配对,else总是和其前面最近的if相配。此外,嵌套层数会增加程序阅读难度。第59页,共138页,2022年,5月20日,18点3分,星期二开关语句Switch(表达式) case 常量表达式1:语句1 break; case 常量表达式2:语句2 break; . case 常量表达式n:语句n break; Default: 语句d第60页,共138页,2022年,5月20日,18点3分,星期二循环语句while (表达式)其含义是:当条件成立时反复执行循环体中的语句,直到条件不成立时为止。do
34、while (条件)for(; ; )第61页,共138页,2022年,5月20日,18点3分,星期二break语句作用:跳出当前的switch语句或循环语句流程控制语句continue语句作用:结束当前这一轮循环,即跳过循环语句中尚未执行的语句,开始下一轮循环,而不是结束整个循环。注:continue只用在for、while、do-while等循环语句中,一般与if语句一起使用,可以加速循环。第62页,共138页,2022年,5月20日,18点3分,星期二返回语句return return (表达式) return 表达式 作用:使程序控制从被调用函数返回到调用函数中,同时把返回值带给调用函
35、数。 跳转语句goto 语句标号 作用: 无条件转移到指定标号处注:最好不使用goto语句第63页,共138页,2022年,5月20日,18点3分,星期二4、复合语句例:while ( i 1) sum = sum + i; i = i + 1;说明: 复合语句的 之后不能有 “;” 允许一行写几个语句,或者一条语句写几行 复合语句中还可以包含复合语句由括在 内的若干C语句组成第64页,共138页,2022年,5月20日,18点3分,星期二5、空语句 只有一个分号的语句,不产生任何操作例:for ( i=1; i 100 ; i +) ;空语句什么也不做,可用来做被转向点,或循环语句中的循环体
36、(循环体是空语句,表示循环体什么也不做)。 当程序中出现连续的两个分号“;”时,一般可把后面的分号看作空语句。 rept: ; . goto rept;第65页,共138页,2022年,5月20日,18点3分,星期二 #include char _getkey() char c; while (!RI) ; /*用空语句等待串口接收结束 C=SBUF; RI=0; return(c); 一个读取串口数据的函数不要滥用空语句,以免引起程序误操作或语法错误第66页,共138页,2022年,5月20日,18点3分,星期二 赋值语句是由赋值表达式加上一个分号构成的,是用于实现计算和赋值的一类最基本的语
37、句。其一般形式如下:可赋值对象v = 表达式e; 注意:(1)如果赋值运算符两边的类型不一致,则系统在算出表达式的值之后,先将该值转换为左边变量的类型,然后再赋值给左边的变量。 (2)赋值运算符“=”右边的表达式可以又是一个赋值表达式,形式为: 变量=变量=表达式; (3)在变量说明中,不允许连续给多个变量赋初值。 6、赋值语句第67页,共138页,2022年,5月20日,18点3分,星期二一、 函数的分类与定义1函数的分类(1) 从语言结构划分,函数分为主函数main()和普通函数两类。(2) 从使用角度划分,函数分为标准库函数和用户自定义函数两类。 库函数是C编译系统提供的一系列标准函数,
38、它们放在一些头文件中,用户可直接调用,使用它们必须先用# include语句将相应头文件包含在程序中。 用户自定义函数是用户按任务需要编写的函数。3.4.5 C51函数及功能第68页,共138页,2022年,5月20日,18点3分,星期二(3) 从参数形式上划分,函数分为无参数函数、有参数函数和空函数三类。 无参数函数调用时无须输入参数,也无结果返回。 有参数函数调用时要给被调用函数提供实质参数,被调用函数运行后产生的结果也要返回给调用函数使用。 空函数是内无语句的空白函数,调用时不产生任何操作,这种函数用于功能备用,以便扩充。第69页,共138页,2022年,5月20日,18点3分,星期二2
39、函数的定义(1) 无参数函数的定义形式: 返回值类型标识符 函数名() 函数体语句无参数函数通常不带返回值,因此标识符可省略或用void。第70页,共138页,2022年,5月20日,18点3分,星期二(2) 有参数函数的定义形式:返回值类型标识符 函数名(形式参数表)形式参数说明函数体语句return(返回参数名)(3) 空函数的定义形式:返回值类型说明符 函数名() 第71页,共138页,2022年,5月20日,18点3分,星期二 用return(返回)语句使程序控制从被调用函数返回到调用函数中,同时把返回值带给调用函数。3. 函数的返回值 void型函数(不需要返回值),无return语
40、句。 对于int类型的函数,不写return语句时,相当于执行了rerun 0;语句。 return 语句中表达式的值一般应与函数类型一致。第72页,共138页,2022年,5月20日,18点3分,星期二二、 函数的调用函数一般调用形式定义为:函数名(实际参数表列)无参数函数不存在“实际参数表列”。有参数函数的“实际参数表列”的各参数之间用逗号隔开,主调函数与被调函数的形式参数数目应该相等,实际参数按顺序依次对应传递给形式参数。第73页,共138页,2022年,5月20日,18点3分,星期二函数调用有三种方式:(1) 使用函数调用语句,被调函数名作为主调函数中的一个语句。如:print_mes
41、sage(); /*message()是被调用函数 */(2) 被调函数作为表达式的运算对象。如:result5*good(x,y)(3) 被调函数作为另一个函数的实际参数。如:mmin(x,alpha(a,b)第74页,共138页,2022年,5月20日,18点3分,星期二三、函数调用条件主调函数调用被调函数,必须满足如下条件:(1) 被调函数必须已经存在,是库函数或用户自定义函数。(2) 程序中如要使用库函数,或使用不在同一文件中的其它用户定义函数,必须在程序的开头用#include语句,将所用函数信息包括到程序中来(3) 如被调函数出现在主调函数之后,应在主调函数前对被调函数的返回值类型
42、予以说明。说明方式为:返回值类型被调函数名(形式参列)第75页,共138页,2022年,5月20日,18点3分,星期二【例】 被调函数在主调函数后,需要说明。 main() int max();/*被调函数说明*/ int x = 70, y = 40, m; m=max(X,Y); int max(a,b);/*被调函数,在主调函数之后出现*/int a,b;return(ab?a:b);第76页,共138页,2022年,5月20日,18点3分,星期二(4) 被调函数说明的语句int max(a,b)也可以移至主调函数man()前,可不必说明。 int max(a,b); /*被调函数,在主
43、调函数之前出现*/int a,b;return(ab?a:b);main() /*主调函数,函数内无被调函数说明int max();*/int x = 70, y = 40, m;m=max(X,Y);第77页,共138页,2022年,5月20日,18点3分,星期二(1) 函数是C51程序的基本单位,一个C51程序至少有一个主函数main(),也可以由一个主函数main()和若干个其它函数构成。若干其它函数受主函数调用,被调用的函数既可以是编译器提供的库函数,也可以是用户自己根据需要设定编制的函数。(2) 一个函数由函数说明部分和函数体两部分组成。(3) 函数说明部分由函数名、函数类型、函数属
44、性、函数参数名和形式参数类型组成,其中允许没有函数参数,函数名后面必须有1个圆括号,括号内就是可有可无的形式参数表。(4) 函数体是用大括号围起来的部分。大括号内有两部分内容:一部分是变量及变量的定义;另一部分是由若干语句组成的执行部分。如果一个函数内有多个大括号,则最外层的一对大括号为函数体的范围。有的函数体既有变量定义部分,又有执行部分;有的函数体仅有执行部分无变量定义部分;有的函数这两部分都没有。 3.4.6 C51程序设计的编程规则第78页,共138页,2022年,5月20日,18点3分,星期二(5) 语句的组成规则为:每个变量必须先定义后使用;变量名由英文字母组成,英文字母要区分大小
45、写,大小写不同则变量名不同;书写格式自由,一行可以写多个语句,一个语句也可以写成多行,但每条语句必须以“;”结尾;分号是C语言的必须组成部分,每个语句和数据在定义的最后必须有一个分号,程序的最后一个语句也应有分号。第79页,共138页,2022年,5月20日,18点3分,星期二(6) C语言对I/O操作实现了“函数化”,分别调用库函数scanf和printf等函数完成,无专门的输入/输出语句。(7) C51的注释用/*/表示,有了注释,阅读程序更方便。C51程序结构如下:全局变量说明/*可被各函数引用*/main()/*主函数*/*函数体开始*/局部变量说明/*限于在本函数内使用*/执行语句(
46、包括调用其它函数的语句)/*主函数的函数体结束*/第80页,共138页,2022年,5月20日,18点3分,星期二function 1(形式参数表)/*可被调用的一个函数*/形式参数说明/*函数1的函数体开始*/局部变量说明执行语句(包括调用其它函数的语句)/*函数1的函数体结束*/function n(形式参数表)/*可被调用的第n个函数*/*格式同函数1,从“”开始,到“”结束*/第81页,共138页,2022年,5月20日,18点3分,星期二3.5 C51初步应用编程 1. I/O端口的简单应用 (1)基本输入输出单元与编程 输出: 发光二极管作为输出状态显示设备具有电路简单、功耗低、寿
47、命长、响应速度快等特点。 最简单的发光二极管接口形式是通过限流电阻R直接挂在IO口线上,限流电阻通常取1001k左右发光二极管与单片机的简单接口 第82页,共138页,2022年,5月20日,18点3分,星期二输入 按键、开关是最基本的输入设备,与单片机相连的简单方式是直接与IO口线连接。当按键、开关闭合时,对应口线的电平就会发生反转,CPU通过读端口电平即可识别是哪个按键或开关闭合。注意:P0口内部结构为漏极开路状态,因此与按键或开关接口时需要有上拉电阻,而P1-P3不需要。 按键或开关与单片机的简单接口 第83页,共138页,2022年,5月20日,18点3分,星期二 独立按键识别和控制L
48、ED点亮程序设计要求开始时LED均熄灭,随后根据按键动作点亮相应LED,按键释放后继续保持直至新的按键按下为止。电路如下图由电路可知,接于的任意一个按键按下时,相应端口的电平将由“1”状态变为“0”状态;而接于的任意一个LED在端口输出“1” 时将被点亮。 第84页,共138页,2022年,5月20日,18点3分,星期二参考程序如下 #include / 定义 51寄存器头文件包含到程序中void main(void) char key =0; /定义一个变量,初值为0 P2 = 0; /熄灭所有LEDP0 = 0 xff; / 向P0写“1”,使P0口可正确读入按键状态 while(1) /
49、循环 key =P0 & 0 x0f ; /将P0口读入的按键状态取反并 /与0f H按位与,清高4位留低4位if (key != 0) P2 = key ; / key不为0有键按下则将key / 送P2口控制相应的LED点亮 /否则,再循环读按键状态 第85页,共138页,2022年,5月20日,18点3分,星期二编程界面和运行界面分别如图 第86页,共138页,2022年,5月20日,18点3分,星期二第87页,共138页,2022年,5月20日,18点3分,星期二例2 :键控流水灯 在上例电路图的基础上,编写可键控的流水灯程序。要求实现功能为,当K1 按下时,要求流水灯流动;K2 按下
50、时停止流动,且全部灯灭;K3按下时使灯由上往下流动,K4 则使灯由下往上流动。 程序说明 判断按键动作,并根据按键的组合状态控制流水灯状态。流水灯控制码事先存放在数组中。 本例电路中LED为低电平驱动,故控制码中输出0电平对应着灯亮,反之,1电平对应着灯灭。流水速度可以根据需要调整延时数值了。 第88页,共138页,2022年,5月20日,18点3分,星期二参考程序如下 /定义数组,并将控制各位灯亮的码作为/初值放入其中/定义delay延时函数(带参数time)/定义内循环控制变量j/定义按键扫描函数/若无按键返回0,否则返回/从P0口读入的按键状态(高/ 4位被清0。/定义两个位变量dir,
51、run,并赋初值/定义int型变量i/根据key函数返回值决定如何控制LED第89页,共138页,2022年,5月20日,18点3分,星期二/若K1按下run=1,跳出switch/若K2按下run=0,跳出switch/若K3按下dir=1,跳出switch/若K4按下dir=0,跳出switch/若ren=1 (K1按下),去判断dir的值/否则(ren=0,K2按下),向P2口输出0,熄灭所有LED/由i控制顺序取出控制码/若dir=1,控制LED/调用延时函数/否则(dir=0),控制LED/由i控制反序取出控制码/送P2/送P2/调用延时函数第90页,共138页,2022年,5月20
52、日,18点3分,星期二第4章单片机的C51语言Keil项目和程序界面如下图所示 第91页,共138页,2022年,5月20日,18点3分,星期二(2)LED数码管原理与编程 数码管这种七段显示器内部由7个条形发光二极管和一个小圆点发光二极管组成,分为两种:共阴极 所有二极管的阴极连接在一起为公共端共阳极 所有二极管的阳极连接在一起为公共端单个数码管的引脚配置如下图所示,其中com为公共端。共阴极共阳极comcom又称COM:字选线 adp:段选线第92页,共138页,2022年,5月20日,18点3分,星期二 给a-g7个发光二极管和dp加正电压点亮,加零电压熄灭,不同亮暗的组合形成不同的字形
53、,这种组合成为段码。 共阳极七段码共阴极七段码C0HF9HA4HB0H99H92H82HF8H80H90H3FH06H5BH4FH66H6DH7DH07H7FH6FH用1个I/O口线控制 dp g f e d c b a 第93页,共138页,2022年,5月20日,18点3分,星期二 用8位I/O口线控制数码管,若其各位与七段发光管和小数位发光管的对应关系如下的话: D7 D6 D5 D4 D3 D2 D1 D0 dp g f e d c b a则LED显示的字型和字段(控制)码有如下的对应关系。 第94页,共138页,2022年,5月20日,18点3分,星期二例3:LED数码管显示 将单片
54、机P0口的与1个共阴极数码管的a-dp引脚相连,编程控制循环显示0-9数字,时间间隔0.2s。硬件电路原理图第95页,共138页,2022年,5月20日,18点3分,星期二程序设计: 显示的数字0-9的段码之间没有规律可循,故采取查表的方式来完成所需段码的获取。按数字的顺序存放待显示字型的字段码。在程序中建立字段码数组led_mod 如下:0 x3f, 0 x06, 0 x5b ,0 x4f, 0 x66, 0 x6d, 0 x7d, 0 x07, 0 x7f, 0 x6f。定义i变量初值为0 i=0 i=9NYP0= led_modi 延时 i=i+1主函数流程第96页,共138页,2022
55、年,5月20日,18点3分,星期二参考程序 /定义带参的延时函数,形参time/定义整型变量j,控制内循环/time控制外循环/定义主函数/内循环体为空语句/定义字符型变量i, 用于控制循环和取数组元素/循环取各数字字段码送P0口显示/延时第97页,共138页,2022年,5月20日,18点3分,星期二例4: 静态显示方式的计数显示器 对按键动作进行统计,并将按键次数通过数码管显示。要求显示范围为1-99,增量为1,超过99后自动循环显示。 硬件电路原理图P3.7采用共阳极数码管简单按键接口第98页,共138页,2022年,5月20日,18点3分,星期二P3.7第99页,共138页,2022年
56、,5月20日,18点3分,星期二程序设计: 初始显示00,定义1个计数变量,不断扫描按键,有按键计数变量加1,并判断是否超范围,超则将其置为0。改变显示的数,方法是:将计数结果拆分成十位和个位(计数值整除10得到十位上的数值,它对10 取模得到个位上的数值),再分别查找取出对应字段码送相应显示端口。检测等待按键松开,如此反复 。计数变量count=0,设P3.7做输入,0的字段码送p0、p1口 count=0NYP0= tablecount/10P1= tablecount%10 延时 count+1主函数流程P3.7=0P3.7=0Ncount=100?YYN 等键释放第100页,共138页
57、,2022年,5月20日,18点3分,星期二参考程序 P3_7=1;,将P3_7置1以保证正确输入P1/P1第101页,共138页,2022年,5月20日,18点3分,星期二P1;/P1第102页,共138页,2022年,5月20日,18点3分,星期二例5. 数码管动态显示原理与编程 数码管与单片机的接口方式有静态显示接口和动态显示接口之分。 静态显示:静态显示接口是一个并行口接一个数码管,其优点是:被显示数据只要送入并行口后就不再需要CPU干预,因而显示效果稳定。但该方法占用资源较多 动态显示:动态显示接口是将所有数码管的个段码线对应端并联起来分别接在8位并行口的对应口线上,而每位数码管的公
58、共端分别由另外一个口的不同I/O线控制。 第103页,共138页,2022年,5月20日,18点3分,星期二数码管动态显示接口示意图 动态显示:动态显示采用循环导通1位数码管截止其它数码管的做法。当循环显示间隔时间较小(如10ms)时,由于人眼的暂留特性,将看不出数码管的闪烁。动态显示接口的特点是占用资源较少,但由于显示值需要CPU随时刷新,故占用机时较多。 第104页,共138页,2022年,5月20日,18点3分,星期二六位共阴极LED动态显示接口7407驱动LED的段P1.0P1.5作位选经7404驱动连接各LED的com端要求数码管从左至右显示123456。程序设计将要显示的数1234
59、56的七段码依次放入数组从数组中取第1个七段码送P0口,控制从左开始选通数码管显示,显示几毫秒后,左移修改字选控制码。然后从数组取下一待显数的七段码送P0口在下一位显示,如此循环逐位显示完6位,再从头开始。第105页,共138页,2022年,5月20日,18点3分,星期二#include char led_mod =0 x06, 0 x5b ,0 x4f, 0 x66, 0 x6d, 0 x7d;void delay(unsigned int time);void main() unsigned char i; /定义控制从数组中取七段码的位置变量 unsigned char led_vei;
60、 /定义存字选控制码变量while(1) led_vei = 0 x01; /字选控制码初值(点亮最左边数码管) for(i = 0;i 0; time-) for(j=0; j125; j+) ; 第106页,共138页,2022年,5月20日,18点3分,星期二(3)行列式键盘原理与编程 前面例题中的按键都是每键分别接在一根IO口线上,这称为独立式键盘。它的电路简单,易于编程,但占用的IO口线较多,当需要较多按键时可能产生IO资源紧张问题,这时应采用行列式键盘。行列式键盘方案的一般做法是,将IO口分为行线和列线,按键置于行线和列线交叉位置的上方,行线则通过上拉电阻接正电源。按键压下时,行线
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025届长治市襄垣县三年级数学第二学期期末教学质量检测模拟试题含答案
- 刀具设计试题及详尽答案呈现
- T8第一次联考-湖南卷-2026届高三-2025年12月-化学-答案
- 2026年上海电气集团招聘试题及答案
- 2025-2026年四川省人教版五年级数学上册第5单元分数四则混合运算测试卷
- 2025-2026年湖南省湘教版初中物理实验操作测试题
- 2025-2026年部编版高三语文诗歌鉴赏综合测试卷
- 2025-2026年志愿者沟通技巧测试卷
- 2025-2026年学前儿童音乐节奏感培养测试卷
- 2025-2026年天津市北师大版初中一年级英语下册第6单元听力专项训练题库
- 2026黄石阳新工作人员公开招聘30人笔试备考题库及答案详解
- 2025年新疆检察院书记员《法律基础知识》题库附答案
- 2026年证券投资顾问胜任能力考试真题及答案解析
- 海南省名校联盟2025-2026学年高二(下)期末化学试卷(含答案)
- CSCO胰腺癌诊疗指南(2026版)完整核心要点
- 《2023CSCO胃癌诊疗指南》解读
- 2026贵州省农业发展集团有限责任公司招录(第一批)岗位65人备考题库及完整答案详解
- 权利的正当性:理论、基础与实践探究
- 传媒行业内容审核标准(标准版)
- UG练习图纸大全-65张-绝对受用
- 安检金属探测器调试工程师岗位招聘考试试卷及答案
评论
0/150
提交评论