#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; } } } } |