#include REGX52.H/*** brief 外部中断0初始化* param 无* retval 无*/void Int0_Init(void){IT01;IE00;EX01;EA1;PX01;}/*外部中断0中断函数模板void Int0_Routine(void) interrupt 0{}*/#include REGX52.H#include Timer0.h#include Int0.hunsigned int IR_Time;unsigned char IR_State;unsigned char IR_Data[4];unsigned char IR_pData;unsigned char IR_DataFlag;unsigned char IR_RepeatFlag;unsigned char IR_Address;unsigned char IR_Command;/*** brief 红外遥控初始化* param 无* retval 无*/void IR_Init(void){Timer0_Init();Int0_Init();}/*** brief 红外遥控获取收到数据帧标志位* param 无* retval 是否收到数据帧1为收到0为未收到*/unsigned char IR_GetDataFlag(void){if(IR_DataFlag){IR_DataFlag0;return 1;}return 0;}/*** brief 红外遥控获取收到连发帧标志位* param 无* retval 是否收到连发帧1为收到0为未收到*/unsigned char IR_GetRepeatFlag(void){if(IR_RepeatFlag){IR_RepeatFlag0;return 1;}return 0;}/*** brief 红外遥控获取收到的地址数据* param 无* retval 收到的地址数据*/unsigned char IR_GetAddress(void){return IR_Address;}/*** brief 红外遥控获取收到的命令数据* param 无* retval 收到的命令数据*/unsigned char IR_GetCommand(void){return IR_Command;}//外部中断0中断函数下降沿触发执行void Int0_Routine(void) interrupt 0{if(IR_State0) //状态0空闲状态{Timer0_SetCounter(0); //定时计数器清0Timer0_Run(1); //定时器启动IR_State1; //置状态为1}else if(IR_State1) //状态1等待Start信号或Repeat信号{IR_TimeTimer0_GetCounter(); //获取上一次中断到此次中断的时间Timer0_SetCounter(0); //定时计数器清0//如果计时为13.5ms则接收到了Start信号判定值在12MHz晶振下为13500在11.0592MHz晶振下为12442if(IR_Time13500-500 IR_Time13500500){IR_State2; //置状态为2}//如果计时为11.25ms则接收到了Repeat信号判定值在12MHz晶振下为11250在11.0592MHz晶振下为10368else if(IR_Time11250-500 IR_Time11250500){IR_RepeatFlag1; //置收到连发帧标志位为1Timer0_Run(0); //定时器停止IR_State0; //置状态为0}else //接收出错{IR_State1; //置状态为1}}else if(IR_State2) //状态2接收数据{IR_TimeTimer0_GetCounter(); //获取上一次中断到此次中断的时间Timer0_SetCounter(0); //定时计数器清0//如果计时为1120us则接收到了数据0判定值在12MHz晶振下为1120在11.0592MHz晶振下为1032if(IR_Time1120-500 IR_Time1120500){IR_Data[IR_pData/8]~(0x01(IR_pData%8)); //数据对应位清0IR_pData; //数据位置指针自增}//如果计时为2250us则接收到了数据1判定值在12MHz晶振下为2250在11.0592MHz晶振下为2074else if(IR_Time2250-500 IR_Time2250500){IR_Data[IR_pData/8]|(0x01(IR_pData%8)); //数据对应位置1IR_pData; //数据位置指针自增}else //接收出错{IR_pData0; //数据位置指针清0IR_State1; //置状态为1}if(IR_pData32) //如果接收到了32位数据{IR_pData0; //数据位置指针清0if((IR_Data[0]~IR_Data[1]) (IR_Data[2]~IR_Data[3])) //数据验证{IR_AddressIR_Data[0]; //转存数据IR_CommandIR_Data[2];IR_DataFlag1; //置收到连发帧标志位为1}Timer0_Run(0); //定时器停止IR_State0; //置状态为0}}}#include REGX52.H#include Timer1.h//引脚定义sbit MotorP1^0;unsigned char Counter,Compare;/*** brief 电机初始化* param 无* retval 无*/void Motor_Init(void){Timer1_Init();}/*** brief 电机设置速度* param Speed 要设置的速度范围0~100* retval 无*/void Motor_SetSpeed(unsigned char Speed){CompareSpeed;}//定时器1中断函数void Timer1_Routine() interrupt 3{TL1 0x9C; //设置定时初值TH1 0xFF; //设置定时初值Counter;Counter%100; //计数值变化范围限制在0~99if(CounterCompare) //计数值小于比较值{Motor1; //输出1}else //计数值大于比较值{Motor0; //输出0}}#include REGX52.H/*** brief 定时器1初始化100us12.000MHz* param 无* retval 无*/void Timer1_Init(void){TMOD 0x0F; //设置定时器模式TMOD | 0x10; //设置定时器模式TL1 0x9C; //设置定时初值TH1 0xFF; //设置定时初值TF1 0; //清除TF1标志TR1 1; //定时器1开始计时ET11;EA1;PT10;}/*定时器中断函数模板void Timer1_Routine() interrupt 3{static unsigned int T1Count;TL1 0x9C; //设置定时初值TH1 0xFF; //设置定时初值T1Count;if(T1Count1000){T1Count0;}}*/#include REGX52.H#include Delay.h#include Key.h#include Nixie.h#include Motor.h#include IR.hunsigned char Command,Speed;void main(){Motor_Init();IR_Init();while(1){if(IR_GetDataFlag()) //如果收到数据帧{CommandIR_GetCommand(); //获取遥控器命令码if(CommandIR_0){Speed0;} //根据遥控器命令码设置速度if(CommandIR_1){Speed1;}if(CommandIR_2){Speed2;}if(CommandIR_3){Speed3;}if(Speed0){Motor_SetSpeed(0);} //速度输出if(Speed1){Motor_SetSpeed(50);}if(Speed2){Motor_SetSpeed(75);}if(Speed3){Motor_SetSpeed(100);}}Nixie(1,Speed); //数码管显示速度}}