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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5271|回復: 10
收起左側

單片機LED調光程序問題

  [復制鏈接]
ID:140489 發表于 2017-4-19 14:08 | 顯示全部樓層 |閱讀模式
現在用一個按鍵可以實現開燈、關燈,長按可以調光,但是調光要在關燈后,按一次按鍵開燈,在1秒內接著長按就可以調光,如果大于1秒再按按鍵就成關燈了;請大神幫忙看一下,怎么寫才能做到,短按開關燈,在開燈的時候,隨時長按都能進入調光狀態。
/*led1用高色溫, led2用低色溫,key_S2按鍵短按開關燈,長按調光調色溫 ,led1和led2的狀態相反
無級調光 ,亮到暗,暗到亮      

*/
#include <reg52.h>
unsigned char pwm_led_val = 0;//LED占空比值  0最亮
unsigned char pwm_t;// 周期
sbit led1 = P1^0;        //定義LED端口
sbit led2 = P1^7;
sbit key_s2 = P3^0;         //定義按鍵端口
void delay(unsigned int z)//毫秒級延時
{
        unsigned int x,y;
        for(x = z; x > 0; x--)
                for(y = 114; y > 0 ; y--);
}        

//定時器0中斷
void timer0() interrupt 1
{
        pwm_t++;
        if(pwm_t == 40)
        {
                pwm_t = 0; led1 = 1;        led2 = !led1;
        }
        if(pwm_led_val == pwm_t)
                led1 = 0; led2 = !led1;                                         
}
void main()
{   
        bit flag;          //亮度標志位

        TMOD |= 0x02;//8位自動重裝模塊
        TH0 = 240;
        TL0 = 240;//
        TR0 = 1;//啟動定時器0
        ET0 = 1;//允許定時器0中斷
        EA        = 1;//總中斷允許
        while(1)
        {
                  if(key_s2 == 0)
                   {
                    delay(10);
                    if(key_s2 == 0)         //確認按下

                     {
                           TR0 = !TR0;
                           P1 = 0xff;         //開關燈
                           delay(100);          //延時長一點
                             while(!key_s2) //如果按鍵還處于按下狀態,就進入調光
                           {
                              delay(10);

                                
                                        if(flag==0)
                                        {
                                                   if(pwm_led_val < 40)
                                                {
                                                        pwm_led_val++;                        //變暗
                                                        if(pwm_led_val >= 40)
                                                                flag=1;
                                                }
                                          }
                                 
                                  if(flag==1)
                                  {
                                           if(pwm_led_val > 0)
                                          pwm_led_val--;          //變亮
                                          if(pwm_led_val <=0)
                                            flag=0;
                                  }         
                                 }
                                 
                                 
                                }
                          }
                    
                 }
                 
  }         


回復

使用道具 舉報

ID:191208 發表于 2017-4-19 16:06 | 顯示全部樓層
寫的還是挺好的
回復

使用道具 舉報

ID:191208 發表于 2017-4-19 16:07 | 顯示全部樓層
還有別的代碼源程序嗎
回復

使用道具 舉報

ID:190228 發表于 2017-4-19 18:03 | 顯示全部樓層
寫的挺好的
回復

使用道具 舉報

ID:165962 發表于 2017-4-19 18:23 | 顯示全部樓層
應該沒有問題的
回復

使用道具 舉報

ID:140489 發表于 2017-4-20 08:50 | 顯示全部樓層
怎么沒有高手來看一下呢?這個問題困擾我好長時間了
回復

使用道具 舉報

ID:140489 發表于 2017-4-21 13:29 | 顯示全部樓層
用狀態機的編程思路,終于把這個功能實現了
/* ********************************************************************************************* */
// 處理器   : STC89C52RC
// 編譯環境 : Keil4 C51
// 系統時鐘 : 11.0592MHZ
// 簡單描述 : 1個獨立按鍵,短按開關燈,長按調光
/* ********************************************************************************************* */
#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();        //不停的檢測按鍵是否被按下
        }

}
回復

使用道具 舉報

ID:47933 發表于 2017-4-23 10:19 | 顯示全部樓層
真厲害,一個鍵這么多功能
回復

使用道具 舉報

ID:192838 發表于 2017-4-23 21:22 | 顯示全部樓層
好強啊
回復

使用道具 舉報

ID:417131 發表于 2019-7-31 15:29 | 顯示全部樓層
LED調光效果很重要,一般用指數調光方式。
回復

使用道具 舉報

ID:511461 發表于 2019-8-1 09:10 | 顯示全部樓層
謝謝樓主分享
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩1区2区| 午夜av影院 | 91在线导航 | 日韩国产免费 | 欧美一区二区三区在线 | 九九久久久 | 欧美日韩一区不卡 | 久久一二区 | 成人国产精品久久 | 在线啊v| 日韩精品在线看 | 2020国产在线| 91亚洲一区 | 精品一区国产 | 一区二区三区四区在线免费观看 | 黑人巨大精品欧美一区二区免费 | 日韩有码一区 | 99精品视频免费在线观看 | 五月婷婷激情 | 久久久.com | 91精品国产麻豆 | 女同av亚洲女人天堂 | 毛片免费观看 | 欧美久久国产精品 | www.日日操 | 亚洲成人国产综合 | 国产成在线观看免费视频 | 亚州精品成人 | 亚洲国产精品久久久 | 国产在线二区 | h视频在线观看免费 | 天堂资源最新在线 | 黄色一级特级片 | 成人在线视 | 久久精品国产一区二区三区 | 亚洲精品视频在线播放 | 午夜寂寞福利视频 | 精品欧美乱码久久久久久 | 超碰伊人久久 | 久久精品91久久久久久再现 | 一区二区三区四区国产 |