1. 程式人生 > >51微控制器萬能紅外遙控學習(通過波形學習)

51微控制器萬能紅外遙控學習(通過波形學習)

最近公司需要開發一款紅外萬能學習模組,利用手機app控制,紅外模組需要帶有紅外接收模組,和發射模組。剛開始我用普遍的紅外四位元組時序成功的學習到資料和發射,但後來發現空調的編碼位元組數是不一樣的,公司要求只需要學習到空調的碼就可以,不需要像空調一樣,一個按鍵多次按發射不同的編碼。於是我想到的通過記錄波形的高低電平和波形的寬度,發射時還原發送就可以

微控制器使用外部中斷來記錄紅外訊號,紅外訊號發射開始是引導碼,當紅外接收器到低電平時就可以觸發到外部中斷開始,並用定時器記錄好時間。下面是例程:

void Int0() interrupt 0
{
uint i;
uint timeL,timeH;
EX0 = 0;//關閉中斷不再接上其他的資料
for(i=0;i<170;i++)//定義了512個位元組的數值(每個波形需要有高低電平的標誌位,寬度分為兩個位元組儲存)
{
if(JS==0)
{
timeL = GetLowTime();//讀取低電平的寬度時間                                                                               if(timeL>30000)//如果超過時間就退出學習,防止程式卡死
break;
xie[i*3] = 0x00;//低電平標誌位
xie[i*3+1] = timeL>>8;//波形寬度低電平
xie[i*3+2] = timeL;//波形寬度高電平
}
else if(JS==1)
{
timeH = GetHighTime();//讀取高電平寬度時間
if(timeH>30000)//如果超過時間就退出學習,防止程式卡死


break;
xie[i*3] = 0xff;//低電平標誌位
xie[i*3+1] = timeH>>8;//波形寬度低電平
xie[i*3+2] = timeH;//波形寬度高電平
}
}
IE0 = 0;//清除中斷標記位
}