|
說明:本人現在已經學完51單片機了,定期會發一些學習總結,本次是關于流水燈的,希望大家多多支持 程序代碼都調試過,都帶有注釋。
51學習總結
2018年3月28日16:41:47
-------------------------------------------------------------------------------------------
一.流水燈總結
a.點亮LED有兩種方式:1.sbit定義IO口;2.0x16進制總線式
b.LED電壓 (voltage) 常識:
單個小功率LED燈,顏色不同,其要求的電壓也不同。紅/黃:一般為1.8~2.1伏,白/綠/藍:一般為3.0~3.6伏。
1W大功率燈要求的電壓與以上相同。
c.LED電流 (current) 常識:
I.小功率的LED燈(包括插件式或者貼片式),每個芯片上允許通過的電流一般不要高于20毫安;
每個雙芯片燈上允許通過的電流一般不高于40毫安;同理每個三芯片燈不要高于60毫安。
II.大功率LED常采用的是1W,其允許通過的最大電流為150毫安
d.流水燈基本程序
- *******************************************************************************************
- #include<reg52.h> //頭文件
- #define uint unsigned int //宏定義 可以看成用uint代替unsigned int
- #define uchar unsigned char//同上
- void delay(uint x) //毫秒級延時函數,延時時間為形參 x ms
- {
- uint i,j;
- for(i=x;i>0;i--)
- for(j=110;j>0;j--);
- }
- void main() //主函數
- {
- P1=0Xfe; //給LED賦初值,先點亮第一個LED,這里的P1是指和LED相連的I/O口
- while(1) //死循環語句
- {
- delay(500); //延時500ms;就是調用延時函數延時
- P1=(P1<<1)|(P1>>7);//左移一位與右移七位 |表示與運算
- }
- } //這個是流水燈的基本程序
- *******************************************************************************************
復制代碼- #include <reg52.h> //51頭文件
- #include <intrins.h>//包含循環右移函數_cror,右移函數_crol_頭文件
- #define uint unsigned int //宏定義
- void delay(uint z)//毫秒級延時函數
- {
- uint x,y;
- for(x = z; x > 0; x--)
- for(y = 120; y > 0 ; y--);
- }
- void main()//主函數
- {
-
- P2 = 0x7f; //賦值給P2,點亮LED8
- while(1)//死循環
- {
- P2= _cror_(P2,1);//循環右移,LED從左至右點亮
- delay(1000);
- }
- }
復制代碼
*******************************************************************************************
- #include <reg52.h>
- unsigned char LED_STATE; //LED狀態值
- void LED_show();
- void LED_show()
- {
- if (LED_STATE>=7) //如果點亮的是LED7
- LED_STATE=0; //回到LED0
- else
- LED_STATE++; //否則點亮下一個LED
- P2=~(1<<LED_STATE);//LED狀態值變換為給P2口賦的值
- }
- void main()
- {
- unsigned int i; //延時變量
- LED_STATE=0; //賦初值
- while(1)
- { LED_show(); //LED狀態切換
- for(i=0;i<10000;i++); //延時
- }
- }
復制代碼
*******************************************************************************************
e.花樣流水燈
*******************************************************************************************
- #include<reg52.h> //頭文件
- #include<intrins.h> //包含循環右移函數_cror,右移函數_crol_頭文件
- #define uint unsigned int //宏定義
- void delay(uint n) //延時函數
- {
- while(n--);
- }
- void main() //主函數
- {
- a: P2=0xfe; //點亮第一個LED
- delay(15000);//延時
- while(1) //死循環
- {
- P2=P2<<1; //依次點亮所有LED
- delay(15000); //延時
- if(P2==0x00) //判斷LED全亮
- { P2=0x01; //熄滅一個
- delay(15000);//延時
- goto b;} //跳去b結構
- }
-
- b: while(1) //死循環
- {
- P2=_crol_(P2,1)+1; //依次熄滅LED,直至熄滅所有LED
- delay(15000); //延時
- if(P2==0xff) //判斷是否熄滅所有LED
- {delay(15000); //延時
- goto a;} //跳去a模塊,反復循環點亮、熄滅
- }
- }
復制代碼
---------------------------------------------
備注:goto語句也稱為無條件轉移語句,其一般格式如下:
goto 語句標號; 其中語句標號是按標識符規定書寫的符號, 放在某一語句行的前面,標號后加冒號(:)。
語句標號起標識語句的作用,與goto 語句配合使用。
C語言不限制程序中使用標號的次數,但各標號不得重名。
goto語句的語義是改變程序流向, 轉去執行語句標號所標識的語句。
goto語句通常與條件語句配合使用。可用來實現條件轉移, 構成循環,跳出循環體等功能。
在結構化程序設計中一般不主張使用goto語句, 以免造成程序流程的混亂,使理解和調試程序都產生困難。
*******************************************************************************************
- #include <reg52.h>
- unsigned char code seg[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0x00,0,0x55,0x55,0xaa,0xaa};
- //定義一個數組 儲存LED狀態量
- void delay(unsigned int cnt) //延時
- {
- while(--cnt);
- }
- void main() //主函數
- {
- unsigned char i; //循環變量
- while(1)
- {
- P2=0xFE; //第一個LED亮
- for(i=0;i<8;i++)
- {
- delay(10000);
- P2 <<=1; /*P2<<=1;是C的一種簡寫,當一個變量要得到和另外一個數和它本身發送計算時就用這種形式。
- 比如:x=x+1可以寫為 x+=1;x=x*1;可以寫為x*=1;同樣P2<<=1;即為P2 = P2<<1;
- 就是取出P2并行8個端口的數據之后向左移動一位,高位被移除,地位被0取代,再放入P2口的8個端口輸出。*/
- } //每循環一次,點亮一個LED,之前點亮的LED不熄滅,LED從左向右逐個點亮
- P2=0x7F; //第八個LED亮,LED7
- for(i=0;i<8;i++)
- {
- delay(10000);
- P2 >>=1; //同上,是C的一種簡寫,為P2 = P2>>1;
- } //每循環一次,點亮一個LED,之前點亮的LED不熄滅,LED從右向左逐個點亮
- P2=0xFE; //第一個LED亮
- for(i=0;i<8;i++)
- {
- delay(10000);
- P2 <<=1; //同上,是C的一種簡寫,為P2 = P2<<1;
- P2 |=0x01; //熄滅第一個LED,其余全亮,通過上一條語句,以此從左向右熄滅
- }
- P2=0x7F; //第八個LED亮,LED7
- for(i=0;i<8;i++)
- {
- delay(10000);
- P2 >>=1; //同上,是C的一種簡寫,為P2 = P2>>1;
- P2 |=0x80; //熄滅第八個LED,其余全亮,通過上一條語句,以此從右向左熄滅
- }
-
- for(i=0;i<16;i++)//循環16次
- {
- delay(20000);//延時
- P2=seg[i]; //讀取數組中的數值
- }
- }
- }
復制代碼
*******************************************************************************************
f.指針型流水燈
*******************************************************************************************
- #include <reg52.h> //頭文件
- #define uchar unsigned char //宏定義
- #define uint unsigned int //宏定義
- uchar code table[]={0x01,0x02,0x04,0x08,
- 0x10,0x20,0x40,0x80,
- 0xfe,0xfd,0xfb,0xf7,
- 0xef,0xdf,0xbf,0x7f};//儲存數據
-
- uchar *p; //定義一個數組
- uchar j; //判斷變量
- uint i; //延時變量
- void main(void)
- {
- p = table;// 將數組的首個元素賦值給指針變量p
- j = 0;//初始化
- while(1) //死循環
- {
- if(j==15) //如果j等于15
- j=0;//則j=0
- else //否則j加1
- j++;
- P2 = *(p+j);//+j表示依次對數組內元素取值
- for(i=0;i<10000;i++); //延時
- }
- }
復制代碼
*******************************************************************************************
g.霖峰--流水燈
*******************************************************************************************
- #include <reg52.h> //頭文件
- #define uchar unsigned char
- void delay(uint x) //毫秒級延時函數,延時時間為形參 x ms
- {
- uint i,j;
- for(i=x;i>0;i--)
- for(j=110;j>0;j--);
- }
- void main()//主函數
- {
- uchar k,i;
- while(1)
- {
- k=0xfe;//11111110 //點亮第一個LED
- for(i=0;i<8;i++)
- {
- P2=k;
- delay(1000);
- k=k<<1; //11111100
- k=k|0x01;//00000001 流水燈
- //11111101
- //11111010
- //00000001
- //11111011
- }
- }
- }
復制代碼
*******************************************************************************************
h.8*8LED點陣驅動 |
-
-
一.pdf
2018-7-31 20:24 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
109.45 KB, 下載次數: 7, 下載積分: 黑幣 -5
流水燈總結
評分
-
查看全部評分
|