#include <STC15F104E.H> typedef unsigned int u16; typedef unsigned char u8;//無符號數據類型 u16 time ; //時間變量 sbit led=P3^5; static u8 u; //static靜態變量下次函數調用時,這個值保持不變。 u8 IRcord[3]; //用來存放用戶碼、用戶反碼、數據碼、數據反碼 u8 position[25]; //用來存放一幀數據+頭碼共25位 bit in_ok; //接收完成標志 bit dispose_ok ; //解碼完成標志 void shu_ju_chu_li()//數據處理函數 { u8 y,j,k=1; //局部變量 (K=1就是去掉引導位頭碼0位) u8 cord,value; //局部變量 for(y=0;y<3;y++)//處理3個字節 { for(j=1;j<=8;j++) //處理1個字節8位 { cord= position[k]; //把儲存的數按位排列(K-第幾位) value=value>>1; // 低位右移 if(cord>=4) // 0.256MS*4=1M大于1Ms判斷為1 { value=value|0x80; //(value|0x80按位或,首位是最低位放最高位等下個數過來再右移) } u++; // 右移一次加一位 } position[y]= value; // 把按位排列好的數放在4組數里(y 是第幾組) value=0; //清0以便接收下次數據 } dispose_ok=1; //處理完畢標志位置1 } void InitTimer0(void) //定時器0初始化 { TMOD = 0x02; //設置定時器0,工作方式2,8位自動重載 TH0 = 0x0; TL0 = 0x0;//最大溢出值256us EA = 1; // 打開總中斷 ET0 = 1;// 定時器0允許位 TR0 = 1;// 計時 } void Timer0Interrupt(void) interrupt 1 //定時中斷函數 { time++; } void Int0Init()//外部中斷初始化 { IT0=1; //外部中斷0允許位 EX0=1; //允許外部中斷0申請 EA=1; //打開總中斷 } void Int0()interrupt 0 //外部中斷0函數 { u8 irin; if(irin) // //如果接收到信號 { if(time>=46&&time<78)// u=0; position[u]=time;//把接收的數據時間保存在irdata[u] time=0; //變量清0 u++; // 保存1位 if(u==25) //一幀數據+頭碼共33位 { in_ok=1; //一幀數據接收完成 u=0; //變量清0 } } else { time=0; //變量清0 irin=1; //初始化接收腳 } } void main () { Int0Init(); //調用外部中斷函數 InitTimer0(); //調用定時中斷函數 while(1) { if(in_ok) //如果收完成標志為1 { shu_ju_chu_li(); //調用紅處理函數 in_ok=0; //標志清0 } if(dispose_ok ) //遙控成功接收 { if (~position[2]==0x8d) //取反IRcord[2]第組數據,=? { position[2]=0; //清0以便接收下次數據 led=~led; } } } } |