新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 最牛的LED遙控控制器---調整無閃爍

        最牛的LED遙控控制器---調整無閃爍

        作者: 時間:2016-11-29 來源:網絡 收藏

        /****************************************/
        /***********遙控解碼低電平檢測***********/
        /****************************************/
        uint Low()
        {
        TL0=0;
        TH0=0;
        TR0=1;
        while(!IR&&(TH0&0x80)==0);
        TR0=0;
        return TH0*256+TL0;
        }
        /****************************************/
        /***********遙控解碼高電平檢測***********/
        /****************************************/
        uint High()
        {
        TL0=0;
        TH0=0;
        TR0=1;
        while(IR&&(TH0&0x80)==0);
        TR0=0;
        return TH0*256+TL0;
        }
        /****************************************/
        /************AD轉換處理子函數************/
        /****************************************/
        void ADzhuan()
        {
        if(!power)//如果此標志位為1,則執行AD轉換
        dat = adzhang1();
        }
        /****************************************/
        /**************LED閃爍子函數*************/
        /****************************************/
        void LEDflash()
        {
        if(flash==1)//如果此標志位為1,則執行閃爍程序
        {
        if(flashnum>=(shudu*800))//定時器時間到了嗎?
        {
        bit kl;//定義一個標志位
        flashnum=0;//到了就清0
        kl=~kl;//將它取反,以便形成亮滅變化
        if(kl==0)//如果為1,就讓LED亮
        dat=100;//等級為100,就最亮
        else//否則滅
        dat=0;//等級為0就為熄滅
        }
        }
        }
        /****************************************/
        /**************LED漸變子函數*************/
        /****************************************/
        void LEDjian()
        {
        if(jian==1)//如果此標志位為1,則執行漸變程序
        {
        bit a;//定義一個標志位
        if(flashnum>=(shudu*100))//定時器時間到了嗎?
        {
        flashnum=0;//到了就清0
        if(a==0)//如果為0就執行漸亮子函數
        {
        dat++;//時間到了就自動加1
        if(dat>100)//如果加到大于100
        {
        a=1;//將標志位變為1
        dat=100;//將變量變為最亮狀態
        }
        }
        else//如果a為1就執行漸暗子函數
        {
        dat--;//時間到了就自動減1
        if(dat<(0-1))//如果減到小于0了,就將它變為0
        {
        a=0;//標志位變為0,以便執行漸亮子函數
        dat=0;
        }
        }
        }
        }
        }

        本文引用地址:http://www.104case.com/article/201611/323378.htm

        /**********************************************/
        /**************LED綜合子函數*************/
        /**********************************************/
        void zonghe()
        {
        uchar ci,ii;
        bit a,fla;//定義一個標志位
        bit kl;//定義一個標志位
        if(zeng==1)
        {
        if(flashnum>=(shudu*100))//定時器時間到了嗎?
        {
        flashnum=0;
        ii++;
        if(ii>7)
        {
        ii=0;
        if(fla==1)
        {

        kl=~kl;//將它取反,以便形成亮滅變化
        if(kl==0)//如果為1,就讓LED亮
        dat=100;//等級為100,就最亮
        else//否則滅
        dat=0;//等級為0就為熄滅
        ci++;
        if(ci>=30)
        {
        ci=0;
        fla=0;
        }
        }
        }
        if(fla==0)
        {
        if(a==0)//如果為0就執行漸亮子函數
        {
        dat++;//時間到了就自動加1
        if(dat>100)//如果加到大于100
        {
        a=1;//將標志位變為1
        dat=100;//將變量變為最亮狀態
        }
        }
        else//如果a為1就執行漸暗子函數
        {
        dat--;//時間到了就自動減1
        if(dat<(0-1))//如果減到小于0了,就將它變為0
        {
        a=0;//標志位變為0,以便執行漸亮子函數
        dat=0;
        ci++;
        if(ci>=4)
        {
        fla=1;
        ci=0;
        }
        }
        }
        }
        }
        }
        }
        /****************************************/
        /************遙控解碼核心部分************/
        /****************************************/
        void decode()
        {
        while(1)
        {
        restart:
        while(IR)/******空閑時處理其它的事情,即當遙控沒有按下時,處理其它事情******/
        {
        ADzhuan();
        LEDflash();
        LEDjian();
        zonghe();
        }/******空閑時處理其它的事情,即當遙控沒有按下時,處理其它事情******/
        temp=Low();
        if(tempc(9500)) continue;//引導脈沖低電平9000
        temp=High();
        if(tempc(5000)) continue;//引導脈沖高電平4500
        for(i=0;i<4;i++) //4個字節
        {
        for(j=0;j<8;j++) //每個字節8位
        {
        temp=Low();
        if(tempc(800)) goto restart;
        temp=High();
        if(tempc(2000)) goto restart;
        IRBUF[i]>>=1;
        if(temp>c(1120))
        {
        IRBUF[i]|=0x80;

        }
        }
        }
        return;
        }

        }
        /****************************************/
        /*********遙控解碼鍵值處理子函數********/
        /****************************************/
        void numzhi()
        {
        switch(IRBUF[2])//判斷數組2鍵值注:因為只有第2組才是按鍵碼,所以判斷數組2

        {
        /****************如果此鍵按下了,則遙控開關機****************11111**/
        case 0x58:
        flag=~flag;
        if(flag==0)
        dat=100;//dat為100時最亮
        else
        dat=0;//為0時熄滅
        jian=0;//將漸變變量置0,以防止漸變子程序動作
        flash=0;//將閃爍變量置0,以防止跳變子程序動作
        zeng=0;//將綜合程序變量置0,以防止綜合子程序動作
        break;

        /***如果此鍵按下了,每按一次亮度會增加1個等級 共為100等級**22222**/
        case 0x1b:if(flag==0)
        {

        dat+=dengji;
        if(dat>=100)
        dat=100;
        jian=0;//將漸變變量置0,以防止漸變子程序動作
        flash=0;//將閃爍變量置0,以防止跳變子程序動作
        zeng=0;//將綜合程序變量置0,以防止綜合子程序動作
        }
        break;

        /***如果此鍵按下了,每按一次亮度會減小1個等級 共為100等級**33333**/
        case 0x1f:if(flag==0)
        {
        dat-=dengji;
        if(dat<=(0-1))
        dat=0;
        jian=0;//將漸變變量置0,以防止漸變子程序動作
        flash=0;//將閃爍變量置0,以防止跳變子程序動作
        zeng=0;//將綜合程序變量置0,以防止綜合子程序動作

        }
        break;

        /***每按一次跳變和漸變速度會減小1個等級 共為60等級,并寫入改變的數值,以便開機記憶**44444**/
        case 0x0f:if(flag==0)
        {
        shudu-=1;
        if(shudu<=1)
        shudu=1;
        sector(0x0200);//擦除EEPROM,擦除地址為0X200
        write(0x0200,shudu);//寫入EEPROM,寫入地址為0X200
        }
        break;

        /***每按一次跳變和漸變速度會增加1個等級 共為60等級,并寫入改變的數值,以便開機記憶**55555**/
        case 0x1a:if(flag==0)
        {
        shudu+=1;
        if(shudu>=30)
        shudu=30;
        sector(0x0200);//擦除EEPROM,擦除地址為0X200
        write(0x0200,shudu);//寫入EEPROM,寫入地址為0X200
        }
        break;

        /*********如果此鍵按下了,則執行手動調光與遙控切換,兩者不能同時工作***********66666**/
        case 0x1e:if(flag==0)
        {
        flash=1;//進入遙控后,讓它先進入關機狀態
        dat=0;
        power=~power;//手動調光與遙控切換標志位
        jian=0;//將漸變變量置0,以防止漸變子程序動作
        flash=0;//將閃爍變量置0,以防止跳變子程序動作
        zeng=0;//將綜合程序變量置0,以防止綜合子程序動作
        }
        break;

        /***********************如果此鍵按下了,則執行漸變子函數*******************77777**/
        case 0x0e:if(flag==0)
        {
        jian=~jian;
        dat=0;
        flash=0;//將閃爍變量置0,以防止跳變子程序動作
        zeng=0;//將綜合程序變量置0,以防止綜合子程序動作
        }
        break;
        /***********************如果此鍵按下了,則執行跳變子函數*******************88888**/
        case 0x19:if(flag==0)
        {
        flash=~flash;
        dat=0;
        jian=0;//將漸變變量置0,以防止漸變子程序動作
        zeng=0;//將綜合程序變量置0,以防止綜合子程序動作
        }
        break;
        case 0x1d:if(flag==0)
        {
        zeng=~zeng;
        dat=0;
        }
        break;

        }
        }
        /****************************************/
        /***************主程序部分***************/
        /****************************************/
        main()
        {
        TMOD=0x11;//設置定時器0定時器1工作方式為1的狀態下工作
        EA=1;

        TR0=1;//設置定時器0
        ET0=1;
        TL0=0;
        TH0=0;

        TR1=1;//設置定時器1
        ET1=1;
        TH1=(65536-20)/256; //定時器初值
        TL1=(65536-20)%256;
        shudu=read(0x0200);//開機讀取EEPROM里面的速度變量shudu,從而形成斷電記憶功能
        while(1)
        {
        decode();//調用解碼子函數
        numzhi();//調用遙控鍵值子函數
        }
        }
        /****************************************/
        /***************定時器1部分**************/
        /****************************************/
        void zhong3() interrupt 3 //利用PWM來改變亮度
        {

        TH1=(65536-20)/256; //定時器0設定約1000us中斷一次
        TL1=(65536-20)%256;
        num++;//PWM定時器
        flashnum++;//閃爍漸變變量
        if(num>=100)//此PWM等級為100,它由變量num與dat完成
        num=0;
        if(numLED=0;//如果計數器變量小于PWM時,LED亮
        else
        LED=1;

        }
        /****************************************/
        /***************定時器0部分**************/
        /****************************************/
        void zhong1() interrupt 1//用來產生遙控解碼計時
        {
        TL0=0;
        TH0=0;
        }


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 芜湖市| 奉贤区| 锡林郭勒盟| 望城县| 墨竹工卡县| 师宗县| 兴国县| 永德县| 昌平区| 平乡县| 宜阳县| 吴川市| 囊谦县| 伊金霍洛旗| 津市市| 常德市| 定安县| 布拖县| 潢川县| 鲁山县| 罗源县| 稷山县| 凤翔县| 渝中区| 宾川县| 文登市| 阳高县| 湾仔区| 盐边县| 和龙市| 安国市| 沙湾县| 莱西市| 乌恰县| 呼玛县| 安岳县| 吴堡县| 隆尧县| 上饶县| 六枝特区| 遵化市|