欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5649|回復(fù): 10
收起左側(cè)

單片機(jī)LED調(diào)光程序問題

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

*/
#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)//毫秒級延時(shí)
{
        unsigned int x,y;
        for(x = z; x > 0; x--)
                for(y = 114; y > 0 ; y--);
}        

//定時(shí)器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;          //亮度標(biāo)志位

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

                     {
                           TR0 = !TR0;
                           P1 = 0xff;         //開關(guān)燈
                           delay(100);          //延時(shí)長一點(diǎn)
                             while(!key_s2) //如果按鍵還處于按下狀態(tài),就進(jìn)入調(diào)光
                           {
                              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;
                                  }         
                                 }
                                 
                                 
                                }
                          }
                    
                 }
                 
  }         


回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

ID:165962 發(fā)表于 2017-4-19 18:23 | 顯示全部樓層
應(yīng)該沒有問題的
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

7#
無效樓層,該帖已經(jīng)被刪除
ID:140489 發(fā)表于 2017-4-21 13:29 | 顯示全部樓層
用狀態(tài)機(jī)的編程思路,終于把這個(gè)功能實(shí)現(xiàn)了
/* ********************************************************************************************* */
// 處理器   : STC89C52RC
// 編譯環(huán)境 : Keil4 C51
// 系統(tǒng)時(shí)鐘 : 11.0592MHZ
// 簡單描述 : 1個(gè)獨(dú)立按鍵,短按開關(guān)燈,長按調(diào)光
/* ********************************************************************************************* */
#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è)置定時(shí)器0工作模式2,8位自動重裝
        TH0 = 240;                                //定時(shí)器裝初值
        TL0 = 240;                                //11.0592M晶振下占空比最大比值是20,輸出2880HZ
        EA = 1;                                        //開總中斷
        ET0 = 1;                                //開定時(shí)器0中斷
        TR0 = 1;                                //啟動定時(shí)器0
}
void Timer1Init(void)
{
        TMOD |= 0x10;                        // 設(shè)置定時(shí)器1工作模式1,16位計(jì)數(shù)器
        TH1 = 0xDC;                                // 賦初始值
        TL1 = 0x00;                                // 11.0592M晶振下,定時(shí)10ms
        TR1 = 1;                                // 啟動定時(shí)器1
}

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

//定時(shí)器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)臨時(shí)存儲值1
        static uChar8 KeyTime = 0;                                        //按鍵延時(shí)時(shí)間
        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)                                        //按下時(shí)間小于1s
                        {
                                KeyStateTemp1 = StateInit;          //按鍵釋放,則回到初始態(tài)
                                                TR0 = !TR0;
                                                LED = 1;                                //關(guān)閉LED
               
                        }
                        else if(++KeyTime > 100)                        //按下時(shí)間大于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ì)時(shí)值大于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)                                        //定時(shí)器1溢出
        {
                TF1 = 0;
                TH1 = 0xDC;
                TL1 = 0x00;
                KeyScan();
        }
}


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

}
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

ID:192838 發(fā)表于 2017-4-23 21:22 | 顯示全部樓層
好強(qiáng)啊
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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