最近在學習紅外線遙控繼電器,手頭有一個閑置遙控器,但不知道按鍵碼值,在網上搜索相關資源后獲到一個程序,經測試好用,在這里分享發給大家。
原程序來源于“知乎”,原文網址:https://zhuanlan.zhihu.com/p/662116293,在這里對原創作者“玄宇鷹魂”表示感謝。
因本論壇下載附件需要“黑幣”,為了避免原作者有可能誤判利用他的原作盈利,在這里只貼出程序內容,不上傳附件。
請有需求的壇友復制后自行生成工程文件和hex文件。
- /*********************************************************************************************
- 使用51單片機和一體化紅外線接收管檢測遙控器發射的紅外線信號,并將按鍵碼值顯示在P0口數碼管上
- 程序在STC89C52RC單片機配合共陽數碼管運行正常
- 原始程序來源于知乎,網址:https://zhuanlan.zhihu.com/p/662116293
- 在這里對原文章作者“玄宇鷹魂”表示感謝!
- *********************************************************************************************/
- #include <reg51.h>
- sbit smg1=P2^0;//數碼管第1位驅動
- sbit smg2=P2^1;//數碼管第2位驅動
- unsigned char Time0;
- unsigned char IrValue[6];
- unsigned char shijian;
- sbit IRIN=P3^2;//一體化紅紅外線接收引腳
- unsigned char shu[]={'0','0','0','0'};
- //unsigned char code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7C,0x39,0x5E,0x79,0x71};//共陰數碼管編碼
- unsigned char code smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共陽數碼管編碼
- unsigned char num=0;
- void IrInit();
- void delay(unsigned int x);
- void DelayMs(unsigned int i)
- {
- while(i--)
- delay(100);
- }
- //主函數: main
- void main()
- {
- IrInit();
- while(1)
- {
- //顯示
- P0=smgduan[num>>4];
- smg1=0;
- delay(100);
- smg1=1;
- P0=smgduan[num & 0x0f];
- smg2=0;
- delay(100);
- smg2=1;
- }
- }
- //紅外線接收初始化函數IrInit()
- void IrInit()
- {
- IT0=1;//下降沿出發
- EX0=1;//打開中斷0允許
- EA=1; //打開總中斷
- IRIN=1;//初始化端口
- }
- //延時函數DelayMs()
- void delay(unsigned int x) //0.14ms誤差0us
- {
- while(x--) ;
- }
- //紅外線接收程序
- void ReadIr() interrupt 0
- {
- unsigned char j,k;
- unsigned int err;
- Time0=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
- Time0++;
- err--;
- if(Time0>30)
- {
- return;
- }
- }
- IrValue[k]>>=1; //k表示第幾組數據
- if(Time0>=8) //如果高電平出現大于565us,那么是1
- {
- IrValue[k]|=0x80;
- }
- Time0=0; //用完時間要重新賦值
- }
- }
- }
- if(IrValue[2]!=~IrValue[3])
- {
- return;
- }
- else
- num=IrValue[2];
- }
- }
復制代碼
|