# ステップバイステップ学習 5 マイクロコントローラー#割り込みとデジタルチューブダイナミックディスプレイ#not.5

1. C 言語配列の概念、定義、応用をマスターします。

1) 配列は変数のセットです。この変数のセットは次の 3 つの条件を満たす必要があります。

同じ配列型を持つ

同じ名前です

記憶の中で連続している

2) 宣言と初期化

配列型配列名[配列長]

配列型配列名[配列長] = {初期値リスト}

3) 使用と割り当ての現象に注意する

配列の添え字と配列要素の数の概念を区別する

配列要素の添字は定数、変数、または式にすることができ、初期化は定数である必要があります。

配列整数の割り当ては初期化中にのみ実行でき、プログラムは単一の要素のみを割り当てることができます。


2. if 文と switch 文の使い方と違いをマスターし、プログラミング時にどちらの文を使用するかを正しく選択できるようになります。

if ステートメントと switch ステートメントの最も詳細な概要: https://blog.csdn.net/2301_77479336/article/details/130087491?spm=1001.2014.3001.5501


3. 割り込みの原理と応用方法を十分に理解し、チュートリアルを終了し、この章のプログラムを独自に作成し、ダウンロードして実践してください。

中断の概要

例えば、キッチンで鍋に水を沸かすためにガスを使っているので、キッチンに立って水が沸騰するのを待たなければなりません。水が溢れてガスが消えてしまったら、災害が発生する可能性があります
突然、ドアの外から朗々と力強い歌声が聞こえてきました。私の大好きな天龍八部が始まろうとしていました。やかんの「ゴロゴロ」音を聞いて、はっきりとわかりました。水が沸騰するまで待たないと、水は出ないのです。人生を楽しむ時間。
このシーンは中断と何の関係があるのでしょうか?

このシーンでは処理能力を持った主体は私だけなので、お湯を沸かすのもテレビを見るのも同時に
一つのことしかできません。しかし、一つのことに集中していると、緊急のことやそうでないことが突然目の前に現れ
、どれも注意が必要なものであり、中には目の前の作業を止めてすぐに対処しなければならないものもあります。
処理が完了した後でのみ、前のタスクに戻って完了することができます。割り込みメカニズムは、予期せぬ状況に対処する能力を与えてくれるだけでなく、このメカニズムの魔法を最大限に活用できれば、複数のタスクを「同時に」完了することができます。

実際、水を沸騰させるには10分かかりますが、やかんを持ち上げてガスを止めるのは数秒しかかかりません。この数秒のために、私は
キッチンで10分待たなければなりません。目覚まし時計で10分タイマーをセットしておくと、10分が過ぎると目覚まし時計がガスを止める時間だと知らせてくれるので、安心してテレビを見ることができます
実際、私は目覚まし時計のような割り込み信号を使って、やかんを運ぶ作業とガスを止める作業を完了することを思い出させました。

2)


4. デジタル管が有効なビットのみを表示するように、つまり上位 0 が表示されないようにプログラムを変更してみてください。

#include <REGX52.H>
sbit addr0 = P1^0;
sbit addr1 = P1^1;
sbit addr2 = P1^2;
sbit addr3 = P1^3;
sbit ENLED = P1^4;
unsigned char code LedChar[] = {
    0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
    0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[6] = { 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
unsigned int flag1s = 0;
unsigned int cnt = 0,i = 0;
void main()
{
 char arr;
	unsigned long sec = 0;
	unsigned int buf[6];
	EA = 1;
	ENLED = 0;
	addr3 = 1;
	TMOD = 0x01;
	TH0 = 0xfc;
	TL0 = 0x67;
	ET0 = 1;
	TR0 = 1;
  while(1) 
{
 if (flag1s == 1)  //ÅжÏ1Ã붨ʱ±êÖ¾
        {
            flag1s = 0;   
            sec++;        
            buf[0] = sec%10;
            buf[1] = sec/10%10;
            buf[2] = sec/100%10;
            buf[3] = sec/1000%10;
            buf[4] = sec/10000%10;
            buf[5] = sec/100000%10;			
			for(arr = 5;arr >=1;arr--)
				{
				if(buf[arr] == 0)			
				LedBuff[arr] = 0xff;
				else
				     break;
				}
				for(;arr >=0;arr--)
				{
				LedBuff[arr] = LedChar[buf[arr]];
				}
			}
}	
}
void InterruptTimer0() interrupt 1
{
	TH0 = 0xfc;
	TL0 = 0x67;
	cnt++;
	if(cnt >= 1000)
	{
		cnt = 0;
	flag1s = 1;
	}
	P0 = 0xff;
	switch (i)
	{
		    case 0 :addr0 = 0;addr1 = 0;addr2 = 0;P0 = LedBuff[0];i++;break;
				case 1 :addr0 = 1;addr1 = 0;addr2 = 0;P0 = LedBuff[1];i++;break;
				case 2 :addr0 = 0;addr1 = 1;addr2 = 0;P0 = LedBuff[2];i++;break;
				case 3 :addr0 = 1;addr1 = 1;addr2 = 0;P0 = LedBuff[3];i++;break;
				case 4 :addr0 = 0;addr1 = 0;addr2 = 1;P0 = LedBuff[4];i++;break;
				case 5 :addr0 = 1;addr1 = 0;addr2 = 1;P0 = LedBuff[5];i=0;break;
		default:break;
	}
	}


5. 999999 か​​らカウントダウンし、タイマ T1 の割り込みを利用して終了するプログラムを書いてみると、タイマと割り込みの使い方をマスターできます。

#include <REGX52.H>
sbit addr0 = P1^0;
sbit addr1 = P1^1;
sbit addr2 = P1^2;
sbit addr3 = P1^3;
sbit ENLED = P1^4;
unsigned char code LedChar[] = {
    0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
    0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[6] = { 
    0x90, 0x90, 0x90, 0x90, 0x90, 0x90
};
unsigned int flag1s = 0;
unsigned int cnt = 0,i = 0;

void main()
{
 char arr;
	unsigned long sec = 0;
	unsigned int buf[6];
	EA = 1;
	ENLED = 0;
	addr3 = 1;
	TMOD = 0x01;
	TH0 = 0xfc;
	TL0 = 0x67;
	ET0 = 1;
	TR0 = 1;
  while(1) 
{
 if (flag1s == 1)  //ÅжÏ1Ã붨ʱ±êÖ¾
        {
            flag1s = 0;  
            sec++;        
            
            buf[0] = sec%10;
            buf[1] = sec/10%10;
            buf[2] = sec/100%10;
            buf[3] = sec/1000%10;
            buf[4] = sec/10000%10;
            buf[5] = sec/100000%10;
				
				
				for(arr = 5;arr >=0;arr--)
				{
				LedBuff[arr] = LedChar[9-buf[arr]];
				}
			}
}	
}
void InterruptTimer0() interrupt 1
{
	TH0 = 0xfc;
	TL0 = 0x67;
	cnt++;
	if(cnt >= 1000)
	{
		cnt = 0;
	flag1s = 1;
	}
	P0 = 0xff;
	switch (i)
	{
		    case 0 :addr0 = 0;addr1 = 0;addr2 = 0;P0 = LedBuff[0];i++;break;
				case 1 :addr0 = 1;addr1 = 0;addr2 = 0;P0 = LedBuff[1];i++;break;
				case 2 :addr0 = 0;addr1 = 1;addr2 = 0;P0 = LedBuff[2];i++;break;
				case 3 :addr0 = 1;addr1 = 1;addr2 = 0;P0 = LedBuff[3];i++;break;
				case 4 :addr0 = 0;addr1 = 0;addr2 = 1;P0 = LedBuff[4];i++;break;
				case 5 :addr0 = 1;addr1 = 0;addr2 = 1;P0 = LedBuff[5];i=0;break;
		default:break;
	}
	}

おすすめ

転載: blog.csdn.net/2301_77479336/article/details/132841655