通過串口發(fā)送紅外遙控器的解碼值到PC
#include
sbit IRD = P3^3;//紅外接收檢測端口
bit irflag = 0;//接收到數(shù)據(jù)的標志
unsigned char ircode[4];//存放紅外遙控器發(fā)送的用戶碼,用戶碼反碼 鍵碼 鍵碼反碼
/**
* @brief 紅外配置
* @param 無
* @retval 無
*/
void ConfigInfrared()
{
TH0 = 0;
TL0 = 0;//清零T0計數(shù)
TMOD &= 0xF0;
TMOD |= 0x01;//T0方式1
TR0 = 0;//在沒有紅外信號之前先關閉T0
ET0 = 0;//只用T0的計數(shù)
//外部中斷1
IT1 = 1;//設置外部中斷觸發(fā)方式為下降沿觸發(fā)
EX1 = 1;//開啟外部中斷1
}
/**
* @brief 獲得IRD紅外檢測引腳的高電平時間(空閑時間)
* @param 無
* @retval 高電平持續(xù)的計數(shù)值
*/
unsigned int getHeighTime()
{
//在檢測外部信號前,必須先將IRDIO口拉高
IRD = 1;
TH0 = 0;
TL0 = 0;//清零T0計數(shù)
TR0 = 1;//開啟T0計數(shù)
while (IRD) //持續(xù)高電平
{
//超時判斷
if (TH0 > 0x40) //當IRD持續(xù)高電平時間17.7ms,遠遠大于引導碼的9ms,是誤碼
{
break;//退出
}
}
TR0 = 0;//停止計數(shù)
return (TH0*256 + TL0);//返回高電平計數(shù)值
}
/**
* @brief 獲得IRD紅外檢測引腳的低電平時間(載波時間)
* @param 無
* @retval 低電平持續(xù)的計數(shù)值
*/
unsigned int getLowTime()
{
IRD = 1;//釋放IRD,檢測外部信號
TH0 = 0;
TL0 = 0;//清零T0計數(shù)
TR0 = 1;//開始計數(shù)
while (!IRD) //持續(xù)低電平
{
if (TH0 > 0x40) //超過18ms就是誤碼,錯誤信號
{
break;
}
}
TR0 = 0;//停止計數(shù)
return (TH0*256 + TL0);//返回低電平計數(shù)值
}
/**
* @brief 外部中斷1服務程序,檢測紅外信號
* @param 無
* @retval 無
*/
void EXINT_ISP() interrupt 2 //外部中斷標號2
{
unsigned char byte;//接收數(shù)據(jù)
unsigned char i, j;
unsigned int time;//時間
time = getLowTime();//獲得載波時間
if (time < 7833 || time > 8755) //引導碼載波是9ms,這里規(guī)定在8.5ms-9.5ms之間是9ms的載波
{
//范圍之外,誤碼
IE1 = 0;//清零外部中斷1中斷標志,為下一次再進入中斷
return;//退出中斷
}
//否則是9ms的載波
time = getHeighTime();//空閑時間
if (time < 3686 || time > 4608) //引導碼的空閑時間4.5ms 這里規(guī)定4ms-5ms是4.5ms的空閑
{
IE1 = 0;//清零中斷標志
return;//退出中斷
}
//否則是4.5ms的空閑
//開始接收用戶碼和鍵碼等
for (i = 0; i < 4; i++)
{
for (j = 0; j < 8; j++)
{
time = getLowTime();//載波
if (time < 423 || time > 608) //560us的載波和560us的空閑是0 范圍460us-660us
{
IE1 = 0;
return;
}
//560us載波
time = getHeighTime();
if (time > 423 && time < 608) //560us空閑
{
//bit 0
byte >>= 1;//低位在前,移入一位0
}
else if (time > 1198 && time < 1658) //1.68ms的空閑是1 范圍 1300us-1800us
{
//bit 1
byte >>= 1;//移入一位
byte |= 0x80;//移入的一位置1
}
else
{
//誤碼
IE1 = 0;
return;//退出中斷
}
}
ircode = byte;
}
//接收完成
irflag = 1;
//退出中斷時清零中斷標志
IE1 = 0;
}
評論