接收以S52單片機(jī)作為接收系統(tǒng)。以S52的P3.3口作為接收端口,該端口是外部中斷1。
這個(gè)接受程序是以XC866作為紅外發(fā)送控制系統(tǒng),接收程序如下:
#include<reg52.h> //頭文件 #include<intrins.h> #define uchar unsigned char //宏定義 #define uint unsigned int sbit HWRx=P3^3; //位聲明 code uchar Table[]= //共陰數(shù)碼管 0-9 a-f - 表 {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71,0x40}; uchar Table_Data[8]={0,0,0,0,0,0,0,0};//用于顯示的數(shù)組 uchar Table_Rx[67];//用于存儲(chǔ)判斷接收是1或0的參數(shù) void Delay();//延時(shí)子函數(shù) void Display(uchar *lp,uchar lc)//顯示 { uchar i; //定義變量 P2=0; //端口2為輸出,關(guān)閉 P1=P1&0xF8; //將P1口的前3位輸出0,對(duì)應(yīng)138譯門(mén)輸入腳, 全0為第一位數(shù)碼管 for(i=0;i<lc;i++) //循環(huán)顯示,采用動(dòng)態(tài)掃描 { P2=Table[lp[i]]; //查表法得到要顯示數(shù)字的數(shù)碼段 if(lp[i]>0x7f) P2+=0x80; Delay(); //延時(shí) P2=0; //清0端口,準(zhǔn)備顯示下位 if(i==7) //檢測(cè)顯示完8位否,完成直接退出,不讓P1口再加1, 否則進(jìn)位影響到第四位數(shù)據(jù) break; P1++; //點(diǎn)亮下一位數(shù)碼管 } } void main() //主函數(shù) { EA=1; //首先開(kāi)啟總中斷 EX1=1; //開(kāi)啟外部中斷 1 IT1=1; //設(shè)置成下降沿觸發(fā)方式 while(1) //一直顯示,其它由中斷處理 { Display(Table_Data,8); } } void Delay() //延時(shí)時(shí)間大約為31us,晶振12M { uchar i=13; while(i) i--; } void Delay_ms(uint z) //延時(shí)時(shí)間約為 1ms*X 晶振為12M { uint x=0,y=0; for(x=z;x>0;x--) for(y=54;y>0;y--); } void hongwai() interrupt 2 //外部中斷 1 ,INT1(P3^3)連接紅外線(xiàn)接收IC數(shù)據(jù)腳 { uchar i,j,tmp; EX1=0; //關(guān)閉中斷 j=33; //傳送一組數(shù)包括引導(dǎo)碼1位,4個(gè)八位數(shù)據(jù),總共33位 i=0; //從第一維數(shù)組開(kāi)始 Delay_ms(10); if(HWRx) { //然后再檢測(cè)紅線(xiàn)接收腳是有數(shù)據(jù)招收,有繼續(xù),沒(méi)有則退出 EX1=1; return; } while(j--) { //循環(huán)接收33位數(shù)據(jù),為何我們用到66位數(shù)組,我們可以不接收高電平 時(shí)間常數(shù),只接低電平常數(shù)就 //可以判斷1或0了,在這里我們都接收,還有一點(diǎn)要知道, 接收波形是反向,在沒(méi)有接收時(shí)端口為高電平 tmp=0; Table_Rx[i]=1; //時(shí)間量從1開(kāi)始 while(!HWRx) //檢測(cè)高低電平的變化,這里檢測(cè)的是高電平 { Table_Rx[i]++; //沒(méi)變繼續(xù)加1 Delay(); //家一個(gè)延時(shí)防止,計(jì)數(shù)值一下子就加滿(mǎn)了 tmp++; //加1 if(tmp==250) break; } i++; tmp=0; Table_Rx[i]=1; //時(shí)間量從1開(kāi)始 while(HWRx) //檢測(cè)高低電平的變化,這里檢測(cè)的是低電平 { Table_Rx[i]++; //沒(méi)變繼續(xù)加1 Delay(); //同上 tmp++; //加1,用于判斷是1還是0的,低電平來(lái)了 if(tmp==250) break; } i++; } P1=0xf8; i=200; //加入循環(huán)延時(shí),抗干擾 while(i) //在有接收數(shù)據(jù)的時(shí)候顯示一個(gè)H { tmp=255; while(tmp) { tmp--; P2=0x76; } i--; } tmp=0; for(i=3;i<19;i++,i++) //處理發(fā)送的數(shù)據(jù) { tmp>>=1; //右移一位,接收低位在前 if(Table_Rx[i]>30) //檢測(cè)低電平時(shí)間超過(guò)30就確認(rèn)為1 tmp+=0x80; } Table_Data[0]=tmp/16; //分開(kāi)2位以16進(jìn)制顯示,用顯示發(fā)送的數(shù)據(jù) Table_Data[1]=tmp%16; tmp=0; for(i=19;i<35;i++,i++) //同上 { tmp>>=1; if(Table_Rx[i]>30) tmp+=0x80; } Table_Data[2]=tmp/16; Table_Data[3]=tmp%16; tmp=0; for(i=35;i<51;i++,i++) { tmp>>=1; if(Table_Rx[i]>30) tmp+=0x80; } Table_Data[4]=tmp/16; Table_Data[5]=tmp%16; tmp=0; for(i=51;i<67;i++,i++) { tmp>>=1; if(Table_Rx[i]>30) tmp+=0x80; } Table_Data[6]=tmp/16; Table_Data[7]=tmp%16; EX1=1; //剛進(jìn)中斷時(shí)關(guān)閉了分控,現(xiàn)在要打開(kāi) }