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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2338|回復: 11
收起左側(cè)

單片機紅外遙控跟獨立按鍵怎樣實現(xiàn)同樣的功能?

[復制鏈接]
ID:899076 發(fā)表于 2022-6-10 14:03 | 顯示全部樓層 |閱讀模式
請教一下各位大佬,我想要紅外遙控跟一個獨立按鍵實現(xiàn)同樣的功能,但是不會整合。下面的代碼單獨使用紅外遙控或者獨立按鍵都能正常切換功能,但是整合到一起就不會了。本人初學者軟件寫的有點亂,望大佬們指點一二。

謝謝
  1. #include <reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. unsigned char irtime;//紅外用全局變量
  5. bit irpro_ok,irok;
  6. unsigned char IRcord[4];//用來存放用戶碼、用戶反碼、數(shù)據(jù)碼、數(shù)據(jù)反碼
  7. unsigned char irdata[33];//用來存放32位碼值

  8. typedef unsigned char u8;
  9. typedef unsigned int u16;

  10. u16 mode;

  11. sbit key = P3^4;

  12. void delay(u16 i)
  13. {
  14.         while(i--);
  15. }

  16. void tim0_isr()interrupt 1  //定時器0中斷服務函數(shù)
  17. {
  18.         irtime++;
  19. }

  20. void ex0_isr()interrupt 0   //外部中斷0服務函數(shù)
  21. {
  22.         static unsigned char i;
  23.         static bit startflag;
  24.         if(startflag)
  25.         {
  26.                 if(irtime<53&&irtime>=32)
  27.                 i=0;
  28.                 irdata[ i]=irtime;[ i]
  29.                 irtime=0;
  30.                 i++;
  31.                 if(i==33)
  32.                 {
  33.                         irok=1;
  34.                         i=0;
  35.                 }
  36.         }
  37.         else
  38.         {
  39.                 irtime=0;
  40.                 startflag=1;                        
  41.         }
  42. }

  43. void TIM0init()//定時器0初始化
  44. {
  45.         TMOD=0x02;//定時器0工作方式2,TH0是重裝值,TL0是初值
  46.         TH0=0x00;
  47.         TL0=0x00;
  48.                 EA=1;
  49.         ET0=1;//開總中斷
  50.         TR0=1;

  51.         IT0=1;
  52.         EX0=1;

  53. }
  54. void Ircordpro()//紅外碼值處理函數(shù)(關(guān)鍵函數(shù))
  55. {
  56.         unsigned char i,j,k=1;
  57.         unsigned char cord,value;

  58.         for(i=0;i<4;i++)                //處理4個字節(jié)
  59.         {
  60.                 for(j=1;j<=8;j++)         //處理1個字節(jié)8位
  61.                 {
  62.                         cord=irdata[k];
  63.                         value=value>>1;
  64.                         if(cord>7)value=value|0x80;//大于某值為1
  65.                         k++;
  66.                 }
  67.                 IRcord[ i]=value;[ i]
  68.                 value=0;
  69.         }
  70.         irpro_ok=1;//處理完畢標志位置1
  71. }

  72. void Key()                          //按鍵
  73. {
  74.         if(key==0)
  75.         {
  76.                 delay(1000);
  77.                 if(key==0)
  78.                 {
  79.                         mode++;
  80.                         if(mode==8)
  81.                         {
  82.                                 mode=0;
  83.                         }
  84.                         while(!key);
  85.                 }
  86.         }
  87. }

  88. void IR_LED()
  89. {
  90.         if(irok)
  91.         {                        
  92.                 Ircordpro();
  93.                 irok=0;
  94.         }
  95.         if(irpro_ok)//遙控成功接收
  96.         {                        
  97.                 switch(IRcord[2])
  98.                 {        
  99.                         case 0x04:P1 = 0x01; break;      //打開紅色LED
  100.                         case 0x05:P1 = 0x02; break;      //打開綠色LED
  101.                         case 0x06:P1 = 0x04; break;      //打開藍色LED
  102.                         case 0x07:P1 = 0x07; break;      //打開白色LED
  103.                         case 0x08:P1 = 0x03; break;      //打開紅綠色LED
  104.                         case 0x09:P1 = 0x05; break;      //打開紅藍色LED
  105.                         case 0x0a:P1 = 0x06; break;      //打開綠藍色LED
  106.                 }
  107.         }
  108. }

  109. void main()
  110. {        
  111.         TIM0init();
  112.         while(1)
  113.         {        
  114.                 Key();
  115.                 IR_LED();
  116.         }
  117. }        

復制代碼


回復

使用道具 舉報

ID:161164 發(fā)表于 2022-6-10 15:52 | 顯示全部樓層
  1. #include <reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. unsigned char irtime;//紅外用全局變量
  5. bit irpro_ok,irok;
  6. bit key_ok;//<<<<<<<<<<<<<<<<<<<<<<<<<<<
  7. unsigned char IRcord[4];//用來存放用戶碼、用戶反碼、數(shù)據(jù)碼、數(shù)據(jù)反碼
  8. unsigned char irdata[33];//用來存放32位碼值

  9. typedef unsigned char u8;
  10. typedef unsigned int u16;

  11. u16 mode;

  12. sbit key = P3^4;

  13. void delay(u16 i)
  14. {
  15.         while(i--);
  16. }

  17. void tim0_isr()interrupt 1  //定時器0中斷服務函數(shù)
  18. {
  19.         irtime++;
  20. }

  21. void ex0_isr()interrupt 0   //外部中斷0服務函數(shù)
  22. {
  23.         static unsigned char i;
  24.         static bit startflag;
  25.         if(startflag)
  26.         {
  27.                 if(irtime<53&&irtime>=32)
  28.                         i=0;
  29.                 irdata[ i]=irtime;
  30.                 [ i]
  31.                 irtime=0;
  32.                 i++;
  33.                 if(i==33)
  34.                 {
  35.                         irok=1;
  36.                         i=0;
  37.                 }
  38.         }
  39.         else
  40.         {
  41.                 irtime=0;
  42.                 startflag=1;
  43.         }
  44. }

  45. void TIM0init()//定時器0初始化
  46. {
  47.         TMOD=0x02;//定時器0工作方式2,TH0是重裝值,TL0是初值
  48.         TH0=0x00;
  49.         TL0=0x00;
  50.         EA=1;
  51.         ET0=1;//開總中斷
  52.         TR0=1;

  53.         IT0=1;
  54.         EX0=1;

  55. }
  56. void Ircordpro()//紅外碼值處理函數(shù)(關(guān)鍵函數(shù))
  57. {
  58.         unsigned char i,j,k=1;
  59.         unsigned char cord,value;

  60.         for(i=0; i<4; i++)              //處理4個字節(jié)
  61.         {
  62.                 for(j=1; j<=8; j++)       //處理1個字節(jié)8位
  63.                 {
  64.                         cord=irdata[k];
  65.                         value=value>>1;
  66.                         if(cord>7)value=value|0x80;//大于某值為1
  67.                         k++;
  68.                 }
  69.                 IRcord[ i]=value;
  70.                 [ i]
  71.                 value=0;
  72.         }
  73.         irpro_ok=1;//處理完畢標志位置1
  74. }

  75. void Key()                          //按鍵
  76. {
  77.         if(key==0)
  78.         {
  79.                 delay(1000);
  80.                 if(key==0)
  81.                 {
  82.                         key_ok = 1;//<<<<<<<<<<<<<<<<<<<<<<<<<<<
  83.                         mode++;
  84.                         if(mode==8)
  85.                         {
  86.                                 mode=0;
  87.                         }
  88.                         while(!key);
  89.                 }
  90.         }
  91. }

  92. void IR_LED()
  93. {
  94.         if(irok)
  95.         {
  96.                 Ircordpro();
  97.                 irok=0;
  98.         }
  99. }
  100. void Led_Control()//<<<<<<<<<<<<<<<<<<<<<<<<<<<
  101. {
  102.         static u8 Temp = 0;
  103.         if(irpro_ok)
  104.         {
  105.                 irpro_ok = 0;
  106.                 Temp = IRcord[2];
  107.         }
  108.         if(key_ok)
  109.         {
  110.                 key_ok = 0;
  111.                 Temp = mode+4;
  112.         }
  113.         switch(Temp)
  114.         {
  115.                 case 0x04:P1 = 0x01; break;      //打開紅色LED
  116.                 case 0x05:P1 = 0x02; break;      //打開綠色LED
  117.                 case 0x06:P1 = 0x04; break;      //打開藍色LED
  118.                 case 0x07:P1 = 0x07; break;      //打開白色LED
  119.                 case 0x08:P1 = 0x03; break;      //打開紅綠色LED
  120.                 case 0x09:P1 = 0x05; break;      //打開紅藍色LED
  121.                 case 0x0a:P1 = 0x06; break;      //打開綠藍色LED
  122.                 default:break;
  123.         }
  124. }
  125. void main()
  126. {
  127.         TIM0init();
  128.         while(1)
  129.         {
  130.                 Key();
  131.                 IR_LED();
  132.                 Led_Control();//<<<<<<<<<<<<<<<<<<<<<<<<<<<
  133.         }
  134. }

復制代碼


回復

使用道具 舉報

ID:213173 發(fā)表于 2022-6-10 16:27 | 顯示全部樓層
兩者能對同一個變量控制就整合到一起了。
回復

使用道具 舉報

ID:899076 發(fā)表于 2022-6-10 17:22 | 顯示全部樓層
wulin 發(fā)表于 2022-6-10 16:27
兩者能對同一個變量控制就整合到一起了。

就是不知道如何控制,能否給個示例呢。
回復

使用道具 舉報

ID:899076 發(fā)表于 2022-6-10 23:46 | 顯示全部樓層

感謝大佬,還有個問題請教一下。按照你的代碼下載進去之后發(fā)現(xiàn)上電時按下按鍵第一次的時候直接跳過第一個“case 0x04:P1 = 0x01; break;      //打開紅色LED”直接從第二行“case 0x05:P1 = 0x02; break;      //打開綠色LED”開始執(zhí)行。當case循環(huán)一周之后就又正常了。
回復

使用道具 舉報

ID:161164 發(fā)表于 2022-6-11 17:37 來自手機 | 顯示全部樓層
修羅_戰(zhàn) 發(fā)表于 2022-6-10 23:46
感謝大佬,還有個問題請教一下。按照你的代碼下載進去之后發(fā)現(xiàn)上電時按下按鍵第一次的時候直接跳過第一個 ...

大問題已幫你解決了
小問題就當是功課吧~
回復

使用道具 舉報

ID:899076 發(fā)表于 2022-6-16 18:31 | 顯示全部樓層
lkc8210 發(fā)表于 2022-6-11 17:37
大問題已幫你解決了
小問題就當是功課吧~

謝謝大佬,我把按鍵功能做到void Led_Control()里面問題解決了。

void Led_Control()//<<<<<<<<<<<<<<<<<<<<<<<<<<<
{
        static u8 Temp = 0;
        if(irok)
    {
        Ircordpro();
        irok=0;
    }
    if(irpro_ok)
    {
                irpro_ok = 0;
                Temp = IRcord[2];
    }
    if(key_ok)
    {
        key_ok = 0;
        Temp = mode+4;
                mode++;                          //*****************
                if(mode == 8)          //******************
                {                                  //*********************
                        mode = 0;          //************************
                }                                  //*****************

    }   
    switch(Temp)
    {
        case 0x04:P1 = 0x01; break;      //打開紅色LED
        case 0x05:P1 = 0x02; break;      //打開綠色LED
        case 0x06:P1 = 0x04; break;      //打開藍色LED
        case 0x07:P1 = 0x07; break;      //打開白色LED
        case 0x08:P1 = 0x03; break;      //打開紅綠色LED
        case 0x09:P1 = 0x05; break;      //打開紅藍色LED
        case 0x0a:P1 = 0x06; break;      //打開綠藍色LED
                case 0x0b:LED_R(); break;        //打開紅色LED呼吸
        default:break;
    }
}
回復

使用道具 舉報

ID:899076 發(fā)表于 2022-6-16 18:38 | 顯示全部樓層
lkc8210 發(fā)表于 2022-6-11 17:37
大問題已幫你解決了
小問題就當是功課吧~

但是我又有個疑惑,現(xiàn)在的按鍵功能是按循序依次往下實行的。比如
case 0x04: ................;break;
case 0x05: ................;break;
case 0x06: ................;break;
case 0x07: ................;break;
case 0x08: ................;break;
按循序依次往上+1,那么如果我0x05這行去掉之后按鍵就會空按一下才能跳到0x06這一行。這個又改怎樣做呢
大佬有空能否幫忙解答一下,謝謝
回復

使用道具 舉報

ID:161164 發(fā)表于 2022-6-16 21:17 | 顯示全部樓層
修羅_戰(zhàn) 發(fā)表于 2022-6-16 18:38
但是我又有個疑惑,現(xiàn)在的按鍵功能是按循序依次往下實行的。比如
case 0x04: ................;break;
...

case 0x04: ................;break;
case 0x05: Temp=0x06; mode = 2; break;
case 0x06: ................;break;
case 0x07: ................;break;
case 0x08: ................;break;
簡單粗爆
回復

使用道具 舉報

ID:383215 發(fā)表于 2022-6-16 22:30 | 顯示全部樓層
太亂了,基本上一點思路都沒有,最近我可能也要編類似的程序,想想沒有什么難度啊,板凳的說法是對的,兩者能對同一個變量控制就整合到一起了。可惜哪里有整合?基本編程思路,按鍵去抖動得到穩(wěn)定鍵值,紅外接收得到穩(wěn)定鍵值,這兩個鍵值共用一個全局變量,比如叫做key_ok,if(key_ok==某鍵值){key_ok=0;操作1;操作2},最關(guān)鍵就是查詢到一個穩(wěn)定鍵值之后,穩(wěn)定鍵值一定要清零,然后執(zhí)行相應的操作,這就要求按鍵去抖動和紅外接收要相當可靠,剩下的操作就簡單了,if語句太多可改為switch語句就完事了。
回復

使用道具 舉報

ID:899076 發(fā)表于 2022-6-17 09:59 | 顯示全部樓層
lkc8210 發(fā)表于 2022-6-16 21:17
case 0x04: ................;break;
case 0x05: Temp=0x06; mode = 2; break;
case 0x06: ......... ...

非常感謝大佬的指點,這樣做之后按鍵是正常的了。可是在紅外遙控上面0x05跟0x06就同時控制一個功能了
回復

使用道具 舉報

ID:264021 發(fā)表于 2022-7-8 18:46 | 顯示全部樓層
遙控某個鍵用A代表,獨立某個按鍵用B代表,if{(A==0x11)||(B==0)}{BEEP=0;}這樣簡單實現(xiàn)遙控和按鍵,A.B無論誰按下都能,控制蜂鳴器
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产欧美日韩一区二区三区 | 亚洲成年影院 | 精品成人一区二区 | 久久久成人动漫 | a免费在线 | 自拍偷拍亚洲一区 | 中文字幕乱码一区二区三区 | 性欧美hd | 日韩快播电影网 | 国产精品一区三区 | 国产区精品视频 | 成年人国产在线观看 | 日本一区二区三区在线观看 | 亚洲日本欧美日韩高观看 | 国产成人久久精品一区二区三区 | 亚洲精品国产精品国自产在线 | 视频一区二区在线观看 | 国产精品777一区二区 | 久久久久亚洲精品国产 | 日韩毛片播放 | 久久av网站 | 成人国内精品久久久久一区 | 91看片免费版 | 欧美精品乱码99久久影院 | 国产精品成人在线 | 国产在线视频在线观看 | 中文字幕 欧美 日韩 | 欧美一区二区三区在线播放 | 国内精品成人 | 真人女人一级毛片免费播放 | 高清国产午夜精品久久久久久 | 国产综合精品一区二区三区 | 欧美成人免费在线 | 男人的天堂久久 | a级在线| 黄色av免费 | a级毛片基地 | 久久精品美女 | 久久久影院| 免费看啪啪网站 | 午夜小电影 |