P0口聯接8個LED燈,P1^0~P1^7;ide
點亮一個LED函數
1 #include<reg52.h> //包含頭文件,通常狀況不須要改動, 2 //頭文件包含特殊功能寄存器的定義 3 4 sbit LED=P1^0;// 用sbit 關鍵字 定義 LED到P1.0端口, 5 //LED是本身任意定義且容易記憶的符號 6 /*------------------------------------------------ 7 主函數 8 ------------------------------------------------*/ 9 void main (void) 10 { 11 //此方法使用bit位對單個端口賦值 12 LED=1; //將P1.0口賦值 1,對外輸出高電平 13 LED=0; //將P1.0口賦值 0,對外輸出低電平 14 15 while (1) //主循環 16 { //主循環中添加其餘須要一直工做的程序 17 LED=0; 18 //將P1.0口賦值 0,對外輸出低電平 19 } 20 }
點亮多個LEDspa
#include<reg52.h> //包含頭文件,通常狀況不須要改動, //頭文件包含特殊功能寄存器的定義 sbit LED0=P1^0;// 用sbit 關鍵字 定義 LED到P1.0端口, sbit LED1=P1^1;//LED是本身任意定義且容易記憶的符號 sbit LED2=P1^2; sbit LED3=P1^3; sbit LED4=P1^4; sbit LED5=P1^5; sbit LED6=P1^6; sbit LED7=P1^7; /*------------------------------------------------ 主函數 ------------------------------------------------*/ void main (void) { //此方法使用bit位對單個端口賦值 LED0=0; //將P1.0口賦值 0,對外輸出低電平 LED1=1; LED2=0; LED3=1; LED4=0; LED5=1; LED6=0; LED7=1; while (1) //主循環 { //主循環中添加其餘須要一直工做的程序 } }
若是像上面那樣一個個賦值就太累了,下面是簡單方法3d
//此方法使用1個字節對單個端口賦值
P1 = 0xFF; //P1口所有爲高電平,對應的LED燈全滅掉,
//ff換算成二進制是 1111 1111code
P1 = 0xfe; //P1口的最低位點亮,能夠更改數值是其餘的燈點亮
//0xfe是16進制,0x開頭表示16進制數,
//fe換算成二進制是 1111 1110 blog
P0口是開路漏極只能輸出低電平,不能正常輸出高電平。it
所有取反,主函數中的代碼修改成for循環
LED=~LED; class
在一個時鐘週期內閃爍一次,這個時間過短,難以觀察。變量
這樣就引入延時須要,簡單方法就是執行一個循環一段時間。
1 void main (void) 2 { 3 while (1) //主循環 4 { //主循環中添加其餘須要一直工做的程序 5 LED=~LED; 6 //將P1.0口賦值 0,對外輸出低電平 7 delay(100);//執行100次 8 } 9 } 10 void delay(int time)//延時函數 11 { 12 int i=0; 13 while(time--) 14 { 15 i=4000; 16 while(i--); 17 } 18 }
1 void delay(int time)//延時函數 2 { 3 int i=0; 4 while(time--) 5 { 6 i=4000; 7 while(i--); 8 } 9 } 10 void main (void) 11 { 12 while (1) //主循環 13 { //主循環中添加其餘須要一直工做的程序 14 15 unsigned char i; //定義一個無符號字符型局部變量 i 取值範圍 0~255 16 //P1=0xfe; //賦初始值 17 for(i=0;i<8;i++) //加入 for循環,代表for循環大括號中的程序循環執行8次 18 { 19 P1<<=1; 20 delay(100);//執行100次 21 } 22 } 23 }
1 void delay(int time)//延時函數 2 { 3 int i=0; 4 while(time--) 5 { 6 i=4000; 7 while(i--); 8 } 9 } 10 void main (void) 11 { 12 13 unsigned char i; //定義一個無符號字符型局部變量 i 取值範圍 0~255 14 delay(100); 15 P1=0xfe; //賦初始值 16 while (1) //主循環 17 { 18 for(i=0;i<8;i++) //加入 for循環,代表for循環大括號中的程序循環執行8次 19 { 20 delay(100); 21 P1<<=1; 22 P1=P1|0x01; //左移後,最右端自動賦值0,因此須要該語句賦值1 23 } 24 P1=0xfe; //從新賦初始值 25 //主循環中添加其餘須要一直工做的程序 26 } 27 }
1 sbit LED0=P1^0; 2 void delay(int i)//延時函數 3 { 4 while(i--); 5 } 6 void main (void) 7 { 8 9 unsigned int CYCLE=600,PWM_LOW=0;//定義週期並賦值 10 while (1) //主循環 11 { 12 LED0=1; 13 delay(60000); //特地加延時,能夠看到熄滅的過程 14 for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++){ //PWM_LOW表示低 15 //電平時間,這個循環中低電平時長從1累加到CYCLE(週期)的值,即600次 16 17 LED0=0; //點亮LED 18 delay(PWM_LOW);//延時長度,600次循環中從1加至599 19 LED0=1; //熄滅LED 20 delay(CYCLE-PWM_LOW);//延時長度,600次循環中從599減至1 21 22 } 23 LED0=0; 24 for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--){ //與逐漸變亮相反的過程 25 26 LED0=0; 27 delay(PWM_LOW); 28 LED0=1; 29 delay(CYCLE-PWM_LOW); 30 } 31 //主循環中添加其餘須要一直工做的程序 32 } 33 }