基于51單片機的無線遙控小車設計 (附發射接收程序) 關于遙控小車,網上的資料很多,有藍牙的、有WIFI的、有紅外的、還有單片機+PT2262/PT2272編解碼芯片的等等,動不動就上演智能小車的節奏,什么避障、什么循跡,講半天云里霧里的,還不知道真正的遙控在哪里。如果只是需要小車進行簡單的前后左右停止操作,需要那么麻煩嗎?1.藍牙版的需要手機APP和藍牙接收模塊(一般十幾元,加運費的話也得二十了),另外遙控范圍有限,一般在10米以內;2.WIFI版的,難到小車只在有網的地方跑嗎?況且WIFI接收模塊也不便宜吧;3.紅外版的,遙控器只能對著小車遙控,又不是電視機(擱那一直不動),用紅外遙控器的,不知道怎么想的;4.還有單片機+PT2262/PT2272編解碼芯片的,這個讓我不能理解的是既然已經有單片機了,還要編解碼芯片做什么呢?好了,話不多說,現在給大家來一款51單片機版(不需要編解碼芯片)的無線遙控小車設計,電路原理圖及實物照片如下圖:
另外需要說明的是,發射接收模塊需要自己各接上17cm長的導線作為天線,小車電源的話用一節可充電的鋰電池就好,容量最好大一點,小車跑的時間就能長一些,或者把以前不用的手機上的鋰電池拆下來接上也可以!遙控器電源采用2節3V(2032的)鈕扣電池就可以了。
以下是遙控小車程序代碼:
- /***************************************************************/
- /*【基于51單片機的無線遙控小車設計】
- /***************************************************************/
- /*發射部分*/
- #include"STC15F104E.H"
- #define uchar unsigned char
- sbit K0=P3^5;//S4,停止
- sbit K1=P3^4;//S5,前進
- sbit K2=P3^1;//S2,后退
- sbit K3=P3^2;//S1,左轉
- sbit K4=P3^0;//S3,右轉
- sbit TX=P3^3;
- void delay_315()
- {
- uchar i,j;
- for(i=0;i<10;i++)
- for(j=0;j<110;j++);
- }
- void main()
- {
- uchar i;
- bit dong=0;
- TMOD=0X01; //開定時器0中斷
- TH0=(65536-100)/256;
- TL0=(65536-100)%256;
- EA=1;
- ET0=1;
- TR0=1;
- EX0=1;
- IT0=1;
- TX=0;
- while(1)
- {
- if(K0==0) //發送指令0
- {
- delay_315();
- while(K0==0){ v0();v0();v0();m=0;while(m<40);}
- }
-
- if(K1==0) //發送指令1
- {
- delay_315();
- while(K1==0){ v0();v0();v1();m=0;while(m<40);}
- }
-
- if(K2==0)
- {
- delay_315();
- while(K2==0){ v0();v1();v0();m=0;while(m<40);}
- dong=1;
- }
- if(K3==0)
- {
- delay_315();
- while(K3==0){ v0();v1();v1();m=0;while(m<40);}
- dong=1;
- }
- if(K4==0)
- {
- delay_315();
- while(K4==0){ v1();v0();v0();m=0;while(m<40);}
- dong=1;
- }
- if(dong==1)
- {
- dong=0;
- for(i=0;i<5;i++)
- { v0();v0();v0();m=0;while(m<40);
- delay_315(); }
-
- }
- }
- }
- /*
- void EXINT_0() interrupt 0
- {
- delay_315();
- if(K7==0) //發送指令1
- {
- delay_315();
- while(K7==0){v3();v2();v0();v0();v1();m=0;while(m<40);}
- delay_315();
-
- // dong=1;
- }
- }
- */
- void timer0() interrupt 1
- {
- TH0=(65536-100)/256;
- TL0=(65536-100)%256;
- m++;
- TF0=0;
- }
- /***************************************************************/
- /*【基于51單片機的無線遙控小車設計】
- /***************************************************************/
- /*接收部分*/
- #include"STC15F104E.H"
- #define uchar unsigned char
- sbit RX=P3^3; //定義接收腳
- sbit LED=P3^5; //定義繼電器端
- sbit IN1=P3^0; //電機驅動L
- sbit IN2=P3^1; //電機驅動L
- sbit IN3=P3^2; //電機驅動R
- sbit IN4=P3^4; //電機驅動R
- //void delay10ms(unsigned char a);
- //小車動作函數
- void run()//前進
- {
- IN1=1;//左電機往前走
- IN2=0;
-
- IN3=1;//右電機往前走
- IN4=0;
- }
- void backrun()//后退
- {
- IN1=0;//左電機往后走
- IN2=1;
-
- IN3=0;//右電機往后走
- IN4=1;
- }
- /*
- void leftrun()//左前
- {
- IN1=0;//左電機往后走
- IN2=0;
-
- IN3=1;//右電機往前走
- IN4=0;
- }
- void rightrun()//右前
- {
- IN1=1;//左電機往前走
- IN2=0;
-
- IN3=0;//右電機往后走
- IN4=0;
- }
- */
- void lefturn()//左轉
- {
- IN1=0;//左電機往后走
- IN2=1;
-
- IN3=1;//右電機往前走
- IN4=0;
- }
- void righturn()//右轉
- {
- IN1=1;//左電機往前走
- IN2=0;
-
- IN3=0;//右電機往后走
- IN4=1;
- }
- void stop()//停止
- {
- IN1=0;//左電機停止
- IN2=0;
-
- IN3=0;//右電機停止
- IN4=0;
- }
- uchar m,flag,x,y;
- bit n;
- //PCON2=0X00;
- void main()
- {
- // P3M1 = 0x00;
- // P3M1 = 0xFF;
- uchar a,b,c,p=0; //定義存取的數據
- TMOD=0X01;
- TH0=(65536-100)/256; //開定時器0
- TL0=(65536-100)%256;
- EA=1; //開總中斷
- ET0=1; //開定時器0中斷
- TR0=1; //啟動定時器0工作
- EX1=1; //允許外部中斷INT1
- IT1=1; //外部中斷INT1為下降沿觸發方式
- p=0;
- x=0;
- LED=1;
- while(1)
- {
- if(n==1)
- {
- p=a+b+c;
- x++;
- if(x==1)y=p;
- // delay10ms(1);
- if(x==2)
- {
- x=0;
- if(y==p)
- {
- // P2=p;delay100ms(8); P2=0XFF;
- switch(p)
- {
- case 0:stop();break; //停止
- case 1:run()break;
- case 2:backrun();break;
- case 3:lefturn();break;
- case 4:righturn();break;
- // case 5:lefturn();break;
- // case 6:righturn();break;
- // case 7:LED = 1;delay100ms(1); break;
- default:stop();LED = 1;break;
- }
- }
- }
- // stop();LED = 1;
- }
-
- }
- }
- }
- }
- /*
- void delay10ms(unsigned char a)
- {
- unsigned char i,j,k;
- for(i=a;i>0;i--)
- for(j=20;j>0;j--)
- for(k=248;k>0;k--);
- }
- */
- void timer0() interrupt 1
- {
-
- TH0=(65536-100)/256;
- TL0=(65536-100)%256;
- m++;
- // x++;
-
- TF0=0;
- }
- void INT_1() interrupt 2
- {
- n=1;
- }
復制代碼
|