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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

求助大神,剛學單片機,要求用紅外遙控器發送字符在LED點陣屏上顯示,仿真沒有結果

[復制鏈接]
跳轉到指定樓層
樓主
紅外遙控
#include <AT89X51.h>


static bit OP;        //紅外發射管的亮滅
static unsigned int count;       //延時計數器
static unsigned int endcount; //終止延時計數
static unsigned char Flag;      //紅外發送標志
char iraddr1;  //十六位地址的第一個字節
char iraddr2;  //十六位地址的第二個字節


void SendIRdata(char p_irdata);
void delay();
char getkey()
{
          P1=0xfe;P3_6=P3_7=1;P3_3=1;
          if(!P1_4)return 1;   //ON
          if(!P1_5)return 2;   //7
          if(!P1_6)return 3;   //8
          if(!P1_7)return 4;   //9
          if(!P3_6)return 5;   //X
          if(!P3_7)return 6;   //÷
          P1=0xfd;
          if(!P1_4)return 11; //+-
          if(!P1_5)return 12; //4
          if(!P1_6)return 13; //5
          if(!P1_7)return 14; //6
          if(!P3_6)return 15; //-
          if(!P3_7)return 16; //MRC
          P1=0xfb;
          if(!P1_4)return 21; //%
          if(!P1_5)return 22; //1
          if(!P1_6)return 23; //2
          if(!P1_7)return 24; //3
          if(!P3_6)return 25; //+
          if(!P3_7)return 26; //M-
          P1=0xf7;
          if(!P1_4)return 31; //□
          if(!P1_5)return 32; //0
          if(!P1_6)return 33; //.
          if(!P1_7)return 34; //=
          if(!P3_6)return 35; //+
          if(!P3_7)return 36; //M+


          P1=0xfF;P3_3=0;
          if(!P1_4)return 41; //
          if(!P1_5)return 42; //
          if(!P1_6)return 43; //
          if(!P1_7)return 44; //
          if(!P3_6)return 45; //
          if(!P3_7)return 46; //
          return 0;
}


void main(void)
{
  char key;
  count = 0;
  Flag = 0;
  OP = 0;
  P3_4 = 1;
  EA = 1; //允許CPU中斷
  TMOD = 0x11; //設定時器0和1為16位模式1
  ET0 = 1; //定時器0中斷允許


  P1=0xff;
  TH0 = 0xFF;
  TL0 = 0xE6; //設定時值0為38K 也就是每隔26us中斷一次  
  TR0 = 1;//開始計數


  iraddr1=0xff;
  iraddr2=0xff;




  do{
          key=getkey();
      if(key==1)SendIRdata(0x12);//set
      if(key==11)SendIRdata(0x0b);//exit
      if(key==25||key==35)SendIRdata(0x1a);//+
      if(key==15)SendIRdata(0x1e);//-
      if(key==6)SendIRdata(0x0e);//↑ ÷
      if(key==16)SendIRdata(0x1d);//↓ MRC


      if(key==26)SendIRdata(0x1f);//← M-
      if(key==36)SendIRdata(0x1b);//→ M+
      if(key==32)SendIRdata(0x00);//0
      if(key==22)SendIRdata(0x01);//1
      if(key==23)SendIRdata(0x02);//2


      if(key==24)SendIRdata(0x03);//3
      if(key==12)SendIRdata(0x04);//4
      if(key==13)SendIRdata(0x05);//5
      if(key==14)SendIRdata(0x06);//6
      if(key==2)SendIRdata(0x07);//7
      if(key==3)SendIRdata(0x08);//8


      if(key==4)SendIRdata(0x09);//9
      if(key==21)SendIRdata(0x2A);//%
      if(key==5)SendIRdata(0x2B);//X
      if(key==33)SendIRdata(0x2C);//.
      if(key==34)SendIRdata(0x2D);//=
      if(key==31)SendIRdata(0x2E);//□


      if(key==41)SendIRdata(0x2F);//
      if(key==42)SendIRdata(0x30);//
      if(key==43)SendIRdata(0x31);//
      if(key==44)SendIRdata(0x32);//
      if(key==45)SendIRdata(0x33);//
      if(key==46)SendIRdata(0x34);//
  }while(1);
}
//定時器0中斷處理
void timeint(void) interrupt 1
{
  TH0=0xFF;
  TL0=0xE6; //設定時值為38K 也就是每隔26us中斷一次
  count++;


}




void SendIRdata(char p_irdata)
{
  int i;
  char irdata=p_irdata;


  //發送9ms的起始碼
  endcount=223;
  Flag=1;
  count=0;
  P3_4=0;
  do{}while(count<endcount);


  //發送4.5ms的結果碼
  endcount=117;
  Flag=0;
  count=0;
  P3_4=1;
  do{}while(count<endcount);


  //發送十六位地址的前八位
  irdata=iraddr1;
  for(i=0;i<8;i++)
  {


     //先發送0.56ms的38KHZ紅外波(即編碼中0.56ms的低電平)
     endcount=10;
     Flag=1;
     count=0;
         P3_4=0;
     do{}while(count<endcount);


    //停止發送紅外信號(即編碼中的高電平)
     if(irdata-(irdata/2)*2)  //判斷二進制數個位為1還是0
     {
       endcount=15;  //1為寬的高電平
     }
    else
     {
     endcount=41;   //0為窄的高電平
     }
    Flag=0;
    count=0;
        P3_4=1;
    do{}while(count<endcount);


    irdata=irdata>>1;
  }


  //發送十六位地址的后八位
  irdata=iraddr2;
  for(i=0;i<8;i++)
  {
     endcount=10;
     Flag=1;
     count=0;
         P3_4=0;
     do{}while(count<endcount);


     if(irdata-(irdata/2)*2)
     {
        endcount=15;
     }
     else
     {
       endcount=41;
     }
     Flag=0;
     count=0;
         P3_4=1;
     do{}while(count<endcount);


     irdata=irdata>>1;
  }


  //發送八位數據
  irdata=~p_irdata;
  for(i=0;i<8;i++)
  {
     endcount=10;
     Flag=1;
     count=0;
         P3_4=0;
     do{}while(count<endcount);


     if(irdata-(irdata/2)*2)
     {
         endcount=15;
     }
     else
     {
       endcount=41;
     }
     Flag=0;
     count=0;
         P3_4=1;
     do{}while(count<endcount);


     irdata=irdata>>1;
  }


  //發送八位數據的反碼
  irdata=p_irdata;
  for(i=0;i<8;i++)
  {
     endcount=10;
     Flag=1;
     count=0;
         P3_4=0;
     do{}while(count<endcount);


     if(irdata-(irdata/2)*2)
     {
         endcount=15;
     }
     else
     {
       endcount=41;
     }
     Flag=0;
     count=0;
         P3_4=1;
     do{}while(count<endcount);


     irdata=irdata>>1;
  }


  endcount=10;
  Flag=1;
  count=0;
  P3_4=0;
do{}while(count<endcount);
  P3_4=1;
  Flag=0;
}


void delay()
{
  int i,j;
  for(i=0;i<400;i++)
  {
    for(j=0;j<100;j++)
    {
    }
  }
}


解碼



#include "reg52.h"                         //此文件中定義了單片機的一些特殊功能寄存器
       


typedef unsigned int u16;          //對數據類型進行聲明定義
typedef unsigned char u8;






sbit IRIN=P3^2;




u8 IrValue[7];
u8 Time;
u8 x;
u8 DisplayData[8];
unsigned char code led[]={0xff,0xff,0xc1,0xbe,0xbe,0xbe,0xc1,0xff,
                                                        0xff,0xfe,0x80,0xde,0xff,0xff,0xff,0xff,
                                                        0xff,0xc6,0xba,0xba,0xba,0xd8,0xff,0xff,
                                                        0xff,0xc9,0xb6,0xb6,0xb6,0xdd,0xff,0xff,
                                                        0xff,0xfb,0x80,0xdb,0xeb,0xf3,0xff,0xff,
                                                        0xff,0xb1,0xae,0xae,0xae,0x8d,0xff,0xff,
                                                        0xff,0xd9,0xb6,0xb6,0xb6,0xc1,0xff,0xff,
                                                        0xff,0x8f,0xb0,0xbf,0xbf,0xbf,0xff,0xff,
                                                        0xff,0xc9,0xb6,0xb6,0xb6,0xc9,0xff,0xff,
                                                        0xff,0xc1,0xb6,0xb6,0xb6,0xcd,0xff,0xff, };


/*******************************************************************************
* 函 數 名         : delay
* 函數功能                   : 延時函數,i=1時,大約延時10us
*******************************************************************************/
void delay(u16 i)
{
        while(i--);       
}
void display()
{
unsigned char w,i,j;


w=0x01;
         j=x*8;
        for(i=0;i<8;i++)
        {P1=w;
        P0=led[j++];
        delay(200);
        w<<=1;       
        }}


/*******************************************************************************
* 函數名         :DigDisplay()
* 函數功能                 :數碼管顯示函數
* 輸入           : 無
* 輸出                  : 無
*******************************************************************************/


/*******************************************************************************
* 函數名         : IrInit()
* 函數功能                   : 初始化紅外線接收
* 輸入           : 無
* 輸出                  : 無
*******************************************************************************/


void IrInit()
{
        IT0=1;//下降沿觸發
        EX0=1;//打開中斷0允許
        EA=1;        //打開總中斷


        IRIN=1;//初始化端口
}




/*******************************************************************************
* 函 數 名       : main
* 函數功能                 : 主函數
* 輸    入       : 無
* 輸    出             : 無
*******************************************************************************/
void main()
{       
        IrInit();
        while(1)
{         display();


                       
        }               
}


/*******************************************************************************
* 函數名         : ReadIr()
* 函數功能                   : 讀取紅外數值的中斷函數
* 輸入           : 無
* 輸出                  : 無
*******************************************************************************/


void ReadIr() interrupt 0
{        unsigned char q=0;
        u8 j,k;
        u16 err;
        Time=0;                                         
        delay(700);        //7ms
        if(IRIN==0)                //確認是否真的接收到正確的信號
        {         
               
                err=1000;                                //1000*10us=10ms,超過說明接收到錯誤的信號
                /*當兩個條件都為真是循環,如果有一個條件為假的時候跳出循環,免得程序出錯的時
                侯,程序死在這里*/       
                while((IRIN==0)&&(err>0))        //等待前面9ms的低電平過去                 
                {                       
                        delay(1);
                        err--;
                }
                if(IRIN==1)                        //如果正確等到9ms低電平
                {
                        err=500;
                        while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高電平過去
                        {
                                delay(1);
                                err--;
                        }
                        for(k=0;k<4;k++)                //共有4組數據
                        {                               
                                for(j=0;j<8;j++)        //接收一組數據
                                {


                                        err=60;               
                                        while((IRIN==0)&&(err>0))//等待信號前面的560us低電平過去
                                        {
                                                delay(1);
                                                err--;
                                        }
                                        err=500;
                                        while((IRIN==1)&&(err>0))         //計算高電平的時間長度。
                                        {
                                                delay(10);         //0.1ms
                                                Time++;
                                                err--;
                                                if(Time>30)
                                                {
                                                        return;
                                                }
                                        }
                                        IrValue[k]>>=1;         //k表示第幾組數據
                                        if(Time>=8)                        //如果高電平出現大于565us,那么是1
                                        {
                                                IrValue[k]|=0x80;
                                        }
                                        Time=0;                //用完時間要重新賦值                                                       
                                }
                        }
                }
                if(IrValue[2]!=~IrValue[3])
                {
                        return;
                }
        }
IrValue[5]=IrValue[2] & 0x0F; //取鍵碼的低四位


IrValue[6]=IrValue[2] >> 4; //右移4次,高四位變為低四位


if(IrValue[5]>9)


{


IrValue[5]=IrValue[5]+0x37;


}


else


IrValue[5]=IrValue[5]+0x30;


if(IrValue[6]>9)


{


IrValue[6]=IrValue[6]+0x37;


}


else


IrValue[6]=IrValue[6]+0x30;


q= (((IrValue[6]&0x0f)<<4) + (IrValue[5]&0x0f));       
switch(q)
{case 0x00:x=0;break;
case 0x01:x=1;break;
case 0x02:x=2;break;
case 0x03:x=3;break;
case 0x04:x=4;break;
default :  x=0;
}                
}


9Q7~}PM`}IRUSDE{0D6~0WY.png (68.01 KB, 下載次數: 38)

9Q7~}PM`}IRUSDE{0D6~0WY.png
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:584814 發表于 2020-5-22 07:32 | 只看該作者
那就搭個實物試試
回復

使用道具 舉報

板凳
ID:648281 發表于 2020-5-22 11:58 | 只看該作者
你好!
這個還是分步來調試吧
1、解碼單片機   a、先能點陣正常顯示數字
   b、再調試紅外中斷接收,實現解碼
   c、接著添加解碼數字的程序,顯示
2、發射單片機
   a、能檢測到矩陣鍵盤行列,確定數字
   b、檢測到的數字,添加進紅外數組內
   c、能通過紅外發射出去,給解碼端
3、共同的問題
   a、晶振的使用
   b、38K載波的問題
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色婷综合网 | 国产在线中文字幕 | 日韩在线精品强乱中文字幕 | 国产精品免费在线 | 日韩成人av在线播放 | 久久久久高清 | 日日日干干干 | 成人欧美一区二区三区1314 | 欧美激情一区二区三级高清视频 | 欧美一区二区另类 | 久久精品16 | 亚洲黄色网址视频 | 一级片免费视频 | 网色| 国产一区电影 | 日韩欧美视频网站 | 亚洲影音先锋 | 久久久久久久久久久福利观看 | 91麻豆精品国产91久久久久久久久 | 久久久久综合 | 美人の美乳で授乳プレイ | 国产目拍亚洲精品99久久精品 | 精品久久久999 | 国产精品美女www爽爽爽视频 | 亚洲国产一区二区三区 | 日韩欧美一区二区三区免费观看 | 国产一区二区中文字幕 | 91xxx在线观看 | 国产视频福利一区 | 韩日av片| 日韩欧美在线一区 | 国产精品久久久久久模特 | 久久久久久免费毛片精品 | 日韩精品免费在线观看 | 国产精久久久久久久 | 玖玖国产精品视频 | 99免费视频 | 久久人人网 | 日韩成人在线免费视频 | 9999久久| 草草草久久久 |