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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8924|回復: 3
打印 上一主題 下一主題
收起左側

用遙控器上的1-4鍵分別控制8個LED燈的點亮、變亮、變暗和熄滅的程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:89720 發表于 2015-9-10 16:12 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
求助各位大神,幫忙看以下的程序。用遙控器上的2和3鍵沒有辦法調節8個LED燈的亮度。是什么原因?



/*-----------------------------------------------
名稱:按下遙控器的1鍵,8個LED燈會亮;按2鍵,會慢慢變亮,亮到最高時,蜂鳴器響;按3鍵,會慢慢變暗,暗道最低時,蜂鳴器會響;按4鍵,8個LED燈全滅。

內容:遙控器控制8個LED燈亮,滅和調光
------------------------------------------------*/
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char


sbit ir=P3^2;
sbit fm=P2^3;  

uchar irtime;
bit irprosok,irok;
uchar ircode[4];
uchar irdata[33];
uchar startflag;
uchar  bitnum;
uchar pwm,num;

void delay(uint ms)      //ms級延時函數,只在蜂鳴器子函數中用到了
{
        uchar i;
        while(ms--)
        {
                for(i=0;i<120;i++);
        }
}

void bee()              //蜂鳴器子函數
{
        fm=0;
        delay(100);
        fm=1;
        delay(100);
}

void keyscan2()                        //PWM占空比增加的子函數,把18ms的脈寬分成了36等分,每一等分是0.5ms,讓定時器1每0.5ms中斷一次
{

        if(pwm<36)
                {
                        pwm++;
                        delay(100);
                }
        else
                {
                        bee();
                }

}

void keyscan3()                        //PWM占空比減少的子函數
{

        if(pwm>1)
                {
                        pwm--;
                        delay(100);
                }
        else
                {
                        bee();
                }
}


void init_t1()                        //定時器1的初始化子函數,讓定時器每0.5ms溢出中斷一次
{
        TMOD=0x10;
        TH1=(65536-500)/256;
        TL1=(65536-500)%256;
        EA=1;
        ET1=1;
        TR1=1;
}

void t1() interrupt 3                //定時器1的中斷函數,每中斷1次,判斷num的值與當前的pwm值,如果小于,則輸出高電平
{
        TR1=0;
        TH1=(65536-500)/256;
        TL1=(65536-500)%256;
        num++;
        if(num>32)
        {
                num=0;
        }
        if(num<=pwm)
        {
                P1=0xff;
        }
        else
        {
                P1=0x00;
        }
        TR1=1;
}

void led()                                               
{
        init_t1();
        num=0;
        pwm=16;
        while(1)
        {
                keyscan2();
                keyscan3();
        }
}


void timer0init(void)//定時器0初始化 256*(1/12m)*12=0.256ms
{

  TMOD=0x02;//定時器0工作方式2,TH0是重裝值,TL0是初值
  TH0=0x00; //重載值
  TL0=0x00; //初始化值
  ET0=1;    //開中斷
  TR0=1;   
}


void tim0_isr (void) interrupt 1 using 1  //定時器0中斷服務函數
{
  irtime++;  //用于計數2個下降沿之間的時間
}


void int0init(void)  //外部中斷0初始化
{
IT0 = 1;   //指定外部中斷0下降沿觸發,INT0 (P3.2)
EX0 = 1;   //使能外部中斷
EA = 1;    //開總中斷
}


void int0 () interrupt 0 //外部中斷0服務函數
{
if(startflag)
{
  if(irtime>32&&irtime<63)  //8-16ms
        {
           bitnum=0;
        }
        irdata[bitnum]=irtime;
        irtime=0;
        bitnum++;
        if(bitnum==33)
          {
           bitnum=0;
           irok=1;
          }
}
else
{
irtime=0;
startflag=1;
}
}


void irpros(void) // 紅外碼值處理
{
        uchar mun,k,i,j;
        k=1;
        for(j=0;j<4;j++)
        {
                for(i=0;i<8;i++)
                {
                        mun=mun>>1;
                        if(irdata[k]>6)
                        {
                                mun=mun | 0x80;
                        }
                                k++;
                }
                ircode[j]=mun;
        }
        irprosok=1;
}


void ir_work(void) //紅外鍵值處理
{
        switch(ircode[2])   //判斷第三個數碼值
                 {
                         case 0x0c:P1=0x00;break;//    按鍵1 點亮8個LED燈
                         case 0x18:led();break;//      按鍵2 讓8個LED燈變亮
                         case 0x5e:led();break;//      按鍵3 讓8個LED燈變暗
                         case 0x08:P1=0xff;break;//4   按鍵4 熄滅8個LED燈
             default:break;
                         }
                  irprosok=0;//處理完成標志
  }


void main(void)
{
int0init(); //初始化外部中斷
timer0init();//初始化定時器


while(1)//主循環
   {
    if(irok)       //如果接收好了進行紅外處理
          {   
           irpros();
           irok=0;
          }

    if(irprosok)  //如果處理好后進行工作處理
          {
           ir_work();
            }
   }
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:78515 發表于 2015-9-11 08:47 | 只看該作者
你的接收用的什么解碼的,也是單片機嗎?
回復

使用道具 舉報

板凳
ID:89720 發表于 2015-9-12 15:52 | 只看該作者
有沒有大神在?幫我看看我的程序是哪里出現了問題。
回復

使用道具 舉報

地板
ID:89720 發表于 2015-9-12 15:53 | 只看該作者
安陽市新世紀 發表于 2015-9-11 08:47
你的接收用的什么解碼的,也是單片機嗎?

我也不是很懂,是在淘寶上買好的開發板。STC89C52的單片機。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产精品久久 | 欧美日韩在线免费 | 日韩视频区 | 亚洲精品电影在线 | 日韩av一区二区在线观看 | 国产精品国产精品国产专区不卡 | 国产精品美女久久久久aⅴ国产馆 | 亚洲国产aⅴ成人精品无吗 国产精品永久在线观看 | 午夜视频在线观看网站 | 亚洲视频欧美视频 | 色婷婷av777| 国产精品久久国产愉拍 | 午夜国产一级片 | 欧美a∨ | av先锋资源| 精品国产伦一区二区三区观看体验 | 亚洲成人国产 | 国产高清久久久 | 成人福利在线观看 | 国内精品久久精品 | 国产成人高清视频 | 国产乱码久久久久久一区二区 | 五月激情婷婷六月 | 久久精品91久久久久久再现 | 日韩欧美专区 | 日韩视频在线免费观看 | 国产91 在线播放 | 国产黄色大片 | 欧美午夜一区 | 日韩一区二区三区在线 | 伦理二区 | 国产精品一级 | 欧美日韩精品区 | 香蕉av免费 | 国产精品一区二区av | 日韩一区精品 | 色综合99 | 亚洲 中文 欧美 日韩 在线观看 | 久久亚洲欧美日韩精品专区 | 国产精品高清一区二区三区 | 婷婷激情在线 |