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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

紅外遙控,能在1602上解碼,但是改成用來遙控LED燈的亮咩的時候就不行了

[復制鏈接]
跳轉到指定樓層
樓主
ID:83523 發表于 2015-9-19 22:14 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
void delay(uchar x);  //x*0.14MS
void delay1(int ms);
void beep();
void led();
sbit IRIN = P3^3;         //紅外接收器數據線
sbit BEEP = P1^5;         //蜂鳴器驅動線
sbit RELAY= P1^4;         //繼電器驅動線


uchar IRCOM[7];


sbit LCD_RS = P2^6;            
sbit LCD_RW = P2^5;
sbit LCD_EN = P2^7;
sbit led1= P1^0;

uchar code  cdis1[ ] = {" Red Control "};
uchar code  cdis2[ ] = {"  IR-CODE: --H  "};

/*******************************************************************/
/*                                                                 */
/*檢查LCD忙狀態                                                    */
/*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數據。      */
/*                                                                 */
/*******************************************************************/

bit lcd_busy()
{                          
    bit result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    delayNOP();
    result = (bit)(P0&0x80);
    LCD_EN = 0;
    return(result);
}

/*******************************************************************/
/*                                                                 */
/*寫指令數據到LCD                                                  */
/*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。                             */
/*                                                                 */
/*******************************************************************/

void lcd_wcmd(uchar cmd)

{                          
   while(lcd_busy());
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    _nop_();
    _nop_();
   // cmd = ((cmd&0x01)<<7)|((cmd&0x02)<<5)|((cmd&0x04)<<3)|((cmd&0x08)<<1)|((cmd&0x10)>>1)|((cmd&0x20)>>3)|((cmd&0x40)>>5)|((cmd&0x80)>>7);
    P0 = cmd;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;  
}

/*******************************************************************/
/*                                                                 */
/*寫顯示數據到LCD                                                  */
/*RS=H,RW=L,E=高脈沖,D0-D7=數據。                               */
/*                                                                 */
/*******************************************************************/

void lcd_wdat(uchar dat)
{                          
   while(lcd_busy());
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
//        dat = ((dat&0x01)<<7)|((dat&0x02)<<5)|((dat&0x04)<<3)|((dat&0x08)<<1)|((dat&0x10)>>1)|((dat&0x20)>>3)|((dat&0x40)>>5)|((dat&0x80)>>7);
    P0 = dat;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;
}

/*******************************************************************/
/*                                                                 */
/*  LCD初始化設定                                                  */
/*                                                                 */
/*******************************************************************/

void lcd_init()
{
    delay1(15);                  
    lcd_wcmd(0x38);      //16*2顯示,5*7點陣,8位數據
    delay1(5);
    lcd_wcmd(0x38);         
    delay1(5);
    lcd_wcmd(0x38);         
    delay1(5);

    lcd_wcmd(0x0c);      //顯示開,關光標
    delay1(5);
    lcd_wcmd(0x06);      //移動光標
    delay1(5);
    lcd_wcmd(0x01);      //清除LCD的顯示內容
    delay1(5);
}

/*******************************************************************/
/*                                                                 */
/*  設定顯示位置                                                   */
/*                                                                 */
/*******************************************************************/

void lcd_pos(uchar pos)
{                          
  lcd_wcmd(pos | 0x80);  //數據指針=80+地址變量
}

/*******************************************************************/
main()
{
   uchar m;

    IRIN=1;                    //I/O口初始化
    BEEP=1;
    RELAY=1;
        led1=0;
       
    delay1(10);                 //延時
    lcd_init();                //初始化LCD            

    lcd_pos(0);                //設置顯示位置為第一行的第1個字符

     m = 0;
    while(cdis1[m] != '\0')
     {                         //顯示字符
       lcd_wdat(cdis1[m]);
       m++;
     }

    lcd_pos(0x40);             //設置顯示位置為第二行第1個字符
     m = 0;
    while(cdis2[m] != '\0')
     {
       lcd_wdat(cdis2[m]);      //顯示字符
       m++;
     }


//        IE = 0x81;                 //允許總中斷中斷,使能 INT0 外部中斷
//        TCON = 0x01;               //觸發方式為脈沖負邊沿觸發
IT1=1;
EX1=1;
EA=1;


   while(1)        ;

} //end main
/**********************************************************/
void IR_IN() interrupt 2 using 0
{
  unsigned char j,k,N=0;
     EX1 = 0;   
         delay(15);
         if (IRIN==1)
     { EX1 =1;
           return;
          }
                           //確認IR信號出現
  while (!IRIN)            //等IR變為高電平,跳過9ms的前導低電平信號。
    {delay(1);}

for (j=0;j<4;j++)         //收集四組數據
{
  for (k=0;k<8;k++)        //每組數據有8位
  {
   while (IRIN)            //等 IR 變為低電平,跳過4.5ms的前導高電平信號。
     {delay(1);}
    while (!IRIN)          //等 IR 變為高電平
     {delay(1);}
     while (IRIN)           //計算IR高電平時長
      {
    delay(1);
    N++;           
    if (N>=30)
         { EX1=1;
         return;}                  //0.14ms計數過長自動離開。
      }                        //高電平計數完畢               
     IRCOM[j]=IRCOM[j] >> 1;                  //數據最高位補“0”
     if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //數據最高位補“1”
     N=0;
  }//end for k
}//end for j

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

   IRCOM[5]=IRCOM[2] & 0x0F;     //取鍵碼的低四位
   IRCOM[6]=IRCOM[2] >> 4;       //右移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;

     lcd_pos(0x4b);            
     lcd_wdat(IRCOM[6]);        //第一位數顯示
     lcd_pos(0x4c);            
     lcd_wdat(IRCOM[5]);        //第二位數顯示

         


     beep();
     EX1 = 1;
       
}

void led()
{


                  if(IRCOM[5]=6&&IRCOM[1]==1) {led1=0;}
                 
}
void beep()
{
  unsigned char i;
  for (i=0;i<100;i++)
   {
   delay(4);
   BEEP=!BEEP;                 //BEEP取反
   }
  BEEP=1;                      //關閉蜂鳴器
}
/**********************************************************/
void delay(unsigned char x)    //x*0.14MS
{
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:83523 發表于 2015-9-19 22:18 | 只看該作者
1602上顯示遙控“0”的鍵碼值是16H
C:\Users\Administrator\Desktop
回復

使用道具 舉報

板凳
ID:83523 發表于 2015-9-19 22:18 | 只看該作者
求大俠指導一下,畢設剩下紅外了,跪求
回復

使用道具 舉報

地板
ID:1 發表于 2015-9-19 22:54 來自手機 | 只看該作者
這個是修改前的程序還是修改后的程序
回復

使用道具 舉報

5#
ID:84652 發表于 2015-9-19 22:58 | 只看該作者
if(IRCOM[5]=6&&IRCOM[1]==1) {led1=0;}
應該是IRCOM[5]==6吧?
回復

使用道具 舉報

6#
ID:83523 發表于 2015-9-19 23:12 | 只看該作者
王朗的誘惑 發表于 2015-9-19 22:58
if(IRCOM[5]=6&&IRCOM[1]==1) {led1=0;}
應該是IRCOM[5]==6吧?

對對對
回復

使用道具 舉報

7#
ID:83523 發表于 2015-9-19 23:14 | 只看該作者
admin 發表于 2015-9-19 22:54
這個是修改前的程序還是修改后的程序

回老師,修改后的,但是led()沒加進去,試過加進去,不能控制,所以想問論壇里的師兄修改后再加進去調試
回復

使用道具 舉報

8#
ID:79544 發表于 2015-9-21 11:03 | 只看該作者
紅外可以解出碼值對吧,用解出的碼值去控制繼電器不就行啦,switch(IRCOM[2]){case 碼值:RELAY= 0;}放在大循環里。試試
回復

使用道具 舉報

9#
ID:79544 發表于 2015-9-21 19:18 | 只看該作者
樓主的程序我加上了控制LED的正確函數。加上三極管就可以控制繼電器驅動電器。
  1. /***********************************************
  2.         功能:萬能紅外遙控器解碼并用數碼管顯示。
  3.                         只顯示鍵值碼.根據鍵值控制LED
  4.                         加上三極管就可以控制繼電器
  5.         紅外接收頭的輸出接外部中斷1.  P3.3
  6.         晶振:11.0592M
  7.         單片機:STC12C5A60S2
  8.         作者 :蘇義江改編自51黑論壇
  9. *************************************************/
  10. #include <reg52.h>
  11. #define uchar unsigned char
  12. sbit dula=P0^7;
  13. sbit wela=P0^6;
  14. sbit fmq=P1^7;
  15. sbit  IR=P3^3;
  16. //共陽
  17. uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
  18.                                 0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,
  19.                                 0xa1,0x86,0x8e,0x89};
  20. //共陰
  21. /*uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  22.        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  */

  23. uchar f;

  24. #define Imax 14000    //此處為晶振為11.0592時的取值,
  25. #define Imin 8000    //如用其它頻率的晶振時,
  26. #define Inum1 1450    //要改變相應的取值。
  27. #define Inum2 700
  28. #define Inum3 3000

  29. uchar Im[4]={0x00,0x00,0x00,0x00};
  30. uchar show[2]={0,0};
  31. unsigned long m,Tc;
  32. unsigned char IrOK;

  33. void delay(uchar i)//延時
  34. {
  35.   uchar j,k;
  36.   for(j=i;j>0;j--)
  37.     for(k=125;k>0;k--);
  38. }

  39. void display()//顯示函數
  40. {
  41.    P2=table[show[0]];
  42.    dula=1;
  43.    dula=0;
  44.         P2=0xff;
  45.    
  46.    wela=0;
  47.    P2=0xfe;
  48.    wela=1;
  49.    wela=0;
  50.    delay(5);
  51.    
  52.    P2=table[show[1]];
  53.    dula=1;
  54.    dula=0;
  55.         P2=0xff;
  56.    
  57.    P2=0xfd;
  58.    wela=1;
  59.    wela=0;
  60.    delay(5);
  61. }


  62. //外部中斷1解碼程序
  63. void intersvr1(void) interrupt 2 using 1
  64. {
  65.         fmq=0;    //蜂鳴器響
  66.         Tc=TH0*256+TL0;   //提取中斷時間間隔時長
  67.         TH0=0;
  68.     TL0=0;         //定時中斷重新置零
  69.         if((Tc>Imin)&&(Tc<Imax))
  70.     {
  71.                   m=0;
  72.         f=1;
  73.                   return;
  74.      }       //找到啟始碼
  75.    if(f==1)
  76.    {
  77.        if(Tc>Inum1&&Tc<Inum3)
  78.                    {
  79.                            Im[m/8]=Im[m/8]>>1|0x80; m++;
  80.             }
  81.               if(Tc>Inum2&&Tc<Inum1)
  82.         {
  83.                  Im[m/8]=Im[m/8]>>1; m++; //取碼
  84.                   }
  85.                   if(m==32)
  86.                    {
  87.                  m=0;  
  88.                  f=0;
  89.          if(Im[2]==~Im[3])//鍵值碼和反碼相同
  90.                {
  91.            IrOK=1; //正確至1
  92.                     }
  93.          else IrOK=0;   //取碼完成后判斷讀碼是否正確
  94.      }
  95.                //準備讀下一碼
  96.    }
  97.         fmq=1; //蜂鳴器關,如果嫌吵,可刪掉此行和上面對應的開喇叭那一行
  98. }
  99. /*主程序*/
  100. void main(void)
  101. {
  102.     uint  a;   
  103.          m=0;
  104.     f=0;
  105.         EA=1;
  106.         IT1=1;
  107.         EX1=1;
  108.     TMOD=0x11;  
  109.     TH0=0;TL0=0;
  110.     TR0=1;
  111.          while(1)
  112.         {

  113.        if(IrOK==1)
  114.                   {
  115.                       show[1]=Im[2] & 0x0F;     //取鍵碼的低四位
  116.            show[0]=Im[2] >> 4;  
  117.            IrOK=0;     
  118.                   }
  119.            for(a=100;a>0;a--)
  120.           {
  121.                             display();
  122.                      }
  123.                 switch(Im[2])
  124.                 {
  125.                         case 0x1b:P0=0XFE;break;
  126.                         case 0x18:P0=0XFd;break;
  127.                         case 0x17:P0=0XFb;break;
  128.                         case 0x16:P0=0XF7;break;
  129.                         case 0x15:P0=0Xef;break;
  130.                         case 0x14:P0=0Xdf;break;
  131.                         default: break;
  132.                 //        return;
  133.                 }
  134.         }
  135. }
復制代碼
回復

使用道具 舉報

10#
ID:51128 發表于 2015-12-21 22:12 | 只看該作者
aaxing 發表于 2015-9-19 22:18
1602上顯示遙控“0”的鍵碼值是16H

我的怎么是 :10H
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩黄a| 国产亚洲精品久久久久动 | 日韩av一区二区在线观看 | 综合精品久久久 | 91精品国产综合久久久久久丝袜 | 久久国产精品免费一区二区三区 | 成人毛片视频在线播放 | 在线观看免费av片 | 成人精品一区二区三区中文字幕 | 亚洲视频免费观看 | 毛色毛片免费看 | 久久久国产一区二区三区四区小说 | 污书屋| 日韩精品一区二区三区老鸭窝 | 中文字幕在线第一页 | 日韩一区二区三区在线观看 | 免费av观看 | 欧美 日韩 国产 一区 | 欧美精品久久久久久久久久 | 成年人在线观看视频 | 欧美日韩国产在线 | 视频二区在线观看 | 二区三区av | 国产成人一区二区 | 日韩在线欧美 | 91激情视频 | 国产精品久久a | 成人午夜影院 | 一区二区国产精品 | 国产精品久久久久久久7电影 | 精品成人av| 午夜久久久 | 亚洲成人免费观看 | 最近日韩中文字幕 | 欧美男男videos| 亚洲综合激情 | 91精品国产91久久久久久不卞 | 日本大香伊一区二区三区 | 美国十次成人欧美色导视频 | 国产精品精品视频 | 九九在线精品视频 |