1. 程式人生 > >2.3.第八個實驗--使用38譯碼器驅動數碼管

2.3.第八個實驗--使用38譯碼器驅動數碼管

2.3.第八個實驗–使用38譯碼器驅動數碼管

實驗目的:使用38譯碼器來驅動數碼管來節省IO埠

預備知識:

(1)什麼是38譯碼器?
這裡寫圖片描述
38譯碼器有3個輸入埠A、B、C和8個輸出埠Y0-Y7。由輸入埠控制輸出埠的值

(2)為什麼要使用38譯碼器

這裡寫圖片描述

回想之前的驅動動態數碼管的時候,一個段碼埠控制顯示的數字,一個com埠控制哪個數碼管工作,段碼埠接8個IO引腳,com埠接8個IO引腳。這樣很浪費IO口資源,為了節省IO資源,使用38譯碼器接在com口,這樣可以使用3個輸入引腳控制8個com埠了。J15接到J16埠。
(3)為什麼3個輸入端可以控制8個輸出埠值?
3個輸入埠,每一個埠有兩種狀態(0或1),3個埠可以組成8中不同的狀態。
(4)3個輸入埠如何控制8個輸出埠?
根據74LS138晶片的資料手冊查詢38譯碼器晶片的譯碼錶即可。
這裡寫圖片描述


分析資料手冊可以得到:
(1)G1、G2*兩個埠是使能引腳,並且要想讓38譯碼器工作,G1接高電平,G2*接低電平。所以看上面38譯碼器的原理圖中G1接VCC,G2*接GND。
(2)當ABC三個輸入埠輸入不同的值時,Y0-Y7會對應的輸出低電平,回想動態數碼管是共陰數碼管,而38譯碼器Y0-Y7預設輸出高電平,這樣銜接的天衣無縫。

實驗分析:
第一步:八個數碼管陽極接一個IO埠,來負責輸出顯示的數字(也就是輸出對應的段碼)。
第二步:八個數碼管的com端分別接入38譯碼器的Y0-Y7引腳。由38譯碼器的ABC三個輸入端來控制數碼管的com埠從而達到控制哪個數碼管工作的目的。
第三步:根據原理圖接線,J15-J16、ABC分別接P1.0、P1.1、P1.2
第四步:測出數碼管的段碼和38譯碼器的譯碼錶。
第五步:程式設計。

實驗程式碼:

#include<reg51.h>

void delay(void)
{
    unsigned char i=0,j=0;
    for(i=0;i<100;i++);
        for(j=0;j<20;j++);
}

void main(void)
{
    /*  P0.0接到 A,P0.1接到B,P0.2接到C
        P0埠是段碼口,控制要顯示的數字
        P1埠是38譯碼器的埠,通過com端控制第幾個數碼管工作
    */

/*  測試38譯碼器的位碼
    c b a 
    000     Y0輸出低電平 第1個數碼管工作        對應十六進位制數0x1
    001     Y1輸出低電平 第2個數碼管工作        對應十六進位制數0x2
    010     Y2輸出低電平 第3個數碼管工作        對應十六進位制數0x3
    011     Y3輸出低電平 第4個數碼管工作        對應十六進位制數0x4
    100     Y4輸出低電平 第5個數碼管工作        對應十六進位制數0x5
    101     Y5輸出低電平 第6個數碼管工作        對應十六進位制數0x6
    110     Y6輸出低電平 第7個數碼管工作        對應十六進位制數0x7
    111     Y7輸出低電平 第8個數碼管工作        對應十六進位制數0x8

*/
unsigned char duanma[8]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f}; //段碼 unsigned char weima[8]={0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7}; //38譯碼器的位碼 unsigned char i=0; while(1) { for(i=0;i<=7;i++) { P1=weima[i]; //38譯碼器的位碼 P0=duanma[i]; //八個數碼管的段碼 delay(); P0=0; //消隱 } } }

實驗總結:
(1)使用38譯碼器就是為了節省IO口,如果IO口夠用可以不使用38譯碼器。
(2)動態數碼管的陽極接在P0這個IO埠上,控制數碼管顯示的數字,陰極接在38譯碼器的八個輸出引腳上Y0-Y7,Y0-Y7由38譯碼器的ABC三個輸入引腳控制。控制哪個數碼管工作。
(3)測試數碼管的段碼和38譯碼器的位碼。
(4)先分析原理圖看如何接線,再看38譯碼器的資料手冊看它怎麼工作。最後程式設計。
(5)著重實驗分析過程,而非知識本身,多總結學習方法。