#define uchar unsigned char #define uint unsigned int sbit led1 = P0^0; // sbit led2 = P0^1; // sbit led3 = P0^2; // sbit led4 = P0^3; // sbit PWM_0 = P1^4; //定义直流电机的控制端口 sbit PWM_1 = P1^6; //定义直流电机的控制端口 sbit PWM_3 = P1^5; //定义直流电机的控制端口 sbit PWM_4 = P1^7; //定义直流电机的控制端口 sbit IRIN = P3^3; //红外接收器数据线 uchar CYCLE; //定义周期 uchar PWM_ON ; //定义低电平时间 uchar PWM_FF ; //定义低电平时间 uchar PWM_3T ; //定义低电平时间 uchar PWM_4T ; //定义低电平时间 uchar IRCOM[7];
void Delay_1ms(uint i) { uchar x,j; for(j=0;j/*********************红外专用延迟函数**********************************/ void delay(uchar x) //x*0.14MS {
uchar i; while(x--) {
for (i = 0; i<13; i++) {} } }
/***************** 红外遥控键盘函数 *************/ void key() {
if((IRCOM[2]==0x18)) //按数字键2 上 { Delay_1ms(20); if(IRCOM[2]==0x18)
{ PWM_ON=10; PWM_FF=10; PWM_3T=0; PWM_4T=0; led1 = 0; // led2 = 1; // led3 = 1; // led4 = 1; // while(!IRCOM[2]); } } if((IRCOM[2]==0x52)) //按数字键8 下 { Delay_1ms(20); if(IRCOM[2]==0x52) { led1 = 1; // led2 = 0; // led3 = 1; // led4 = 1; // PWM_ON=0; PWM_FF=0; PWM_3T=10; PWM_4T=10; while(!IRCOM[2]); } }
if((IRCOM[2]==0x08)) //按数字键4 左 { Delay_1ms(20); if(IRCOM[2]==0x08) { led1 = 1; // led2 = 1; // led3 = 0; // led4 = 1; // PWM_ON=0; PWM_FF=10; PWM_3T=0; PWM_4T=0; while(!IRCOM[2]); } }
if((IRCOM[2]==0x5a))//按数字键6 右 { Delay_1ms(20); if(IRCOM[2]==0x5a) { led1 = 1; // led2 = 1; // led3 = 1; // led4 = 0; // PWM_ON=10; PWM_FF=0; PWM_3T=0; PWM_4T=0; while(!IRCOM[2]); } } if((IRCOM[2]==0x1c))//按数字键5 停 { Delay_1ms(20); if(IRCOM[2]==0x1c) { led1 = 1; // led2 = 1; // led3 = 1; // led4 = 1; // PWM_ON=0; PWM_FF=0; PWM_3T=0; PWM_4T=0; while(!IRCOM[2]); } } }
void Time0(void) { TMOD |=0x01; //定时器设置 1ms in 12M crystal TH0=(65536-1000)/256; TL0=(65536-1000)%256; //定时1mS IE= 0x82; //打开中断 TR0=1; //定时器打开 }
/*********** 定时器0、1,外部中断1 初始化 *****************/
void Time(void) { TMOD =0x11; //定时器设置 1ms in 12M crystal TH0=(65536-1000)/256; TL0=(65536-1000)%256; //定时1mS // TH1 = 0x4c; //对TH0 TL0赋值
// TL1 = 0x00; //使定时器0.05秒中断一次 // ET1 = 1; ET0 = 1; EX1 = 1; EA = 1; //打开中断 TR0 = 1; //定时器打开 // TR1 = 1; IRIN= 1; //红外I/O口初始化 }
main() { led1 = 1; // led2 = 1; // led3 = 1; // led4 = 1; // CYCLE = 10; //时间可以调整 这个是10步调整 周期10ms 8位PWM就是256步 PWM_0 = 0; PWM_1 = 0;
Time(); //中断初始化 while(1) { } }
/********************************/ /* 定时中断 */ /********************************/ void tim(void) interrupt 1 using 1 { static unsigned char count; TH0=(65536-1000)/256; TL0=(65536-1000)%256;//定时1mS if(count==PWM_ON) { PWM_0 = 1; //直流电机转
} if(count==PWM_FF) { PWM_1 = 1; //直流电机转 } if(count==PWM_3T) { PWM_3 = 1; //直流电机转 } if(count==PWM_4T) { PWM_4 = 1; //直流电机转 } count++; if(count == CYCLE) { count=0; if(PWM_ON!=0) //如果左右时间是0 保持原来状态 { PWM_0 = 0; //直流电机不转 } if(PWM_FF!=0) //如果左右时间是0 保持原来状态 { PWM_1 = 0; //直流电机不转 } if(PWM_3T!=0) //如果左右时间是0 保持原来状态 { PWM_3 = 0; //直流电机不转 } if(PWM_4T!=0) //如果左右时间是0 保持原来状态 { PWM_4 = 0; //直流电机不转 } } }
/********************************************************************/ /********* 红外外部中断1函数 ***********/ /********************************************************************/
void IR_IN() interrupt 2 using 0 {
unsigned char j,k,N=0;
EX1 = 0; delay(15); if (IRIN==1) { EX1 =1; return; }
//确认IR信号出现
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。 {delay(1);}
for (j=0;j<4;j++) //收集四组数据 {
for (k=0;k<8;k++) //每组数据有8位 {
while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。 {delay(1);}
while (!IRIN) //等 IR 变为高电平 {delay(1);} while (IRIN) //计算IR高电平时长 { delay(1); N++; if (N>=30) { EX1=1; return; } //0.14ms计数过长自动离开。 } //高电平计数完毕 IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0” if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1” N=0;
} //end for k } //end for j
if (IRCOM[2]!=~IRCOM[3]) {
EX1=1; return; } key(); EX1 = 1; }