[STC MCU学習]レッスン7:シングルチップマイクロコンピューター制御静的/動的デジタルチューブ

【朱さんのコース概要侵入】


最初の部分、章リスト

1.7.1。デジタルチューブとは

1.7.2。静的デジタルチューブの予備駆動

1.7.3。静的デジタルチューブ表示番号

1.7.4。デジタルチューブに0からfを順番に表示させます

1.7.5。ダイナミックデジタルチューブ

1.7.6.38デコーダーの紹介

1.7.7。ダイナミックデジタルチューブディスプレイプログラミング実際の戦闘1

1.7.8。ダイナミックデジタルチューブディスプレイプログラミング実際の戦闘2


パート2、教室の記録


1.7.1。デジタルチューブとは


1.7.1.1。いくつかの側面
デジタルチューブ(1)の外観を見てください

デジタルチューブ画像の結果


(2)機能:ニクシーチューブは数字を表示するため使用される表示装置です:産業の機会でより多く使用されます!
(3)分類:単一(1桁)、行(2桁、4桁、8桁)


1.7.1.2。動作原理
(1)ライトオフの原理(実際には内部照明LED)

デジタルチューブには8つのLEDがあります。


(2)数字(またはテキスト)を表示する原理:内部LEDのオンとオフを使用して、数字を構成する外部ストロークを表示するかどうかを指定します。人々が見るのは異なる数字です。照明とよく似ています!たとえば、次のようになります。ディスプレイ2、8

デジタルチューブ画像の結果

1.7.1.3、共通アノードと共通カソードデジタルチューブ
(1)駆動方法の違い

ニクシーチューブ内の8つのLEDが独立して駆動されることは明らかでなければなりません8個のLEDの正極がVCCに接続されている場合(負極がマイクロプロセッサの異なるピンに接続されている場合)、この接続は共通アノードと呼ばれます(前のレッスンのLEDライト)。逆に、8個のLEDの負の電極を一緒に接続してからGNDに接続する(正の電極をそれぞれマイクロプロセッサの異なるピンに接続する)場合、それは共通カソードと呼ばれます。どちらの接続方法でもデジタルチューブディスプレイを駆動できますが、表示に使用するMCUプログラムが異なります(アノードが共通の場合はMCU 0がオンになり、カソードが共通の場合はMCUの1がオンになります)。


(2)駆動電流需要の違い

デジタルチューブ(実際にはLED)が共通アノードに従って接続されている場合、マイクロプロセッサはディスプレイを直接駆動できます。共通カソードが接続されている場合、マイクロコンピュータのIOポートから供給される電流がデジタルチューブ内のLEDディスプレイを駆動するのに十分でないため、マイクロコンピュータを直接駆動することはできません。解決する大電流ドライブチップを提供する回路。古いバージョンの概略図74HC573を参照してください)。


1.7.1.4。静的および動的デジタルチューブ:実際、それらはすべて同じであり、すべてデジタルチューブです!表示方法が違います!
(1)使用の違い 

スタティックフェイスセパレートデジタルチューブ、ダイナミックロー!
(2)回路接続の違い


1.7.2。静的デジタルチューブの予備駆動


1.7.2.1。概略図分析
1.7.2.2。配線
(1)結論:マイクロプロセッサのP0ポートは、共通アノードデジタルチューブのカソードに直接接続されています。したがって、マイクロコンピュータが0を出力すると、ニクシーチューブはオンになり、1を出力すると、ニクシーチューブはオフになります。実験検証結果はOKです。


1.7.2.3。プログラミング照明は小さなライトと同じです
(1)P0 = 0x0; 8つのセグメントがすべてオン
(2)P0 = 0xff; 8つのセグメントがすべてオフ
(3)P0 = 0x0f; 4つのセグメントがオンで4つのセグメントがオフ
(4)P0 = 0xfe ;

1.7.2.4。概略図のデジタルチューブのセグメント番号が正しいことを確認します
(1)デジタルチューブの8つのセグメントは実際には8つのLEDであり、IOポートP0(P0.0、P0.1····P0)の8つのピンに対応します。 .7)では、誰が誰に対応するのでしょうか。
  写真を見てください
(2)理論的には、概略図と配線方法を分析して、この対応(デジタルチューブのセグメントコード)を推測することができますエラーが発生しやすい
(3)実際の戦闘では、通常、テストする独自のコードを記述します。
    P0 = 0xfe; // 11111110P0.0出力0実際の測定値はニクシーチューブaセグメントに対応
    P0 = 0xfd; // 11111101P0.1出力0実際の測定値はbセグメントに対応
    P0 = 0xfb; // 11111011P0.2出力0実際の測定値はcセグメントに対応
    P0 = 0xf7; // 11110111P0.3出力0セグメントdに対応する実際の測定値
    P0 = 0xef; // 11101111P0.4出力0eセグメントに対応する実際の測定値
    P0 = 0xdf; // 11011111P0.5出力0fセグメントに対応する実際の測定値
    P0 = 0xbf; // 10111111P0.6出力0実際の測定値はgセグメントに対応
    P0 = 0x7f; // 01111111P0.7出力0実際の測定値はdpセグメントに対応
    
注:P0ポートの8つのバイナリビットのうち、上位ビットはP0.7に対応し、下位ビットはP0.0に対応します。

1.7.2.5。思考:デジタルチューブはどのように数字を表示しますか?
(1)ニクシーチューブは番号を表示します。実際、ニクシーチューブは対応するセグメントを点灯します。実際には、IOポートの対応するピンを出力0(他のピンは出力1)にします。これは、実際には8ビットのバイナリ番号に対応します。
(2)結論は次のとおりです。P0ポートは適切なバイト数を出力し、デジタルチューブは対応する数を表示します。各番号には対応する8ビットのバイナリ番号があります。重要なのは8ビットのバイナリ番号を取得することです。
例:「A」を取得するには、dセグメントとdpセグメントがオフである限り、つまり、0x88 // 10001000


1.7.3。静的デジタルチューブ表示番号


1.7.3.1。デジタルコード(セグメントコード)の取得は
、番号を表示する場合、番号を表示するために必要なセグメントを知る必要があることを意味します。したがって、次の表は、さまざまな番号に対応するさまざまなデジタルチューブLEDライトの照明です。接続されているMCUのIOポートが出力するセグメントコードの2進数と16進数。

要显示的数字  数码管亮的LED                段码二进制   十六进制
0               abcdef                  11000000    0xC0
1               bc                      11111001    0xf9
2               abdeg                   10100100    0xA4
3               abcdgh                  10110000    0xb0
4               bcfg                    10011001    0x99
5               acdfg                   10010010    0x92
6               acdefg                  10000010    0x82
7               abc                     11111000    0xf8
8               abcdefg                 10000000    0x80    
9               abcdfg                  10010000    0x90
A               abcefg                  10001000    0x88
b               cdefg                   10000011    0x83
C               adef                    11000110    0xc6
d               bcdeg                   10100001    0xA1
E               adefg                   10000110    0x86
F               aefg                    10001110    0x8e


1.7.3.2、プログラミング検証

ディスプレイをいくつか選んでください〜

P0ポートを使用してデジタルチューブピン(J8)を接続し、新しいプロジェクトを作成します。次のコードは、静的デジタルチューブ表示番号0を実現できます。

#include <reg51.h>


void main(void)
{
    while(1)
    {
        P0 = 0xC0;
    }
}

現象:

1.7.3.3。結論
(1)異なるデジタルコード(セグメントコード)テーブルは完全に異なる可能性があります
(2)異なるコードテーブルは同じデジタルチューブ配線モードで完全に異なる可能性があります
(3)ハードウェアが確認された後、デバッグによって実験を実行できます。コードテーブルを決定する

数字は変わり、方法は変わりません!


1.7.4。デジタルチューブに0からfを順番に表示させます


1.7.4.1。愚かな方法:分割された状態の
状態+遅延、コードは次のとおりです。

#include<reg52.h>

void delay(void)
{
	unsigned char i = 200;
	unsigned char j = 300;
	
	while(i--)
		while(j--);
}
void main()
{
		while(1)
		{

			P0 = 0xc0;		//0
			delay();
			
			P0 = 0xf9;		//1
			delay();
			
			P0 = 0xa4;		//2
			delay();
			
			P0 = 0xb0;		//3
			delay();
			
			P0 = 0x99;		//4
			delay();
			
			P0 = 0x92;		//5
			delay();
			
			P0 = 0x82;		//6
			delay();
			
			P0 = 0xf8;		//7
			delay();
			
			P0 = 0x80;		//8
			delay();
			
			P0 = 0x90;		//9
			delay();
			
			P0 = 0x88;		//A
			delay();
			
			P0 = 0x83;		//b
			delay();
			
			P0 = 0xc6;		//C
			delay();
			
			P0 = 0xa1;		//d
			delay();
			
			P0 = 0x86;		//E
			delay();
			
			P0 = 0x8e;		//F
			delay();	
		}
}


1.7.4.2。アップグレード方法:配列を使用

#include<reg52.h>

//利用数组来显示静态数码管数字
void delay(void)
{
	unsigned char i = 200;
	unsigned char j = 300;
	
	while(i--)
		while(j--);
}

void main()
{
		unsigned char val[16] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};
		unsigned char i = 0;
		
		while(1)
		{
				for(i = 0;i<16;i++)
				{
						P0 = val[i];
						delay();
				}
		}
}

次のクラスの前に、上記のコードを適応させるように自問してください。デジタルチューブに奇数番号ではなく偶数番号(0、2、4 ...)のみを表示させる
1.7.4.3。まとめ
(1)C言語のさまざまな機能がさまざまな場所で使用されているため、簡略化できます。プログラミング
(2)C言語配列は0から始まり、境界を越えないように注意してください。これは非常に重要です。


1.7.5。ダイナミックデジタルチューブ


1.7.5.1静的ニクシーチューブ駆動方法の欠点
(1)ドライブがシンプルで直接、プログラミングが簡単であるという利点
(2)各ニクシーチューブに1つのポートが必要であり、シングルチップマイクロコンピュータのポートが十分でないという欠点
解決策:ダイナミックモードを使用して複数のドライブを駆動するデジタルチューブ


1.7.5.2ダイナミックデジタルチューブとは何ですか?
(1)デジタルチューブまたは元のデジタルチューブ(共通アノードまたは共通カソードの両方)。次の図に示すように、デジタルチューブにはCOM(共通)端とセグメント端の2つの端があります。 :

これは一般的なカソードデジタルチューブです  


(2)セグメントコード(J6)の片側はまだMCUポートに接続されています


(3)COM(コモンポール)をシングルチップマイクロメータの1つのIOポートに接続し、複数のシリアルデジタルチューブのCOMをIOポートに接続します.1つのCOMは、スタティックとは異なり、VCC / GNDに直接接続されたコモンレベルです。
スタティックとダイナミックの分析と比較Nixieチューブは、本質的な違いは次のとおりであることを発見しました。静的デジタルチューブでは、セグメントコードが指定されている限り、デジタルチューブは機能する必要があり(表示はセグメントコードの終わりにのみ依存します)、動的Nixieチューブのセグメントコードの終わりはCOMの終わりが協調する必要があります。デジタルチューブを点灯します。

1.7.5.3。ダイナミックデジタルチューブはどのように機能しますか(私たちは一般的なカソードダイナミックデジタルチューブです)
(1)一定期間、デジタルチューブの列の1つのデジタルチューブのみが機能し、他のデジタルチューブは休止しています(機能していません)。注これを疑わないでください、後で説明します!
(2)COM端子は動作するデジタルチューブを選択しセグメント端子は表示するデジタルチューブのセグメントコードを出力します;遅延; COM端子は次に動作するデジタルチューブを選択し、セグメント端子はこのデジタルチューブを出力するように変更します番号のセグメントコード;遅延; COM端末が次に動作するデジタルチューブを選択します······
(3)動作中のデジタルチューブをすばやく切り替えると、すべてのデジタルチューブが明るいことがわかります(実際、輝度は静的ドライブよりも低い)。ビジョンの持続性

2つのポイントを確認します。
まず、マクロ内ですべてのデジタルチューブが同時にオンになっているため、すべてのデジタルチューブが同時に機能すると考えられ、複数のデジタルチューブを組み合わせて表示できます(たとえば、ディスプレイ12345678
。ニクシーチューブは順番に点灯します。異なるセグメントコードを異なるニクシーチューブに送信できるため、異なるニクシーチューブは異なる番号を表示できます。したがって、8本のデジタルチューブに相当するディスプレイは独立しています。


1.7.6.38デコーダーの概要

1.7.8.1 38デコーダーを導入する理由
(1)38デコーダーの役割:3つのIOポートを使用して8つの出力を制御します。

CBA     对应Yx(x:0-7) 
000        0
001        1
010        2
011        3
100        4
101        5
110        6
111        7

3位到8位的映射(编码)

出力は何ですか、最初のピンはローに引き下げられます!
(2)38デコーダーでデジタルチューブを駆動することの意義:38デコーダーを使用した後、38デコーダーの3つの入力を使用してデジタルチューブの8ビットコードを制御できるため、合計で3 +8しか必要ありません。 = 11IOピンは8本のダイナミックニクシーチューブを駆動できます。

38デコーダーのJ10ピンはダイナミックデジタルチューブのJ1に直接接続できます。
概略図:

物理マップ:
 


1.7.8.2、74LS138データシート
(1)は真実の表を理解することに焦点を当てています

 


(2)G1、G2A、G2Bはイネーブルピンです。
(3)ABCはエンコード端子、Y0〜Y7は出力端子です。


1.7.7。ダイナミックデジタルチューブディスプレイプログラミング実際の戦闘1

このセクションの目的:デジタルチューブのセグメントコードテーブルを取得する最初の実験
1.7.7.1配線
(1)配線の決定: P0はJ6に接続し、P2.0-P2.2は38デコーダーのABC端子に接続し、J10はJ1に接続します
(2) P2.2-P2.4:000 0番目のニクシーチューブがオン、001最初のニクシーチューブがオン...
(3)セグメントコードの終わりは、セグメントコードテーブルを取得するためにテストするさまざまな値を提供します

ステップ1:最初にP0.0-P0.7とabcdefgをテストします。これらはどのように対応していますか?
実験的テストの結論:P2.0--P2.2:000は最初のデジタルチューブ、111は8番目のデジタルチューブです!
                         P0.0はaに対応します(P0.1はbに対応します·····P0.7はdpに対応します)

显示      对应段           P0二进制        对应十六进制
0         abcdef           00111111         0x3f
1         bc               00000110         0x06
2         abdeg            01011011         0x5b
3         abcdg            01001111         0x4f
4         bcfg             01100110         0x66
5         acdfg            01101101         0x6d
6         acdefg           01111101         0x7d
7         abc              00000111         0x07
8         abcdefg          01111111         0x7f
9         abcdfg           01101111         0x6f
A         abcefg           01110111         0x77
b         cdefg            01111100         0x7c
C         adef             00111001         0x39
d         bcdeg            01011110         0x5e
E         adefg            01111001         0x79
F         aefg             01110001         0x71

セグメントコードテーブル:0x3f、0x06、0x5b、0x4f、0x66、0x6d、0x7d、0x07、0x7f、0x6f、0x77、0x7c、0x39、0x5e、0x79、0x71

1.7.7.2、

プログラミング前のsbit定義ビット変数(1) IOポートを直接操作するには、ポート名(P0、P1)を使用して、IOポートの8つのピン全体を操作できます。ただし、この方法では単一のIOポートを制御できません。
(2)現在、プログラミングにはIOピンの個別の操作が必要です。たとえば、P3.4を操作するには、P3.4を直接書き込むときにC言語が認識されず、sbitキーワードを使用してピンを定義する必要があります。ファーストクラスでも使用しました!
sbit SER = P3 ^ 4;

1.7.7.3、マクロ定義とtypedef
ucharの導入、u8

typedef unsigned char u8;

#define uchar unsigned char

 注:#defineとtypedefは、可能な限り前方に記述する必要があります。


1.7.8。ダイナミックデジタルチューブディスプレイプログラミングコンバット2

このセクションの目標:38デコーダーとダイナミックデジタルチューブを使用して、8つの接続されたデジタルチューブディスプレイを実現します12345678
(1)プログラミングのアイデア:最初に最初のデジタルチューブを選択し、次に1のセグメントコードをセグメントコードの最後に送信し、しばらく遅延します。次に、2番目のニクシーチューブを選択するように切り替えてから、セグメントコード2をセグメントコードの最後に送信し、しばらく遅延します。8番目のニクシーチューブが表示されるまではサイクルです。このサイクルは無限ループです。
注:遅延は適切である必要があります。目で検出できないだけでなく、すべてのデジタルチューブが同時にオンになっていることを確認することもできます。

実験的結論:
1。遅延時間が長すぎると、数値が点滅します。
2.時間を短縮した後、3つの問題があります。1つは光が十分に明るくないこと、2つ目は暗さが十分に暗くないこと、3つ目は数字(1)の1つが明らかに欠陥があることです。

理由:異なる番号のセグメントコードが重複しています!

解決策: 各デジタルチューブがオンになったら空白にして、次のチューブに切り替えます。
ブランキング:各ライトが終了すると、セグメントコードはすべて0になるため、すべてのセグメントがライトされるわけではありません。// P0 = 0x00;

プログラムの最初の改善点:セグメントコードを配列に入れて配列をチェックします。
2番目のステップの改善:COMオプションコードにスイッチケースを使用する

/**************************************************************************************
接线说明: 单片机-->动态数码管模块(具体接线图可见开发攻略对应实验的“实验现象”章节)
				J22-->J6
				P22-->J9(A)
				P23-->J9(B)
				P24-->J9(C)		
注意事项:																				  
***************************************************************************************/

#include "reg51.h"			

typedef unsigned char u8;

sbit LSA=P2^0;
sbit LSB=P2^1;
sbit LSC=P2^2;

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


void delay(unsigned char i)
{
	while(i--);	
}

/*******************************************************************************
* 函 数 名         : DigDisplay
* 函数功能		   : 数码管动态扫描函数,循环扫描8个数码管显示
*******************************************************************************/
void DigDisplay()
{
	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=smgduan[i];//发送段码
		delay(100); //间隔一段时间扫描	
		P0=0x00;//消隐
	}
}

void main()
{	
	while(1)
	{	
		DigDisplay();  //数码管显示函数	
	}		
}

このレッスンのプログラムダウンロードリンク:デジタルチューブ

このレッスンは終わりました!
 

おすすめ

転載: blog.csdn.net/qq_27148893/article/details/109441396