学習メモ|ブザーの理解|制御原理|IH調理器のLED実践操作|ロジック操作|STC32Gマイコンビデオ開発チュートリアル(Chong兄弟)|エピソード8(パート1):ブザーの応用

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が点滅し続け動作中を示し、動作中は機能の切り替えはできません。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/Medlar_CN/article/details/132422984