今天分享一個89c51製作的8位流水燈案例。使用Proteus模擬。同上一遍文章不同。上一篇文章中對於GPIO操作主要是位操作,即sbit led1=P0^0;其中P0^0代表p0.0這個引腳,然後在這樣位定義以後就可以對led1這個變數進行賦值操作,控制led燈的亮滅閃爍。今天要分享的是一次性對P... ...
今天分享一個89c51製作的8位流水燈案例。使用Proteus模擬。
同上一遍文章不同。上一篇文章中對於GPIO操作主要是位操作,即sbit led1=P0^0;其中P0^0代表p0.0這個引腳,然後在這樣位定義以後就可以對led1這個變數進行賦值操作,控制led燈的亮滅閃爍。今天要分享的是一次性對P1.0-P1.7進行操作。
89c51單片機是以51為內核的8位處理器,可以很方便的實現8位數據的操作。
所使用的電路原理圖如下:
使用200Ohm的電阻進行限流,LED燈採用陰極接法,即LED燈的陰極接到單片機的IO口;
本次案例流水燈共有以下幾種模式:
1):D1-D2-D3-D4-D5-D6-D7-D6-D5-D4-D3-D2-D1;順向,逆向間隔流水;
2):從D1-D7按照二進位的形式流水
3):順向移位流水:D1-D1,D2-D1,D2,D3-D1,D2,D3,D4-D1,D2,D3,D4,D5-D1,D2,D3,D4,D5,D6-D1,D2,D3,D4,D5,D6,D7;
4):逆向移位流水:D7-D7,D6-D7,D6,D5-D7,D6,D5,D4-D7,D6,D5,D4,D3-D7,D6,D5,D4,D3,D2-D7,D6,D5,D4,D3,D2,D1;
源代碼如下:
其中
led_Mod:流水模式選擇參數可以設置為1-5;
uDelay_ms:每一次切換之間的間隔時間;
void LED_Display(uint16 led_Mod,uint32 uDelay_ms)
{
int i=0;
uint32 cnt=0;
static int Mod;
Mod=led_Mod;
switch(Mod)
{
case 1://第一種模式:正向流水
{
for(;i<=7;i++)
{
if(i>=8)
{
i=0;
break;
}
Led=~led_Moud[i];
delay(uDelay_ms);
}
break;
}
case 2://第二種模式:逆向流水
{
for(;i<=7;i++)
{
if(i>=8)
{
i=0;
break;
}
Led=~led_Moud[7-i];
delay(uDelay_ms);
}
break;
}
case 3://第三種模式:二進位移位
{
for(i=0xff;i>=0x00;i--)
{
if(i==0)
{
i=0;
break;
}
Led=i;
delay(uDelay_ms);
}
break;
}
case 4://第四種模式:移位模式(不尋數組)順向
{
for(;i<=7;i++)
{
if(i>=8)
{
i=0;
break;
}
Led = (0xfe<< i); //Led 等於 0xfe 左移 i 位,控制 8 個 LED
delay(uDelay_ms);
}
Led=0xff;
break;
}
case 5://第五種模式:移位模式(不尋數組)逆向
{
for(;i<=7;i++)
{
if(i>=8)
{
i=0;
break;
}
Led = (0x7f>>i); //Led 等於 0xfe 左移 i 位,控制 8 個 LED
delay(uDelay_ms);
}
Led=0xff;
break;
}
default:break;
}
}
順向流水的數組定義如下:
const uchar code led_Moud[]=
{
0X01, 0X02, 0X04, 0X08, 0X10, 0X20, 0X40, 0X80//Module1
};
delay函數的定義:
請查看第一遍博客;http://www.cnblogs.com/Mr-Wangblogs/p/8890788.html
主函數的設計如下:
對於顯示函數的聲明如下:
51_Include.h內如下:
具體編碼方式圖解:(本編碼方式是基於陽極接法,陰極的讀者可以自行編寫,遇到問題可以咨詢)
接下來簡單介紹一下C51數組定義的時候裡面涉及到的幾個關鍵字
首先C51數組定義如下:
const uchar code led_Moud[]=
{
0X01, 0X02, 0X04, 0X08, 0X10, 0X20, 0X40, 0X80//Module1
};
const:
作用主要有以下幾點:
(1)可以定義const常量,具有不可變性。
(2)便於進行類型檢查,使編譯器對處理內容有更多瞭解,消除了一些隱患。
(3)可以避免意義模糊的數字出現,同樣可以很方便地進行參數的調整和修改。
(4)可以保護被修飾的東西,防止意外的修改,增強程式的健壯性。
(5) 可以節省空間,避免不必要的記憶體分配。
(6)提高了效率
以上內容來自網路
我們在C51中使用這個關鍵字一般都是在定義數組是使用。在製作字型檔,編碼時使用,主要目的時為了減少51資源的浪費以及不允許修改他所修飾的數組內容。
code:
C51的關鍵字,不是C語言的關鍵字。Code的意思是代碼區,也就是說我們這樣定義的時候就將這個數組放到了單片機的代碼區,可以減少檢索時間。
對於以上內容有疑問請及時聯繫我,我會儘快回覆,歡迎一起交流和學習。