前言
報名了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等於上一個鎖存器關閉時的電平狀態。
我們現在需要給Y5C(LE)端口置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++);
}