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