阿里云oss建站 直接上传wordpress深圳做企业网站

当前位置: 首页 > news >正文

break;  /执行完语句2后使用break跳出switch结构/
Case  常量表达式n: /如果常量表达式n满足则执行语句n/ 语句n; break;  /执行完语句n后使用break跳出switch结构/ default:  /条件都不满足时执行语句n1/ 语句n1; } 当switch括号中表达式的值与某一个case后面的常量表达式的值相等时就执行它后面的语句然后因遇到break而退出switch语句。 当所有case中常量表达式的值都没有与表达式的值相匹配时就执行default后面的语句。 每个case的常量表达式必须是互不相同的否则出现对表达式的同一个值有两种以上的选择。 如果case语句中遗忘了break,则程序在执行了本行case选择之后不会按规定退出switch语句而是执行后续的case语句。 注意对于Switch语句需要注意两点一是常量表达式的值必须是整型或字符型二是最好使用“break”。 实例 void main(void) {unsigned char i; i2; Switch(i) { Case 0: P00xff ;  /如果i0,则执行“P00xff”/ break; Case 1:P10xff; break; Case 2:P20xff;   /常量表达式2满足则执行“P20xff”/ break;  /执行完后跳出switch结构/ default:P10x00;  /当所有的case中的常量表达式的值都没有与表达式的值相匹配时就执行default后面的语句/ } } 3.C51的循环结构 循环结构是结构化程序设计的3种基本结构之一因此掌握循环结构的概念是程序设计尤其是C程序设计最基本的要求。 在C51语言中实现循环的语句主要有3种。 (1)While语句的一般形式 While(表达式) {语句/*循环体*1} While语句的语义是计算表达式的值当值为真(非0)时执行循环体语句否则跳出循环体执行后续操作。 使用while语句应注意以下几点 ●While语句中的表达式一般是关系表达式或逻辑表达式只要表达式的值为真(非0)即可继续循环。 ●循环体如包含一个以上的语句则必须用“{}”括起来组成复合语句。 ●While循环体中应有让循环最终能结束的语句否则将造成死循环。一直运行直至关机。 实例 while(1) {} 这个语句的作用就是无限循环一直运行直至关机。 实例用while求1到10的和程序如下 void main(void) { unsigned char i,sum; sum0; i1; while(i10) { sumsumi i; } POsum;  //将结果送P0口显示 } (2)do…while语句的一般形式 do {语句;}   /循环体/ while(表达式); do…while循环语句的执行过程如下首先执行循环体语句一次再判断表达式的值。如果表达式的值为真(非0值),则重复执行循环体语句直到表达式的值变为假(0值)时循环结束。对于这种结构,在任何条件下循环体语句至少会被执行一次。注意 ●do是C语言关键字必须和while联合使用 ● while(表达式)后的分号“;”不能少它表示整个循环语句的结束。 实例用do…while求1到10的和程序如下 void main(void) { unsigned char i,sum; sum0; i1; do{ sumsumi;  /注意{}不能省否则跳不出循环体/ i; } while(i10);/1分号“;”不能少 POsum;  //将结果送P0口显示 } (3)for语句的一般形式 For  (初始化表达式条件表达式增量表达式) {语句}  /循环体/ For 循环语句结构可使程序按指定的次数重复执行 一个语句或一组语句。for循环语句的执行过程如下 ●初始化表达式 ●求解条件表达式。若其值为“真”,则执行for后面的语句如果其值为“假”,那么跳过for循环语句 ●若条件表达式为“真”,则执行指定的语句后执行增量表达式 ●执行for后面的语句。 4.项目实践 任务12-2-1:用按键S控制P1口8只LED显示状态 任务实现 (1)分析先设置一个变量i,当i1时LED1发光当i2时LED1、LED2发光当i3时LED1、LED2、LED3发光…;当i8时LED1LED8都发光。由“switch”语句根据i的值来实现LED发光。i值的改变可以通过按键S来控制每按下S按键一次i自增1,当增加到9时将其值重新置为1。 (2)程序设计 #includesreg51.h //包含单片机寄存器的头文件 sbit SP3^0; 1/定义按键S接入P3.0引脚 /********************************* 函数功能延时约150ms *******************************/ Void delay(void) { Unsigned char i,j; for(i0;i200;i) for(j0;j250;j) } /****************************** 函数功能主函数 ********************************/ void main(void) { unsigned chari; i0;  //初始化 while(1)  //无限循环 { if(S0) //判断S按键是否被按下如果S0被按下 { delay();  150ms延时消除键盘抖动 if(S0)  /再判断S按键是否被按下如果S0确被按下/ i;  //自增1 if(i9) //如果i9,将其值重新置为1 i1; } switch(i)  //7使用多分支语句 { case1:P10xfe;  //LED1发光 break;  //退出switch语句 case2:P10xfc; //LED1、LED2发光 break;  //退出switch语句 case3:P10xf8;  //LED1、LED2、LED3发光 break;  //退出switch语句 case4:P10xf0;  //LED1、LED2、LED3、LED4发光 break;  //退出switch语句 case5:P10xe0;  //LED1、LED2、LED3、LED4、LED5发光 break;  //退出switch语句 case6:P10xc0;  //LED1、LED2、LED3、LED4、LED5、LED6发光 break;  //退出switch语句 case7:P10x80;  //LED1、LED2、LED3、LED4、LED5、LED6、LED7发光 break;  //退出switch语句 case8:P10x00;  //LED1~LED8发光 break;  //退出switch语句 defauit:  //默认值关闭所有LED P10xff;} } } 任务12-2-2:用for语句实现蜂鸣器发出1kHZ音频 任务实现 (1)分析:设单片机晶振频率为12MHz,则机器周期为1μs。只 要让单片机的P1.0引脚的电平信号每隔音频的半个周期取反一次即可发出1KHz音频。音频的周期为T1/1000Hz0.001s,即1000μs,半个周期为1000μs/2500μs,即在P1.0引脚上每500μs取反一次即可发出1KHz音频。而延时500μs需要消耗机器周期数N500μs /3167,即延时每循环167次就可让P1.0引脚上取反一次就可以得到1KHz音频。 (2)程序设计 #includereg51.h  //包含单片机寄存器的头文件 sbit soundP1^0;   //将sound位定义为p1.0引脚 /******************************************** 函数功能延时以形成约1KHz音频 /********************************************** void delay500us(void) { unsigned char i; for(i0;i167;i) ; } /********************************************** 函数功能延时1000μs以形成一个周期约500Hz音频 /********************************************** void delay1000us(void) { unsigned int i; for(i0;i333;i) ; } /********************************************** 函数功能发声1s时间的控制 /********************************************** void sound1s(void) { unsigned int i; for(i0;i1000;i) { sound 0; delay500us(); sound 1; delay500us(); } } /********************************************** 函数功能发声0.5s时间的控制 /********************************************** void soundBans(void) { unsigned char i; for(i0;i250;i) { sound0; delay1000us(); sound1; delay1000us(); } } 4实践探索——用单片机开发版来实现 由于开发板蜂鸣器连接在P2.4引脚因此只需要修改代码”sbit soundP2^4”就可以了。 小结消耗机器周期数的计算(近似值): (1)一重循环 for(i0;in;i)    //n必须为无符号字符型数据 消耗机器周期数为 N3×n 式中N为消耗机器周期数n为需要设置的循环次数(n必须为无符号字符型数据)。 (2)二重循环 for(i0;in;i)    //n必须为无符号字符型数据 for(i0;im;i)   //m必须为无符号字符型数据消耗机器周期数为 N3×n×m 任务12-2-3:用while语句控制P1口8只LED的显示状态 任务实现 (1)分析 设计一个用while语句实现P1口8只LED显示状态的程序根据要求在while语句循环中设置一个变量i,当i小于0x64(十进制数100)时将i的值送P1口显示并i自增1,当i等于0×64时就跳出while循环。 (2)程序设计 #includereg51.h  //包含单片机寄存器的头文件 /********************************************** 函数功能延时约150ms /********************************************** void delay(void) { unsigned char i,j; for(i0;i200;i) for(j0;j250;j) ; } /********************************************** 函数功能主函数 /********************************************** void main(void) { unsigned char i; while(1)  //无限循环 { i0;  //将i置为0即初始化 while(i0x64)  //i小于100时执行循环体 { P1i; delay; i;  //i自增1 } } } 任务12-2-4:用do…while语句控制P1口8只LED的显示状态 任务实现 (1)分析:只要在循环体中按照点亮次序依次点亮再将循环条件设置为死循环即可。现在来讨论点亮LED的控制码。LED1发光的控制码为0xfe;LED1、LED2发光的控制码为0xfc;LED1、LED2、LED3发光的控制码为0xf8……LED1LED8都发光的控制码为0x00;LED1发光的控制码为0xfe;LED1、LED2发光的控制码为0xfc…依次循环。 2程序设计 #includereg51.h void delay(void) { unsigned char i,j; for(i0;i200;i) for(j0;j200;j) ; } void main(void) { do { P10xfe;  //LED1点亮 delay();  //延时 P10xfc;  //LED1、LED2点亮 delay();  //延时 P10xf8;  //LED1、LED2、LED3点亮 delay();  //延时 P10xf0;  //LED1~LED4点亮 delay();  //延时 P10xe0;  //LED1~LED5点亮 delay();  //延时 P10xc0;  //LED1~LED6点亮 delay();  //延时 P10x80;  //LED1~LED7点亮 delay();  //延时 P10x00;  //LED1~LED7点亮 delay();  //延时 }while(1); }