/*此程序是针对uPD6121系列遥控器的取码程序,解码值在Im[2]中,当IrOK=1时解码有效*/ /******************************************************************************/ /* 项目名称 : TX-1C扩展板 红外遥控器控舵机 */ /* 主控芯片 : STC89C52 */ /* 文件名称 : Inf_HelmMotor */ /* 文件功能 : 主函数 */ /* 文件版权 : 天祥电子 */ /* 文件版本 : */ /******************************************************************************/ /**********************************包含头文件**********************************/ #include uchar helm_jd; //角度标识 uchar helm_count; //0.5ms次数标识 /******************************************************************************/ /* 函数名称 : delay */ /* 函数描述 : 延时函数 */ /* 输入参数 : 无 */ /* 参数描述 : 无 */ /* 返回值 : 无 */ /******************************************************************************/ void helm_delay(uchar i) { uchar j,k; for(j = i;j > 0;j--) { for(k = 10;k > 0;k--); } } /******************************************************************************/ /* 函数名称 : display */ /* 函数描述 : 显示函数函数 */ /* 输入参数 : 无 */ /* 参数描述 : 无 */ /* 返回值 : 无 */ /******************************************************************************/ void helm_display(void) { uchar bai,shi,ge; switch(helm_jd) //根据角度标识显示相应的数值 { case 1: //为1,角度为0,前3个数码管显示000 bai = 0; shi = 0; ge = 0; break; case 2: //为2,角度为45,前3个数码管显示045 bai = 0; shi = 4; ge = 5; break; case 3: //为3,角度为90,前3个数码管显示090 bai = 0; shi = 9; ge = 0; break; case 4: //为1,角度为135,前3个数码管显示135 bai = 1; shi = 3; ge = 5; break; case 5: //为5,角度为180,前3个数码管显示180 bai = 1; shi = 8; ge = 0; break; default: break; } dula = 0; wela = 0; { P0 = 0; dula = 1; dula = 0; P0 = 0xff; wela = 1; wela = 0; } P0 = seg_table[bai]; dula = 1; dula = 0; P0 = 0xfe; wela = 1; wela = 0; helm_delay(5); { P0 = 0; dula = 1; dula = 0; P0 = 0xff; wela = 1; wela = 0; } P0 = seg_table[shi]; dula = 1; dula = 0; P0 = 0xfd; wela = 1; wela = 0; helm_delay(5); { P0 = 0; dula = 1; dula = 0; P0 = 0xff; wela = 1; wela = 0; } P0 = seg_table[ge]; dula = 1; dula = 0; P0 = 0xfb; wela = 1; wela = 0; helm_delay(5); } /******************************************************************************/ /* 函数名称 : Inf_Dispose */ /* 函数描述 : 红外接收处理函数 */ /* 输入参数 : 无 */ /* 参数描述 : 无 */ /* 返回值 : 无 */ /******************************************************************************/ void helm_Inf_Dispose(void) { if(IrOK == 1) { switch(Im[2]) { case 0x09: //遥控器+键按下 角度加45 helm_jd++; //角度标识加1 helm_count = 0; //按键按下 则20ms周期从新开始 if(helm_jd == 6) { helm_jd = 5; //已经是180度,则保持 } break; case 0x15: //遥控器-键按下 角度减45 helm_jd--; //角度标识减1 helm_count = 0; if(helm_jd == 0) { helm_jd = 1; //已经是0度,则保持 } break; default: break; } IrOK = 0; } } void helm_Time0_Init() //定时器初始化 { TMOD |= 0x01; //定时器0工作在方式1 IE |= 0x82; TH0 = 0xfe; TL0 = 0x33; //11.0592MZ晶振,0.5ms TR0 = 1; //定时器开始 ET0 = 1; } /******************************************************************************/ /* 函数名称 : main */ /* 函数描述 : 主函数 */ /* 输入参数 : 无 */ /* 参数描述 : 无 */ /* 返回值 : 无 */ /******************************************************************************/ void helm_main(void) { system_init(); EA = 1; EX1 = 1; IT1 = 1; helm_Time0_Init(); helm_jd = 1; helm_count = 0; while(message=='d') { helm_Inf_Dispose(); //红外接收处理 helm_display(); //数码管显示 } } /******************************************************************************/