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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

求指導,單片機紅外遙控實現LED閃爍程序及PWM調光

[復制鏈接]
跳轉到指定樓層
樓主
求指導,想要實現按鍵4按下LED4延時0.5秒閃爍,按其他鍵或者再按一下熄滅;按鍵2按下LED2稍暗,按其他鍵或者再按一下熄滅,按鍵3按下LED2稍亮,按其他鍵或者再按一下熄滅,程序應該怎么修改呢?程序及按鍵編碼值如下:按鍵編碼值:
按鍵1:00-FF-0C-F3
按鍵2:00-FF-18-E7
按鍵3:00-FF-5E-A1
按鍵4:00-FF-08-7F
按鍵5:00-FF-1C-E3
按鍵6:00-FF-5A-A5
按鍵7:00-FF-42-BD
按鍵8:00-FF-52-AD

程序:

#include <reg52.h>
#include <intrins.h>
#define  NOP()   _nop_()   
#define uchar unsigned char
#define uint  unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_()};

void delay(uchar x);
void delay1(int ms);
void delayms(uint);
void beep(void);

sbit IRIN = P3^2;        
sbit LED1 = P1^0;        
sbit LED2 = P1^1;  
sbit LED3 = P1^2;  
sbit LED4 = P1^3;  
sbit LED5 = P1^4;  
sbit LED6 = P1^5;  
sbit LED7 = P1^6;
sbit LED8 = P1^7;
sbit BEEP = P2^3;      
uchar IRCOM[7];
unsigned char Y1,Y2,Y3,Y4,Y5,Y6,Y7,Y8,Y9,i,j;

main()
{
    IE = 0x81;                 
    TCON = 0x01;                  
    IRIN=1;
    BEEP=1;        
    LED1=1;
    LED2=1;
    LED3=1;
    LED4=1;
    LED5=1;
    LED6=1;
    LED7=1;
    LED8=1;
    delay1(10);              
   while(1);
}

void IR_IN(void) interrupt 0   
{
  unsigned char j,k,N=0;
         EX0 = 0;   
         delay(15);
         if (IRIN==1)
                                {
                            EX0 =1;
          return;
                                }                     
    while (!IRIN)           
    {delay(1);}

    for (j=0;j<4;j++)         
                {
                        for (k=0;k<8;k++)        
                        {
                                while (IRIN)            
                                {delay(1);}
                                while (!IRIN)         
                                {delay(1);}
                                while (IRIN)         
                                {
                                        delay(1);
                                        N++;           
                                        if (N>=30)
                                        {
                                         EX0=1;
                                         return;
                                        }               
                                }                                 
                                IRCOM[j]=IRCOM[j] >> 1;                  
                                if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  
                                N=0;
                        }
                }

   if (IRCOM[2]!=~IRCOM[3])
   {
                 EX0=1;
     return;
         }

   IRCOM[5]=IRCOM[2] & 0x0F;   
   IRCOM[6]=IRCOM[2] >> 4;   

   if(IRCOM[5]>9)
    { IRCOM[5]=IRCOM[5]+0x37;}
   else IRCOM[5]=IRCOM[5]+0x30;
   if(IRCOM[6]>9)
    { IRCOM[6]=IRCOM[6]+0x37;}
   else IRCOM[6]=IRCOM[6]+0x30;

   Y1=Y2=Y3=Y4=Y5=Y6=Y7=Y8=Y9=0;
               
   switch(IRCOM[2])
   {
                        case 0x0C: Y1=0x01; break;
      case 0x18: Y2=0x01; break;
      case 0x5E: Y3=0x01; break;
      case 0x08: Y4=0x01; break;
      case 0x1C: Y5=0x01; break;
      case 0x5A: Y6=0x01; break;
      case 0x42: Y7=0x01; break;
      case 0x52: Y8=0x01; break;


   }
                        
                        if(Y1&0xFF)LED1=0;               
      else LED1=1;         
      if(Y2&0xFF)LED2=0;
      else LED2=1;
      if(Y3&0xFF)LED3=0;
      else LED3=1;
      if(Y4&0xFF)LED4=0;
      else LED4=1;
      if(Y5&0xFF)LED5=0;
      else LED5=1;
      if(Y6&0xFF)LED6=0;
      else LED6=1;
      if(Y7&0xFF)LED7=0;
      else LED7=1;
      if(Y8&0xFF)LED8=0;
      else LED8=1;                                 

    beep();
    EX0 = 1;

}


void beep(void)
{
  unsigned char i;
  for (i=0;i<100;i++)
   {
   delay(4);
   BEEP=!BEEP;               
   }
  BEEP=1;                     
}

void delay(unsigned char x)   
{
        unsigned char i;
  while(x--)
        {
                for (i = 0; i<13; i++) {}
        }
}

void delay1(int ms)
{
        unsigned char y;
  while(ms--)
        {
                for(y = 0; y<250; y++)
                {
   _nop_();
   _nop_();
   _nop_();
   _nop_();
                }
        }
}



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

使用道具 舉報

沙發
ID:147710 發表于 2020-8-26 16:30 | 只看該作者
你這個程序功能代碼互相交叉,牽一發動全身,沒有修改價值,先按照之前的按鍵控制LED的例子先做一遍,各功能模塊要獨立出來:LED顯示,蜂鳴器驅動,鍵值解析,紅外接收,單獨封裝成一個函數,先把這些一個個調試正常,然后一個個組合起來。另外,定時中斷中再用delay很不妥。
回復

使用道具 舉報

板凳
ID:230118 發表于 2020-8-26 17:44 | 只看該作者
用個小狀態機描述比較清晰:
idle state :   ledOff();
                  if (capture(Key4))
                  {
                        shine(LED4);
                        goto  state  1;
                   }

                  if (capture(Key2))
                  {
                        darken(LED2)
                        goto  state  2;
                   }

                   if (capture(Key3))
                  {
                        brighten(LED2)
                        goto  state  3;
                   }

state 1、state2、state3:
                   if (capture(anykey))
                   {
                         goto state idle;
                   }

偽代碼,自己實現函數
回復

使用道具 舉報

地板
ID:626891 發表于 2020-8-26 18:07 來自觸屏版 | 只看該作者
XTXB 發表于 2020-8-26 16:30
你這個程序功能代碼互相交叉,牽一發動全身,沒有修改價值,先按照之前的按鍵控制LED的例子先做一遍,各功 ...

這個程序搞了好久,把各個功能模塊分出來,然后再組合,對于我們初學者來說很難的,不知道從何入手
回復

使用道具 舉報

5#
ID:147710 發表于 2020-8-26 22:02 | 只看該作者
你上次不是提過類似問題么,我給的參考程序有沒有敲一遍?首先在IO口加幾個按鍵代替紅外接收,把LED按照需求點亮,
然后再單獨調通紅外接收。
最后組合在一起。
別急,花點時間把這些吃透,以后就輕松了。
做項目其實都是大同小異。
你這個我以前玩過。







回復

使用道具 舉報

6#
ID:626891 發表于 2020-8-27 10:16 來自觸屏版 | 只看該作者
我有開發板的,就是不知道怎么組合程序

S00827-10150649.png (541.8 KB, 下載次數: 38)

S00827-10150649.png
回復

使用道具 舉報

7#
ID:147710 發表于 2020-8-27 12:53 | 只看該作者
截個圖看看,你完成的單個功能。
你這個需求由于有紅外編碼,對時序要求比較嚴,先把單個功能高質量完成才行,別一開始就搞組合功能,到時不能工作都不知道如何查起。
比如先做一個簡單功能,把這個功能封裝成函數,有了封裝換一個不同的遙控器就不至于全部推倒重來。
別想著只用幾行代碼就能解決所有問題,要舍得多聲明變量,多聲明函數,思維要有層次,不要眉毛胡子一把抓,結果啥都沒抓到。
我給你的代碼有你所缺乏的編程思維,認真做一遍后,你目前的很多問題都可迎刃而解。
千萬不要小瞧按鍵點燈程序,你試著完成下面需求:
1,單擊按鍵在按下時馬上點亮
2,單擊按鍵在抬起后才點亮
3,雙擊點亮,
4,長按3秒點亮
5,連續按3次點亮
6,按住按鍵不放,1秒后,LED每秒鐘閃爍3次,松開手后,LED熄滅

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品久久国产 | 国产精品毛片一区二区在线看 | 麻豆一区二区三区精品视频 | 亚洲天堂久久新 | 精品一区久久 | 国产在线一级片 | 久久久久91| 欧美中文字幕一区二区三区 | 日韩成人免费中文字幕 | www.黄色片视频 | 91麻豆久久久 | 在线国产一区二区 | 色偷偷人人澡人人爽人人模 | 欧美亚洲日本 | 欧美一区二区三区 | 久久精品亚洲精品国产欧美kt∨ | 色综合美女| 中文字幕在线播放不卡 | www.色婷婷| 91在线精品一区二区 | av一二三区 | 日本在线视频一区二区 | 涩涩视频在线观看免费 | 成人3d动漫一区二区三区91 | 精品国产精品三级精品av网址 | 久久av一区 | 亚洲精品久久久久久国产精华液 | 成人免费视频一区二区 | aaaaaa大片免费看最大的 | 日韩一级一区 | 三级黄色片在线观看 | 在线视频一区二区 | 在线视频中文字幕 | 久久精品小视频 | 亚洲3级 | 亚洲色图50p | 成年视频在线观看 | 国产精品久久久久久久久大全 | 日本黄色免费大片 | 中文字幕四虎 | 欧美日韩国产免费 |