記事ディレクトリ
1. ブザーについて知る
裏側のビニールで覆われているのはアクティブブザーです。
背面の露出した回路基板にはパッシブブザーがあります。
YX55675-パッシブブザーモジュール情報
抽出コード:nl73
違い
1. アクティブブザーは内部に発振源を持っているため、電源を入れるとすぐにブザー音が鳴ります(一方がハイレベル、もう一方がローレベル)。一方、パッシブブザーは内部に発振源を持っていないため、 DC 信号が使用されている場合はバズ音を発することはできません (ハイレベルとローレベルを与え続ける必要があります)。
2. 価格の違い アクティブ ブザーは、より多くの振動源が含まれているため、パッシブ ブザーよりも高価です。アクティブでコントロールしやすい。音楽は受動的に演奏するのが良いでしょう。
このアクティブブザーを中心に実験を始めましょう。
2.制御原理
回路図:
トランジスタのベースがローレベルの場合、SS8550 はコレクタに伝達して導通し、BEEP1 の正極を接続し、BEEP1 の負極はグランドに接続されます。
C35 コンデンサは単純なフィルタリングの役割を果たします。
ハイレベルでP54ピンがオフ、
ローレベルでP54ピンがオンになります。
ここでは、前のレッスンでのボタンの点灯と組み合わせて、自分で段落を書いてみます。ここで達成できるのは、ボタンを押してブザーをオンにし、ボタンを押してブザーをオフにすることです。歌手プログラム! (まずは自分で試してから、私が書いたものを読んでください!)
ブザー制御原理を実現
記憶する必要があるボタンシングルトリガーコード:
if (KEY1 == 0)
{
delay_ms(10);
if (KEY1 == 0)
{
while(KEY1 == 0);
BEEP = !BEEP;
}
}
3. ブザーの実用化
物理マップ:
需要分析
このセクションでは、8 個の LED (LED1 ~ LED8) と KEY1 (スイッチ) および KEY2 ボタン (機能選択) を制御することを選択します。
ボタン2、LED 8、ブザー*1
1. ボタン 1 を押すと、ブザーが 10ms 鳴動し、セルフテストが開始され、
LED1 ~ 8 が 200ms 間すべて点灯し、その後消灯します。 。
2. 電源を入れた後、ボタン 2 を押すと、ブザーが 10 ミリ秒間鳴り、LED1 ~ 8 が順番に点灯し、スープ作り、湯沸かし、その他の機能の切り替えを示します。
3. 電源を入れた後、もう一度ボタン 1 を押すと、ブザーが 10 ミリ秒間鳴り、すべての LED が消えてシャットダウンを示します。
コードの作成
ステップ 1 コードの作成と分析
まず、プロジェクト フォルダーの下に新しい test サブディレクトリを作成し、そのディレクトリ内に新しい test.c と test.h を作成します。
test.c をプロジェクトに追加します。
test.h のテンプレートを修正しました
#ifndef __TEST_H //判断是否有test.h
#define __TEST_H
#include "COMM/stc.h" //调用头文件
#include "COMM/usb.h"
#endif
Test.c は test.h への参照を追加し、test.c ファイルがプロジェクトに追加され、インクルード ファイルの参照パスが追加されます。
定義ファイルを test.h に移動すると、他のファイルは前に追加したインクルードを通じて事前定義にアクセスできます。
次に、必要な関数を記述します。
最初のステップは、状態変数とテスト関数を作成することです。
#include "test.h"
bit Run_Flag = 0; //0-1开关机变量
u8 Run_Mode = 0; //0-8 模式几 0:没有模式
void Test(void) //电磁炉的功能
{
if (KEY1 == 0) //开关机键
{
delay_ms(10);
if (KEY1 == 0)
{
while(KEY1 == 0); //按钮按下,并等待按钮松开
if (Run_Flag = 0) //表示还没有开机
{
Run_Flag = 1; //开机变量改为1,表示已经开机
BEEP = 0; //打开蜂鸣
delay_ms(10); //延迟10ms
BEEP = 1; //关闭蜂鸣
P40 = 0; //打开了LED总电源
P6 = 0X00; //全部点亮
delay_ms(200); //延迟200ms
P6 = 0XFF; //全部关闭
}
}
}
}
ヘッダー ファイルには、次のような関数の宣言を含める必要があります。
void delay_ms(u16 ms);
void Test(void);
コンパイルを開始し、プロンプト「test\test.c(10): warning C140: 'delay_ms' unknown; according to 'extern int late_ms()'」を表示します。その理由は、delay_ms が test.h で定義されていないため、最初に移動する必要があるためです
。コピーするときにのみ、次のエラーが表示されます。
Tips:提示:“test\test.c(14): error C16: unprintable character 0xA3 skipped
test\test.c(14): エラー C16: 印刷できない文字 0xA9 がスキップされました"
これは、中国語の入力メソッドで書かれた句読点が keil に表示されるためです (例: //lcm_w_word("Hello abc"); 全角文字は使用できません)スペースを含む任意の文字、および句読点とスペースは英語でのみ入力できます。このエラーが表示された場合は、
全角文字または句読点を置き換えてください。ただし、通常の状況では表示されません。追加する // のみ検出可能
ヒント:「test\test.c(14): 警告 C137: 条件式の定数」
if() では = を使用すべきではありませんが、== を使用する必要があります。= を使用することは変数に定数を代入することと同じであるため、コンパイラは警告を出します。次に、else if がある場合は、「警告 C294: コードに到達できません」というプロンプトが表示されます (この例には else if がないため、表示されません)。
メインコードを実装する
main.c に Test 関数を追加します。
while(1) //死循环
{
if( DeviceState != DEVSTATE_CONFIGURED ) //判断USB是否连接成功,最新版usb.h中该有定义
continue;
if( bUsbOutReady ) //判断有没有接收到数据
{
usb_OUT_done(); //接收应答(固定格式)
}
Test();
}
test.h で定義:
#ifndef __TEST_H //判断是否有test.h
#define __TEST_H
#include "COMM/stc.h" //调用头文件
#include "COMM/usb.h"
#define MAIN_Fosc 24000000UL
#define KEY1 P32
#define KEY2 P33
#define BEEP P54 //定义一个BEEP控制引脚
void delay_ms(u16 ms);
void Test(void);
#endif
最初のステップでカスタム変数と関数を実装するための test.c のコード:
#include "test.h"
bit Run_Flag = 0; //0-1开关机变量
u8 Run_Mode = 0; //0-8 模式几 0:没有模式
void Test(void) //电磁炉的功能
{
if (KEY1 == 0) //开关机键,第一步骤代码段
{
delay_ms(10);
if (KEY1 == 0)
{
//while(KEY1 == 0); //按钮按下,并等待按钮松开
if (Run_Flag == 0) //表示还没有开机
{
Run_Flag = 1; //开机变量改为1,表示已经开机
BEEP = 0; //打开蜂鸣
delay_ms(10); //延迟10ms
BEEP = 1; //关闭蜂鸣
P40 = 0; //打开了LED总电源
P2 = 0X00; //全部点亮
delay_ms(300); //延迟200ms
P2 = 0XFF; //全部关闭
}
}
}
}
void delay_ms(u16 ms) //unsigned int
{
u16 i;
do
{
i = MAIN_Fosc/6000;
while(--i);
}while(--ms);
}
コードを実行すると、ブザーが 1 回鳴り、すべてのライトが点灯した後に 8 つの状態がすべて消灯し、その後他のボタンを押しても無反応になり、その後の機能コードが追加されます。
ステップ 2: シャットダウン コードの作成と分析
電源を入れた後、もう一度ボタン 1 を押すと、ブザーが 10 ミリ秒間鳴り、すべての LED が消え、P40 の主電源インジケータが消えてシャットダウンを示します。
基本的な機能ステータスは key1 が押されたときであり、異なるブート変数に従って異なる実行コードが選択されます。
else
{
Run_Flag = 0; //已关机
BEEP = 0; //打开蜂鸣(提醒)
delay_ms(10); //延迟10ms
BEEP = 1; //关闭蜂鸣
P2 = 0XFF; //状态指示全部关闭
P40 = 1; //关闭总电源LED
}
ステップ 3: ステータス選択ボタン コードの作成と分析
電源を入れた後、ボタン 2 を押すと、ブザーが 10 ミリ秒間鳴り、LED1 ~ 8 が順番に点灯し、スープ作り、湯沸かしなどの機能が切り替わります。
実装コード:
/*=======================按下按键2,执行本段代码=====================*/
if (KEY2 == 0) //开关机键
{
delay_ms(10); //防抖
if (KEY2 == 0)
{
while(KEY2 == 0); //等待按键松开,将要执行
/*=======================还没有开机的情况下,执行本段代码=====================*/
if (Run_Flag == 0) //表示还没有开机
{
BEEP = 0; //打开蜂鸣
delay_ms(10); //延迟10ms
BEEP = 1; //关闭蜂鸣
Run_Mode++; //每次按下,模式+1(移至下一个led)
if (Run_Mode > 8) //如果模式大于8,回到模式1
Run_Mode = 1; //Run_Mode超过8后清零,回到第一个灯
P2 = ~(1<< (Run_Mode - 1)); //最先想到的“1<< Run_Mode”是错误写法,执行结果是8个灯中每次移动仅1个不亮。
//灯是低电平点亮,1<< Run_Mode,即1<<1,左移以后为0000 0010,仅1个LED灭,继续左移,尾部补0,还是只有1个LED灭
//解决方法:RunMode先减1,再左移,最后全部取反。这里用~为全取反。而!是位取反。
//P2 = 0XFX; P6<< 1 + 1; 也可以实现
}
完全な機能を実装する Test.c コード
実行中に、初めてボタンを押したときに、ボタンが電源オン状態で 0 ビットのライトが点灯しない場合は、Run_Mode = 0; //モードは次のように追加する必要があることがわかります。シャットダウンコードでクリアされます。
完全な機能を実現するための test.c コードは次のとおりです。
#include "test.h"
bit Run_Flag = 0; //0-1开关机变量
u8 Run_Mode = 0; //0-8 模式几 0:没有模式
void Test(void) //电磁炉的功能
{
if (KEY1 == 0) //开关机键
{
delay_ms(1000); //长按1s开机
if (KEY1 == 0)
{
//while(KEY1 == 0); //按钮按下,并等待按钮松开
/*=======================还没有开机的情况下,执行本段代码=====================*/
if (Run_Flag == 0) //表示还没有开机
{
Run_Flag = 1; //开机变量改为1,表示已经开机
BEEP = 0; //打开蜂鸣
delay_ms(10); //延迟10ms
BEEP = 1; //关闭蜂鸣
P40 = 0; //打开了LED总电源
P2 = 0X00; //全部点亮
delay_ms(300); //延迟200ms
P2 = 0XFF; //全部关闭
}
/*=======================已经开机的状态下,执行关机操作=====================*/
else
{
Run_Flag = 0; //标记已关机
BEEP = 0; //打开蜂鸣(提醒)
delay_ms(10); //延迟10ms
BEEP = 1; //关闭蜂鸣
P2 = 0XFF; //状态指示全部关闭
P40 = 1; //关闭总电源LED
Run_Mode = 0; //模式清零
}
}
}
/*=======================按下按键2,执行本段代码=====================*/
if (KEY2 == 0) //状态选择键被按下
{
delay_ms(10); //防抖
if (KEY2 == 0)
{
while(KEY2 == 0); //等待按键松开,将要执行
{
BEEP = 0; //打开蜂鸣
delay_ms(10); //延迟10ms
BEEP = 1; //关闭蜂鸣
Run_Mode++; //每次按下,模式+1(移至下一个led)
if (Run_Mode > 8) //如果模式大于8,回到模式1
Run_Mode = 1; //Run_Mode超过8后清零,回到第一个灯
P2 = ~(1<< (Run_Mode - 1)); //错误写法,执行结果是8个灯中仅1个不亮
//灯是低电平点亮,1<< Run_Mode,即1<<1,左移以后为0000 0010,仅1个LED灭,继续左移,尾部补0,还是只有1个LED灭
//解决方法:RunMode先减1,再左移,最后全部取反。这里用~为全取反。而!是位取反。
//P2 = 0XFX; P6<< 1 + 1; 也可以实现
}
}
}
}
void delay_ms(u16 ms) //unsigned int
{
u16 i;
do
{
i = MAIN_Fosc/6000;
while(--i);
}while(--ms);
}
ヒント: C 言語の論理演算子
1. AND 演算 &&
AND 演算には、キー文字 && の使用が必要です。これは、2 つ以上の式を 1 つに接続することを意味します。式全体が TRUE になる前に、すべての式が TRUE である必要があり、それ以外の場合は false になります。
2. OR 演算 ||
OR 演算では、キー文字 || を使用する必要があります。これは、2 つ以上の式を 1 つに接続することを意味します。いずれかの式が TRUE の場合、式全体が TRUE になります。すべての式が false の場合のみ、式全体が false です。
三、非稼働!
キー文字を使用する操作は必要ありません。、単一の式の結果を否定するために使用されます。
元の式の結果が false の場合は、式の前に演算子を追加してください。否定された結果は TRUE です。元の計算結果が TRUE の場合は、式の前に演算子を追加してください。否定された結果は false になります。
要約する
1. ブザーの使い方を理解する
2. ブザーを使ってみる
宿題
追加ボタン3. 押すと起動となり、選択した機能のLEDが点滅し続け動作中を示し、動作中は機能の切り替えはできません。