智能玩具小车的设计与实现 程序 可以实现小车在红外遥控器下行驶 左转 右转 前进 后退 停止 要原理图的话 你懂的 #include<> #include <>#define uchar unsigned char#define uint unsigned int sbit IR=P3^2; //红外接口标志 sbit NEA1=P2^2; sbit NEB1=P2^3; sbit IN1=P2^0; sbit IN2=P2^1; sbit IN3=P2^4; sbit IN4=P2^5;char code Tab[16]="0123456789ABCDEF";unsigned char irtime;//红外用全局变量bit irpro_ok,irok;unsigned char IRcord[4];unsigned char irdata[33];unsigned char TempData[16]; uchar a; void Ir_work(void); void Ircordpro(void); void qian_jin(void); void hou_tui(void); void zuo(void); void you(void); void ting(void); void zuo45(void); void you45(void); void delay(uchar t); void delay(uchar t) //延时1ms { uchar i,j,k; for(i=t;i>0;i--) for(j=142;j>0;j--) for(k=4;k>0;k--); } void DelayUs2x(unsigned char t){ while(--t);}void DelayMs(unsigned char t){ while(t--) { //大致延时1mS DelayUs2x(245); DelayUs2x(245); }} void qian_jin(void) { IN1=0; IN2=1; IN3=0; IN4=1; NEA1=1; NEB1=1; } void hou_tui(void) { IN1=1; IN2=0; IN3=1; IN4=0; NEA1=1; NEB1=1; } void zuo(void) { IN1=0; IN2=1; IN3=1; IN4=0; NEA1=1; NEB1=1; } void you(void) { IN1=1; IN2=0; IN3=0; IN4=1; NEA1=1; NEB1=1; } void ting(void) { IN1=0; IN2=0; IN3=0; IN4=0; NEA1=0; NEB1=0; } void zuo45(void) { IN1=0; IN2=1; IN3=1; IN4=0; NEA1=1; NEB1=1; delay(150); delay(100); } void you45(void) { IN1=1; IN2=0; IN3=0; IN4=1; NEA1=1; NEB1=1; delay(150); delay(100); }void tim0_isr (void) interrupt 1 using 1{ irtime++; //用于计数2个下降沿之间的时间}void EX0_ISR (void) interrupt 0 //外部中断0服务函数{ static unsigned char i; //接收红外信号处理 static bit startflag; //是否开始处理标志位if(startflag) { if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+ i=0; irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1 irtime=0; i++; if(i==33) { irok=1; i=0; } } else { irtime=0; startflag=1; }}void TIM0init(void)//定时器0初始化{ TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值 TH0=0x00; //重载值 TL0=0x00; //初始化值 ET0=1; //开中断 TR0=1; }void EX0init(void){ IT0 = 1; //指定外部中断0下降沿触发,INT0 () EX0 = 1; //使能外部中断 EA = 1; //开总中断}void Ir_work(void){ TempData[0] = Tab[IRcord[0]/16]; //处理客户码 TempData[1] = Tab[IRcord[0]%16]; TempData[2] = '-'; TempData[3] = Tab[IRcord[1]/16]; //处理客户码 TempData[4] = Tab[IRcord[1]%16]; TempData[5] = '-'; TempData[6] = Tab[IRcord[2]/16]; //处理数据码 TempData[7] = Tab[IRcord[2]%16]; TempData[8] = '-'; TempData[9] = Tab[IRcord[3]/16]; //处理数据反码 TempData[10] = Tab[IRcord[3]%16]; irpro_ok=0;//处理完成标志 }void Ircordpro(void)//红外码值处理函数{ unsigned char i, j, k; unsigned char cord,value; k=1; for(i=0;i<4;i++) //处理4个字节 { for(j=1;j<=8;j++) //处理1个字节8位 { cord=irdata[k]; if(cord>7) //大于某值为1, value|=0x80; if(j<8) { value>>=1; } k++; } IRcord[i]=value; value=0; } irpro_ok=1;//处理完毕标志位置1}void main(void){ EX0init(); //初始化外部中断 TIM0init(); //初始化定时器 DelayMs(20); //延时有助于稳定 while(1)//主循环 { if(irok) //如果接收好了进行红外处理 { Ircordpro(); irok=0; } if(irpro_ok) { Ir_work(); }if(TempData[9]=='E' && TempData[10]=='3' ) { a=0; } if(TempData[9]=='E' && TempData[10]=='7' ) { a=1; } if(TempData[9]=='A' && TempData[10]=='D') { a=2; } if(TempData[9]=='F' && TempData[10]=='7') { a=3; } if(TempData[9]=='A' && TempData[10]=='5') { a=4; } if(TempData[9]=='F' && TempData[10]=='3') { a=5; } if(TempData[9]=='A' && TempData[10]=='1' ) { a=6; } switch(a) { case 0: ting(); break; case 1: qian_jin(); break; case 2: hou_tui(); break; case 3: zuo(); break; case 4: you(); break; case 5: zuo45();a=0;TempData[10]='0'; break; case 6: you45();a=0;TempData[10]='0'; break; default: a=0; break; } }}