基于51和红外同时控制舵机的程序,在开发板实现的很好,但在最小系统实现不了 不知道还要焊哪一部分 求大神指导
所有代码下载:
红外成功1.rar
(45.99 KB, 下载次数: 25)
/*2aêÔμç»úÄü·ñóéoìíaÏß¿ØÖÆ*/
#include<reg52.h>
sbit IRIN=P3^2;
#define Stop 0 //o궨ò壬í£Ö1
#define Left 1 //o궨ò壬×ó×a
#define Right 2 //o궨ò壬óò×a
sbit ControlPort = P2^0; //¶æ»úDÅoŶ˿ú
sbit KeyLeft = P1^3; //×ó×a°′¼ü¶Ë¿ú
sbit KeyRight = P1^2; //óò×a°′¼ü¶Ë¿ú
sbit KeyStop = P1^1; //1éλ°′¼ü¶Ë¿ú
unsigned char TimeOutCounter = 0,LeftOrRight = 0; //TimeOutCounter£o¶¨ê±Æ÷òç3ö¼Æêy LeftOrRight£o¶æ»ú×óóòDy×a±êÖ¾
unsigned char IrValue[3];
void DelayMs(unsigned int x);
void InitialTimer ( void )
{
TMOD=0x10; //¶¨ê±/¼ÆêyÆ÷11¤×÷óú·½ê½1
TH1 = ( 65535 - 500 ) / 256; //0.25ms
TL1 = ( 65535 - 500 ) % 256;
EA=1; //¿a×üÖD¶Ï
IT0=1;//ía2¿ÖD¶Ï0ìø±äÑØ′¥·¢·½ê½£¨Ï½μÑØ£©
EX0=1;//′ò¿aINT0μÄÖD¶ÏÔêDí
ET1=1; //ÔêDí¶¨ê±/¼ÆêyÆ÷1 ÖD¶Ï
TR1=1; //Æô¶ˉ¶¨ê±/¼ÆêyÆ÷1 ÖD¶Ï
}
void ControlLeftOrRight ( void ) //¿ØÖƶæ»úoˉêy
{
if(IrValue[2]==0x46)
{
while ( !KeyStop ); //ê1±êÖ¾μèóúStop£¨0£©£¬ÔúÖD¶ÏoˉêyÖD½«óÃμ½
LeftOrRight = Stop;
}
if( IrValue[2]==0x45 )
{
while ( !KeyLeft ); //ê1±êÖ¾μèóúLeft£¨1£©£¬ÔúÖD¶ÏoˉêyÖD½«óÃμ½
LeftOrRight = Left;
}
if( IrValue[2]==0x47)
{
while ( !KeyRight ); //ê1±êÖ¾μèóúRight£¨2£©£¬ÔúÖD¶ÏoˉêyÖD½«óÃμ½
LeftOrRight = Right;
}
}
int Time;
void main()
{
InitialTimer();
IrValue[2]=0x46;//ĬèÏí£Ö1
for(;;)
{
if( KeyLeft ==0 )
{
LeftOrRight = Right;
}
if( KeyStop ==0 )
{
LeftOrRight = Left;
}
ControlLeftOrRight();
}
}
void Timer1 ( void ) interrupt 3 //¶¨ê±Æ÷ÖD¶Ïoˉêy
{
TH1 = ( 65535 - 400 ) / 256;
TL1 = ( 65535 - 400) % 256;
TimeOutCounter ++;
switch ( LeftOrRight )
{
case 0 : //Îa0ê±£¬¶æ»ú1é룬Âö¿í1.5ms
{
if( TimeOutCounter <= 4 )
{
ControlPort = 1;
}
else
{
ControlPort = 0;
}
break;
}
case 1 : //Îa1ê±£¬¶æ»ú×ó×a£¬Âö¿í1ms£¨àíÂÛÖ죩£¬êμ¼ê¿éòÔμ÷êÔμÃ3ö
{
if( TimeOutCounter <= 3 )
{
ControlPort = 1;
}
else
{
ControlPort = 0;
}
break;
}
case 2 : //Îa2ê±£¬¶æ»úóò×a£¬Âö¿í2ms£¨àíÂÛÖ죩£¬êμ¼ê¿éòÔμ÷êÔμÃ3ö
{
if( TimeOutCounter <= 5)
{
ControlPort = 1;
}
else
{
ControlPort = 0;
}
break;
}
default : break;
}
if( TimeOutCounter == 80 ) //ÖüÆú20ms£¨àíÂÛÖ죩£¬±è½Ï¿é¿¿£¬×îoÃ2»òaDT¸Ä
{
TimeOutCounter = 0;
}
}
/****************************************************½aÂë3ìDò************************************************************/
void ReadIr() interrupt 0
{
unsigned char j,k;
unsigned int err;
Time=0;
DelayMs(70);
if(IRIN==0) //è·èÏêÇ·ñÕæμĽóêÕμ½Õyè·μÄDÅoÅ
{
err=1000; //1000*10us=10ms,3¬1yËμÃ÷½óêÕμ½′íÎóμÄDÅoÅ
/*μ±á½¸öìõ¼t¶¼ÎaÕæêÇÑ-»·£¬èç1ûóDò»¸öìõ¼tÎa¼ùμÄê±oòìø3öÑ-»·£¬ÃaμÃ3ìDò3ö′íμÄê±
o3ìDòËàÔúÕaàï*/
while((IRIN==0)&&(err>0)) //μè′yÇ°Ãæ9msμÄμíμçÆ½1yè¥
{
DelayMs(1);
err--;
}
if(IRIN==1) //èç1ûÕyè·μèμ½9msμíμçÆ½
{
err=500;
while((IRIN==1)&&(err>0)) //μè′y4.5msμÄÆe꼸ßμçÆ½1yè¥
{
DelayMs(1);
err--;
}
for(k=0;k<4;k++) //12óD4×éêy¾Y
{
for(j=0;j<8;j++) //½óêÕò»×éêy¾Y
{
err=60;
while((IRIN==0)&&(err>0))//μè′yDÅoÅÇ°ÃæμÄ560usμíμçÆ½1yè¥
{
DelayMs(1);
err--;
}
err=500;
while((IRIN==1)&&(err>0)) //¼ÆËã¸ßμçÆ½μÄê±¼ä3¤¶è¡£
{
DelayMs(1);//0.14ms
Time++;
err--;
if(Time>30)
{
EX0=1;
return;
}
}
IrValue[k]>>=1; //k±íê¾μú¼¸×éêy¾Y
if(Time>=8) //èç1û¸ßμçÆ½3öÏÖ′óóú565us£¬ÄÇÃ′êÇ1
{
IrValue[k]|=0x80;
}
Time=0; //óÃíêê±¼äòaÖØD¸3Öμ
}
}
}
if(IrValue[2]!=~IrValue[3])
{
return;
}
}
}
/***********************************************************************************************************/
void DelayMs(unsigned int x) //0.14msÎó2î 0us
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++)
{}
}
}
|