紅外解碼程序(用1602顯示碼值)
void int0init()//外部中斷O初始化,按P3。2
{
IT0=1;//設(shè)為下降沿觸發(fā)方式。IT0=0為低電平觸發(fā)。因?yàn)榧t外輸入高時(shí),接收為低,要從低開(kāi)始計(jì)時(shí)
EX0=1;//外部中斷打開(kāi)
EA=1;//總中斷打開(kāi)
}
void irpros()//紅外提取處理程序
{
uchar i,k,j,irvalue;
k=1;//第一k=0是引導(dǎo)碼,不須要。所以從K=1開(kāi)始提取編碼,把K=0的引導(dǎo)碼去掉
for(j=0;j<4;j++)//共有四個(gè)碼,所以循環(huán)四次
{
for(i=0;i<8;i++)//每個(gè)碼八位,循環(huán)八次
{
irvalue=irvalue>>1;//irvalue低位在前,高位在后,所以右移,判斷8次,右移7次
if(irdata[k]>6)//如果兩個(gè)中斷的時(shí)間為1.125MS,說(shuō)明傳的是0,1.125/0.255=4.4個(gè)irtime,
//如果兩個(gè)中斷的時(shí)間為1.125MS,說(shuō)明傳的是1,2.25/0.255=8.8個(gè)irtime,
//我取中斷值6;如果irdata大于6,說(shuō)明是1,小于6說(shuō)明是0;
{
irvalue=irvalue|0x80;
}
k++;//每提一次,K自增一次,一共要33次
}
ircode[j]=irvalue;
}
irprosok=1;
beep=0;
delay(3);
beep=1;
}
void irwork()
{
disp[0]=ircode[0]/16;//取高四位
disp[1]=ircode[0]%16;//取低四位
disp[2]=ircode[1]/16;//取高四位
disp[3]=ircode[1]%16;//取低四位
disp[4]=ircode[2]/16;//取高四位
disp[5]=ircode[2]%16;//取低四位
disp[6]=ircode[3]/16;//取高四位
disp[7]=ircode[3]%16;//取低四位
}
void display()
{
write_com(0x80);
write_dat(Tab[disp[0]]);
write_dat(Tab[disp[1]]);
write_dat(Tab[disp[2]]);
write_dat(Tab[disp[3]]);
write_dat(Tab[disp[4]]);
write_dat(Tab[disp[5]]);
write_dat(Tab[disp[6]]);
write_dat(Tab[disp[7]]);
}
void main()
{
init_1602();
timer0init();
int0init();
while(1)
{
if(irreceok)//判斷接收是否OK
{
irpros();//接收OK就要處理.把數(shù)據(jù)從irdata中提出來(lái)
irreceok=0;//要把irreceok清0,為下一次接收做準(zhǔn)備
}
if(irprosok)
{
irwork();//如果處理OK,把數(shù)據(jù)分離,可以去顯示
irprosok=0;//要把irprosok清0,為下一次處理做準(zhǔn)備
}
display();//顯示函數(shù)還沒(méi)寫,有待完善
}
}
void timer0() interrupt 1//定時(shí)器0中斷函數(shù)
{
irtime++;/*irtime為字符型,最大為255,輸入開(kāi)始時(shí)讀一次irtime
然后清0,結(jié)束再讀一次,irtime乘以255就是一次掃描定時(shí)的時(shí)間*/
}
void int0() interrupt 0//外部中斷0函數(shù),這是關(guān)鍵
{
if(startflag)//如果startflag=1就開(kāi)始接數(shù)據(jù)
{
if(irtime>30) //接收引導(dǎo)碼,引導(dǎo)碼有9MS,9/0.256=33.15,在這就取32即可
//說(shuō)明這時(shí)檢測(cè)到了引導(dǎo)碼
{
bitnum=0;//收到引導(dǎo)碼后,bitnum清O準(zhǔn)備裝數(shù)據(jù)
}
irdata[bitnum]=irtime;//第1個(gè)bitnum=0的數(shù)據(jù)被裝入數(shù)組。
irtime=0;//清0就不會(huì)對(duì)下次有影響
bitnum++; //不停地給數(shù)組加入新數(shù)據(jù)
if(bitnum==33)//如果bitmun=33,說(shuō)明一幀數(shù)據(jù)傳完
{
bitnum=0;//bitnum清0為接收下一幀做準(zhǔn)備
irreceok=1;//主函數(shù)只要判斷irreceok是否為1做出后面的決定
}
}
else //
{
startflag=1;
irtime=0;
}
}
評(píng)論