51單片機應用從零開始(一)-CSDN博客
51單片機應用從零開始(二)-CSDN博客
51單片機應用從零開始(三)-CSDN博客
51單片機應用從零開始(四)-CSDN博客
51單片機應用從零開始(五)·加減乘除運算-CSDN博客
51單片機應用從零開始(六)·邏輯運算-CSDN博客
目錄
?編輯
1.??用右移運算流水點亮 P1 口 8 位 LED
2.??用 if 語句控制 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語句通常具有以下形式:
if (condition) {//code block to execute if condition is true
}
????????其中,condition是一個布爾表達式,如果它的值為true,則執行if語句塊中的代碼。如果condition的值為false,則if語句塊中的代碼將被跳過。如果需要在條件不成立時執行特定的代碼塊,可以使用else關鍵字:
if (condition) {//code block to execute if condition is true
} else {//code block to execute if condition is false
}
????????如果有多個可能的條件需要使用if語句判斷并執行不同的代碼塊,則可以使用if-else if-else結構:
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語句的基本語法:
switch(expression){case constant-expression1:statement(s);break;case constant-expression2:statement(s);break;/* 可以有任意數量的 case 語句 */default:statement(s);
}
switch語句的執行過程如下:
- 表達式expression的值被計算并與每個case常量表達式進行比較,如果匹配到一個case常量表達式,則執行該case下的語句塊,直到遇到break語句或者switch語句結束。
- 如果所有case表達式都與表達式expression的值不匹配,則執行default下的語句塊,如果沒有default語句,則直接結束switch語句。
以下是一個簡單的實例,演示了如何使用switch語句:
#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; } }
}