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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

求大神幫忙看代碼,開發(fā)板上用紅外遙控控制P1口的8個LED燈調(diào)光的程序

[復(fù)制鏈接]
ID:89720 發(fā)表于 2015-10-8 19:50 | 顯示全部樓層 |閱讀模式
本帖最后由 zql_0711 于 2015-10-8 19:57 編輯

求助大神:
       用51開發(fā)板上的遙控器1-4鍵,來控制P1口的8個LED流水燈點亮、變亮、變暗和熄滅的程序。
代碼如下: 現(xiàn)在情況是上電后8個流水燈就是點亮狀態(tài),然后按遙控器上的1-4鍵全都沒反應(yīng)。
是什么問題呢?




/*-----------------------------------------------
名稱:紅外遙控調(diào)光

內(nèi)容:按配套遙控器上的1-4按鍵分別控制P1接口的8個LED燈點亮、變暗、變亮和熄滅的程序,PWM信號的周期是16ms
------------------------------------------------*/
#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)   //延時函數(shù)
{
        uchar i;
        while(ms--)
        {
                for(i=0;i<120;i++);
        }
}

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

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中斷服務(wù)函數(shù)
{
  irtime++;          //用于計數(shù)2個下降沿之間的時間
}


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

void timer1init()                                //定時器1初始化,讓定時器1每隔500ms中斷一次
{
        TMOD=0x01;
        TH1=(65536-500)/256;
        TL1=(65536-500)%256;
        EA=1;
        ET1=1;
        TR1=1;
}

void int1() interrupt 3        //定時器500ms中斷一次后,進入此中斷函數(shù),讓num值每次加1,并判斷num與pwm值,若小于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 int0 () interrupt 0            //外部中斷0服務(wù)函數(shù)
{
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])         //判斷第三個數(shù)碼值
            {
                         case 0x0c:                                //按鍵1 點亮全部LED燈
                                {
                                        P1=0;
                                }
                         break;                                       

                         case 0x18:                                //按鍵2增加PWM,讓LED燈變亮               
                                {
                                        if(pwm<32)
                                        {
                                                pwm++;
                                                delay(100);
                                        }
                                        else                         //達(dá)到最高后蜂鳴器響
                                        {
                                                bee();
                                        }
                            }
                        break;                                

                        case 0x5e:                                //按鍵3減小PWM,讓LED燈變暗        
                                {
                                        if(pwm>1)
                                                {
                                                        pwm--;
                                                        delay(100);
                                                }
                                                else                        //達(dá)到最低后蜂鳴器響
                                                {
                                                        bee();
                                                }        
                                }
                        break;        
                        
                        case 0x08:P1=0xff;break;                        //按鍵4,熄滅全部LED燈

                        default:P1=0xff;break;                         //默認(rèn)值,默認(rèn)上電后LED燈是熄滅狀態(tài)
                }         
                  irprosok=0;//處理完成標(biāo)志
}


void main(void)
{
         int0init();            //初始化外部中斷
    timer0init();           //初始化定時器
        timer1init();
        pwm=0;
        num=0;
        while(1)            //主循環(huán)
                {
                if(irok)          //如果接收好了進行紅外處理
                  {   
                   irpros();
                   irok=0;
                  }
               
                if(irprosok)       //如果處理好后進行工作處理
                  {
                   ir_work();
                  }
                }
}



回復(fù)

使用道具 舉報

ID:88716 發(fā)表于 2015-10-9 11:01 | 顯示全部樓層
1.你用定時器1,每500us(而不是你注釋的500毫秒!)進入定時器1中斷,因為你初始化num=0,PWM=0;而num值會隨著每次中斷加1(500us),而PWM值只在外部中斷0產(chǎn)生的情況下(即按下遙控器時,而引導(dǎo)碼就已經(jīng)9ms+4.5ms了),導(dǎo)致num值一直大于pwm值,一直執(zhí)行 P1=0x00 所以流水燈一直亮
2.建議不要這么定義uchar  bitnum;  含有bit關(guān)鍵詞,一不小心容易出錯。
3、最好設(shè)置中斷優(yōu)先級PT1=1;
回復(fù)

使用道具 舉報

ID:89720 發(fā)表于 2015-10-9 11:20 | 顯示全部樓層
hzb123 發(fā)表于 2015-10-9 11:01
1.你用定時器1,每500us(而不是你注釋的500毫秒!)進入定時器1中斷,因為你初始化num=0,PWM=0;而num值會 ...

謝謝hzb123前輩,我懂你所說的前面第一點和第二點了。第三點中斷優(yōu)先級我之前沒接觸過。等下我仔細(xì)上網(wǎng)了解下。另外,我改過程序了,程序能正常運行,但是只能做幾段的分段調(diào)光,PWM連續(xù)調(diào)光怎么我都做不出來。還請你指點下。


/*-----------------------------------------------
名稱:紅外遙控調(diào)光

內(nèi)容:按配套遙控器上的1-4按鍵分別控制P1接口的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)   //延時函數(shù)
{
        uchar i;
        while(ms--)
        {
                for(i=0;i<120;i++);
        }
}

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

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

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

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


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

void timer1init()                                //定時器1初始化,讓定時器1每隔500ms中斷一次
{
        TMOD=0x12;
        TH1=(65536-500)/256;
        TL1=(65536-500)%256;
        EA=1;
        ET1=1;
        TR1=1;
}

void int1() interrupt 3        //定時器500us中斷一次后,進入此中斷函數(shù),讓num值每次加1,并判斷num與pwm值,若小于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 int0 () interrupt 0 //外部中斷0服務(wù)函數(shù)
{
        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])   //判斷第三個數(shù)碼值
            {
                         case 0x0c:                                //按鍵1 點亮全部LED燈
                                {
                                        pwm=0;
                                }
                         break;                                       

                         case 0x18:                                //按鍵2增加PWM,讓LED燈變亮-----這里的程序不知道該怎么寫,寫了好幾遍都不能進行PWM調(diào)光       
                                {
                                        for(pwm=32;pwm>0;pwm--);
                            }
                        break;                               

                        case 0x5e:                                //這個是按鍵3,讓LED變成30%的亮度,即分段調(diào)光
                                {
                                        pwm=23;
                                }
                        break;       
                       
                        case 0x08:pwm=32;break;                        //按鍵4,熄滅全部LED燈

            default:pwm=32;break;                         //默認(rèn)值,默認(rèn)上電后LED燈是熄滅狀態(tài)
                }         
                  irprosok=0;//處理完成標(biāo)志
}


void main(void)
{
        int0init(); //初始化外部中斷
    timer0init();//初始化定時器
        timer1init();
        num=0;
        pwm=32;   //讓PWM值是32,即讓單片機上電后LED流水燈的狀態(tài)是熄滅的。
        while(1)//主循環(huán)
                {
                if(irok)       //如果接收好了進行紅外處理
                  {   
                   irpros();
                   irok=0;
                  }
               
                if(irprosok)  //如果處理好后進行工作處理
                  {
                   ir_work();
                  }
                }
}
  
  
回復(fù)

使用道具 舉報

ID:89720 發(fā)表于 2015-10-9 11:37 | 顯示全部樓層
hzb123 發(fā)表于 2015-10-9 11:01
1.你用定時器1,每500us(而不是你注釋的500毫秒!)進入定時器1中斷,因為你初始化num=0,PWM=0;而num值會 ...

hzb123前輩,謝謝你的回復(fù)。對于你的第1點和第2點我已經(jīng)明白了,第3點中斷優(yōu)先級以前我沒接觸過,等下仔細(xì)查查這方面資料。
我現(xiàn)在改過程序,程序如下:程序可以實現(xiàn)按鍵分段調(diào)光,即按下按鍵3,LED燈是30%的亮度,但是怎么也實現(xiàn)不了pwm連續(xù)調(diào)光。請幫忙看下。重點在case:0x18這一段調(diào)光。這個該怎么寫呢?

/*-----------------------------------------------
名稱:紅外遙控調(diào)光

內(nèi)容:按配套遙控器上的1-4按鍵分別控制P1接口的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)   //延時函數(shù)
{
        uchar i;
        while(ms--)
        {
                for(i=0;i<120;i++);
        }
}

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

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

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

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


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

void timer1init()                                //定時器1初始化,讓定時器1每隔500ms中斷一次
{
        TMOD=0x12;
        TH1=(65536-500)/256;
        TL1=(65536-500)%256;
        EA=1;
        ET1=1;
        TR1=1;
}

void int1() interrupt 3        //定時器500us中斷一次后,進入此中斷函數(shù),讓num值每次加1,并判斷num與pwm值,若小于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 int0 () interrupt 0 //外部中斷0服務(wù)函數(shù)
{
        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])   //判斷第三個數(shù)碼值
            {
                         case 0x0c:                                //按鍵1 點亮全部LED燈
                                {
                                        pwm=0;
                                }
                         break;                                       

                         case 0x18:                                //按鍵2增加PWM,讓LED燈變亮-----這里的程序不知道該怎么寫,寫了好幾遍都不能進行PWM調(diào)光       
                                {
                                        for(pwm=32;pwm>0;pwm--);
                            }
                        break;                               

                        case 0x5e:                                //這個是按鍵3,讓LED變成30%的亮度,即分段調(diào)光
                                {
                                        pwm=23;
                                }
                        break;       
                       
                        case 0x08:pwm=32;break;                        //按鍵4,熄滅全部LED燈

            default:pwm=32;break;                         //默認(rèn)值,默認(rèn)上電后LED燈是熄滅狀態(tài)
                }         
                  irprosok=0;//處理完成標(biāo)志
}


void main(void)
{
        int0init(); //初始化外部中斷
    timer0init();//初始化定時器
        timer1init();
        num=0;
        pwm=32;   //讓PWM值是32,即讓單片機上電后LED流水燈的狀態(tài)是熄滅的。
        while(1)//主循環(huán)
                {
                if(irok)       //如果接收好了進行紅外處理
                  {   
                   irpros();
                   irok=0;
                  }
               
                if(irprosok)  //如果處理好后進行工作處理
                  {
                   ir_work();
                  }
                }
}
  
  
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 99精品电影 | 久久精品成人 | 91精品国产91久久久久久三级 | 综合久久亚洲 | 一级片免费视频 | 久久久久久国产 | 羞羞视频免费观 | 欧美不卡网站 | h在线 | av网站在线免费观看 | 欧美一区二区三区四区在线 | 成人一区二区三区在线观看 | 久久综合久久自在自线精品自 | 久久99国产精品 | 国产一区二区三区四区五区加勒比 | 婷婷久久五月天 | 日韩在线精品视频 | 成人免费视频观看视频 | 天天操天天摸天天爽 | 亚洲精品日韩一区二区电影 | 久久伊人一区二区 | 国产成人精品免费 | 亚洲欧美日韩电影 | 一区二区三区四区在线视频 | 欧美亚洲视频在线观看 | 在线免费观看视频你懂的 | 夜夜草| 日韩影音 | 欧美一级片在线观看 | 亚洲国产欧美日韩 | 国产精品欧美一区喷水 | 欧美黄在线观看 | 99精品热视频 | 久久这里只有精品首页 | 一区二区三区在线观看免费视频 | 欧美在线色 | 国产精品久久久久久久久久久久久久 | 国产精品一区二区久久精品爱微奶 | 日韩欧美在线视频播放 | 亚洲欧洲在线看 | 亚洲精品一区二区三区中文字幕 |