手把手教你学单片机的C语言程序设计(十三).pdf_第1页
手把手教你学单片机的C语言程序设计(十三).pdf_第2页
手把手教你学单片机的C语言程序设计(十三).pdf_第3页
手把手教你学单片机的C语言程序设计(十三).pdf_第4页
手把手教你学单片机的C语言程序设计(十三).pdf_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基本数据类型( 如字符型、 整型、 浮 点型) 的一个重要特征是只能具有单一 的值。然而 许多情况下我们需要一种 类型可 以表示数据的集合 , 例如 : 如果 使用基本类型表示整个班级学生的数 学成绩 则 3 0个学生需要 3 0个基本 类型变量。 如果可以构造一种类型来表 示 3 0个学生的全部数学成绩 , 将会大 大简化操作。 C语言中除了基本的的数据类型 ( 例如整型、 字符型、 浮点型数据等属于 基本数据类型 ) 外 还提供了构造类型 的数据 构造类型数据是由基本类型数 据按一定规则组合而成的 因此也称为 导出类型数据。 C语言提供了三种构造 类型: 数组类型、 结构体类型和共用体 类型。 构造类型可以更为方便地描述现 实问题中各种复杂的数据结构。 数组是一组有序数据的集合 , 数 组中的每一个数据都属于 同一个数据 类型。 数组类型的所有元素都属于同一 种类型 并且是按顺序存放在一个连续 的存储空间中, 即最低的地址存放第一 个元素 , 最高的地址存放最后的一个元 素。数组类型的优点主要有两个: 1 让 一 组同一类型的数据共用一个变量名, 而不需要为每一个数据都定义一个名 字 ; 2 由于 数组的构造方法采 用的是顺 序存储 , 极大方便了对数组中元素按照 同一方式进行的各种操作。 I t L , i, 需要说 明的是数组 中元 素的次序 是 由下标来 确定的, 下标从 0开始顺序编号。 数组 中的各 个元 素可 以用数组 名 和下标来唯一地确定 。 数组可 以是一维 数组 、 二 维数组或者多维数组。常用的 有一维、 二维数组和字符数组等。一维 数组只有一个下标 , 多维数组有两个 以 上的下标。在 C语 言 中数组 必须先定 义 , 然后 才能使 用。 一 维数组 一 维数组的定义形式如下: 数据类型【 存储器类型 数组名 【 常量表达式 : 其中, 。 数据类型” 说明了数组中各 个元素的类型。 。 数组名” 是整个数组的 标识符, 它的定名方法与变量的定名方 法一样。 。 常量表达式” 说 明了该数组的 长度, 即该数组中的元素个数。常量表 达式必须用方括号。 【 , 括起来 而且其 中不能含有变量。 例如定义数组 c h a r ma t h【 3 0 则 该数组可 以用来描述 3 0个学生的数 学成绩。 二维及 多维 数组 定义多维 数组时 只要在数组 名后 面增加相应 于维 数的常量表达式即可。 对于二维 数组 的定义形式 为: 数据类型【 存储器类型 数组名 【 常量表达式 1 【 常量表达式 2 : 例 如 要 定 义 一 个 3 行 5列 共 3 5 = 1 5个元素的 整数矩阵 f i r s t ,可 以 采 用如 下的定义 方法 : in t f ir s t 【 3 【 5 : 再如我们要在点 阵液晶上显示。 爱 我中华” 四个汉字, 可这样定义点阵码: c h a r c o d e H a n z i 4 3 2 = f O x 0 00x 4 0, 0 x 40 0 x2 00x B2 0 x A0 0 x 9 60x 9 0, 0 x 9 A0x 4 C 0 x 92 0 x 4 7 0 x F 6, 0 x 2 A, 0 x 9 A, 0 x 2A0 x 93 0 xl 2 0 x 91 , 0 xl A 0 x 9 9, 0 x 2 6,0x 9 7 0 x 22 , 0 x91 0 x 4 0, 0 x 90,0x C0 0 x3 0。 0 x 4 0。 O x O 0 , O x O 0 , 爱 ” 0 x 20 , 0x 0 4。 0 x 2 0 0 x 04。0x 2 2, 0 x 42 , 0 x 22 0 x 8 2, 0 x F E,Ox 7 F, 0 x 21 , 0 x 01,0x 21 , 0 x 01 , 0x 2 0, 0 xl 0, 0 x 20 , 0x l 0,Ox FF , 0 x 08,0x 2 0, O x 07 , 0x 2 2, 0 x1 A, 0 x AC, 0 x21 。 0 x 2 0, 0 x 40,0x 2 0, 0 x F 0, O x O 0 , O x O 0 , 我 ” O x O0 , O xO 0。 O x O 0, O x O 0,0x F C, O x 07,Ox 0 8, O x 0 2, 0 x 08 , 0 x0 2, 0 x 0 8, O x 02,Ox 0 8, 0 x 02 , O xF F, O xF F Ox 0 8 0 x 0 2 0 x 0 80x 0 2 0 x 0 8 0 x 02Ox O 8。0x 0 2。 0 x FC。Ox O7 0 x 080x 0 0。 0 x 0 0 0 x 0 0。0 x 0 0 。 0 x 0 0 。 。 中 0 x 20 0 x0 0 O xl 0 0 x 04。0x 0 8。 0 x 0 4 0 x FC 0 x 0 5。 0 x 03 。 0 x0 4 0 x 0 2 0 x 04。Ox l 0 0 x 0 4。 O xl 0。 O x FF O x7 F。0x 0 4。 0 x 880x 0 4。 0 x 8 8。 0 x 040x 8 4 0x 0 4。 0 x 8 6。 0 x 04。0x E40x 0 4 0 O 0。 0 x 04。0 x 0 0 O x O 0 ”华 ” 点阵码可使用专用的汉字或图形 点阵生成软件产生 。 数组的定义要注意 以下几个 问题 : 1 数 组 名 的 命 名规 则 同 变 量 名 的命 名 要符 合 C语言标识符 的命 名 规 则 。 2 数组 名后面的- 【 , 是数组的标 志 不能用圆括号或其他符号代替。 3 数组元素的个数必须是一个固 定 的值 可 以是整型常量 、 符号常量或 者 整型常量 表达式。 字符数组 基本类型为字符类型的数组称为 字符数组。字符数组是用来存放字符 的。 字符数组是 C语言中常用的一种数 组。字符数组中的每个元素都是一个字 符 因此可用字符数组来存放不同长度 的字符串。字符数组的定义方法与一般 数组相同 下面是定义字符数组的例子: c h a r s e c o n d 【 6 = H , 。E 。 , 。 L 。 , 。 L 。 , 。O。 , 。k 0 。 l : c h a r t h i r d 6 = HE L L O。 l : 在 C语言中字符串是作为字符数 组来处理的。 一个一维的字符数组可 以 存放一个字符串, 这个字符串的长度应 小于或等于字符数组的长度。 为了测定 字符串的实际长度, C语言规定 以、 0 。 。 作为字符串结束标志, 对字符串常量也 自动加一个 、 0 作为结束符。因此字符 数组 c h a r s e c o n d 6 或 c h a r t h ir d 6 可 存储一个长度5的不 同长度的字符 串。在访问字符数组时, 遇到 就表 示字符串结束 ,因此在定义字符数组 时, 应使数组长度大于它允许存放的最 大字符串的长度。 维普资讯 望 厂 _ 萄 团 譬 曩 雷 囡 对于字符数组的访问可以通过数 组 中的元素逐个进行访 问, 也可 以对整 个数组进行访 问。 数组元素赋初值 数组的定义方法。 可以在存储器空 间中开辟一个相应于数组元素个数的 存储空间, 数组的赋值除了可以通过输 入或者赋值语句为单个数组元素赋值 来实现 还可以在定义的同时给出元素 的值, 即数组的初始化。如果希望在定 义数 组的 同时给数组 中各个 元素赋 以 初值 , 可 以采用如下方法: 数据类型【 存储器类型 数组名 【 常量表达式 = 常量表达式表l : 其中, “ 数据类型”指出数组元素的 数据类型。“ 存储器类型” 是可选项, 它指 出定义的数组所在存储器空间。 “ 常量表 达式表” 中给出各个数组元素的初值。 例如 : u c h a r c o d e S E G7 【 1 0 = f 0 x 3 f , 0 x 0 6 0 x 5 b , 0 x 4 f ,0 x 6 6 O x 6 d 0 x 7 d , 0 x 0 7 , 0 x 7 f 0 x 6 f ; 有 关数组初始化 的说 明如下 : 1 元素值表列 。 可以是数组所有元素 的初值, 也可以是前面部分元素的初值。 如 : i n t a 【 5 = 1 , 2 , 3 l : 数组 a的前 3个元素 a 0 、 a 1 、 a 【 2 分别等于 1 、 2 、 3 , 后 2个元素末说 明。 但是系统约定: 当数组 为整型 时 , 数 组在进行初始化时未明晚设定初值的 元素 , 其值 自动被设置为 0 。所 以 a 3 、 a 4 的值为 0 。 2 当对全部数组元 素赋 初值 时 , 元 素个数可以省略。 但“ 不能省。 例如: c h a r c = a, b, Cl : 此时系统将根据数组初始化时大括 号内值的个数, 决定该数组的元素个数。 所 以上例 数组 C的元素个数为 3 。但是 如果提供的初值小于数组希望的元素个 数时, 方括号内的元素个数不能省。 数组作为函数的参数 除了可 以用变量 作 为函数 的参数 之外 ,还可 以用数组 名作 为函数 的参 数。一个数组的数组名表示该数组的 首地址。数组名作为函数的参数时, 此 时形式参数和 实际参数 都是数组 名 。 传 递的是整个数组, 即形式参数数组和实 际参数数组完全相同, 是存放在同一空 间的同一个数组。 这样调 用的过程 中参 数传递方式实际上是地址传递 。 将实际 参数数 组 的首 地址 传递给被调 函数 中 的形式参数数组。 当形式参数数组修改 时。 实际参数数组也同时被修改了。 用数组名作为 函数 的参数 , 应该在 主调 函数和被 调 函数中分 别进行数 组 定义 , 而不能只在一 方定义 数组。而且 在两个 函数 中定义 的数组类 型必须 一 致,如果类型不一致将导致编译出错。 实参数 组和形 参数 组的长度可 以一 致 也可 以不一致 。 编译器 对形 参数组的长 度不作检查, 只是将实参数组的首地址 传递给形参数组。 如果希望形参数组能 得到实参数组的全部元素 。 则应使两个 数组的长度一致。 定义形参数组时可以 不指定长度 , 只在数组 名后 面跟 一个空 的方括号 【 , 但 为了在被调 函数 中处 理 数组元素的需要 , 应 另外设 置一 个参数 来传递数组元素的个数。 下面做几个有关数组的实验。 iiiiii;iiiiiii i _ , 实 验- : ll一 : 在 L E D 1 2 8 6 4图 形 液 晶 试 验 板 上 , 输入 数 字 “ 5 ” 、 “ 6 ” 、 “ 7 ” 、 “ 8 ” 。 将 它 们存入数组 s h u z u 4 , 然后让 它们在 数码管上显示。 在我 的文档 中建立 一个 文件 目录 ( c s 3 2 ) , 然后 建立 c s 3 2 u v 2的工程 项 目 最 后建立源程 序文件( c s 3 2 C o 输入下面的程序 : # i n c lu d e 序号( 以下同 ) : 1 # d e f in e u c h a r u n s i g n e d c h a r 2 # d e f i n e u in t u n s ign e d i n t 3 u c h a r c o d e SE G7 1 1 0 = 0 x 3 f ,0 x 0 6 ,0 x 5 b 0 x 4 f 0 x 6 6 0 x 6 d 0 x 7 d O x 0 7 O x 7 f ,O x 6 f ; 4 u c h a r c o d e AC T 4 = 0 x e f ,0 x d f ,0 x b f ,0 x 7 f ; 5 u c h a r d a t a s h u z u 4 ; 6 7 u c h a r s t a t u s ; 8 u c h a r t e mp f : 9 1 0 v oi d de l a y_l ms ( v o i d ) 1 1 f , 1 2 u i n t k : 1 3 f o r ( k = 0 ;k 5 0 ) t e mp = 0 ; 5 2 if ( t e mp = = 0 ) f + ; 5 3 if ( f 9 ) f = 0 ; 5 4 t e mp + +: 5 5 d elay_l ms ( ) 5 6 l 5 7 l 5 8 5 9 v o i d k e y s 2 ( v o id ) 6 0 f 6 1 P 2 = 0 x f f ;| |娩 i f ( P 2 = 0 x f d ) 6 3 f 6 4 s wit c h( s t a t u s ) 6 5 f 6 6 c a s e 1 : s h u z u 0 = f ; b r e a k ; 6 7 c a s e 2 : s h u z u 1 = f ; b r e a k ; 6 8 c a s e 3 : s h u z u 2 : f : b r e a k : 6 9 c a s e 4 : s h u z u 【 3 】 = f b r e a k : 7 O d e f a u I t : b r e a k : 7 1 维普资讯 l l l 7 5 v o i d k e y _ s 4 ( v o id ) I P2 =0 x 什: 7 2 7 3 7 4 7 6 7 7 7 8 if ( P 2 = = 0 x f 7 ) 7 9 I if ( t e mp 5 0 ) t e mp = 0 ; 8 O if ( t e mp = 0 ) s t a t u s + + ; 8 1 if ( s t a t u s 4 ) s t a t u s = O : 8 2 t e mD + +: 8 3 d e l a y _l ms ( ) : 8 4 l 8 5 l 8 6 , 8 7 , v o i d ma i n ( v o id ) 1 wh i le ( 1 ) I k e y s l ( ) : k e y s 2 0; k e y s 4 0; s wi t c h( s t a t u s ) I c a s e 0: dis a ll 0 ; b r e a k ; c a s e 1 : d is _ s h u z u 0 0 ; b r e a k ; c as e 2: dis s h u z u 1 ( ) : b r e a k : c a s e 3 : d is s h u z u 2 ( ) : b r e a k : c a s e 4 : d is s h u z u 3 ( ) : b r e a k : de f au l t : b r e a k; l l l O2 03 04 05 编译通 过后 ,将生 成的 c s 3 2 h e x 文件烧 录到 8 9 S 5 1芯片 中,将 芯片插 入到 L E D 1 2 8 6 4图形液晶试验板上 试验板上接通 5 V开关稳压 电源。刚开 始 4个 L E D数码管显示 “ 0 0 0 0 。按一 下 S 4键 ,只有个位数码管亮 ( 显示 “ 0 ”o再按一下 S 4键 , 变成十位数码 管亮( 显示“ 0 ”o 。 这样按动 S 4键 后 , 显示状态变成: 显示全部 四位一显 示个位一显示十位一显示百位一显示 千位 , 循环进行。 在个位数码管点亮时, 按下 S 1 键 ( 按住 不放 ) , 则显示值 开始 递增( 0 9 ) 并循环 调整到我们需要的 某个值( 例如“ 8 ” ) 时, 放开 S 1键, 然后 按动 一下 S 2键 , 即将该值 存人 数组 的 s h u z u 0 。同理, 在十、 百、 千位数码管 点亮时, 我们也可将“ 7 ” 、 “ 6 ” 、 “ 5 ” 三个 值存人数组的 s h u z u【 1 】、 s h u z u【 2 】、 s h u z u 3 。 再按动 S 4键, 让四位数码管 、 全部点亮, 显示数组的内容“ 5 6 7 8 ” 。这 样实现 了对数组 的读写操作 。 我们对程序进行分析。 序号 1( 程序解释 以下同 ) :包含头文件 REG51 H。 序号 2 、 3 : 数据类型的宏定 义。 序 号 4: 定 义 数 组 SE G7 1 0 】 存 放数 码 管 0 9的字形 码 由于进行 只读操 作 因此存 储区可选定在 c o d e区。 序号 5 : 定义数组 A CT 4 4 】 存放 四位数码管 的位码 由于进 行只读操 作 因此存 储区选 定在 c o d e区。 序号 6: 定 义数 组 s h u z u 4 】 存 放输入 的数 据 由于要进 行读写操 作 因此存储 区选定 在 d a t a区。 序号 7 : 程序分隔。 序号 8 : 定义工作状态 s t a t u s 。 序号 9 : 全局 变量 t e mp、 f 。 序号 1 0: 程序分 隔。 序号 1 1 1 5: 延时 1 mS的子 函数。 序号 1 6: 程序分 隔。 序号 1 7 : 定义函数名为 d i s a ll 的子函数。 序号 1 8 : dis a l l 子 函数 开始 。取 出数 组 的 s h u z u 0 】 内容送 P 0 13 同时点 亮个位 数码 管。 序号 1 9 : 延时 1 m S , 维持数码管点亮。 序 号 2 O : 取 出 数组 的 s h u z u 1 】 内 容送 P O 口 同时点亮十位数码管。 序号 2 1 : 延时 1 mS 维持数码管点亮。 序 号 2 2 : 取 出数 组 的 s h u z u 2 】 内 容 送 P O 口 同时点亮百位数码管。 序号 2 3: 延时 1 mS, 维持数码管点 亮。 序 号 2 4 : 取 出数组 的 s h u z u 3 】 内 容送 P O 口 同时点亮千位数码管。 序号 2 5: 延时 1 mS 维 持数码 管点亮。 序号 2 6: d is _ a ll 函数子结束。 序号 2 7: 程序分隔。 序号 2 8 : 定 义函数 名为 d is s h u z u 0的子 函 数。 序号 2 9: d is _ s h u z u 0子函数开始。 取 出数组 的 s h u z u 0 】 内容送 P 0 13 同时 点亮个位数 码管。 序号 3 O : 延时 1 mS 维持数码管点亮。 序号 3 1 : d is s h u z u 0子函数子结束。 序号 3 2 : 程序分隔。 序号 3 3 : 定 义函数 名为 d is s h u z u l的子 函 数。 序号 3 4: d is _ s h u z u l子函数开始。 取 出数组 的 s h u z u 1 】 内容送 P 0 13 , 同 时点亮十位 数 码管。 序号 3 5 : 延时 1 mS 维持数码管点亮。 序号 3 6: d is s h u z u 0子函数子结束。 序号 3 7 : 程序分隔。 序号 3 8: 定义 函数 名为 d i s _ s h u z u 2的子 函 数 。 序号 3 9: d is s h u z u 2子函数开始 。 取 出数组 的 s h u z u 2 内容送 P 0 13 同 时点亮百位数 码管。 序号 4 O: 延时 1 mS 维 持数码 管点亮。 序号 4 1 : d i s _ s h u z u 2子函数子结束。 序号 4 2 : 程序分隔。 序号 4 3 : 定义函数 名为 d is s h u z u 3的子 函 数。 序号 4 4: d is s h u z u 3子函数开始 。 取 出数组 的 s h u z u 3 内容送 P 0 13 同 时点亮千位数 码管。 序号 4 5: 延时 1 mS 维 持数码管 点亮。 序号 4 6: d i s s h u z u 3子函数子结束。 序号 4 7 : 程序分隔。 序号 4 8 : 定义函数名为 k e y s l的子 函数 。 序号 4 9: k e y s l 子 函数开始 。 序号 5 0: P 2口置全 1 准备读取输入值。 序号 5 1 : 进行 t f ( P 2 = = 0 x f e ) 语句 判别。读入 P 2口的输 入值 如 果为 F E H, 说 明 S 1键被 按下。 序号 5 2 : 进入 I f ( P 2 = = 0 x f e ) 语句。 t e mp的计 数范 围为 0 5 0 。 序号 5 3: 在 t e mp为 0时 对 f 进 行递增 。f 是我们要取用并写入数组的一个变量。 序号 5 4: f 的范围 为 0 9 。 序号 5 5: t e mp递增。 序号 5 6: 延时 1 mS 。 序号 5 7 : If ( P 2 = 0 x f e ) 语句结束。 序号 5 8 : k e y _ s 1子函数子结束。说 明: 由于 按 下键后 程序做 完判断处理 ( 如对 f 递 增 ) 后要 延时 1 mS ( 如序号 5 51 因此下 一次 对 f 的递增需等待 5 0 x l mS之后 才进行 这样比 较 适合人的直 觉 否则按下键 后的 f 递 增太 快 眼睛 无法看清 。 序号 5 9 : 程序分隔。 序号 6 O : 定义 函数名 为 k e y s 2的子函数。 序号 6 1 : k e y _ s 2子函数开始。 序号 6 2 : P 2口置全 1 准备读取 输入值 。 序号 6 3 : 进行 If ( P 2 = = 0 x f d ) 语句判别。读入 P 2口的输入值 。 如果 为 F DH 说 明 S 2键 被 按 下。 序号 6 4 : 进入 If ( P 2 = = 0 x f d ) 语句。 序号 6 5:进行 s wit c h( s t a t u s ) 开 关语 句判 断。 序号 6 6 : 进入开 关语句。 序号 6 7 :如果 s t a t u s的值 为 1 将 f 值赋 s h u z u 0 】 然后退 出开关语句。 序号 6 8 :如 果 s t a t u s的值 为 2 将 f 值 赋 s h u z u 1 】 然 后退 出开关语句 。 序号 6 9 :如果 s t a t u s的值 为 3 将 f 值赋 s h u z u 2 】 , 然后退 出开关语句 。 序号 7 O :如果 s t a t u s的值 为 4 将 f 值赋 s h u z u 3 】 然后退 出开关语 句。 序号 7 1 : 如果 s t u s的值 一项也 不符合 , 则 直接退出开关语句 。 序号 7 2 : 开关语句结束。 8 9 O 1 2 3 4 5 6 7 8 9 O O 肥 肥 维普资讯 学 习单 片飙 序号 7 3 : If ( P 2 = = 0 x f d ) 语句结束。 序号 7 4: k e y s 2子 函数子结束 。 序号 7 5: 程 序分 隔。 序号 7 6: 定 义函数 名为 k e y _ s 4的子 函数。 序号 7 7: k e y s 4子 函数开始。 序号 7 8: P 2口置全 1 。 准备读取输入值。 序号 7 9: 进行 I f ( P 2 = = 0 x f 7 ) 语句判别。读入 P 2口的输入值 , 如 果为 F 7 H。 说 明 S 4键 被 按下。 序号 8 0 : t e mp的计数范围为O 5 O 。 序 号 8 1 :在 t e mp 为 O时 。对 s t a t u s进 行 递 增 。 s t a t u s是 程 序 运 行 过 程 中的 一 个 状 态 标 志 。 序号 8 2: s t a t u s的范围为 0 3 。 序号 8 3: t e mp递增。 序号 8 4: 延时 1 mS 。 序号 8 5: I f ( P 2 = 0 x f 7 ) 语句结束。 序号 8 6: k e y _ s 4子 函数子结束 。 序号 8 7 : 程 序分隔。 序号 8 8 : 定义函数名为 ma in的主函数。 序号 8 9: ma in主函数开始。 序号 9 O: 无限循环。 序号 9 1 : 无限循环语句开始。 序号 9 2: 调用 k e y _ s 1 子 函数 。 序号 9 3 : 调用 k e y _ s 2子函数 。 序号 9 4: 调用 k e y _ s 4子函数 。 序 号 9 5: 进 行 s wit c h( s t a t u s )开 关 语 句 判 断 。 序号 9 6 : 进入开关语句。 序 号 9 7: 如果 s t a t u s的值 为 0 。 调用 d i s _ a l l 子 函数 , , 然后退 出开关语句。 序 号 9 8 : 如 果 s t a t u s的 值 为 1 , 调 用 d i s _ s h u z u 0子 函数 , , 然后退出开关语句。 序 号 9 9:如 果 s t a t u s的 值 为 2 , 调 用 di s _s h u z u l子 函数 , , 然后退 出开关语句。 序 号 1 o 0 :如 果 s t a t u s的值 为 3,调 用 di s s h u z u 2子 函数 , 。 然后退 出开关语句。 序 号 1 O 1 :如 果 s t a t u s的 值 为 4。调 用 dis _s h u z u 3子 函数, , 然后退 出开 关语句。 序号 1 0 2:如果 s t a t u s的值一项也不符合 , 则直 接退 出开 关语句 。 序号 1 0 3: 开关语句结 束。 序号 1 O 4: 无限循 环语句 结束。 序号 1 0 5: ma in主 函数结 束。 在 L E D 1 2 8 6 4图形 液 晶试 验 板 上, 输入 1 0个整数( 0 9 9 9之间) , 输 出其中的最大数。 在我的文档中建立一个文件目录 ( c s 3 3) , 然后建立 c s 3 3 u v 2的工程项 目。 最后建立源程序文件 ( c s 3 3 c o 输入下面的程序: # i n c lu d e 1序号( 以下同 ) : 1 # d e f in e u c h a r u n s ig n e d c h a r 2 # de f i n e u i n t un s i gn ed int| | 3 u c h a r c o d e S E G7 【 1 0 = 0 x 3 f 0 x 0 6 0 x 5 b 0 x 4 f 0 x 6 6 O x 6 d O 7 d D O 7 -O 7 f 0 x 6 f ; 4 u c h a r c o d eA Cl 4 = 0 x e f ,0 x d f 0 x b f 0 x 7 f ; 5 u i n t d a t a s h u z u 1 0 ;| | 6 7 u c h a r s t a t u s ; 8 u c h a r t e mp ; 9 i n t ma x f : I I 1 0 1 1 v o i d d e la y 1 ms ( v o id ) 1 2 f , 1 3 u i n t k : 1 4 f o r ( k = 0 ; k 5 0 ) t e mp = 0 ;| | 4 2 if ( t e mp = = 0 ) f + + ; 4 3 if ( f 9 9 9 ) f = 9 9 9 ; 4 4 t e mD 十 + : 1 4 5 d e la y 1 ms ( ) : 1 4 6 1 4 7 1 4 8 4 9 v oi d k e y _s 2 ( v o i d ) 1 1 5 0 f 1 5 1 P 2 = 0 x ff ; 1 5 2 i f ( P 2 = = 0 x f d ) 1 5 3 ( if ( t e mp 5 0 ) t e mp = 0 ; 5 4 i f ( t e mp = = 0 ) f i f ( f 5 0 ) t e mp = 0 ; 1 1 8 7 if ( t e mp = = 0 ) s t a t u s + + ; 1 8 8 if ( s t a t u s 1 0 ) s t a t u s = 0 ; 1 8 9 t e mp + + : # 9 O dela y _l ms ( ) 1 9 1 1 9 2 9 3 9 4 v o id c o n v ( v o id ) 1 9 5 9 6 u c h a r i : 1 9 7 ma x = s h u z u 0 ; 1 9 8 f o r ( i =1 : _ max ) ma x = s h u z u i ;1 1 1 0 1 1 0 2 1 0 3 1 04 v o i d ma i n ( v o i d ) 1 1 1 0 5 f 1 0 6 wh i le ( 1 ) 、 1 0 7 f 1 0 8 k ey _s 1 0; 1 0 9 47 巍一 一 一 维普资讯 k e y s 2 0 ; 1 1 0 k e y s 3 0 ; 1 1 1 k e y s 4 0 ; 1 1 2 c o n v 0; 1 1 3 if ( s t a t u s = =1 O ) d i s ma x ( ) : 1 1 4 els e dis i n p u t ( ) ; 1 1 5 1 1 6 , 1 1 7 编译通 过后 ,将生成 的 c s 3 3 h e x 文件烧 录到 8 9 s 5 1芯片 中,将 芯片插 入到 L E D 1 2 8 6 4图形 液晶试验 板上 。 试验板上接通 5 V开关稳压电源。刚开 始 4个 L E D数码 管显 示“ 0 0 0 0 ” , 其 中 最左 的数码 管显示状态 ( 状态 为 0 ) , 右 边三个 数码管显示 数据。按 动 S 1键 , 数据递增( 最大 到 9 9 9) 。 按动 S 2键 , 数 据递减( 最小到 0 0 0 o 当我们 选择某个 数据( 例如 1 5 9) 后 , 按一下 S 3键 。 即将 此数据( 1 5 9 ) 存人数组的 s h u z u 0 1 ; 按 一 下 S 4键 ,最 左 的数 码管 数 据递 增 ( 状态 为 1 ) ,按 动 S 1或 S 2键选择 数 据, 再按一下 S 3键 。 将此数据存人数 组的 s h u z u 1 ; 同理 , 我们可 将 s h u z u 【 o -s h u z u 9 存入 0 9 9 9之间 的不 同数 据。最后按 一下 S 4键 , 最 左 的数码管熄灭 , 右边三个数码管显示从 数组 s h u z u找出的最 大数。 我们 对程序进行分析。 序号 1 ( 程 序解释 ,以下同 ) :包含头 文件 REG51 H。 序号 2 、 3: 数据类型的宏定义。 序号 4 : 定 义 数组 S E G7 1 0 】 , 存 放 数 码 管 0 9的字形 码 , 由于 进行只读 操作 , 因此存 储区可选定在 c o d e区。 序号 5: 定 义数 组 AC T 4 4 】 。 存放 四位 数 码 管的位码 由于进 行只读操 作 因此 存储 区 可选定 在 c o d e区。 序号 6 : 定义数组 s h u z u 1 0 】 。 存放输入 的数 据 由于 要进行读 写操作 。 因此存 储区选定 在 d a t a区。 序号 7 : 程序分隔。 序号 8: 定义工作状态 s t u s 。 序号 9: 全局变量 t e mp 。 序号 1 0 : 全局 变量 ma x 、 f 。 序号 1 1 : 程序分隔。 序号 1 2 1 6 : 延时 1 mS的子函数。 序号 1 7 : 程序分隔。 序号 1 8 : 定义 函数名为 d is max 的子函数。 序号 1 9: d is max 子 函数 开始 。取 出 max 的个位数送 P 0 13。 同时点亮个位数码管。 序号 2 0: 延时 1 mS 维持数码管点亮。 序号 2 1 : 取 出 max 的十位数 送 P 0口。 同时 点亮十位数码管。 序号 2 2: 延时 1 mS。 维 持数码 管点亮。 序号 2 3: 取 出 ma x的百位数送 P 0口 同时 点亮百位数码管。 序号 2 4 : 延时 1 mS 。 维持数码管点亮。 序号 2 5: d is max 子 函数子结 束。 序号 2 6: 程序分隔。 序号 2 7:定 义 函数 名 为 d i s in p u t 的 子 函 数。 序号 2 8: d is _ i n p u t 子函数开始。取 出 f 的个 位数送 P O 13。 同时点亮个位数码管。 序号 2 9 : 延时 1 mS , 维持数码管 点亮 。 序号 3 0 : 取 出 f的十位 数送 P O口 。 同时点 亮十位数码管。 序号 3 1 : 延时 1 mS 。 维持数码管点亮 。 序号 3 2 : 取 出 f的百位 数送 P O口 。 同时点 亮百位数码管。 序号 3 3 : 延时 1 mS。 维持数码管点亮 。 序号 3 4 : 取 出 f 的 千位数 送 P O口 , 同时点 亮千位数码管。 序号 3 5 : 延时 1 mS。 维持数码管点亮 。 序号 3 6 : dis _ i n p u t 子 函数子结束 。 序号 3 7 : 程序分 隔。 序号 3 8 : 定义 函数名 为 k e y s 1的子函数。 序号 3 9 : k e y s l子 函数开始。 序号 4 0 : P 2口置全 1 。 准备读取输入值。 序号 41 : 进行 If ( P 2 = = 0 x f e ) 语 句判别。读入 P 2口的输 入值 。 如果 为 F E H。 说 明 S1键被 按下。 序号 4 2 : 进入 If ( P 2 = = 0 x f e ) 语 句。 t e mp的计 数范围为 0 5 0 。 序号 4 3: 在 t e mp为 0时 。 对 f 进 行递增 。f 是我们要取 用并写入 数组的一个 变量。 序号 4 4 : f 最大为 9 9 9 。 序号 4 5 : t e mp递增 。 序号 4 6 : 延时 1 mS。 序号 4 7 : If ( P 2 = = 0 x f e ) 语 句结束。 序号 4 8 : k e y s 1子 函数子结束。 序号 4 9 : 程序分 隔。 序号 5 0 : 定义 函数名 为 k e y s 2的子函数。 序号 51 : k e y s 2子 函数开始。 序号 5 2 : P 2口置全 1 , 准备读取 输入值。 序号 5 3 : 进行 lf ( P 2 = = O x f d) 语句判别。读入 P 2口的输入 值 , 如果 为 F DH。 说 明 S 2键 被 按下。 序号 5 4: 进入 I f ( P 2 = = 0 x f d ) 语句 。t e mp的 计数 范围为 0 5 0 。 序号 5 5: 在 t e mp为 0时 对 f 进 行递增 。f 是我们要取 用并写入 数组的一个 变量。 序号 5 6 : f 最小为 0 。 序号 5 7 : t e mp递增 。 序号 5 8 : 延时 1 mS。 序号 5 9 : If ( P 2 = = 0 x f d) 语句结束 。 序号 6 0 : k e y s 2子 函数子结束。 序号 61 : 程序分 隔。 序号 6 2 : 定义 函数名 为 k e y _ s 3的子函数。 序号 6 3: k e y _ s 3子 函数开始。 序号 6 4: P 2口置全 1 。 准备读取输入值 。 序号 6 5: 进行 I f ( P 2 = O x f b ) 语 句判别。读入 P 2 13的输入值 如果 为 F BH。 说 明 S 3键 被 按下 。 序号 6 6: 进入 I f ( P 2 = 0 x f b ) 语句。 序号 6 7 :进 行 s wi t c h( s t a t u s ) 开关语句 判 断。 序号 6 8: 进入开关语 句。如果 s t a t u s的值为 0。 将 f 值赋 s h u z u O 】 , 然后退 出开 关语句 。 序 号 6 9:如果 s t u s的值 为 1 。将 f 值赋 s h u z u 1 】 然后退出开关语句。 序 号 7 0 :如果 s t u s的值 为 2 ,将 f 值赋 s h u z u 2 】 , 然后退出开关语句。 序号 7 1 :如果 s t u s的值 为 3 ,将 f 值赋 s h u z u 3 】 , 然后退出开关语句。 序号 7 2 :如果 s t a t u s的值 为 4将 f 值赋 s h u z u 4 】 , 然后退出开关语句。 序号 7 3 :如果 s t a t u s的值 为 5 ,将 f 值赋 s h u z u 5 】 。 然后退出开关语句。 序号 7 4 :如果 s t a t u s的值 为 6 ,将 f 值赋 s h u z u 6 】 。 然后退出开关语句。 序号 7 5 :如果 s t a t u s的值 为 7 将 f 值赋 s h u z u 7 】 。 然后退出开关语 句。 序号 7 6 :如果 s t a t u s的值 为 8 ,将 f 值赋 s h u z u 8 】 。 然后退出开关语 句。 序号 7 7 :如果 s t u s的值 为 9 。将 f 值赋 s h u z u 9 】 。 然后退出开关语 句。 序号 7 8: 如果 s t u s的值 一项也不符合 , 则 直接退 出开关语句。 序号 7 9: 开关语 句结 束。 序号 8 0: I f ( P 2 = = O x f b ) 语句 结束 。 序号 8 1 : k e y s 3子 函数子结束 。 序号 8 2: 程序分隔。 序号 8 3: 定义 函数名为 k e y s 4的子 函数 。 序号 8 4 : k e y s 4子 函数开始 。 序号 8 5 : P 2口置全 1 准备读取输入值。 序号 8 6 : 进 行 If ( P 2 = = 0 x f 7 ) 语句判别 。读入 P 2口的输入值 。 如果 为 F 7 H, 说 明 S 4键被 按下。 序号 8 7 : t e mp的计 数范围为 0 5 0 。 序号 8 8 : 在 t e mp为 0时。 对 s t a t u s 进行递增。 s t a t u s 是程序运行过程中的- - d 。 序号 8 9: s t u s的范围为 0 1 0 。 序号 9 0: t e mp递增。 序号 9 1 : 延时 1 mS 。 序号 9 2: I f ( P 2 = = 0 x f 7 ) 语句结束。 序号 9 3: k e y _ s 4子 函数子结束 。 序号 9 4 : 程序分隔。 序号 9 5 : 定义函数名为 c o n v的子函数 。 序号 9 6: c o n v子函数开始。 序号 9 7:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论