? 導(dǎo)讀:《藍(lán)橋杯單片機(jī)組》專欄文章是博主2018年參加藍(lán)橋杯的單片機(jī)組比賽所做的學(xué)習(xí)筆記,在當(dāng)年的比賽中,博主是獲得了省賽一等獎(jiǎng),國(guó)賽二等獎(jiǎng)的成績(jī)。成績(jī)雖談不上最好,但至少問(wèn)心無(wú)愧。如今2021年回頭再看該系列文章,仍然感觸頗多。為了能更好地幫助到單片機(jī)初學(xué)者,今年特地抽出時(shí)間對(duì)當(dāng)年的文章邏輯和結(jié)構(gòu)進(jìn)行重構(gòu),以達(dá)到初學(xué)者快速上手的目的。需要指出的是,由于本人水平有限,如有錯(cuò)誤還請(qǐng)讀者指出,非常感謝。那么,接下來(lái)讓我們一起開(kāi)始愉快的學(xué)習(xí)吧。
一、硬件電路基礎(chǔ)知識(shí)
工欲善其事必先利其器,閱讀電路原理圖是單片機(jī)開(kāi)發(fā)的基礎(chǔ),正式開(kāi)始寫程序之前,我們先來(lái)補(bǔ)充一下藍(lán)橋單片機(jī)組這個(gè)原理圖的基礎(chǔ)知識(shí)吧。硬件電路總體來(lái)說(shuō)并不太難,這里僅拿74HC573和ULN2003組成的電路做重點(diǎn)介紹。
1.1、74HC573 電路
藍(lán)橋的這塊板子主要靠74HC573 電路和74HC138撐起外設(shè)的門面,74HC138數(shù)電常講(詳情看這里),這里不再重復(fù)。74HC573可能有點(diǎn)陌生,其實(shí)也沒(méi)啥,記住一點(diǎn)它是個(gè)鎖存器,存狀態(tài)的器件就行了。
非得深入了解的話,可以看看這里,了解完之后對(duì)付這個(gè)比賽也完全夠用了。
如果程序中使用完573后,記得及時(shí)的禁止使能!在程序中,可以這樣寫:
注:看到后面會(huì)發(fā)現(xiàn)這樣寫不太好,因?yàn)槿菀子绊慖O的其他位,這里僅僅為了方便入門!
P2 = P2 & 0x1F;
1.2、ULN2003 電路
這個(gè)可得好好說(shuō)說(shuō),感覺(jué)挺好使的,其內(nèi)部電路示意圖如下所示。
主要記住幾個(gè)信息:
- 特點(diǎn)①、它是個(gè)驅(qū)動(dòng)芯片,可以驅(qū)動(dòng)諸如繼電器和電機(jī)此類感性負(fù)載!
- 特點(diǎn)②、輸出端可達(dá)500mA/50V.
注:感性負(fù)載的緣故,輸出端具有的二極管學(xué)名續(xù)流二極管。
ULN2003的9腳是COM口,為內(nèi)部7個(gè)續(xù)流二極管負(fù)極的公共端,各二極管的正極分別接各達(dá)林頓管的集電極。
用于感性負(fù)載時(shí),該腳接負(fù)載電源正極,實(shí)現(xiàn)續(xù)流作用。如果該腳接地,實(shí)際上就是達(dá)林頓管的集電極對(duì)地接通。所以最好接上VCC!
注:達(dá)林頓管是兩個(gè)三極管接在一起,極性只認(rèn)前面的三極管
- 特點(diǎn)③、ULN2003是一個(gè)非門電路!
若要深入了解ULN2003的具體參數(shù)信息,可以看這里,但是還是那句話,上面介紹的足矣應(yīng)付這個(gè)比賽。
1.3、了解IO控制原理 - 以驅(qū)動(dòng)蜂鳴器為例
干說(shuō)的話,有點(diǎn)不直觀,先來(lái)看看怎么驅(qū)動(dòng)蜂鳴器吧。板載蜂鳴器為有源蜂鳴器,只要兩端有壓差就會(huì)響!板載電路原理圖如下所示:
通過(guò)電路圖,不難看出,也就是說(shuō)我們只需要控制 N_BUZZ
是低電平就OK了,那么再順藤摸瓜就可以找到N_BUZZ
是連接到那個(gè)IO引腳。
聽(tīng)起來(lái)那豈不是so easy的事么,確實(shí)如此...
繼續(xù)往下走咯~
順藤摸瓜的原理圖見(jiàn)上。
再提醒一下 ULN2003 驅(qū)動(dòng)芯片是個(gè)非門。
故順藤摸瓜可得:想要OUT7=0
,那么只能IN7=1
了;IN7對(duì)應(yīng)到鎖存器573,不改變狀態(tài),再對(duì)應(yīng)到IO口就是P06了,也就是我們讓 P0^6=1
, 這時(shí)候蜂鳴器就會(huì)響了。
確實(shí)是這樣的,但是別忘了573上面的LE,是需要使能的。也就是Y5C=1
開(kāi)啟使能,再根據(jù)上面的思路,順藤摸瓜就來(lái)到了74HC02這個(gè)或非門
WR是J13上的,當(dāng)我們是IO編程的時(shí)候,J13的2、3腳是相連的。
關(guān)于IO編程這個(gè)概念,后面會(huì)繼續(xù)深入的。
J13是個(gè)3腳排針,它的3腳連接的是GND。那么2、3腳是相連,也即是說(shuō)WR是接地的。
74HC02同時(shí)還是個(gè)非門,想要Y5C=1
,那么Y5=0
即可,Y5又是38譯碼器的輸出,Y5等于0就是38譯碼器選中對(duì)應(yīng)的引腳,因?yàn)樗?strong>低電平輸出(數(shù)電有講)。
也即是讓C/B/A=1/0/1
,C/B/A
又分別對(duì)應(yīng)P2口的P27/P26/P25
,如下圖所示。
那么一切就理清楚了,若想驅(qū)動(dòng)有源蜂鳴器,只需要讓P2 = (P2&0x1F|0xA0)
即可。
二、實(shí)驗(yàn)寫代碼
代碼如下
#include <stc15.h>
sbit Buzz=P0^6;
void main()
{
P2 = ((P2&0x1F)|0xA0);
Buzz = 1;
P2 = P2 & 0x1F;
while(1);
}
關(guān)于繼電器,它和蜂鳴器一樣都是Y5C所在寄存器使能控制,只需改變相應(yīng)的IO口,就可以實(shí)現(xiàn)控制繼電器,直接上代碼。
#include <stc15.h>
sbit Buzz = P0^6;
sbit Relay = P0^4;
void main()
{
P2 = ((P2&0x1F)|0xA0); //使能573
Buzz = 0; //關(guān)閉蜂鳴器
Relay = 0; //關(guān)閉繼電器
P2 = P2 & 0x1F; //禁止573
while(1);
}
LED燈不過(guò)是換成了Y4C,對(duì)應(yīng)選中Y4就可以操作LED了,上代碼。
#include <stc15.h>
sbit Buzz = P0^6;
sbit Relay = P0^4;
void main()
{
P2 = ((P2&0x1F)|0xA0); //使能573
Buzz = 0; //關(guān)閉蜂鳴器
Relay = 0; //關(guān)閉繼電器
P2 = P2 & 0x1F; //禁止573
P2 = ((P2&0x1F)|0x80);
P0 = 0x00; //點(diǎn)亮所有LED
P2 = P2 & 0x1F;
while(1);
}
三、總結(jié)
后期當(dāng)不使用 LED、繼電器和蜂鳴器 的時(shí)候,記得直接關(guān)閉,亂響的話很容易影響心情的!(╭(╯^╰)╮)
關(guān)閉代碼模板如下:
void CloseFucker()
{
P2 = (P2 & 0x1F) | 0x80;//關(guān)閉LED
P0 = 0xFF;
P2 = 0x00;
P2 = (P2 & 0x1F) | 0xA0;//關(guān)閉蜂鳴器繼電器
P0 = P0 & 0xAF;
P2 = 0x00;
}
小結(jié):本篇文章從藍(lán)橋單片機(jī)板子的硬件電路入手,詳細(xì)介紹了74HC573和ULN2003這兩個(gè)不那么熟悉的器件電路功能及作用。接著以驅(qū)動(dòng)蜂鳴器為例,介紹了單片機(jī)IO的控制方式。最后舉一反三,介紹了單片機(jī)IO控制LED和繼電器的方式。
希望大家多多支持我的原創(chuàng)文章。如有錯(cuò)誤,請(qǐng)大家及時(shí)指正,非常感謝。