久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13534|回復: 30
收起左側

單片機LED調光程序,狀態機按鍵處理,效果比較好

  [復制鏈接]
ID:140489 發表于 2017-4-21 13:38 | 顯示全部樓層 |閱讀模式
用狀態機處理按鍵,終于把這個功能實現了;實驗板上測試通過。
/* ********************************************************************************************* */
// 處理器   : STC89C52RC
// 編譯環境 : Keil4 C51
// 系統時鐘 : 11.0592MHZ
// 簡單描述 : 1個獨立按鍵,短按開關LED燈,長按調光,如果按住按鍵不放,LED亮度從 亮-->暗,暗-->亮,循環。
/* ********************************************************************************************* */
#include<reg52.h>
typedef unsigned char uChar8;
typedef unsigned int  uInt16;
                                         /*初始狀態  確認狀態   單擊狀態    連發狀態 */
typedef enum KeyState{StateInit,StateAffirm,StateSingle,StateRepeat};//鍵值狀態值
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;                        //設置定時器0工作模式2,8位自動重裝
        TH0 = 240;                                //定時器裝初值
        TL0 = 240;                                //11.0592M晶振下占空比最大比值是20,輸出2880HZ
        EA = 1;                                        //開總中斷
        ET0 = 1;                                //開定時器0中斷
        TR0 = 1;                                //啟動定時器0
}
void Timer1Init(void)
{
        TMOD |= 0x10;                        // 設置定時器1工作模式1,16位計數器
        TH1 = 0xDC;                                // 賦初始值
        TL1 = 0x00;                                // 11.0592M晶振下,定時10ms
        TR1 = 1;                                // 啟動定時器1
}

/* ***************************************************** */
// 函數名稱:        Init()
// 函數功能:   初始化
// 入口參數:        無
// 出口參數:         無
/* ***************************************************** */
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;                                         
}


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

        KeyPressTemp1 = KEY1;                                                //讀取I/O口的鍵值
        switch(KeyStateTemp1)
        {       
                case StateInit:                                                        //按鍵初始狀態
                        if(!KeyPressTemp1)                                        //當按鍵按下,狀態切換到確認態
                                KeyStateTemp1 = StateAffirm;
                        break;
               
                case StateAffirm:                                                //按鍵確認態
                        if(!KeyPressTemp1)
                        {
                                KeyTime = 0;
                                KeyStateTemp1 = StateSingle;        //切換到單次觸發態       
                        }
                        else KeyStateTemp1 = StateInit;         //按鍵已抬起,切換到初始態
                        break;
       
                case StateSingle:                                                //按鍵單發態
                        if(KeyPressTemp1)                                        //按下時間小于1s
                        {
                                KeyStateTemp1 = StateInit;          //按鍵釋放,則回到初始態
                                                TR0 = !TR0;
                                                LED = 1;                                //關閉LED
               
                        }
                        else if(++KeyTime > 100)                        //按下時間大于1s(100*10ms)
                        {
                                KeyStateTemp1 = StateRepeat;        //狀態切換到連發態
                                KeyTime = 0;       
                        }
                        break;
               
                case StateRepeat:                                                //按鍵連發態               
                        if(KeyPressTemp1)
                                KeyStateTemp1 = StateInit;                //按鍵釋放,則進初始態
                        else                                                                //按鍵未釋放
                        {
                                if(++KeyTime > 10)                                //按鍵計時值大于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;
        }
}


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


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

}

評分

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

查看全部評分

回復

使用道具 舉報

ID:192911 發表于 2017-4-24 06:46 | 顯示全部樓層
學習              了
回復

使用道具 舉報

ID:231147 發表于 2017-9-7 11:05 | 顯示全部樓層
剛接觸單片機,請多多關照
回復

使用道具 舉報

ID:159139 發表于 2017-9-9 11:33 來自手機 | 顯示全部樓層
學習學習狀態機按鍵,感謝樓主的分享。
回復

使用道具 舉報

ID:254251 發表于 2017-12-26 16:04 | 顯示全部樓層
再加上掉電模式就完美了 ,誰改好我10RMB以上
回復

使用道具 舉報

ID:89286 發表于 2017-12-26 18:09 | 顯示全部樓層
thanks for sharing
回復

使用道具 舉報

ID:243748 發表于 2017-12-30 21:26 來自手機 | 顯示全部樓層
樓主可以提供下程序包嗎
回復

使用道具 舉報

ID:190152 發表于 2017-12-31 23:00 | 顯示全部樓層
這個不錯,正想做個調光臺燈
回復

使用道具 舉報

ID:140489 發表于 2018-1-2 10:08 | 顯示全部樓層
wuxishun 發表于 2017-12-30 21:26
樓主可以提供下程序包嗎

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

使用道具 舉報

ID:135735 發表于 2018-1-31 18:05 | 顯示全部樓層
不錯,我什么時候才達到這樣的水平
回復

使用道具 舉報

ID:272625 發表于 2018-2-2 04:24 來自手機 | 顯示全部樓層
好資料,有實用價值!
回復

使用道具 舉報

ID:280434 發表于 2018-2-2 15:38 | 顯示全部樓層
不錯。學習中。
回復

使用道具 舉報

ID:91521 發表于 2018-2-16 19:45 | 顯示全部樓層
大哥,好厲害!
回復

使用道具 舉報

ID:269211 發表于 2018-2-17 11:15 | 顯示全部樓層
謝謝樓主分享
回復

使用道具 舉報

ID:284003 發表于 2018-2-17 14:54 | 顯示全部樓層
很好用,謝謝樓主,辛苦了!
回復

使用道具 舉報

ID:36328 發表于 2019-1-14 19:56 | 顯示全部樓層
狀態機處理好
回復

使用道具 舉報

ID:140183 發表于 2019-2-22 12:57 | 顯示全部樓層
今天測試了一下.效果很好!謝謝分享!
回復

使用道具 舉報

ID:74145 發表于 2019-4-8 10:51 | 顯示全部樓層
這個確實好
回復

使用道具 舉報

ID:14052 發表于 2019-4-20 20:15 | 顯示全部樓層
學習學習
回復

使用道具 舉報

ID:543809 發表于 2019-5-25 10:39 | 顯示全部樓層
請問有原理圖嗎
回復

使用道具 舉報

ID:571570 發表于 2019-6-25 11:15 來自手機 | 顯示全部樓層
老哥有沒有仿真圖,求發到2621904761@qq.com郵箱,謝謝
回復

使用道具 舉報

ID:826754 發表于 2020-11-21 17:35 | 顯示全部樓層
學習了,想做LED燈的PWM調光,但不知道怎樣編程。
回復

使用道具 舉報

ID:577329 發表于 2020-11-22 15:23 | 顯示全部樓層
為什么我復制代碼,在keil4中編譯失敗?
回復

使用道具 舉報

ID:66287 發表于 2020-11-24 15:33 | 顯示全部樓層
無標題.jpg
IO口操作仿真.rar (15.05 KB, 下載次數: 14)
回復

使用道具 舉報

ID:848824 發表于 2020-12-16 16:30 | 顯示全部樓層
剛試驗了好用,感謝。
回復

使用道具 舉報

ID:848824 發表于 2021-2-17 17:53 | 顯示全部樓層
這個可以控制可控硅嗎
回復

使用道具 舉報

ID:848824 發表于 2021-2-27 04:07 來自手機 | 顯示全部樓層
這個能控制可控硅調壓嗎
回復

使用道具 舉報

ID:859852 發表于 2021-2-27 22:14 來自手機 | 顯示全部樓層
好,好好學習了,學習了 。這個資料非常實用
回復

使用道具 舉報

ID:839438 發表于 2021-6-3 21:41 | 顯示全部樓層
一直找類似的按鍵
回復

使用道具 舉報

ID:143767 發表于 2024-11-22 17:36 | 顯示全部樓層
這個程序我搭建電路試了一下,功能正常,但是LED一上電就亮,沒有使用價值,怎樣改成一上電是不亮的就好了,哪位高手指導一下,謝謝!
回復

使用道具 舉報

ID:6467 發表于 2024-12-24 23:06 | 顯示全部樓層
一直找類似的按鍵;;這個資料非常實用
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av在线一区二区三区 | 亚洲激情一区二区 | 日韩 欧美 二区 | 亚洲国产精品区 | 久久久久久久久91 | 国产精品国产a级 | 午夜99 | 91在线播 | 久久综合一区二区三区 | 欧美黄在线观看 | 国产免费看 | 丁香久久| 国产精品亚洲成在人线 | 韩国av影院| 日韩色图视频 | 一区二区高清 | 欧美三级在线 | 91久久精品一区二区二区 | 亚洲成人一区 | 亚洲一区二区在线播放 | 亚洲精品在线播放 | 国产精品一区二区久久 | 古装三级在线播放 | 一区二区不卡 | 国产黄色av电影 | 狠狠草视频 | 成人av高清 | 欧美激情精品久久久久久 | 国产乱人伦 | 国产一区免费视频 | 成人亚洲一区 | 亚洲免费在线 | 夜色www国产精品资源站 | 久久久久久久久久久久亚洲 | 欧美福利 | 欧美日韩综合 | 在线免费观看视频你懂的 | 亚洲综合一区二区三区 | 狠狠婷婷综合久久久久久妖精 | 欧美精品在线一区二区三区 | 欧美成人高清视频 |