51單片機學習 數碼管 倒計時


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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM