浙江工业职业技术学院电气工程分院毕业设计
}
//发送八位数据的反码 irdata=D;
for(i=0;i<8;i++) {
endcount=10; flag=1; count=0;
do{}while(count endcount=41; } else { endcount=15; } flag=0; count=0; do{}while(count endcount=10; flag=1; count=0; do{}while(count //-------------------------------------------------------------------------------- //接收模块程序 unsigned long Low_guide() { unsigned long dat=0; TL1=0; TH1=0; TR1=1; while(!Ir_Pin&&((TH1*256+TL1)<5000)); dat=TH1*256+TL1; TL1=0; TH1=0; 22 浙江工业职业技术学院电气工程分院毕业设计 while(!Ir_Pin&&((TH1*256+TL1)<5000)); dat=dat+(TH1*256+TL1); TR1=0; return dat; } unsigned int High_guide() { TL1=0; TH1=0; TR1=1; while(Ir_Pin &&((TH1*256+TL1)<5000)); TR1=0; return TH1*256+TL1; } //============================================================== //辨别低电平 unsigned int Ir_Get_Low() { TL1=0; TH1=0; TR1=1; while(!Ir_Pin && ((TH1&0x80)==0)); //当Ir_Pin变为1时,退出计时 TR1=0; return TH1*256+TL1; } //============================================================= //辨别高电平 unsigned int Ir_Get_High() { TL1=0; TH1=0; TR1=1; while(Ir_Pin && ((TH1&0x80)==0));//当Ir_Pin变为0时,退出计时 TR1=0; return TH1*256+TL1; } void timeint(void) interrupt 1 { TH0=0xFF; TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次 23 浙江工业职业技术学院电气工程分院毕业设计 count++; if (flag==1) { OP=~OP; } else { OP = 0; } P3_4 = OP; } void Slave_init() { call_master_flag=0; sys_code=0; call_addr=0; ////////////////////// count = 0; flag = 0; OP = 0; P3_4 = 0; } //临时用 void disp(uchar n1,uchar n2,uchar n3) { Num1_Ram=n1/10; Num2_Ram=n1; Num3_Ram=n2/10; Num4_Ram=n2; Num5_Ram=n3/16; Num6_Ram=n3; SMS06_display(); } //============================================================== //主函数 void main() { uchar n=0; Slave_init(); init_SMS0601(); TMOD=0x11;//定时器1采用16为计时 24 浙江工业职业技术学院电气工程分院毕业设计 TH0 = 0xFF; TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次 ET0 = 1; //定时器0中断允许 TR0 = 0; EA = 1; //允许CPU中断 while(1) { restart: while(Ir_Pin);//等待主机呼叫 //////////////////////////////////////////////////////////////////////////// guide_high=Low_guide(); //guide_long=Ir_Get_Low(); if(guide_high<8000 || guide_high>9900) continue;//引导脉冲低电平9000 guide_low=High_guide(); //guide_long=Ir_Get_High(); if(guide_low<4000 || guide_low>5000) continue;//引导脉冲高电平4500 ////////////////////////////////////////////////////////////////////////////// for(i=0;i<4;i++) //4个字节 for(j=0;j<8;j++) //每个字节8位 { //排除干扰+载波低电平通过 temp=Ir_Get_Low();//载波为560m if(temp if(temp Ir_Buf[i]>>=1;//给第一位清零,配合装值,第二次才正式使用 //判断高低电平,高:>1120us 低:<1120us if(temp>1120) Ir_Buf[i]|=0x80;//第一位为1 ,否则为0 //判断系统码是不是正确,yes 取地址信息, no 退出 sys_code=Ir_Buf[0]/16;//转换成系统码 //if(sys_code!=10) //if(sys_code==10||sys_code==1) if(sys_code==10) 25 浙江工业职业技术学院电气工程分院毕业设计 { call_addr=Ir_Buf[0];//取地址 call_master_flag=1; } else { goto restart;//返回 } ////////////////////////////////////////////////// if(call_master_flag==1) { if(call_addr==1) { RH(); T_RH[0]=0xa1;//系统码+地址 T_RH[1]=temp_val/10;//装温度整数值 T_RH[2]=RH_val/10;//装湿度整数值 T_RH[3]=(temp_val)*16+(RH_val);//高4位装温度小数值,低4位装湿度小数值 SendIRdata(T_RH[0],T_RH[1],T_RH[2],T_RH[3]);//往主机发送信息//往主机发送信息 call_master_flag=0; } else if(call_addr==2) { RH1(); T_RH[4]=0xa2;//系统码+地址 T_RH[5]=temp_val_1/10;//装温度整数值 T_RH[6]=RH_val_1/10;//装湿度整数值 T_RH[7]=(temp_val_1)*16+(RH_val_1);//高4位装温度小数值,低 26 浙江工业职业技术学院电气工程分院毕业设计 4位装湿度小数值 SendIRdata(T_RH[4],T_RH[5],T_RH[6],T_RH[7]); call_master_flag=0; } //后加 else if(call_addr==3) { RH2(); T_RH[8]=0xa3;//系统码+地址 T_RH[9]=temp_val_2/10;//装温度整数值 T_RH[10]=RH_val_2/10;//装湿度整数值 T_RH[11]=(temp_val_2)*16+(RH_val_2);//高4位装温度小数值,低4位装湿度小数值 SendIRdata(T_RH[8],T_RH[9],T_RH[10],T_RH[11]); call_master_flag=0; } } disp(call_addr,T_RH[8],n); n++; Slave_init(); //disp(T_RH[1],T_RH[3]/16,n); //m++; //disp(Ir_Buf[0],T_RH[5],m0); //disp(Ir_Buf[2],Ir_Buf[3],m0); //从机处理结束; //////////////////////////////////////////////////////// } } 27