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

下载本文档

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

文档简介

手 学 习单 片机 s wi t c h c a s e开关语句是一种多分 支选择语句, 是用来实现多方向条件分 支的语句。 虽然从理论上讲采用条件语 句也可以实现多方向条件分支, 但是当 分支较多时会使条件语句的嵌套层次 太多, 程序冗长 , 可读性降低。 开关语句 可直接处理多分支选择, 使程序结构清 晰。使用方便。开关语句是用关键字 s wi t c h构成的, 它的一般形式如下: s wit c h ( 表达式) c a s e常量表达式 1 : 语句 1 : l b r e a k ; c a s e常量表达式 2 : 语句 2 : l b r e a k ; ; c a s e常量表达式 n : 语句 n ; b r e a k ; d e f a u lt : 语句 d ; b r e a k ; l 开关语句的执行过程是: 1 当 s wi t c h后面表达式的值与某 一 “ c a s e ” 后面的常量表达式的值相等 时。 就执行该“ c a s e ” 后面的语句, 然后 遇 到 b r e a k语 句而 退 出 s w i t c h语 句 。 若所有“ c a s e ” 中常量表达式的值都没 有与 表 达 式 的值 相 匹配 ,就执 行 d e f a u l t 后面的 d语句。 2 s wit c h后面括号内的表达式, 可 以是整型或字符型表达式, 也可以是枚 举类型数据。 3 每一个 c a s e常量表达式的值必 须不同, 否则就会出现自相矛盾的现象 【 对同一个值 。有两种或者多种解决方 案提供 ) 。 4 每个 c a s e和 d e f a u l t 的出现次 序不影响执行结果, 可先出现“ d e f a u lt 再出现其它的“ c a s e 。 4 假如在 c a s e语句的最后没有加 “ b r e a k : 。则流程控制转移到下一个 c a s e继续执 行。因此 ,在执行一个 c a s e分 支后 。使 流程 跳 出 s wi t c h结 构 。 即终 止 s wi t c h语句 的执行 , 可用一 个 b r e a k语句完成 。 |il 在 L E D 1 2 8 6 4图形 液晶试验板 上实现: 输入年份 y e a r 和月份 mo n t h后 , 程序计算出该月有多少天 d a y 。S 4键 用作状态设定【 输入年、 月或显示天数 的切换 ) 。 S1 键用作输入年份的低 2位 ( 如输入 1 9 8 6年的 8 6)或输入月份 , S 2键用作输入年份的高 2位 【 如输入 1 9 8 6年 的 1 9 o 该程序设计的关键是要判断当年 是 否 为闰年。 闰年 的 2月有 2 g天 , 平 年的 2月只有 2 8天。闰年的条件是 : 年份 数 y e a r 能被 4整除 ,但不能被 1 O 0整除:或者年份数 y e a r 能被 4 0 0 整除 。 其逻辑关系为_y e a e o 4 = = O & & y e a e o 1 O 0 1 = 01 1y e a r 4 0 0= 0 当此 表 达式 的值 为 真 时 。 y e a r 为 闰年 。 否则 为平年 。 在我的文档中建立一个文件 目录 【 c s 2 1 ) , 然后建立 c s 2 1 u v 2的工程项 目。 最后建立源程序文件( c s 2 1 C o 输入下面的程序: # i n c lu d e 序 号( 以下 同 ) : 1 # d e f i n 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 i n t U n s i g n e d in t 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 x 7 d 0 x 0 7 , 0 x 7 f 0 x 6 f l : 4 u c h a r A C T 4 = 0 x e f O x d f , 0 x b f ,0 x 7 f ; 5 = = = = = = = : = 6 u c h ar s t a t u s _f la g; 7 u i n t y e a r ; 8 u c h a r mo n t h ; 9 u c h a r d a y ; 1 0 u c h a r t e mp _ y e a r I , t e mp mo n t h ;1 1 u ch ar t e m p _y e a r _ h ; 1 2 , 一 一 一一 - 一 一 一1 3 v oid k ey _s 1 ( v o i d ) ; 1 4 v oid k ey _s 2 ( v o i d ) ; 1 5 v o id k e y _ s 4 ( v o id ) ; fl1 6 v o id d e la y ( u i n t k ) : 1 7 u c h a r c o n v ( u i n t y e a r u c h a r mo n t h ) ;1 8 一 一- - 一 一1 9 v o i d ma i n ( v o i d ) 2 0 u c h a r i: 2 1 u i n t t e mp 1 t e mp 2 ; 2 2 wh i le ( 1 ) 2 3 k e y _ s 4 0; 2 4 s wit c h ( s t a t u s _ f l a g ) 2 5 2 6 ca s e 0 :k ey _s 1 ( ) : t e mpl =t emp _y e a r _ l ; 2 7 k ey _s 2 ( ) ; t e rnp 2 = t e rnp _ y e a r h ; b r e a k ; 2 8 c a s e 1 : k e y _ s 1 ( ) : mo n t h = t e m p _ mo n t h ; b r e a k ; 2 9 d e f a u l t : b r e a k ; 3 0 l 3 1 y e a r = t e mp 1 + ( t e mp 2 1 0 0 ) ; 3 2 一一3 3 d a y = c o n v ( y e a r , mo n t h ) ; 3 4 - 3 5 f o r ( i = 0 : i 9 9 ) t e mp _ y e a r I = 0 ; b r e a k ; 7 2 c a s e 1 : t e mp _ mo n t h + ; ff 7 3 if ( t e mp mo n t h 1 2 ) t e mp _ mo n t h =1 ; b r e a k ; 7 4 d e f a u lt : b r e a k ; 7 5 7 6 7 7 l 7 8 ff - 7 9 v oid k e y _s 2 ( v o id) 8 0 8 1 P 2 = 0 x ff ; 8 2 if ( P 2 = = O x f d ) 8 3 8 4 s wi t c h ( s t a t u s _ f la g ) 8 5 8 6 c a s e 0 : t e mp _ y e a r _ h + + ; 8 7 i f ( t e mp _ y e a r _ h 9 9 ) t e mp _ y e a r _ h = 0 ; b r e a k ; 8 8 d e f a u lt : b r e a k ; 8 9 9 O l 91 l 9 2 习单 片机 , -一一一9 3 vo i d k e y s 4 ( v o i d ) 1 9 4 5 P 2 = 0 x ff ;| | 9 6 if ( P 2 = = 0 x f 7 ) s t a t u s _ f I a g+ + : 9 7 i f ( s t a t u s _ f l a g 2 ) s t a t u s _ f la g = 0 ; 9 8 , 9 9 - - 1 0 0 u c h a r c o n v ( u in t y e a r 。 u c h a r mo n t h ) 1 01 u c h a r l e n ; 1 0 2 s wit c h ( mo n t h ) ffl 0 3 I I 1 0 4 c a s e 1 : l e n = 3 1 ; b r e a k ; 1 0 5 c a s e 3 : 1e n = 3 1 ; b r e a k ; 1 0 6 c a s e 5 : 1 e n = 3 1 ; b r e ak; 1 0 7 c a s e 7 : 1e n = 3 1 ; b r e a k ; 1 0 8 c a s e 8 : 1 e n = 3 1 ; b r e a k ; I I 1 0 9 c a s e 1 0 : le n = 31 ; b r e a k ; 1 1 0 c a s e 1 2 : 1 e n = 31 ; b r e a k ; 1 1 1 c a s e 4 : le n = 3 0 ; b r e ak ; 1 1 2 c a s e 6 : Ie n = 3 O : b r e a k : , 1 1 3 c a s e 9 : le n = 3 0 ; b r e a k ; 1 1 4 c a s e 1 1 : I e n = 3 O : b r e a k : , 1 1 5 c a s e 2 : if( y e a r 4 = = 0 & & y e a r 1 0 0 = 0 11 y e a r 4 0 0 = = 0 ) le n = 2 9 ;1 1 6 e l s e l e n =2 8 : br e a k I , 1 1 7 d e f a u l t : r e t u r n 0; b r e a k ; 1 1 8 l , , 1 1 9 r e t u r n l e n ; 1 2 0 1 , , 1 2 1 编译通过后,将生成的 c s 2 1 h e x 文件烧录到 8 9 s 5 1 芯片中, 将芯片插入 到 L E D 1 2 8 6 4图形液晶试验板上 。 试 验板上接通 5 V电源, 4个数码管显示 年份“ 0 0 0 0 ” 。按下 S 1 、 S 2键可输入年 份 y e a r ;按一下 S 4键切换到输入月份 mo n t h 。 按下 S1 键可输入月份 mo n t h ; 再按一下 S 4键切换到显示该月天数 d a y 。 若输入条件不符合( 如输入了 1 3 月 ) , 则显示屏熄灭以示输入出错。 下面分析程序 。 序号 1( 程序解释以下同) :包含头文件 RE G51 H。 序号 2 3 : 数据类型 的宏定义 。 序号 4 : 数码管O 一 9的字形码。 序号 5 : 数码管的位选码。 序号 6 : 程序分隔。 序 号 7 :定 义 无 符 号字 符型 全 局 变量 s t a t us _f l a g ( 状态标志 ) 。 序 号 8:定 义 无 符 号 整 型全 局 变 量 y e a r ( 年 ) 。 序号 9 : 定义无符号 字符型 全局变量 mo n t h ( 月 ) 。 序号 1 O :定义无符号字符型全局变量 d a y ( 天 ) 。 序号 1 1 1 2:定 义无符 号字符 型全 局变量 t e mp _y e ar _ l 、 t emp mo n t h 、 t e mp _ y e a Lh ( 程序执 行过 程中的中间变量 ) 。 序号 1 3 : 程序分隔。 序号 1 4 1 8 : 函数声明。 序号 1 9 : 程序分隔。 序号 2 0: 定 义函数名为 ma i n的主函数。 序号 2 1 : ma i n的主函数开 始。定 义无符 号 字符型局部变量 i 。 序号 2 2: 定义无符号 整型 局部 变量 t e mpl 、 t e mp2o 序号 2 3 : wh il e循环语句进行 无限循环 。 序号2 4 , 调用S 4 键判断子函数 k e y _ s 4 0 。 序 号 2 5 : s w i t c h语 句 , 根 据 表 达 式 s t a t u s_f l a g的值进行散转 。 序号 2 6: s w i t c h语句开始 。 序 号 2 7 2 8 : 调 用 k e y _ s 1 ( ) 、 k e y _ s 2 0子 函 数 并把按键输入值赋 t e mpl 、 t e mp 2 。 序号 2 9 : 调 用 k e y _ s 1 ( ) 子 函数 , 并把按键 输 入值赋 mo n t h 。 序号 3 O : 一项也不符合, 则直接退出。 序号 3 1 : s wit c h语句结束 。 序号 3 2 : 数学计算。 序号 3 3: 程序分隔。 序 号 3 4: 调 用 c o n v ( y e a r ,mo n t h ) 子 函数 得 到 当月 的天数 。 序号 3 5 : 程序分隔 。 序 号 3 6 5 2 : f o r 语句循 环 , 用于 点亮刷 新 4 个数码管 。 序号 3 7 : f o r 语句 开始 。 序 号 3 8 : s w it c h 语 句 , 根 据 表 达 式 s t a t u s _f l a g的值进行散转。 序 号 3 9 : s wit c h语 句开始。 序号 4 O 一 4 3 :点亮 4位数码管,显示年份 y ea r 序号 4 4 4 5 : 点亮右边 2 位数码管, 显示月 份 mo n t h 。 序号 4 6 4 7 : 如果 d ay 的值 为 真( 大 于 O) , 点亮左边 2 位数码管, 显示天数 d ay。 序号 4 8 4 9 : 否则熄灭数码管。 序号 5 0: 一项也不符合 , 则直接退 出。 序号 5 1 : s w it c h 语句结束。 序号 5 2: f o r 语句结束 。 序号 5 3: wh i le循环语句结束。 序号 5 4 : m a i n的主函数结束。 序号 5 5: 程序分隔。 序号 5 2 6 2: 延时子 函数。 维普资讯 序号 6 3: 程序分隔。 序号 6 4 7 8: k e y s 1 ( ) 子函数。 序号 6 5: k e y _ s 1 ( ) 子 函数开始 。 序号 6 6 : P 2口置全 1 以便读取按键输入。 序号6 7 : 如果P 2 等于0 x f e 。 说明s 1 键按下。 序号6 8 : 进入 _f 条件语句。 序号 6 9 7 6 : s wi t c h语句。 序号 7 0: s wi t c h语句开始。 序 号 7 1 : s t a t u s _ f la g 为 0时 , t e mp _ y e a r _ l 递增。 序号 7 2 : t e mp y e a r _ l 变化范围O 9 9 ( 年份 的低 2 位变化范围0 0 9 9 ) 。 序 号 7 3 : s t a t u s _ f la g 为 1时 , t e mp mo n t h 递增。 序号7 4 : t e mp _ mo n t h变化范围 1 1 2 ( 月份 的变化 范围 1 1 2 ) 。 序号7 5 : 一项也不符合, 则直接退出。 序号 7 6 : s wit c h语句结 束。 序号 7 7 : _f 条件语句结束。 序号 7 8: k e y _ s 1 ( ) 子函数结束。 序号 7 9: 程序分隔。 序号 8 0 9 2 : k e y _ s 2 0 子函数 , 可参考序号 6 4 7 8对 k e y _ s 1 0子函数的分析。 序号 9 3: 程序分隔。 序号 9 4 9 9: k e y _ s 4 0子函数。 序号 9 5: k e y _ s 4 0 子函数开始。 序号 9 6 : P 2口置全 1 以便读取按键输入。 序号 9 7 :如果 P 2 等于 O ) ( f 7 。说明s 4键按 下 。 s t a t u s _ f l a g递增。 序号 9 8 : s t a t u s _ f l a g变化范围 0 - 2 ( 只能选 择输入 年份 、 输 入月份 、 显示 天数 3种 状态 ) 。 序号 9 9 : k e y _ s 4 0 子函数结束。 序号 1 o O : 程序分隔。 序号 1 0 1 1 2 1 : c o n v 0子函 数 。 通 过输 入 年 份、 月份, 计算出当月的天数。 序号 1 0 2 : c o n v 0 子函数开始, 定义无符号字 符型局部变量 l e n 。 - 序 号 1 0 3 1 1 9 : s wit c h语 句 。根 据 月 份 【 mo n t h) 。 得 到天数【 le n o 序号 1 0 4: s wi t c h语句开始。 序 号 1 0 5 1 1 1 : 1 、 3 、 5 、 7 、 8 、 1 0 、 1 2月 的 天 数为3 1 天。 序 号 1 1 2 1 1 5: 4、 6、 9、 1 1月 的 天 数 为 3 0天 。 序号 1 1 6: 2月 的天数如 闰年 为 2 9天。 序号 1 1 7 : 否则是平年为 2 8天。 序号 1 侣: 如月份出错【 如输入了 1 3 个月 ) 。 天数返回 0 。 序号 1 1 9 : s w it c h 语句结束。 序号 1 2 0 : 如月份正确 。 返 回该月 的天数 。 序号 1 2 1 : c o n v 0 子函数结束。 习单 片机 在许多实际问题 中, 需要程序进行 有规律的重复执行, 这时可以用循环语 句来实现。在 C语言中, 用来实现循环 的语句有 wh i l e语句 、 d o wh i l e语句 、 f 0 r 语句及 g o t o语句等。 1 wh i le语 句 wh i l e语句构成循环结构的一般形 式如下 : wh i l e ( 条件表达式) 语句: 其执行过程是 : 当条件表达式的结 果为真( 非 0值 ) 时, 程序就重复执行后 面的语句 , 一直执行到条件表达式的结 果变化为假( 0值 ) 时为止。这种循环结 构是先检查条件表达式所给出的条件 , 再根据检查的结果决定是否执行后面 的语句。 如果条件表达式的结果一开始 就为假 , 则后面 的语 句一次也不会被执 行。这里的语句可以是复合语句。图 1 为 w h i l e语句 的流程 图。 3 尊 篱 _ 麓 | : |一 用 wh il e语句求 1 + 2 +1 O O的 结果并将结果在 L E D 1 6 2字符液晶 试验板上输 出显示 。 在我的文档中建立一个文件 目录 ( c s 2 2) , 然 后建 立 c s 2 2 u v 2的工 程项 目。 最后建立源程序文件( c s 2 2 c o 输入下面的程序: # i n c lu d e fl序号【 以下 同 ) : 1 # d e f i n 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 S E G7 【 1 0 】 = 0 x c 0 0 x f 9 ,0 x a 4 0 x b 0 , 0 x 9 9 0 x 9 2 0 x 8 2 O x f 8 ,0 x 8 0 0 x 9 0 ; 4 一= : 一= = = = = = = = = = = = 5 v o i d d e l a y ( u i n t k ) 6 I| | 7 u i n t i ,j : 8 f o r ( _ = 0 : i 序号( 以下 同 ) : 1 # d e f i n e u c h a r u n s i g n e d c h a r f1 2 # d e f i n e u i n t u n s i g n e d i n t 3 u c h a r c o d e S E G7 1 0 = 0 x c 0 ,0 x f 9 , 0 x a 4 , 0 x b 0 0 x 9 9 , 0 x 9 2 , 0 x 8 2 , 0 x f 8 0 x 8 0 0 x 9 0l ; 4 =5 v o i d d e la y ( u in t k ) 6 | |1 u in t i, j : 8 for ( = O : i 序号( 以下同) : 1 # d e f i n 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 i n t u n s ig n e d i n t 3 u c h a r c o d e S E G 7 1 0 = 0 x c 0 0 x f 9 0 x a 4 0 x b 0 0 x 9 9 0 x 9 2 。 0 x 8 2 , 0 x f 8 0 x 8 0 0 x 9 0 ; 4 一= = =一一一=一=5 v o id d e l a y ( u i n t k ) 6 、 l n u i n t i ,j : 8 f o r ( I_ 0 : i 序号( 以下同 ) : 1 # d e f in e u c h a r u n s ig n e d c h a r 2 # d e f i n e u i n t u n s i g n e d in t 3 u c h a r c o d e S E G7 【 1 0 】 : 1 0 x c 0 , 0 x f9 0 x a 4 0 x b 0 0 x 9 9。0 x 9 2 。 0 x 8 2 。0 x f 8 0 x 8 0 0 x 9 0 ; 4 - 5 -一一: : : = = = v o id ma in ( v o i d ) I uc h ar c a t - - 0: P 0 = S E G7 0 ; 6 0 1 2 4 5 6 7 鹏 们 们 们 们 一 一 一 维普资讯 习单 片 机 从家用多功能定时控制器电路设计, 谈单片机系统的硬件 ( 4 ) 语音 电路 、 E E P R O M、 红外接收 及输出驱动电路 语 音 芯 片 很 多 。本 设 计 采 用 a P 8 8 4 2 。 所需语音信号已预先录入。图 6是其引脚图, 图7是其在 CP U控制模 式下的典型接线图, S 1 S 5选择 3 0段 语音 , S B T为放音触发端。 从图7可知。 对 1 9 段语音的控制需占用单片机的 6 根 I O 1:3 线。 关于 a P 8 8 4 2的详细资料。 请参考相关文章或上网查询。8 9 S 5 2单 片机片内不含 E E P R 0M, 需要外扩。此 处选用存储容量为 5 1 2字节 的串行 E E P R OM 2 4 C0 4 , 它通过 S C L和 S D A 与单片机进行通信, WP端为写保护。 用 单片机控制该端1:3。 可减少误写。 提高 可靠性。可见控制 2 4 0 0 4要占单片机 的3根1:3 线。红外接收采用一体化的红 d e la y ( 1 0 0 0) ; 1 8 f 0 r ( c n t = O :c n t 1 O ; c n t + + ) 1 9 l , , 2 0 if ( c n t 5 ) c o n t i n u e : 2 1 P O = S E G 7 【 c n t 】 : 2 2 d e la y ( 1 O 0 0 ) ;| | 2 3 2 4 wh i le ( 1 ) : 2 5 2 6 编译通过后 。将生成的 c s 2 5 h e x 文件烧录到 8 9 S 5 1芯片中。将芯片插 入到 L E D 1 6 2字符液晶试验板上 , 试 验板上接通 9 V电源 。 右边一个数码管 开始显示 。 0 。 。 随后显示 。 5 9 。 。 下面分析一 下程序 。 序号 1( 程序解释。以下同) :包含头文件 REG51 H。 序号 2 3 : 数据类型的宏定义。 序号 4 : 数码 管 O 9的字形码 。 序号 5 : 程序分 隔。 序号 6 1 2: 延时子函数。 序号 1 3: 程序分隔。 序号 6 1 2: 延时子函数。 电路 设 计 的方 法 外接收头 HD 0 0 3 8 。 其输出接至单片机 。 需要占用一个 I ( 3 Iq。输出驱动电路由 三极管驱动电路和继电器等组成。继电 器的触点通过接插件引出, 以便控制相 关电器。 ( 5 ) 温度检测电路 表 1 陈阳海 实现温度检测的方法很多。 这里我 们采用负温热敏 电阻 R l 作温度传感 器、用 N E 5 5 5组成的单稳电路作温度 检测电路, 当电容器 C的容量固定时 。 其单稳脉冲的宽度与 R l 的阻值成正 比 , 单片机先输出单稳触发信号, 然后 检测单稳脉冲的宽度并查表, 便可求得 序号 1 3 : 程 序分 隔。 序号 1 4 : 定 义函数 名为 ma in的主函数。 序号 1 5 : ma i n主函数开 始。 序号 1 6 :定义无符号字符型变量 c n t 并赋 初值 O 。 序号 1 7 : 右边一个数码管 显

温馨提示

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

评论

0/150

提交评论