藍橋杯 01:蜂鳴器、繼電器、LED的使用

前言

報名了3月份的藍橋杯比賽,特地寫博客來記錄自己的學習。

開發工具

開發板:CT107D+
編譯環境:Keil5

原理簡介

在以前學習51單片機的時候,可以通過置1(高電平)和0(低電平)的方式來使LED、蜂鳴器工作。但在CT107D+開發版上還需一些初始化

蜂鳴器原理圖 :可知給 BUZZ 這個IO口置0低電平)就能完成蜂鳴器的使用。

再看 BUZZ 連接在單片機的那個 GPIO 口

在這裏插入圖片描述
清楚看見 BUZZ 連接在 P0^6 ,但有一個鎖存器(74HC573)和 ULN2003 擋在中間.
我們使用蜂鳴器的思路爲:

打開鎖存器,使得 P0^6(D7)控制Q7輸入到IN7然後輸出到OUT7端口即BUZZ端口。

如何打開鎖存器呢?因爲OE端口已共地,我們只需控制LE端口,即當LE = 1,鎖存器打開,即此時 Q7電平受到D7影響 即:P0^6(D7) = Q7(電平狀態),若LE = 0 ,則 Q7的電平狀態不受D7影響,即Q7等於上一個鎖存器關閉時的電平狀態。

我們現在需要給Y5CLE)端口置1(高電平)以此來打開鎖存器
再翻開發板原理圖找:
在這裏插入圖片描述
74HC02 是個非門電路,即 Y5C = ! (Y5 || WR) ,WR端口有跳線帽共地,WR爲低電平。


(!:代表非運算,0變1, 1變0; ||:或運算, 1 || 0 =1, 0 || 0 = 0;)

要使 Y5C = 1,即 !(Y5 || WR) = 1, 所以 (Y5 || WR)= 0, 又因爲WR = 0, 所以 Y5 = 0。

所以我們需要使Y5 端口的電平爲 低電平。

又通過原理圖可知:Y5的輸出由P2端口的高三位控制在這裏插入圖片描述
翻閱74HC138譯碼器的芯片手冊可知

A B C Y1 Y2…和原理圖上的標號對應端口一致 X:不用在意 L: 低電平 H:高電平
在這裏插入圖片描述
看不懂沒關係,我們去學長博客那邊偷圖:
在這裏插入圖片描述
可知P2的高三位不同的電平排序,代表了不同的電平輸出
我們想控制 Y5 爲低電平, 即P27 = 1, P26 = 0, P25 = 1;P2口的低五位的電平不影響Y5低電平的輸出 。
我們的原理部分大致講的差不多了。
再來理一下思路:
在這裏插入圖片描述







蜂鳴器程序代碼

蜂鳴器部分:

sbit BEEP = P0^6;  //蜂鳴器接口


void BEPP_init()
{
   
   
	P2 = (P2&0X1F)| 0XA0;   // 1f , a0 均爲16進制編碼,可用計算器計算得出
    /* 打開鎖存器74HC573, P2上三位置零(置零採用與運算不改變下五位電平).
    再使上三位等於1 0 1 (置1採用或運算),操控Y5 */

	BEEP = 0;   //初始化,關閉蜂鳴器
}

繼電器

根據原理圖可知:在鎖存器打開的情況下 繼電器由 P0^4 端口控制。
其原理與蜂鳴器原理大致相同。
在這裏插入圖片描述

在這裏插入圖片描述
和蜂鳴器相同,同樣是通過譯碼器使 Y5 = 0, 再經過非門操作打開鎖存器
在這裏插入圖片描述
代碼


sbit RELAY = P0^4;  //繼電器接口

void RELAY_init()
{
   
   
	P2 = (P2&0X1F)| 0XA0;  //原理一樣,同樣操控Y5
	RELAY = 0;  //初始化,關閉繼電器

}

LED

原理圖:在鎖存器打開的情況下,P0口直接操控 LED燈,剛好都是八位。
在這裏插入圖片描述
在這裏插入圖片描述

和蜂鳴器不同的是,通過P2高三位操控譯碼器使 Y4 = 0, 再經過非門操作打開鎖存器

代碼

void LED_init()
{
   
   
	P2 = (P2&0X1F) | 0X80; 
	/*打開鎖存器74HC573, P2上三位置零(置零採用與運算不改變下五位電平)	
    再使上三位等於1 0 0 (置1採用或運算),操控Y4 */	
   
   
    P0 = 0XF0;  //初始化,點亮一半的燈

}

完整工程代碼

#include <reg52.h>


sbit BEEP = P0^6;  //蜂鳴器接口
sbit RELAY = P0^4;  //繼電器接口

void BEPP_init();  //蜂鳴器初始化
void LED_init();   //LED初始化
void delay(unsigned int m);  //簡單的延時函數 
void RELAY_init();    //繼電器初始化


void main()
{
   
   
	BEPP_init();  
	LED_init();
	while(1)
	{
   
   
		BEEP = 1;   
    delay(500);
		BEEP = 0;
    delay(500);
	}
}

void BEPP_init()
{
   
   
	P2 = (P2&0X1F)| 0XA0;    //打開鎖存器74HC573, P2上三位置零(置零採用與運算不改變下五位電平),再使上三位等於1 0 1 (置1採用或運算),操控Y5
	BEEP = 0;   //初始化,關閉蜂鳴器
}

void RELAY_init()
{
   
   
	P2 = (P2&0X1F)| 0XA0;
	RELAY = 0;  //初始化,關閉繼電器
}

void LED_init()
{
   
   
	P2 = (P2&0X1F) | 0X80;  //打開鎖存器74HC573, P2上三位置零(置零採用與運算不改變下五位電平),再使上三位等於1 0 0 (置1採用或運算),操控Y4
	P0 = 0XF0;  //初始化,點亮奇數燈

}
void delay(unsigned int m)  //簡單的延時函數
{
   
   
  unsigned int i;
	unsigned int j;
	for(i=0;i<m;i++)
		for(j=0;j<309;j++);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章