51單片機學習 數碼管 倒計時
簡介
1.硬件部分
普中單片機 開發板 (138譯碼器控制)數碼管
2.軟件部分
keil軟件
硬件部分
138譯碼器
簡介
74LS138 為3 線-8線譯碼器,共有 54LS138和 74LS138 兩種線路結構型式。54LS138為軍用,74LS138為民用。
工作原理
①當一個選通端(E1)為高電平,另兩個選通端()和()為低電平時,可將地址端(A0、A1、A2)的二進制編碼在Y0至Y7對應的輸出端以低電平譯出。(即輸出為Y0至Y7的非)比如:A2A1A0=110時,則Y6輸出端輸出低電平信號。
②利用 E1、E2和E3可級聯擴展成 24 線譯碼器;若外接一個反相器還可級聯擴展成 32 線譯碼器。
③若將選通端中的一個作為數據輸入端時,74LS138還可作數據分配器。
④可用在8086的譯碼電路中,擴展內存。
真值表
引腳功能
應用
74LS138可以組成三變量輸入,四變量輸入的任意組合邏輯電路。
(1)用一塊3線-8線譯碼器74LS138可以組成任何一個三變量輸入的邏輯函數,任意一個輸入三變量的邏輯函數都可以用一塊3線-8線譯碼器74LS138來實現。因為任意一個組合邏輯表達式都可以寫成標准與或式的形式,即最小項之和的形式,而·塊3線-8線譯碼器74LS138的輸出正好是二變量最小項的全部體現。
(2)二塊3線-8線譯碼器74LS138可以組成任何一個四變量輸入的邏輯函數。
常見的一些編碼器、譯碼器如(74LS138)都只是三位或四位二進制的編碼譯碼,只能滿足一些簡單電子電路的需求,對於復雜電子電路就無能為力了。
中規模集成電路74LS138的工作原理十分簡單,根據輸出表達式,從中可以看出譯碼器74LS138是一個完全譯碼器,涵蓋了所有三變量輸入的最小項,這個特性正是它組成任意一個組合邏輯電路的基礎。74ls138還有另一重要應用,可以組成數據分配器。其實在電路在家用電器、自動化控制等方面都有重要的應用。
軟件部分
//基於普中單片機138譯碼器數碼管實驗
#include "reg51.h" //此文件中定義了單片機的一些特殊功能寄存器
typedef unsigned int u16; //對數據類型進行聲明定義
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit led=P2^2;
sbit beez=P1^5;
u16 flag=60,q,w,i,num=0,qwe=0;
double code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值
void delay(u16 i)//us軟件延遲
{
while(i--);
}
void DigDisplay()
{
u8 i;
for(i=0;i<2;i++)
{
switch(i) //位選,選擇點亮的數碼管,
{
case(0):
LSA=0;LSB=0;LSC=0; P0=smgduan[0]; break;//顯示第0位
case(1):
LSA=1;LSB=0;LSC=0; P0=smgduan[6]; break;//顯示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//顯示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//顯示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//顯示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//顯示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//顯示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//顯示第7位
}
delay(100); //間隔一段時間掃描
P0=0x00;//消隱
}
}
void time() interrupt 1
{
TH0=(65535-45872)/256;
TL0=(65536-45872)%256;
num++;
if(num==20)
{
num=0;
flag--;
q = flag%10;
w = flag/10%10;
}
}
void main()
{
TMOD=0x01;
TH0=(65535-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
for(i=0;i<2;i++)
switch(i) //位選,選擇點亮的數碼管,
{
case(0):
LSA=0;LSB=0;LSC=0; P0=smgduan[w]; break;//顯示第0位
case(1):
LSA=1;LSB=0;LSC=0; P0=smgduan[q]; break;//顯示第1位
}
}
}
關於顯示數字的處理(簡單處理,可能有錯誤,畢竟小白)
一維數組表示數字,
取萬位,就要/10000%10,主要看前面的數字取什么位
取個位,就要/1%10 //number%10 = number/1%10
LightBuf[0]= DuanMa[num%10]; //取個位/ number%1/10
LightBuf[1]= DuanMa[num/10%10];//取十位 number%10/10
LightBuf[2]= DuanMa[num/100%10];//取百位 number%100/10
LightBuf[3]= DuanMa[num/1000%10];//取千位 number%1000/10
參考資料
1.百度百科https://baike.baidu.com/item/74LS138/7761037?fr=aladdin
2. 普中單片機論壇http://prechin.net/