51单片机应用从零开始(七)·循环语句(if语句,swtich语句)

51单片机应用从零开始(一)-CSDN博客

51单片机应用从零开始(二)-CSDN博客

51单片机应用从零开始(三)-CSDN博客

51单片机应用从零开始(四)-CSDN博客

51单片机应用从零开始(五)·加减乘除运算-CSDN博客

51单片机应用从零开始(六)·逻辑运算-CSDN博客

目录

​编辑

[1. 用右移运算流水点亮 P1 口 8 位 LED](#1. 用右移运算流水点亮 P1 口 8 位 LED)

[2. 用 if 语句控制 P0 口 8 位 LED 的流水方向](#2. 用 if 语句控制 P0 口 8 位 LED 的流水方向)

[3. 用 swtich 语句的控制 P0 口 8 位 LED 的点亮状态](#3. 用 swtich 语句的控制 P0 口 8 位 LED 的点亮状态)


1. 用右移运算流水点亮 P1 口 8 位 LED

C语言中的右移运算是将一个整数向右移动指定的位数。右移运算符用">>"表示,其作用是将一个数的二进制表示向右移动指定的位数,并用0在左侧填充。

例如:

int a = 10; // a的二进制表示为 00001010
a = a >> 2; // 将a向右移动2位,得到00100001,即4

在进行右移运算时,如果对有符号整数进行右移,则保留符号位。如果符号位是1,则在左侧用1填充,如果符号位是0,则在左侧用0填充。如果对无符号整数进行右移,则在左侧用0填充。

例如:

int b = -10; // b的二进制表示为 11110110
b = b >> 2; // 对有符号整数进行右移,得到11111101,即-3
unsigned int c = 10; // c的二进制表示为 00001010
c = c >> 2; // 对无符号整数进行右移,得到00000010,即2

那么根据这一特性我们可以完成:

#include<reg51.h> //包含单片机寄存器的头文件
/***************************** 
函数功能:延时一段时间
*****************************/ 
void delay(void) 
{ 
 unsigned int n; 
 for(n=0;n<30000;n++) 
 ; 
} 
/***************************** 
函数功能:主函数
*****************************/ 
void main(void) 
{ 
 unsigned char i; 
 while(1) 
 { 
 P1=0xff; 
 delay(); 
 for(i=0;i<8;i++)//设置循环次数为 8 
 { 
 P1=P1>>1; //每次循环 P1 的各二进位右移 1 位,高位补 0 
 delay(); //调用延时函数
 } 
 } 
 
}

2. 用 if 语句控制 P0 口 8 位 LED 的流水方向

C语言中,if语句是一种条件语句,用于根据条件选择是否执行特定的代码块。if语句通常具有以下形式:

c 复制代码
if (condition) {
   //code block to execute if condition is true
}

其中,condition是一个布尔表达式,如果它的值为true,则执行if语句块中的代码。如果condition的值为false,则if语句块中的代码将被跳过。如果需要在条件不成立时执行特定的代码块,可以使用else关键字:

c 复制代码
if (condition) {
   //code block to execute if condition is true
} else {
   //code block to execute if condition is false
}

如果有多个可能的条件需要使用if语句判断并执行不同的代码块,则可以使用if-else if-else结构:

c 复制代码
if (condition1) {
   //code block to execute if condition1 is true
} else if (condition2) {
   //code block to execute if condition1 is false and condition2 is true
} else {
   //code block to execute if both condition1 and condition2 are false
}

在if语句中也可以嵌套其他if语句,以实现更复杂的条件判断。

在51单片机中,我们可以实现:

#include<reg51.h> //包含单片机寄存器的头文件
sbit S1=P1^4; //将 S1 位定义为 P1.4 
sbit S2=P1^5; //将 S2 位定义为 P1.5 
/***************************** 
函数功能:主函数
*****************************/ 
void main(void) 
{ 
 while(1) 
 { 
 if(S1==0) //如果按键 S1 按下
 P0=0x0f; //P0 口高四位 LED 点亮
 if(S2==0) //如果按键 S2 按下
 P0=0xf0; //P0 口低四位 LED 点亮
 } 
}

3. 用 swtich 语句的控制 P0 口 8 位 LED 的点亮状态

switch语句是一种多分支选择结构,它可以根据某个表达式的值来执行相应的代码块。下面是C语言中switch语句的基本语法:

c 复制代码
switch(expression){
   case constant-expression1:
      statement(s);
      break;
   case constant-expression2:
      statement(s);
      break;
   /* 可以有任意数量的 case 语句 */
   default:
      statement(s);
}

switch语句的执行过程如下:

  1. 表达式expression的值被计算并与每个case常量表达式进行比较,如果匹配到一个case常量表达式,则执行该case下的语句块,直到遇到break语句或者switch语句结束。
  2. 如果所有case表达式都与表达式expression的值不匹配,则执行default下的语句块,如果没有default语句,则直接结束switch语句。

以下是一个简单的实例,演示了如何使用switch语句:

c 复制代码
#include <stdio.h>
int main() {
   int grade = 85;
   switch(grade) {
      case 90 :
         printf("优秀\n" );
         break;
      case 80 :
         printf("良好\n" );
         break;
      case 70 :
         printf("中等\n" );
         break;
      case 60 :
         printf("及格\n" );
         break;
      default :
         printf("不及格\n" );
   }
   return 0;
}

输出结果为:

良好

用 swtich 语句的控制 P0 口 8 位 LED 的点亮状态

#include<reg51.h> //包含单片机寄存器的头文件
sbit S1=P1^4; //将 S1 位定义为 P1.4 
/***************************** 
函数功能:延时一段时间
*****************************/ 
void delay(void) 
{ 
 unsigned int n; 
 for(n=0;n<10000;n++) 
 ; 
} 
/***************************** 
函数功能:主函数
*****************************/ 
void main(void) 
{ 
 unsigned char i; 
 i=0; //将 i 初始化为 0 
 while(1) 
 { 
 if(S1==0) //如果 S1 键按下
 { 
 delay(); //延时一段时间
 if(S1==0) //如果再次检测到 S1 键按下
 i++; //i 自增 1 
 if(i==9) //如果 i=9,重新将其置为 1 
 i=1; 
 
 } 
 switch(i) //使用多分支选择语句
 { 
 case 1: P0=0xfe; //第一个 LED 亮
 break; 
 case 2: P0=0xfd; //第二个 LED 亮
 break; 
 case 3:P0=0xfb; //第三个 LED 亮
 break; 
 case 4:P0=0xf7; //第四个 LED 亮
 break; 
 case 5:P0=0xef; //第五个 LED 亮
 break; 
 case 6:P0=0xdf; //第六个 LED 亮
 break; 
 case 7:P0=0xbf; //第七个 LED 亮
 break; 
 case 8:P0=0x7f; //第八个 LED 亮
 break; 
 default: //缺省值,关闭所有 LED 
 P0=0xff; 
 } 
 } 
}
相关推荐
scan14 小时前
单片机串口接收状态机STM32
stm32·单片机·串口·51·串口接收
Qingniu014 小时前
【青牛科技】应用方案 | RTC实时时钟芯片D8563和D1302
科技·单片机·嵌入式硬件·实时音视频·安防·工控·储能
深圳市青牛科技实业有限公司6 小时前
【青牛科技】应用方案|D2587A高压大电流DC-DC
人工智能·科技·单片机·嵌入式硬件·机器人·安防监控
Mr.谢尔比7 小时前
电赛入门之软件stm32keil+cubemx
stm32·单片机·嵌入式硬件·mcu·信息与通信·信号处理
LightningJie7 小时前
STM32中ARR(自动重装寄存器)为什么要减1
stm32·单片机·嵌入式硬件
西瓜籽@7 小时前
STM32——毕设基于单片机的多功能节能窗控制系统
stm32·单片机·课程设计
远翔调光芯片^1382879887210 小时前
远翔升压恒流芯片FP7209X与FP7209M什么区别?做以下应用市场摄影补光灯、便携灯、智能家居(调光)市场、太阳能、车灯、洗墙灯、舞台灯必看!
科技·单片机·智能家居·能源
极客小张11 小时前
基于STM32的智能充电桩:集成RTOS、MQTT与SQLite的先进管理系统设计思路
stm32·单片机·嵌入式硬件·mqtt·sqlite·毕业设计·智能充电桩
m0_7393128713 小时前
【STM32】项目实战——OV7725/OV2604摄像头颜色识别检测(开源)
stm32·单片机·嵌入式硬件
嵌入式小章14 小时前
基于STM32的实时时钟(RTC)教学
stm32·嵌入式硬件·实时音视频