/*此程序是针对uPD6121系列遥控器的取码程序,解码值在Im[2]中,当IrOK=1时解码有效*/ /******************************************************************************/ /* 项目名称 : TX-1C扩展板 红外遥控器控制直流电机 */ /* 主控芯片 : STC89C52 */ /* 文件名称 : Inf_DcMotor */ /* 文件功能 : 主函数 */ /* 文件版权 : 天祥电子 */ /* 文件版本 : */ /******************************************************************************/ /**********************************包含头文件**********************************/ #include /********************************定义变量和数组********************************/ uchar PulseWidth = 0; //定义脉宽值 uchar StartFlag = 0; //定义启动标志位 0为停止 1为启动 uchar dc_count; //0.5ms次数标识 /******************************************************************************/ /* 函数名称 : delay */ /* 函数描述 : 延时函数 */ /* 输入参数 : 无 */ /* 参数描述 : 无 */ /* 返回值 : 无 */ /******************************************************************************/ void dc_delay(uchar i) { uchar j,k; for(j = i;j > 0;j--) { for(k = 125;k > 0;k--); } } /******************************************************************************/ /* 函数名称 : display */ /* 函数描述 : 显示函数函数 */ /* 输入参数 : 无 */ /* 参数描述 : 无 */ /* 返回值 : 无 */ /******************************************************************************/ void dc_display(void) { dula = 0; P0 = seg_table[PulseWidth/10]; //显示脉宽值高位 dula = 1; dula = 0; wela = 0; P0 = 0xfe; wela = 1; wela = 0; dc_delay(5); } /******************************************************************************/ /* 函数名称 : Inf_Dispose */ /* 函数描述 : 红外接收处理函数 */ /* 输入参数 : 无 */ /* 参数描述 : 无 */ /* 返回值 : 无 */ /******************************************************************************/ void dc_Inf_Dispose(void) { if(IrOK == 1) { switch(Im[2]) { case 0x44: //遥控器 开始/停止 键按下 启动停止控制 StartFlag =~ StartFlag; if(StartFlag) //启动 打开定时器中断 { if(PulseWidth) //只有当脉宽值不为0时才可以启动 { ET0 = 1; } } else //停止 关闭定时器中断 { ET0 = 0; dc_motor = 0; } break; case 0x09: //遥控器 - 键按下 脉宽值加10 PulseWidth += 10; dc_count=0; if(PulseWidth==60) { PulseWidth = 50; } break; case 0x15: //遥控器 + 键按下 脉宽值减10 PulseWidth -= 10; dc_count=0; if(PulseWidth == 0) { PulseWidth = 10; } if(PulseWidth == 246) { PulseWidth = 0; } break; default: break; } IrOK = 0; } } /******************************************************************************/ /* 函数名称 : Time0_Init */ /* 函数描述 : 定时器0初始化函数 */ /* 输入参数 : 无 */ /* 参数描述 : 无 */ /* 返回值 : 无 */ /******************************************************************************/ void dc_Time0_Init() //定时器初始化 { TMOD |= 0x01; //定时器0工作在方式1 IE |= 0x82; TH0 = 0xfe; TL0 = 0x33; //11.0592MZ晶振,0.5ms TR0 = 1; //定时器开始 ET0 = 0; } /******************************************************************************/ /* 函数名称 : main */ /* 函数描述 : 主函数 */ /* 输入参数 : 无 */ /* 参数描述 : 无 */ /* 返回值 : 无 */ /******************************************************************************/ void dc_main() { system_init(); IT1 = 1; EX1 = 1; dc_Time0_Init(); PulseWidth = 0; dc_count = 0; dc_motor = 0; diola = 1; dc_Time0_Init(); while(message=='c') { dc_Inf_Dispose(); //红外接收处理 dc_display(); //数码管显示 } } /******************************************************************************/