L298N을 통해 DC 모터를 제어하기 위한 51 마이크로 컨트롤러용 C 소스 프로그램을 찾고 있습니다.
#include
#define uchar unsigned char
#define uint unsigned int
uint t;
p>
p>
uint flag1,flag1s;/*flag1=1이면 섀시가 왼쪽으로 회전하고, flag1&flag2=1이면 섀시가 오른쪽으로 회전합니다*/
uint flag2;/* 중지 플래그*/
uint flag3,flag3s;/*flag3=1일 때 오른쪽 팔이 올라가고, flag3&flag2=1일 때 오른쪽 팔이 내려갑니다*/
uint flag4 ,flag4s;/* flag4=1일 때 왼쪽 팔이 올라가고, flag4&flag2=1일 때 왼쪽 팔이 내려갑니다*/
uint flag5;/*flag5=1일 때 자동 시연*/
//신호등 제어
sbit hong=P3^0;
sbit huang=P3^1;
sbit lv=P3 ^2;
//왼쪽 팔 제어(zb1이 0이면 올리고, zb2가 1이면 올리고, 그렇지 않으면 내립니다.)
sbit zb1=P2^0 //P2= 0x02 왼팔 올리기
sbit zb2=P2^1; //P2=0x01 왼팔 내리기
//오른팔 제어(yb1이 0이고 yb2일 때 올리기) 1이면 내려놓음)
sbit yb1=P2^2; //P2=0x08 오른쪽 팔 올리기
sbit yb2=P2^3; 오른쪽 팔 올리기
/ /로봇 섀시 제어(dp1이 0이면 좌회전, dp2가 1이면 좌회전, 그렇지 않으면 우회전)
sbit dp1=P2^4 / /P2=0x20 섀시 좌회전
sbit dp2=P2^5; //P2=0x10 섀시 우회전
//태양광 섀시 제어(tdp1이 0일 때 좌회전, tdp2 1, 그렇지 않으면 오른쪽으로 회전)
sbit tdp1=P2^6; //P2=0x80 Solar 섀시가 왼쪽으로 회전
sbit tdp2=P2^7 //P2=0x40 Solar 섀시가 오른쪽으로 회전합니다
//원격 제어
sbit yk1=P1^0;//원격 제어 1
sbit yk2=P1^1;//원격 제어 2
sbit yk3=P1^2;/ /원격 제어 3
sbit yk4=P1^3;//원격 제어 4
sbit yk5= P1^4;//원격 제어 5
void init() ;
void Delay(uint);
void zidong();
voidkeyscan();
/**** ************************* 주요 기능*** ********************* ****/
void main()
{
init();
while(1)
{
zidong();
keycan();
if(flag5==1)
zidong() ;
if(flag1==1)
P2=0x20;//섀시 좌회전
그렇지 않으면
>
P2=0x00;
if(flag1s==1)
P2=0x10;//섀시가 우회전합니다
else
P2=0x00;
if(flag3==1)
P2=0x08;//오른팔 올리기
else
P2=0x00;
if(flag3s==1)
P2=0x04;//오른팔을 넣으세요
else
P2=0x00;
if(flag4==1)
P2=0x02;//왼쪽 팔 올리기
else
P2=0x00;
if(flag4s==1)
P2=0x01;//왼쪽 팔을 넣으세요
else
P2 =0x00;
}
}
/******************** ******** ****초기화 기능****************************/
void init()
{
flag1=0;
flag1s=0;
flag2=0;
flag3=0;
flag3s=0;
flag4=0;
flag4s=0;
flag5=0;
TMOD=0x11;//타이머 0을 작업 모드로 설정
TH0=(65536-10000)/256;
TL0=(65536-10000 )%256;
TH1=(65536-20000)/256;
TL1=(65536-20000)%256;
EA=1;/ /총 인터럽트 활성화
ET0=1;//타이머 0 인터럽트 활성화
ET1=1;
TR0=1;//타이머 0 시작
p>TR1=1;
}
/************************ *****타이머 1을 사용하고, 태양광 섀시의 회전을 제어하세요**************************/
void time0() 인터럽트 1//태양 기지 타이밍, 5분마다 한 번씩 전송
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
t++;
if(t==6000)
{ t=0;
P2=0x80;//Solar 섀시가 우회전합니다.
Delay(1);
P2=0x00;
}
}
/**** ********************* 키보드 스캔 기능************ ************* *****/
void 키 스캔()
{
if(yk1== 1&yk2==0)
{
지연1(1);
if(yk1==1&yk2==0)
>
flag1=1;
}
else flag1=0;
if(yk2==1&yk1==0&yk3==0&yk4==0 )
{
지연1(1);
if(yk2==1&yk1==0&yk3==0&yk4==0)
flag2=1;
flag1=0;
flag3=0;
flag4=0;
flag5=0; /0으로 모두 지우기
flag1s=0;
flag3s=0;
flag4s=0;
}
if(yk3==1&yk2==0)
{
지연1(1);
if(yk3==1&yk2==0)
{
flag3=1;
}
else flag3=0;
}
if(yk4==1&yk2==0)
{
지연1(1);
if(yk4==1&yk2==0 )
{
flag4=1;
}
else flag4=0;
} p >
if(yk5==1)
{
지연1(1);
if(yk5==1)
{
플래그5=1;
}
else 플래그5=0;
}
if (yk1==1&yk2==1)
{
지연1(1);
if(yk1==1&yk2==1)
{
flag1s=1;
}
else flag1s=0; > if(yk3==1&yk2==1)
{
지연1(1);
if(yk3==1&yk2==1) p >
{
flag3s=1;
}
else flag3s=0;
}
if(yk4==1&yk2==1)
{
지연1(1);
if(yk4==1&yk2==1)< / p>
{
flag4s=1
}
<p> else flag4s=0;
}
}
/********************* *** ******** 자동 데모 기능******************************/
void zidong ()
{
while(1)
{
P3=0xfd;//노란색 불빛은 on
P2=0x08;//오른팔을 올리세요
Delay(66);
P2=0x00; //북쪽으로
지연(200);
P2=0x04;//오른팔을 넣으세요
지연(54);
P2=0x00; p>
P3=0xfe;/ /빨간불 켜짐
P2=0x02;//왼쪽 팔 올리기
Delay(52);
P2 =0x00;
Delay(200);
P2=0x01;//왼팔을 넣으세요
Delay(50);
P2=0x00;
P2=0x20;//섀시가 왼쪽으로 회전합니다.
지연(260);
P2=0x00;
Delay(800);
P2=0x08; //오른팔을 들어올립니다.
Delay(66);
P2=0x00; 북쪽
지연(200);
P2=0x04;//오른팔을 넣으세요
지연(54);
P2 =0x00;
P3=0xfb; //녹색 표시등이 켜졌습니다.
P2=0x02;//왼쪽 팔 올리기
Delay(52);
P2=0x00;
Delay(200);
P2=0x01;//왼팔을 넣으세요
Delay(50 );
P2=0x00;
Delay(500);
P2=0x20;//섀시가 왼쪽으로 회전합니다
Delay( 260);
P2=0x00;
Delay(500);
P3=0xfb;//노란색 표시등이 켜져 있습니다.
P2=0x08;//오른팔을 올리세요
지연(66)
P2=0x00; //북쪽으로
지연(200) ;
P2=0x04;//오른팔을 넣으세요
Delay(54);
P2=0x00;
P3= 0xfe;//빨간색 표시등 켜짐
P2=0x02;//왼쪽 팔 올리기 p>
Delay(52);
P2=0x00;
지연(200);
P2=0x01;//왼팔 넣기
지연(50);
P2=0x00;
지연(500);
P2=0x10;//섀시가 우회전합니다
지연(250);
P2=0x00;
지연(500);
P2=0x08;//오른쪽 팔 이동
지연(66);
P2=0x00; //북쪽
지연(200);
P2=0x04;//오른팔을 넣으세요
Delay(54);
P2=0x00;
P3=0xfb;//녹색 표시등은 on//서쪽으로
P2=0x02;//왼쪽 팔 올리기
Delay(52);
P2=0x00;
Delay(200 );
P2=0x01;//왼팔을 넣으세요
Delay(50);
P2=0x00;
지연( 500);
P2=0x10;//섀시가 우회전합니다.
지연(250);
P2=0x00;
지연(500);
P3=0xfd;//노란색 표시등이 켜짐
P2=0x08;//오른팔을 들어 올리세요
Delay(66);
P2=0x00; //북쪽으로
Delay(200);
P2=0x04;//오른쪽으로 놓으세요 arm
지연(54 );
P2=0x00;
P3=0xfe;//빨간색 표시등 켜짐
P2=0x02 ;//왼쪽 팔 올리기
지연(52);
P2=0x00;
지연(200);
P2= 0x01;//왼팔 넣기
지연(50);
P2=0x00;
P2=0x00;
P2= 0x10;//섀시를 오른쪽으로 돌립니다.
지연(250);
P2=0x00;
지연(800);
P2=0x08;//오른쪽 팔 올리기
지연(66);
P2=0x00; //북쪽
지연(200);
P2=0x04;//오른쪽 팔 넣기
Delay(54);
P2=0x00;
P3=0xfb;//green 불 켜짐
P2=0x02 ;//왼쪽 팔 올리기
지연(52);
P2=0x00;
지연( 200);
P2= 0x01;//왼팔 넣기
지연(50);
P2=0x00;
지연 (500);
P2 =0x10;//섀시가 우회전합니다.
지연(250);
P2=0x00;
P3=0xfb;//노란색 표시등 켜짐
P2=0x08; //오른쪽 팔 올리기
Delay(66);
P2=0x00; 북쪽을 향해
Delay(200) ;
P2=0x04;//오른팔을 넣어
Delay(54);
P2=0x00;
P3=0xfe ;//빨간불 켜짐
P2=0x02;//왼쪽 팔 올리기
Delay(52); p>
P2=0x00;
지연(200);
P2=0x01;//왼팔을 넣으세요
지연(50);
P2=0x00;
Delay(500);
P2=0x20;//섀시가 왼쪽으로 회전합니다
Delay(260);
P2=0x00;
P2=0x08;//오른팔을 들어 올리세요
Delay(66);
P2=0x00; //북쪽으로
지연(200);
P2=0x04;//오른팔을 넣어
지연(54 );
P2=0x00;
P3=0xfb;//녹색불이 켜집니다
P2=0x02;//왼팔 들어올리기
p>
지연( 52);
P2=0x00;
지연(200);
P2=0x01;//왼쪽 팔을 넣어
지연(50);
P2=0x00;
지연(500);
P2=0x20;//섀시 회전 왼쪽
지연(260);
P2=0x00;
지연(5);
}
}
/******************************** 1초 지연 기능******** ***************** ************/
무효 지연(단위 z)
{
uint x,y;
for(x=z*62;x>0;x--) //z가 100일 때 1초 지연
for(y=20;y>0;y-- );
}