LED ライトのオン/オフを制御する 51 個のマイクロコントローラー ボタン さまざまな遊び方

LED ライトのオン/オフを制御する 51 個のマイクロコントローラー ボタン さまざまな遊び方

1。概要

この記事では、ボタンの使い方を紹介し、LED ライトを制御する小さな実験を通してボタンの問題点を発見し、それを考えて解決します。ボタン コントロール コンポーネントの使用に習熟します。

2. ハードウェア環境の構築

1.ハードウェアの準備
名前 モデル
マイクロコントローラー STC12C2052 1
LEDランタン なし 2
水晶発振器 12MHz 1
キャパシタンス 30pf 2
抵抗 100オーム 2
ブレッドボード なし 1
接続線 なし 5
2. 回路図の概略図

ここに画像の説明を挿入します

  • 1. 100 オームの抵抗を LED ランプの正極に直列に接続し、それをマイクロコントローラーのピン 20 VCC に接続します。
  • 2. 接続ケーブルの一端はマイクロコントローラーのピン 12 に接続され、もう一端はボタンの 1 つのピンに接続されます。
  • 3. ボタンのもう一方のピンは、接続線を介してマイクロコントローラーのピン 10 GND に接続されます。
  • 4. 水晶発振器の 2 つのピンはそれぞれマイクロコントローラのピン 4 と 5 に接続され、同時に水晶発振器の各ピンは 30pf のコンデンサと直列にマイクロコントローラのピン 10 (GND) に接続されます。

ここに画像の説明を挿入します

3. 実験テーマ

3.1. ボタンを押すとライトが点灯し、ボタンを離すとライトが消えます。

1. トピックの説明

このプロジェクトの目的は、ボタンを使用して LED ライトのオン/オフを制御することであり、ボタンが押されると、低いレベルが読み取られてライトが点灯します。送信ボタンが高レベルを読み取ると、ライトが消えます。

2. プログラムを実装する
/*************************************************************
* 程序名: 按键控制LED灯亮灭
* 编写人: bruce
* 硬件支持:TC12C2052 外部12MHZ晶振
* 日  期: 2023-11-14
* 修改日志: 
/*************************************************************/

#include<STC12C2052AD.H>

sbit LED = P1^7;
sbit KEY = P1^0;


void main(void){
    
    
	KEY = 1;
	LED = 1;

	while(1){
    
    
		/*
		使用if判断语句实现按下按键LED灯亮,
		松开按键LED灯灭
		*/

		/*
		if(KEY == 0){
			LED = 0;
		}else if(KEY == 1){
			LED = 1;
		}
		*/

		// 讨巧的方式实现按键控制灯亮灭
		LED = KEY;
		
	}

}

3.2. ボタン回転制御ライトスイッチ

1. トピックの説明

1回目のボタンを押して離すとライトが点灯し、2回目にボタンを離すと消灯します。

2. プログラムを実装する
/*************************************************************
* 程序名: 第一次按下按键LED灯亮,第二次按下按键LED灯灭,如此循环
* 编写人: bruce
* 硬件支持:TC12C2052 外部12MHZ晶振
* 日  期: 2023-11-14
* 修改日志: 
/*************************************************************/

#include<STC12C2052AD.H>

sbit LED = P1^7;
sbit KEY = P1^0;

/*********************************************************************************************
函数名:毫秒级CPU延时函数
调  用:DELAY_MS (?);
参  数:1~65535(参数不可为0)
返回值:无
结  果:占用CPU方式延时与参数数值相同的毫秒时间
备  注:应用于1T单片机时i<600,应用于12T单片机时i<125
/*********************************************************************************************/
void DELAY_MS (unsigned int a){
    
    
	unsigned int i;
	while( --a != 0){
    
    
		for(i = 0; i < 600; i++);
	}
}

void main(void){
    
    
	KEY = 1;
	LED = 1;

	while(1){
    
    

		if(KEY == 0){
    
    
			/*
			DELAY_MS()延时函数的作用是去掉按下按键抖动造成信号不稳定,导致程序失灵。
			当按下按键后让程序稍等一会跳过按键抖动时刻,再读取按键状态达到去抖动效果。
		  */
			DELAY_MS(120);
			if(KEY == 0){
    
    
				//当按键为0时,判断当前灯的状态,并取反。实现轮训控制灯的开关。
				if(LED == 0){
    
    
					LED = 1;
				}else{
    
    
					LED = 0;
				}
				
			}
		}	
	}

}

上記のプログラムはライトのオン/オフのボタン制御機能を実現していますが、2 つの不完全性があり、最適化する必要があります。最適化ポイントは以下の通り

  • if 判定文を 3 層埋め込むとプログラムが複雑になり、読みにくくなります。
  • キーの揺れを除去するために遅延のみが使用されており、まれに誤動作が発生する可能性があります。

次のプログラムは、この 2 つの点を最適化して、プログラムをより夜間に近いものにしています。

/*************************************************************
* 程序名: 第一次按下按键LED灯亮,第二次按下按键LED灯灭,如此循环
* 编写人: bruce
* 硬件支持:TC12C2052 外部12MHZ晶振
* 日  期: 2023-11-14
* 修改日志: 
/*************************************************************/

#include<STC12C2052AD.H>

sbit LED = P1^7;
sbit KEY = P1^0;

/*********************************************************************************************
函数名:毫秒级CPU延时函数
调  用:DELAY_MS (?);
参  数:1~65535(参数不可为0)
返回值:无
结  果:占用CPU方式延时与参数数值相同的毫秒时间
备  注:应用于1T单片机时i<600,应用于12T单片机时i<125
/*********************************************************************************************/
void DELAY_MS (unsigned int a){
    
    
	unsigned int i;
	while( --a != 0){
    
    
		for(i = 0; i < 600; i++);
	}
}

void main(void){
    
    
	KEY = 1;
	LED = 1;

	while(1){
    
    

		if(KEY == 0){
    
    
			/*
			DELAY_MS()延时函数的作用是去掉按下按键抖动造成信号不稳定,导致程序失灵。
			当按下按键后让程序稍等一会跳过按键抖动时刻,再读取按键状态达到去抖动效果。
		  */
			DELAY_MS(120);
			if(KEY == 0){
    
    
				//当按键为0时,判断当前灯的状态,并取反。实现轮训控制灯的开关。
				LED = ~LED;
				//当按键按下没有松开时则一直做空循环,直到松开,while(1)才开始新的一轮循环。增强了按键控制灯的稳定性。
				while(KEY == 0);	
			}
		}	
	}

}

おすすめ

転載: blog.csdn.net/m0_38039437/article/details/134560671