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);
}
}
}
}