?? 紅外解碼.c
字號:
/********************************************************************
* 文件名 : 紅外解碼.c
* 描述 : 該程序實現用單片機來實現對紅外遙控器編碼信號的解碼。
該遙控板使用的是3010的芯片。解碼可以參考http://www.laogu.com/laogubbs/vbbs_10079.htm
該程序不是標準的紅外解碼程序,只取了遙控板的按鍵碼,區別出了0--9這10個按鍵。
注意:做這個實驗時,請關閉日光燈,日光燈會干擾紅外的解碼。
* 創建人 : 東流,2009年4月9日
* 版本號 : 2.0
* 技術支持論壇:www.zidh.com/bbs(請進入“贊助商板塊”中的“東流電子工作室”)
* 感謝“中國自動化資訊網”對本工作室的大力支持。
***********************************************************************/
#include"reg52.h"
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit rf=P3^3; //一體化接收頭輸出口
uchar Count = 0;
uchar code table[11] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09, 0xff};
/********************************************************************
* 名稱 : Delay_1ms()
* 功能 : 延時子程序,延時時間為 1ms * x
* 輸入 : x (延時一毫秒的個數)
* 輸出 : 無
***********************************************************************/
void Delay_1ms(uint i)
{
uchar x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
/********************************************************************
* 名稱 : Time0_Init()
* 功能 : 定時器的初始化,定時時間可用光碟中軟件計算,11.0592MZ晶振
定時器工作方式為 2 ,定時時間為200毫秒。
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void Time0_Init()
{
TMOD = 0x02;
IE = 0x82;
TH0 = 0x76;
TL0 = 0x76;
}
/********************************************************************
* 名稱 : Time0_Int()
* 功能 : 定時器中斷,Count為中斷中的自加變量。
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void Time0_Int() interrupt 1
{
Count++; //長度加1
}
/********************************************************************
* 名稱 : Key_Choose()
* 功能 : 鍵值轉換為數碼管值
* 輸入 : 鍵值
* 輸出 : 數碼管值
***********************************************************************/
uchar Key_Choose(uchar Key_temp)
{
uchar return_temp = 0;
switch(Key_temp)
{
case 0x6a:
return_temp = 1;
break;
case 0x9a:
return_temp = 2;
break;
case 0x5a:
return_temp = 3;
break;
case 0xa6:
return_temp = 4;
break;
case 0x66:
return_temp = 5;
break;
case 0x96:
return_temp = 6;
break;
case 0x56:
return_temp = 7;
break;
case 0xd4:
return_temp = 8;
break;
case 0xb4:
return_temp = 9;
break;
case 0xaa:
return_temp = 0;
break;
default: return_temp = 10; //如果不是 0 -- 9 這幾個數,數碼管不顯示
}
return return_temp;
}
/********************************************************************
* 名稱 : Main()
* 功能 : 主函數
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void Main(void)
{
uchar temp, i; //temp用來存按鍵碼
P0=0xff;
Time0_Init();
while(1)
{
for(i=0;i<9;i++) //放棄前面數位,因為我們只取后面的按鍵碼
{
while(rf);
while(!rf);
}
while(rf);
TR0 = 1;
for(i=0; i<8; i++)
{
Count = 0;
while(Count <= 4);
if(rf == 1) temp += 0<<i; //當一體化接收頭輸出口為高電平時,點亮LED
else temp += 1<<i;
}
//P0 = temp; //這兩行用來把按鍵碼在P0口顯示出來,這個也是我Key_Choose()中值的來源。
//while(1);
P0 = table[Key_Choose(~temp)];
P2 = 0x01;
temp = 0;
TR0 = 0; //關閉定時器
TH0 = 0x76; //初始化定時器值
TL0 = 0x76;
for(i=0; i<100; i++) //等待一段時間采集下次紅外信號
Delay_1ms(5);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -