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