新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)單按鍵控制led臺(tái)燈

單片機(jī)單按鍵控制led臺(tái)燈

作者: 時(shí)間:2016-11-30 來(lái)源:網(wǎng)絡(luò) 收藏
按鍵控制LED臺(tái)燈亮度 C語(yǔ)言方案

功能要求:?jiǎn)为?dú)一個(gè)按鍵控制LED臺(tái)燈的亮度,上電默認(rèn)關(guān)機(jī),分5個(gè)檔位。
第一檔:100%亮度
第二檔:65%亮度
第三檔:35%亮度
第四檔:20%亮度
第五檔:10%亮度
第六檔:關(guān)機(jī)

本文引用地址:http://m.butianyuan.cn/article/201611/323845.htm

思路:設(shè)定一個(gè)改變占空比的變量PWM,每按一次按鍵PWM值自加一次(自加值看需要定,比如PWM+=100),值越小產(chǎn)生的驅(qū)動(dòng)脈沖頻率越高。PWM函數(shù)采用模擬方法產(chǎn)生,從成本上考慮,帶中斷,定時(shí)器等功能的單片機(jī)價(jià)格比較高。所以采用價(jià)格低廉的低檔單片機(jī)。鑒于仿真方便,本程序采用PIC16F505(當(dāng)然也可以用12F508等芯片)。

端口連接:RC1—LED RC0----蜂鳴器 RC5----按鍵

程序代碼:
#include
__CONFIG(0X034);
#define uchar unsigned char
#define uint unsigned int

#define uchar unsigned char
#define uint unsigned int
uint PWM, H,L;


void delay(uint x)//任意時(shí)間延時(shí)函數(shù)
{
uint c,d;
for(c=x;c>0;c--)
for(d=110;d>0;d--);

}

void KEY1()//按鍵掃描函數(shù),按壓有效(非松手有效),并且不影響LED點(diǎn)亮效果,都可以用此類掃描函數(shù)
{
static bit valid=0;
static bit finish=0;

if(valid==0)
{
if(RC5==0)
{
if(finish==0)
{
finish=1;

RC0=1;
delay(10);
RC0=0;//蜂鳴器,每按一下響一聲
RC1=0;//此語(yǔ)句非常重要,如果不加這句,到最低檔的時(shí)候,不能關(guān)機(jī)而直接進(jìn)入最高檔。

PWM+=100; //按鍵有效,PWM增加100


}
}
else
{
valid=0;
finish=0;
}
}
else
{
if(RC5==0)valid=1;
}
}


void LED_ON()//模擬PWM函數(shù),算法簡(jiǎn)單直觀,通過(guò)改變PWM值去改變LED點(diǎn)亮和熄滅的時(shí)間的間隔達(dá)到調(diào)光的目的。
{


H=PWM;
L=500-H;

RC1=0;
while(H--);
RC1=1;
while(L--);

}
void main()
{
PORTC=0X00;
TRISC=0X10;
PWM=0;

while(1)//用此語(yǔ)句達(dá)到上電關(guān)機(jī)(LED熄滅狀態(tài)),當(dāng)有按鍵按下的時(shí)候,break語(yǔ)句跳出while循環(huán)
{
RC1=0;
if(RC5==0)break;
}

while(1)
{
KEY1();//按鍵掃描,此函數(shù)將改變PWM的值
If(PWM<500)//只要PWM值小于500,每按下一次,都會(huì)執(zhí)行LED_ON()函數(shù),且每次的PWM值都以100的倍數(shù)增加,達(dá)到調(diào)光目的。
{
LED_ON();
}
If(PWM>500)//如果大于500則把PWM清零,且LED關(guān)機(jī)。
{
PWM=0;
RC1=0;
}
}

}



評(píng)論


技術(shù)專區(qū)

關(guān)閉