利用74LS373對 LED 和數碼管分別進行控制,數碼管顯示所亮 LED 的位置

  利用單片機 AT89C51 的 I/O 口,對 LED 和數碼管分別進行控制。以實現 LED燈做流水運動,數碼管顯示所亮 LED 的位置。

使用74LS373可以節省I/O口

74LS373簡介:
  74LS373是三態輸出的八D鎖存器,共有54S373和74LS373兩種線路。373 的輸出端 Q0~Q7 可直接與總線相連。當鎖存允許端LE爲高電平時,Q 隨數據D而變,當LE爲低電平時,D 被鎖存在已建立的數據電平。
在這裏插入圖片描述

電路原理圖:

在這裏插入圖片描述

代碼如下:

#include"reg51.h"
#define LED P1
#define SM P0
typedef unsigned int u16;	  //對數據類型進行聲明定義
typedef unsigned char u8;

sbit P25=P2^5;
sbit P26=P2^6;
sbit P27=P2^7;
u8 i,coun=0;
void InitTimer0(void);
//共陰極數碼管數字顯示錶
unsigned char tab[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};
// 對應顯示           1    2    3    4    5    6    7    8  
//數碼管選擇
unsigned char XZ[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void delay(u16 i)
{
	while(i--);	
}

void main()
{
	InitTimer0();
	LED=0xfe;
	//delay(50000); //延時
	P25=1;
	P26=1; //數碼管讀取工作
	P27=0; //數碼管選擇關閉
	while(1)
	{	
		for(i=0;i<8;i++)
		{
			P1=~(0x01<<i);//將1右移i位,然後將結果取反賦值到P1
			delay(50000); //延時  50000 450ms
		}	
	}
}
void InitTimer0(void)
{
    TMOD = 0x01; //T0計時器,方式一
    TH0 = 0x50;//定時45ms
    TL0 = 0x38;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}

void Timer0Interrupt(void) interrupt 1
{
    TH0 = 0x50;//定時45ms
    TL0 = 0x38;
		P26=1; 
		P27=0; 
		SM=tab[i]; //數碼管讀取賦值
		P26=0;  //數碼管讀取鎖存
		SM=0xff; //消影
		P27=1; //數碼管選擇工作
		SM = XZ[i]; //選擇數碼管
		P27=0; //數碼管選擇停止
		SM=tab[i];
}

效果截圖:

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章