第一:单片机应用中,什么是合适的程序?能发挥硬件性能的程序,就是适合的。你不说你的配件,只要合适的程序是不可能有的。 第二:我有一个,你可以参考。/* 简易小车。51单片机最小系统板,L298N带动两个电机,12V电机电源,L298N自带5V逻辑电源, 供板子使用。 超声波测距HC-SR04,用舵机SG90使它转动探测。 目标:壁障; */ #include <reg51.h> #include <intrins.h> sbit ZLDJ10=P2^3;//直流电机的控制口 sbit ZLDJ11=P2^2; sbit ZLDJ20=P2^1; sbit ZLDJ21=P2^0; sbit RX=P2^6;//超声波测距HC-SR04数据口Echo sbit TX=P2^5;//超声波测距HC-SR04数据口Trig sbit DJ=P2^7;//SG90舵机的数据口 bit flag=0; unsigned int time=0; unsigned int timer=0; unsigned long S=0; unsigned long SPD[5]={5000,5000,5000,5000,5000}; unsigned char GT,DT; void Delay10ms(unsigned int c); void Delay50us(unsigned int c); void DJZD (void); void SG90 (void); void Conut(void); void CSBCJ(void); void main(void) { TMOD=0x11;//设T0、T1为方式1,GATE=0; TH0=0; TL0=0; TH1=0xf8; TL1=0x30; ET0=1; ET1=1; EA=1; TR1=1; GT=30;DT=350;DJ=0; DJZD(); TC(); RX=1; TX=0; Delay10ms(500); RX=0; while(1) { CSBCJ(); SPD[2]=S; if((S>=2500)||flag==1) { KZXCYD(); } if (S<=2500) { ZL(); } } } void Conut(void) { time=TH0*256+TL0; TH0=0; TL0=0; S= (long)(time*0.17); } void zd1() interrupt 1 { flag=1; } void zd3() interrupt 3 { TH1=0xf8; TL1=0x30; timer++; if(timer>=100) { timer=0; TX=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); TX=0; } } void CSBCJ(void) { while(!RX); TR0=1; while(RX); TR0=0; Conut(); } void SG90(void) { flag=0; GT=10;DT=390;DJZD (); CSBCJ(); if ((flag==0)&&(S<=2500)) { SPD[0]=S; } else { SPD[0]=5000; } flag=0; GT=20;DT=380;DJZD (); CSBCJ(); if ((flag==0)&&(S<=2500)) { SPD[1]=S; } else { SPD[1]=5000; } flag=0; GT=30;DT=370;DJZD (); CSBCJ(); if ((flag==0)&&(S<=2500)) { SPD[2]=S; } else { SPD[2]=5000; } flag=0; GT=40;DT=360;DJZD (); CSBCJ(); if ((flag==0)&&(S<=2500)) { SPD[3]=S; } else { SPD[3]=5000; } flag=0; GT=50;DT=350;DJZD (); CSBCJ(); if ((flag==0)&&(S<=2500)) { SPD[4]=S; } else { SPD[4]=5000; } flag=0; GT=10;DT=390;DJZD (); CSBCJ(); if ((flag==0)&&(S<=2500)) { SPD[0]=S; } else { SPD[0]=5000; } flag=0; GT=20;DT=380;DJZD (); CSBCJ(); if ((flag==0)&&(S<=2500)) { SPD[1]=S; } else { SPD[1]=5000; } flag=0; GT=30;DT=370;DJZD (); CSBCJ(); if ((flag==0)&&(S<=2500)) { SPD[2]=S; } else { SPD[2]=5000; } flag=0; GT=30;DT=370;DJZD (); Delay10ms(5); } void DJZD (void) { unsigned char i; for (i=0;i<75;i++) { DJ=1; Delay50us(GT); DJ=0; Delay50us(DT); } DJ=0; } void Delay10ms(unsigned int c) { unsigned char a,b; for(c;c>0;c--) { for(b=44;b>0;b--) { for (a=112;a>0;a--) { } } } } void Delay50us(unsigned int c) { unsigned char a; for(c;c>0;c--) { for (a=19;a>0;a--) { } } } |
既然红外的不好用,那就试试433的或者315的遥控呢 |