|
第一:单片机应用中,什么是合适的程序?能发挥硬件性能的程序,就是适合的。你不说你的配件,只要合适的程序是不可能有的。
第二:我有一个,你可以参考。/*
简易小车。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--)
{
}
}
}
|
|