日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

第四課 多排 LED與LED點陣《中學(xué)生C51單片機易學(xué)實戰(zhàn)入門教程》

 岐岐feng 2018-03-26
  • 實驗準(zhǔn)備

  • 課程內(nèi)容

第四課 多排 LED與LED點陣

實驗準(zhǔn)備:使用前一課已裝配好的實驗板

LED 增加8只

電阻 10k,增加8只

LED點陣 8x8

(或直接使用完整的開發(fā)板)

課程內(nèi)容:

一、 同時控制兩排LED(16只LED)

要繼續(xù)增加控制LED數(shù)量,在P1的8個IO口用完的情況下,選擇P2接另外8只LED,然后程序稍做修改,直接加入對P2的控制即可。

一般情況下,在啟動KEIL軟件之前,從之前的工程中復(fù)制一份出來修改使用,這有兩個好處,一是保留前面的實驗成果,二是無需再花時間輸入相同的內(nèi)容,復(fù)制后只須修改小小即可,省時省力。復(fù)制與粘貼這兩個操作一定要熟練掌握。

例如,把之前的工程myled1 整個文件夾復(fù)制一份為myled2,只需在KEIL中打開這文件夾中的工程即可省去建新工程與設(shè)置的步驟。

以第三課其中一段程序修改來實驗。(僅主程序main(0中增加 P2=~P2;)

#include 'reg52.h'

#define uint unsigned int

#define uchar unsigned char

sbit P10= P1^0;

void mDelay(uint Delay)

{

uint i;

for(;Delay>0;Delay--)

for(i=0;i<>

}

void main()

{

P1=~P1;

P2=~P2;

mDelay(1000);

}

同樣,可參照第三課內(nèi)容對第2排LED做花樣控制,此處可自由實驗下。

二、 LED點陣

89C52單片機只有P0、P1、 P2、P3、P4四個IO組,如果超過32只LED,那么就不好控制了,例如這里的8x8點陣,里面有64只LED。

第四課 多排 LED與LED點陣《中學(xué)生C51單片機易學(xué)實戰(zhàn)入門教程》

分析這LED點陣結(jié)構(gòu),可以見到,每只LED分別由橫向一線與縱向一條控制,當(dāng)LED對應(yīng)橫線設(shè)置信號 1(即5V電壓),同時這只LED縱向的線設(shè)置信號0(即0V電壓),這只LED就會發(fā)光。于是只需兩組IO即可控制LED點陣。

先做個小實驗,把LED點陣兩排腳分別接P1與,修改前面的程序main()部分內(nèi)容,如下:

void main()

{

P1=0xFF; //控制橫向線電壓,提供5V電壓

P2=0xAA; //控制縱向線電壓,產(chǎn)生顯示效果

mDelay(1000);

}

編譯,下載,可以見到LED點陣以行間隔方式點亮了(如果沒有點亮,把P1、P2對調(diào)一下)。

再做下小改,如下:

void main()

{

P1=0xFF; //控制橫向線電壓,提供5V電壓

P2=0xDB; //控制縱向線電壓,產(chǎn)生顯示效果

mDelay(1000);

}

編譯,下載,可以見到LED點陣中間的某些點被控制點亮。

那么,如果想顯示自己想要顯示的指定的內(nèi)容呢,例如顯示數(shù)字,中文等,這就要逐行逐點來計算哪點位置給個0,哪點位置給個1,計算量特大了。

不過,單片機開發(fā)的前輩早就編起了一段代碼,我們直接復(fù)制過來即可使用,當(dāng)然想深層次學(xué)習(xí),可以仔細(xì)研究。這里是易學(xué)教程,我們不用深究。

其實,生產(chǎn)或銷售單片機零件模塊的商家一般都會附送模塊的資料和單片例程,這方便極了,我們只需要學(xué)會調(diào)用即可。例程如下:

#include 'reg52.h'

#define uchar unsigned char

#define uint unsigned int

//以下兩大段數(shù)據(jù)稱為數(shù)組

//數(shù)組row中有8個數(shù),控制LED點陣高電平管腳 ,控制LED橫向線電壓

uchar code row[] ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

//二維掃描數(shù)組,不同的顯示內(nèi)容,只需取出對應(yīng)的一組數(shù),控制LED縱向線

uchar code word[][8]={

{0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00}, //0

{0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00}, //1

{0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00}, //2

{0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00}, //3

{0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00}, //4

{0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00}, //5

{0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00}, //6

{0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00}, //7

{0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00}, //8

{0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00}, //9

{0x00,0x00,0x7F,0x48,0x48,0x30,0x00,0x00}, //P

{0x00,0x00,0x7F,0x48,0x4C,0x73,0x00,0x00}, //R

{0x00,0x00,0x7F,0x49,0x49,0x49,0x00,0x00}, //E

{0x00,0x00,0x3E,0x41,0x41,0x62,0x00,0x00}, //C

{0x00,0x00,0x7F,0x08,0x08,0x7F,0x00,0x00}, //H

{0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00}, //I

{0x00,0x7F,0x10,0x08,0x04,0x7F,0x00,0x00}, //N

{0x7C,0x48,0x48,0xFF,0x48,0x48,0x7C,0x00} //中

};

void mDelay(uint Delay)

{

uint i;

for(;Delay>0;Delay--)

for(i=0;i<>

}

void display(uchar word_num)

{ //參數(shù) word_num 就是要顯示的排在數(shù)組第幾位置的顯示內(nèi)容

uchar i;

for(i=0;i<>

{

P2 = row[i]; //取出對應(yīng)的行掃描控制信號

P0=word[word_num][i]; //取出對應(yīng)的列掃描控制信號,顯示內(nèi)容

mDelay(1); //延時1毫秒(1秒=1000毫秒)

P2=0xff;

P0=0xff;

}

}

void main()

{

display(3); // 如此簡單調(diào)用即可

}

從主程序 main()中可以看到,使用方法實在太簡單了,就一個display()函數(shù),只需換下括號中的顯示參數(shù)即可。

現(xiàn)在可以實踐下了,可以試下找LED點陣廠家配套的例程,或者上網(wǎng)搜索同類例程,或者直接就復(fù)制這一課教程中的代碼,復(fù)制到自己的程序中,只要自己明白自己所調(diào)的模塊實現(xiàn)什么效果,那么這個程序就變成你自己的程序了。

對于其他的模塊也是類似,例如以后學(xué)習(xí)的模塊:4段數(shù)碼管,8路獨立鍵盤,4x4矩陣鍵盤,Lcd1602,12864液晶屏,蜂鳴器模塊,5軸步進電機模塊,超聲波模塊,哨聲模塊,光線控制模塊,DS18B02溫度模塊,VS838紅外接收模塊與7x3紅外搖控器,繼電器控制模塊,帶電池的DS1302實時時鐘模塊,支持SPI的各種模塊,如液晶屏模塊,SD卡模塊,攝像頭模塊,MP3模塊,F(xiàn)M收音機模塊, … …

所以,學(xué)習(xí)C51單片機應(yīng)用并不難,關(guān)鍵就是學(xué)會『拿』過來用,即是復(fù)制與粘貼相關(guān)代碼。

三、 程序優(yōu)化

從前面的程序中看到,程序一大段代碼,其中實現(xiàn)的功能可以讓人重復(fù)使用。另外,從一些模塊廠家提供的例程中,有些例程的部分代碼是放入一個.h 的文件中。而讓主程序部分簡潔明了。

這個 . h文件稱為 『頭文件』,我們把可把常用的功能搬到頭文件件,這頭文件也可以復(fù)制給其他程序中,讓其他程序受益。

示例,建立頭文件 function.h 并化優(yōu)程序。

頭文件function.h內(nèi)容:(注意保存時,要輸入完整文件名function.h)

#include 'reg52.h'

#define uchar unsigned char

#define uint unsigned int

//以下兩大段數(shù)據(jù)稱為數(shù)組

//數(shù)組row中有8個數(shù),控制LED點陣高電平管腳 ,控制LED橫向線電壓

uchar code row[] ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

//二維掃描數(shù)組,不同的顯示內(nèi)容,只需取出對應(yīng)的一組數(shù),控制LED縱向線

uchar code word[][8]={

{0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00}, //0

{0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00}, //1

{0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00}, //2

{0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00}, //3

{0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00}, //4

{0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00}, //5

{0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00}, //6

{0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00}, //7

{0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00}, //8

{0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00}, //9

{0x00,0x00,0x7F,0x48,0x48,0x30,0x00,0x00}, //P

{0x00,0x00,0x7F,0x48,0x4C,0x73,0x00,0x00}, //R

{0x00,0x00,0x7F,0x49,0x49,0x49,0x00,0x00}, //E

{0x00,0x00,0x3E,0x41,0x41,0x62,0x00,0x00}, //C

{0x00,0x00,0x7F,0x08,0x08,0x7F,0x00,0x00}, //H

{0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00}, //I

{0x00,0x7F,0x10,0x08,0x04,0x7F,0x00,0x00}, //N

{0x7C,0x48,0x48,0xFF,0x48,0x48,0x7C,0x00} //中

};

void mDelay(uint Delay)

{

uint i;

for(;Delay>0;Delay--)

for(i=0;i<>

}

void display(uchar word_num)

{ //參數(shù) word_num 就是要顯示的排在數(shù)組第幾位置的顯示內(nèi)容

uchar i;

for(i=0;i<>

{

P2 = row[i]; //取出對應(yīng)的行掃描控制信號

P0=word[word_num][i]; //取出對應(yīng)的列掃描控制信號,顯示內(nèi)容

mDelay(1); //延時1毫秒(1秒=1000毫秒)

P2=0xff;

P0=0xff;

}

}

也就是說把幾行常用的預(yù)定義#define命令,延時函數(shù),顯示函數(shù),點陣數(shù)據(jù)全部放入頭文件中,這樣一來,主程序 就簡單了,如下:

#include “function.h”

void main()

{

display(3); // 如此簡單調(diào)用即可

}

也就是用一個命令#include 命令,把頭文件 function.h 包括進來了

以后的學(xué)習(xí)也基本采用這種程序結(jié)構(gòu),模塊功能放頭文件function.h中,主程序更專注于自己要實現(xiàn)的功能。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多