一、蜂鳴器和繼電器電路介紹
可以發(fā)現(xiàn)兩個電路一端都接著VCC,所以我們只要給另一端接上低電平就可以讓蜂鳴器和繼電器進(jìn)行工作。與操作LED類似,只不過換了一個74HC573進(jìn)行控制。一樣的只需要操作P00~P07、P27、P26、P25這幾個IO口。
與操作LED最大的區(qū)別:蜂鳴器和繼電器需要大電流驅(qū)動,但由于51的驅(qū)動能力很弱,所以需要驅(qū)動器ULN2003來輔助,需要特別注意ULN給高電平時輸出低電平,給低電平輸出高阻態(tài)。所以當(dāng)我們向打開蜂鳴器時,需要令P06=1,而不是P06=1,因為ULN進(jìn)行了一次反向
。
二、題目與答案
2.1 題目
文章來源:http://www.zghlxwxcb.cn/news/detail-815458.html
2.2 答案
#include <stc15.h>
#include <intrins.h>
/*
num從4到7,分別對應(yīng)
4:LED燈
5:蜂鳴器、繼電器、電機(jī)
6:數(shù)碼管段選
7:數(shù)碼管位選
*/
void Delay1000ms(void) //@11.0592MHz
{
unsigned char data i, j, k;
_nop_();
_nop_();
i = 43;
j = 6;
k = 203;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void selectHC573(unsigned char num)
{
switch(num)
{
case 4:
P2=(P2 & 0x1f) | 0x80;
break;
case 5:
P2=(P2 & 0x1f) | 0xa0;
break;
case 6:
P2=(P2 & 0x1f) | 0xc0;
break;
case 7:
P2=(P2 & 0x1f) | 0xe0;
break;
case 0:
P2=(P2 & 0x1f) | 0x00;
break;
}
}
void all_Led_Blink()
{
int i;
selectHC573(4);
for(i=0;i<3;i++)
{
P0=0x00;
Delay1000ms();
P0=0xff;
Delay1000ms();
}
}
void system_Init()
{
selectHC573(5);
P0=0x00;
}
void led_low2high()//LED從低位亮到高位
{
char i=0;
selectHC573(4);
for(i=0;i<8;i++)
{
P0=(0xfe<<i); //1111 1110
Delay1000ms();
}
}
void led_high2low()//LED從高位亮到低位
{
char i=0;
selectHC573(4);
for(i=0;i<8;i++)
{
P0=(0x7f>>i); //0111 1111
Delay1000ms();
}
selectHC573(0); // 關(guān)閉控制LED的573
}
void relay_holdon()
{
selectHC573(0); //在操作不同模塊時,先失能所有573的LE
P0=~0xef; //1110 1111,在打開模塊對應(yīng)的573之前設(shè)置好P0口,避免先前模塊的P0口數(shù)據(jù)傳進(jìn)來
selectHC573(5);
Delay1000ms();
P0=~0xff;
selectHC573(0); //關(guān)閉此模塊對應(yīng)的573數(shù)據(jù)通道
}
void buzz_holdon()
{
selectHC573(0); //在操作不同模塊時,先失能所有573的LE
P0=~0xbf; //1011 1111,在打開模塊對應(yīng)的573之前設(shè)置好P0口,避免先前模塊的P0口數(shù)據(jù)傳進(jìn)來
selectHC573(5);
Delay1000ms();
P0=~0xff;
selectHC573(0); //關(guān)閉此模塊對應(yīng)的573數(shù)據(jù)通道
}
void main(){
system_Init();
while(1)
{
all_Led_Blink();
relay_holdon();
led_low2high();
buzz_holdon();
}
}
2.3 重點(diǎn)函數(shù)解析
沒啥可解析的,看注釋就好了,想到你們不會去認(rèn)真看上面的代碼注釋,這里拖出來提醒你們看一下。??文章來源地址http://www.zghlxwxcb.cn/news/detail-815458.html
void relay_holdon()
{
selectHC573(0); //在操作不同模塊時,先失能所有573的LE
P0=~0xef; //1110 1111,在打開模塊對應(yīng)的573之前設(shè)置好P0口,避免先前模塊的P0口數(shù)據(jù)傳進(jìn)來
// 由于ULN2003的反向作用,所以需要我們軟件在進(jìn)行一次反向操作,當(dāng)然你們可以P0=0x10,我比較喜歡上面的方式。
selectHC573(5);
Delay1000ms();
P0=~0xff; //反向操作符~
selectHC573(0); //關(guān)閉此模塊對應(yīng)的573數(shù)據(jù)通道
}
到了這里,關(guān)于第十五屆藍(lán)橋杯單片機(jī)組——蜂鳴器和繼電器的基本控制的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!