天天看點

c51單片機數位管的控制

電路圖

c51單片機數位管的控制

注:實際中,我單片機的74HC573電路接法與P0端接反了

138譯碼器資料:https://pan.baidu.com/s/1COTcutsnMxMSc8tq0M2yVw 密碼:1jww

138譯碼器的真值表:

c51單片機數位管的控制

74HC573資料:https://pan.baidu.com/s/1b5OJXniyd6gODyf_eA_sXA 密碼:m7zx

如果學過數電,上面可以簡單看下。如果沒有,建議學過數電後再接觸單片機,也可以直接看下面。

過程

  一、  首先,得知道如何正确點亮一個數位管(靜态顯示)。

    數位管内部由七個條形發光二極管和一個小圓點發光二極管組成,根據各管的亮暗組合成字元。常見數位管有10跟管腳。其中有兩個公共端,根據内部發光二極管的接線形式可分為共陰極和共陽極兩種。使用時,共陰極數位管公共端接地,共陽極數位管公共端接電源。參照下圖:

c51單片機數位管的控制

        通過給每個管腳高低電平即可控制數位管的亮滅。還是舉個例子吧,以共陰極數位管為例,讓數位管顯示數字0,隻要abcdef六個管腳輸入一個高電平即可讓數位管顯示數字0,此時用十六進制即為0011 1111(dp、g、f、e、d、c、b、a)0x3f。将上面的0x3f送入74HC573鎖存器,鎖存器再送到數位管,即點亮數位管。(來自:https://blog.csdn.net/fanyuqa/article/details/47395333)。本次使用的是共陰極。

   二、 上面知道如何點亮一個數位管。下面接着介紹,點亮8個數位管中的哪一個。

    這就要用到138譯碼器。其中,G1=vcc,G2A=G2B=0,買來的電路已經預設接好。上面的電路中,ABC分别P22,P23,P24;

如果,P22=0,P23=0,P24=1(0代表低電平,1代表高電平),即001,對應真值表為4。即第4序号的數位管被選中。

    會了選中點亮某個數位管,就可以開始寫程式了。

#include "reg52.h"			 
typedef unsigned int uint;	  
typedef unsigned char uchar;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

uchar code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
					0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值

void main()
{	
	LSA=0;
	LSB=0;
	LSC=0;	
	P0=smgduan[0];
}
           

程式比較簡單,有兩個地方要注意。

1、不能直接令P2^2=0;

2、code+數組後,數組不能改變。https://zhidao.baidu.com/question/121263820.html

這裡有個靜态數位管的視訊,講的挺好:https://pan.baidu.com/s/1I7Gz55NCO_yqopAWOr07QA 密碼:3p7r

    3、動态數位管,在靜态數位管的基礎上,隻是每次讓不同的數位管被點亮。當間隔時間很短時,人眼睛分辨不出來,就會感覺同時在亮。

#include<reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
uchar out[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void delay(uint num)
{
	while(num--);	
}

void display()
{
	u8 i;
	for(i=0;i<8;i++)
	{
		switch(i)	 //位選,選擇點亮的數位管,
		{
			case(0):
				LSA=0;LSB=0;LSC=0; break;//顯示第0位
			case(1):
				LSA=1;LSB=0;LSC=0; 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位	
		}
		P0=out[i];//發送段碼
		delay(100); //間隔一段時間掃描	
		P0=0x00;//消隐
	}
}

void main()
{	
	while(1)
	{	
		display();  	
	}		
}
           

動态數位管視訊教程: https://pan.baidu.com/s/1fLopEJvdCpouLziTaSWxmg 密碼:7szd

繼續閱讀