P0口聯(lián)接8個LED燈,P1^0~P1^7;
#include<reg52.h> sbit LED=P1^0; void main() { LED=0; while(1); }
//此方法使用1個字節(jié)對單個端口賦值
P1 = 0xFF; //P1口全部為高電平,對應的LED燈全滅掉,
//ff換算成二進制是 1111 1111
P1 = 0xfe; //P1口的最低位點亮,可以更改數值是其他的燈點亮
//0xfe是16進制,0x開頭表示16進制數,
//fe換算成二進制是 1111 1110
全部取反,主函數中的代碼修改為
LED=~LED;
#include<reg52.h> unsigned int i,j; void main() { while(1) { P1=~(1<<j++); if(j==8) { j=0; } for(i=0;i<50000;i++); } }
1 void main (void) 2 { 3 while (1) //主循環(huán) 4 { //主循環(huán)中添加其他需要一直工作的程序 5 LED=~LED; 6 //將P1.0口賦值 0,對外輸出低電平 7 delay(100);//執(zhí)行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) //主循環(huán) 13 { //主循環(huán)中添加其他需要一直工作的程序 14 15 unsigned char i; //定義一個無符號字符型局部變量 i 取值范圍 0~255 16 //P1=0xfe; //賦初始值 17 for(i=0;i<8;i++) //加入 for循環(huán),表明for循環(huán)大括號中的程序循環(huán)執(zhí)行8次 18 { 19 P1<<=1; 20 delay(100);//執(zhí)行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) //主循環(huán) 17 { 18 for(i=0;i<8;i++) //加入 for循環(huán),表明for循環(huán)大括號中的程序循環(huán)執(zhí)行8次 19 { 20 delay(100); 21 P1<<=1; 22 P1=P1|0x01; //左移后,最右端自動賦值0,所以需要該語句賦值1 23 } 24 P1=0xfe; //重新賦初始值 25 //主循環(huán)中添加其他需要一直工作的程序 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) //主循環(huán) 11 { 12 LED0=1; 13 delay(60000); //特意加延時,可以看到熄滅的過程 14 for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++){ //PWM_LOW表示低 15 //電平時間,這個循環(huán)中低電平時長從1累加到CYCLE(周期)的值,即600次 16 17 LED0=0; //點亮LED 18 delay(PWM_LOW);//延時長度,600次循環(huán)中從1加至599 19 LED0=1; //熄滅LED 20 delay(CYCLE-PWM_LOW);//延時長度,600次循環(huán)中從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 //主循環(huán)中添加其他需要一直工作的程序 32 } 33 }
流水燈
1 #include<reg52.h> //包含頭文件,一般情況不需要改動, 2 //頭文件包含特殊功能寄存器的定義 3 4 void delay100ms(unsigned char num); 5 /*------------------------------------------------ 6 流水燈 7 ------------------------------------------------*/ 8 void main (void) 9 { 10 unsigned char led=0xff,mask=0x1,flag=0; 11 //unsigned char tflag=0,time=100; 12 while(1) 13 { 14 P1=led^mask; //mask為0 全滅 15 delay100ms(5); //延時500ms 16 if(0x80==mask) 17 flag=0;// 讓mask向右位移 18 if(0x1==mask) 19 flag=1;//讓mask向左位移 20 flag?(mask<<=1):(mask>>=1); 21 } 22 } 23 24 void delay100ms(unsigned char num) 25 { 26 unsigned char n,m; 27 for(;num;num--) 28 { 29 for(n=200;n;n--) 30 { 31 for(m=250;m;m--); 32 } 33 } 34 }
函數實現(xiàn)流水燈
1 #include<reg52.h> //包含頭文件,一般情況不需要改動, 2 #include<intrins.h> 3 #define uchar unsigned char //頭文件包含特殊功能寄存器的定義 4 void delay100ms(unsigned char num); 5 /*------------------------------------------------ 6 利用_crol_、_cror_實現(xiàn)流水燈 7 _crol_ 將char型變量循環(huán)左移 8 _cror_ 將char型變量循環(huán)右移 9 ------------------------------------------------*/ 10 void main (void) 11 { 12 uchar x=0x3; 13 bit flag=0; 14 while(1) 15 { 16 P1=x; 17 delay100ms(10); 18 if(0x3==x) 19 flag=0; 20 else if(0xc0==x) 21 flag=1; 22 flag?(x=_cror_(x,2)):(x=_crol_(x,2)); 23 } 24 } 25 //延時函數 26 void delay100ms(unsigned char num) 27 { 28 unsigned char n,m; 29 for(;num;num--) 30 { 31 for(n=200;n;n--) 32 { 33 for(m=250;m;m--); 34 } 35 } 36 }
指針實現(xiàn)流水燈
#include <reg52.h> void delay(unsigned int); //指針實現(xiàn)流水燈代碼 unsigned char dis[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; void main() { unsigned char i,*p;//定義一個無符號字符型變量i各一個指向無符號字符型變量的指針變量P while(1) { p=&dis[0];//把數組中第一個成員數據(0xFE)所占的內存地址賦給指針變量P for(i=0;i<8;i++) { P1=*p;//取指針指向的數組元素,并拷貝給單片機的P0口 p++; //指針加1,指向數組的下一個元素 delay(10); } } } void delay(unsigned int i) { unsigned int j; for(;i!=0;i--) { for(j=3000;j!=0;j--); } }
花樣流水燈
1 #include<reg52.h> //包含頭文件,一般情況不需要改動, 2 #define uchar unsigned char //頭文件包含特殊功能寄存器的定義 3 uchar code tab[]={ 4 0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80, //正向流水燈 5 0x40,0x20,0x10,0x8,0x4,0x2,0x1,0x0, //反向流水燈 6 0x55,0xaa,0x55,0xaa,0x55,0xaa,0x0, //隔燈閃爍 7 0x0f,0xf0,0x0f,0xf0,0x0, //高四盞 底四盞閃爍 8 0xcc,0x33,0xcc,0x33,0xcc,0x33,0x0 //隔兩盞燈閃爍 9 }; 10 void delay100ms(unsigned char num); 11 /*------------------------------------------------ 12 花樣流水燈 13 ------------------------------------------------*/ 14 void main (void) 15 { 16 uchar x; 17 while(1) 18 { 19 for(x=0;x<35;x++) 20 { 21 P1=tab[x]; 22 delay100ms(10); 23 } 24 } 25 } 26 27 void delay100ms(unsigned char num) 28 { 29 unsigned char n,m; 30 for(;num;num--) 31 { 32 for(n=200;n;n--) 33 { 34 for(m=250;m;m--); 35 } 36 } 37 }
指針,二維數組花樣流水燈
#include <reg52.h> void delay(unsigned int ); //延時函數的聲明 //*******定義一個二維數組,存儲40個彩燈數據。*********** unsigned char dis[5][8]= { {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f} ,{0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe} ,{0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff} ,{0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00} ,{0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f} }; /***********************************主函數************************************/ void main(void) {unsigned char i; unsigned char j; unsigned char *p;//定義一個指向無符號字符型的指針變量。 while(1) { p=&dis[0][0]; //取數組的首地址,也就是第0個元素的所在的地址。 for(j=0;j<5;j++) //用兩層嵌套循環(huán)引用彩燈數組中的數據,行引用,一共5行。 for(i=0;i<8;i++) //用兩層嵌套循環(huán)引用彩燈數組中的數據,列引用,一共8列。 { P1=*p++; //取數組中數據,同時指針加1。 delay(10); //調用延時函數。 } } } /*******************************延時函數*************************************/ void delay(unsigned int i) { unsigned int j; for(;i!=0;i--) for(j=3000;j!=0;j--); }
精確定時1秒移動走馬燈
#include<reg52.h>//包含訪問sfr庫函數 #include<intrins.h>//包含訪問內聯(lián)庫函數 #include <absacc.h> typedef unsigned int uint; //對數據類型進行聲明定義 typedef unsigned char uchar; typedef unsigned long ulong; bit ldelay=0; uchar speed=10; uchar code ledp[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//預定的寫入 P1 的值 uchar ledi;//用來指示顯示順序 /* 精確定時1秒閃爍LED */ uint count; unsigned char led=0xff,mask=0x1; main() { RCAP2H=0X10; //賦值52 0X1000,溢出30次等于1秒 RCAP2L=0X00; TR2=1; //啟動定時器 ET2=1; //打開定時器2中斷 EA=1; //打開總中斷 while(1) { if(ldelay) { ldelay=0; //清除標記 P1=ledp[ledi]; //讀出一個值送到 P1 口 ledi++; //指向下一個 if(ledi==8) { ledi=0; //到了最后一個燈就換到第一個 } } if(!K1)speed=30; //檢查到按鍵,設置對應的跑馬速度 if(!K2)speed=15; if(!K3)speed=6; if(!K4)speed=3; } } //定時器2中斷 timer2() interrupt 5 //定時器2中斷是5號 { static uchar t; TF2=0; t++; if((t==speed)||(t>30)) { t=0; ldelay=1; } }
單按鍵10級調速走馬燈
#include<reg52.h>//包含訪問sfr庫函數 #include<intrins.h>//包含訪問內聯(lián)庫函數 #include <absacc.h> typedef unsigned int uint; //對數據類型進行聲明定義 typedef unsigned char uchar; typedef unsigned long ulong; sbit K1=P3^2; //包含絕對地址訪問庫函數 bit ldelay=0; uchar speed=10;//設置一個變量保存默認的跑馬燈的移動速度 uchar speedlever=0; //保存當前的速度檔次 //一個按鍵控制的 10 級變速跑馬燈試驗 uchar code ledp[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//預定的寫入 P1 的值 uchar ledi;//用來指示顯示順序 uint n; /* 精確定時1秒閃爍LED */ unsigned char led=0xff,mask=0x1; main() { RCAP2H=0X10; //賦值52 0X1000,溢出30次等于1秒 RCAP2L=0X00; TR2=1; //啟動定時器 ET2=1; //打開定時器2中斷 EA=1; //打開總中斷 while(1) { if(ldelay) { ldelay=0; //清除標記 P1=ledp[ledi]; //讀出一個值送到 P1 口 ledi++; //指向下一個 if(ledi==8) { ledi=0; //到了最后一個燈就換到第一個 } } if(!K1) //檢查到按鍵,設置對應的跑馬速度 { for(n=0;n<1000;n++); //等待按鍵穩(wěn)定 { while(!K1); //等待按鍵松開 for(n=0;n<1000;n++); //等待按鍵穩(wěn)定松開 speedlever++; if(speedlever==10)speedlever=0; speed=speedlever*3; //檔次和延時之間的預算法則,也可以用查表方法,做出不規(guī)則的法則 } } } } //定時器2中斷 timer2() interrupt 5 //定時器2中斷是5號 { static uchar t; TF2=0; t++; if((t==speed)||(t>30)) { t=0; ldelay=1; } }
聯(lián)系客服