找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13761|回復(fù): 30
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)LED調(diào)光程序,狀態(tài)機(jī)按鍵處理,效果比較好

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
用狀態(tài)機(jī)處理按鍵,終于把這個功能實(shí)現(xiàn)了;實(shí)驗(yàn)板上測試通過。
/* ********************************************************************************************* */
// 處理器   : STC89C52RC
// 編譯環(huán)境 : Keil4 C51
// 系統(tǒng)時鐘 : 11.0592MHZ
// 簡單描述 : 1個獨(dú)立按鍵,短按開關(guān)LED燈,長按調(diào)光,如果按住按鍵不放,LED亮度從 亮-->暗,暗-->亮,循環(huán)。
/* ********************************************************************************************* */
#include<reg52.h>
typedef unsigned char uChar8;
typedef unsigned int  uInt16;
                                         /*初始狀態(tài)  確認(rèn)狀態(tài)   單擊狀態(tài)    連發(fā)狀態(tài) */
typedef enum KeyState{StateInit,StateAffirm,StateSingle,StateRepeat};//鍵值狀態(tài)值
uChar8 pwm_led_val = 0;         //LED占空比值 0-20 0最亮
uChar8 pwm_t;                                 //周期
sbit KEY1 = P3^0;                        //定義按鍵端口
sbit LED = P1^0;                        //定義LED燈端口

void Timer0Init(void)
{
        TMOD |= 0x02;                        //設(shè)置定時器0工作模式2,8位自動重裝
        TH0 = 240;                                //定時器裝初值
        TL0 = 240;                                //11.0592M晶振下占空比最大比值是20,輸出2880HZ
        EA = 1;                                        //開總中斷
        ET0 = 1;                                //開定時器0中斷
        TR0 = 1;                                //啟動定時器0
}
void Timer1Init(void)
{
        TMOD |= 0x10;                        // 設(shè)置定時器1工作模式1,16位計(jì)數(shù)器
        TH1 = 0xDC;                                // 賦初始值
        TL1 = 0x00;                                // 11.0592M晶振下,定時10ms
        TR1 = 1;                                // 啟動定時器1
}

/* ***************************************************** */
// 函數(shù)名稱:        Init()
// 函數(shù)功能:   初始化
// 入口參數(shù):        無
// 出口參數(shù):         無
/* ***************************************************** */
void Init()                                        //初始化
{
        Timer0Init();
        Timer1Init();
               
}

//定時器0中斷
void timer0() interrupt 1
{
        pwm_t++;
        if(pwm_t == 20)
        {
                pwm_t = 0; LED = 1;
        }
        if(pwm_led_val == pwm_t)
                LED = 0;                                         
}


/* ***************************************************** */
// 函數(shù)名稱:KeyScan(void)
// 函數(shù)功能:掃描按鍵
// 入口參數(shù):無
// 出口參數(shù):鍵值(num)
/* ***************************************************** */
void KeyScan(void)
{
        static uChar8 KeyStateTemp1 = 0;                        //按鍵狀態(tài)臨時存儲值1
        static uChar8 KeyTime = 0;                                        //按鍵延時時間
        bit KeyPressTemp1;                                                        //按鍵是否按下存儲值1
        bit falg;                                                                        //亮度標(biāo)志

        KeyPressTemp1 = KEY1;                                                //讀取I/O口的鍵值
        switch(KeyStateTemp1)
        {       
                case StateInit:                                                        //按鍵初始狀態(tài)
                        if(!KeyPressTemp1)                                        //當(dāng)按鍵按下,狀態(tài)切換到確認(rèn)態(tài)
                                KeyStateTemp1 = StateAffirm;
                        break;
               
                case StateAffirm:                                                //按鍵確認(rèn)態(tài)
                        if(!KeyPressTemp1)
                        {
                                KeyTime = 0;
                                KeyStateTemp1 = StateSingle;        //切換到單次觸發(fā)態(tài)       
                        }
                        else KeyStateTemp1 = StateInit;         //按鍵已抬起,切換到初始態(tài)
                        break;
       
                case StateSingle:                                                //按鍵單發(fā)態(tài)
                        if(KeyPressTemp1)                                        //按下時間小于1s
                        {
                                KeyStateTemp1 = StateInit;          //按鍵釋放,則回到初始態(tài)
                                                TR0 = !TR0;
                                                LED = 1;                                //關(guān)閉LED
               
                        }
                        else if(++KeyTime > 100)                        //按下時間大于1s(100*10ms)
                        {
                                KeyStateTemp1 = StateRepeat;        //狀態(tài)切換到連發(fā)態(tài)
                                KeyTime = 0;       
                        }
                        break;
               
                case StateRepeat:                                                //按鍵連發(fā)態(tài)               
                        if(KeyPressTemp1)
                                KeyStateTemp1 = StateInit;                //按鍵釋放,則進(jìn)初始態(tài)
                        else                                                                //按鍵未釋放
                        {
                                if(++KeyTime > 10)                                //按鍵計(jì)時值大于100ms(10*10ms)
                                {
                                        KeyTime = 0;       
                                                if(falg == 0)
                                                {
                                                        if(pwm_led_val < 20)
                                                        {
                                                                pwm_led_val++;        //亮度變暗
                                                                if(pwm_led_val==20)
                                                                        falg = 1;
                                                        }
                                                }

                                                if( falg ==1 )
                                                {
                                                        if(pwm_led_val > 0)
                                                        {
                                                                pwm_led_val--;        //亮度變亮
                                                                if(pwm_led_val==0)
                                                                        falg = 0;
                                                        }
                                                }
                                }
                                break;
                        }
                        break;
               
                default: KeyStateTemp1 = KeyStateTemp1 = StateInit; break;
        }
}


/* ***************************************************** */
// 函數(shù)名稱:ExecuteKeyNum(void)
// 函數(shù)功能:按鍵值來執(zhí)行相應(yīng)的動作
// 入口參數(shù):無
// 出口參數(shù):無
/* ***************************************************** */
void ExecuteKeyNum(void)
{
        if(TF1)                                        //定時器1溢出
        {
                TF1 = 0;
                TH1 = 0xDC;
                TL1 = 0x00;
                KeyScan();
        }
}


void main()
{
        Init();                                        //首先初始化各數(shù)據(jù)
        while(1)                                //進(jìn)入主程序大循環(huán)
        {
                ExecuteKeyNum();        //不停的檢測按鍵是否被按下
        }

}

評分

參與人數(shù) 2黑幣 +58 收起 理由
zkele + 8 很給力!這個復(fù)制一份來學(xué)習(xí)一下!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏39 分享淘帖 頂4 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:192911 發(fā)表于 2017-4-24 06:46 | 只看該作者
學(xué)習(xí)              了
回復(fù)

使用道具 舉報(bào)

板凳
ID:231147 發(fā)表于 2017-9-7 11:05 | 只看該作者
剛接觸單片機(jī),請多多關(guān)照
回復(fù)

使用道具 舉報(bào)

地板
ID:159139 發(fā)表于 2017-9-9 11:33 來自觸屏版 | 只看該作者
學(xué)習(xí)學(xué)習(xí)狀態(tài)機(jī)按鍵,感謝樓主的分享。
回復(fù)

使用道具 舉報(bào)

5#
ID:254251 發(fā)表于 2017-12-26 16:04 | 只看該作者
再加上掉電模式就完美了 ,誰改好我10RMB以上
回復(fù)

使用道具 舉報(bào)

6#
ID:89286 發(fā)表于 2017-12-26 18:09 | 只看該作者
thanks for sharing
回復(fù)

使用道具 舉報(bào)

7#
ID:243748 發(fā)表于 2017-12-30 21:26 來自觸屏版 | 只看該作者
樓主可以提供下程序包嗎
回復(fù)

使用道具 舉報(bào)

8#
ID:190152 發(fā)表于 2017-12-31 23:00 | 只看該作者
這個不錯,正想做個調(diào)光臺燈
回復(fù)

使用道具 舉報(bào)

9#
ID:140489 發(fā)表于 2018-1-2 10:08 | 只看該作者
wuxishun 發(fā)表于 2017-12-30 21:26
樓主可以提供下程序包嗎

完整程序就帖子里面的,你自己復(fù)制就可以
回復(fù)

使用道具 舉報(bào)

10#
ID:135735 發(fā)表于 2018-1-31 18:05 | 只看該作者
不錯,我什么時候才達(dá)到這樣的水平
回復(fù)

使用道具 舉報(bào)

11#
ID:272625 發(fā)表于 2018-2-2 04:24 來自觸屏版 | 只看該作者
好資料,有實(shí)用價值!
回復(fù)

使用道具 舉報(bào)

12#
ID:280434 發(fā)表于 2018-2-2 15:38 | 只看該作者
不錯。學(xué)習(xí)中。
回復(fù)

使用道具 舉報(bào)

13#
ID:91521 發(fā)表于 2018-2-16 19:45 | 只看該作者
大哥,好厲害!
回復(fù)

使用道具 舉報(bào)

14#
ID:269211 發(fā)表于 2018-2-17 11:15 | 只看該作者
謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

15#
ID:284003 發(fā)表于 2018-2-17 14:54 | 只看該作者
很好用,謝謝樓主,辛苦了!
回復(fù)

使用道具 舉報(bào)

16#
ID:36328 發(fā)表于 2019-1-14 19:56 | 只看該作者
狀態(tài)機(jī)處理好
回復(fù)

使用道具 舉報(bào)

17#
ID:140183 發(fā)表于 2019-2-22 12:57 | 只看該作者
今天測試了一下.效果很好!謝謝分享!
回復(fù)

使用道具 舉報(bào)

18#
ID:74145 發(fā)表于 2019-4-8 10:51 | 只看該作者
這個確實(shí)好
回復(fù)

使用道具 舉報(bào)

19#
ID:14052 發(fā)表于 2019-4-20 20:15 | 只看該作者
學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

20#
ID:543809 發(fā)表于 2019-5-25 10:39 | 只看該作者
請問有原理圖嗎
回復(fù)

使用道具 舉報(bào)

21#
ID:571570 發(fā)表于 2019-6-25 11:15 來自觸屏版 | 只看該作者
老哥有沒有仿真圖,求發(fā)到2621904761@qq.com郵箱,謝謝
回復(fù)

使用道具 舉報(bào)

22#
ID:826754 發(fā)表于 2020-11-21 17:35 | 只看該作者
學(xué)習(xí)了,想做LED燈的PWM調(diào)光,但不知道怎樣編程。
回復(fù)

使用道具 舉報(bào)

23#
ID:577329 發(fā)表于 2020-11-22 15:23 | 只看該作者
為什么我復(fù)制代碼,在keil4中編譯失��?
回復(fù)

使用道具 舉報(bào)

24#
ID:66287 發(fā)表于 2020-11-24 15:33 | 只看該作者

IO口操作仿真.rar (15.05 KB, 下載次數(shù): 14)

回復(fù)

使用道具 舉報(bào)

25#
ID:848824 發(fā)表于 2020-12-16 16:30 | 只看該作者
剛試驗(yàn)了好用,感謝。
回復(fù)

使用道具 舉報(bào)

26#
ID:848824 發(fā)表于 2021-2-17 17:53 | 只看該作者
這個可以控制可控硅嗎
回復(fù)

使用道具 舉報(bào)

27#
ID:848824 發(fā)表于 2021-2-27 04:07 來自觸屏版 | 只看該作者
這個能控制可控硅調(diào)壓嗎
回復(fù)

使用道具 舉報(bào)

28#
ID:859852 發(fā)表于 2021-2-27 22:14 來自觸屏版 | 只看該作者
好,好好學(xué)習(xí)了,學(xué)習(xí)了 。這個資料非常實(shí)用
回復(fù)

使用道具 舉報(bào)

29#
ID:839438 發(fā)表于 2021-6-3 21:41 | 只看該作者
一直找類似的按鍵
回復(fù)

使用道具 舉報(bào)

30#
ID:143767 發(fā)表于 2024-11-22 17:36 | 只看該作者
這個程序我搭建電路試了一下,功能正常,但是LED一上電就亮,沒有使用價值,怎樣改成一上電是不亮的就好了,哪位高手指導(dǎo)一下,謝謝!
回復(fù)

使用道具 舉報(bào)

31#
ID:6467 發(fā)表于 2024-12-24 23:06 | 只看該作者
一直找類似的按鍵;;這個資料非常實(shí)用
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表