이게 원래 원격도어락인데 이걸 바꾸려고 해요.
수신부에 안쓰는 포트에다가 서보모터를 3개 더 연결해서 4개까지 제어를 하려고 하거든요.
그래서 송신부에 있는 리모콘으로
1번 - 1번모터 열기
2번 - 1번모터 닫기
3번 - 2번모터 열기
4번 - 2번모터 닫기
5번 - 3번모터 열기
6번 - 3번모터 닫기
7번 - 4번모터 열기
8번 - 4번모터 닫기
이렇게 하려고 하거든요.
여기서 어떻게 해야할지 모르겠어요.
수정본
================================================
#include <io51.h>
/* Port 3 */
//#define SIG_1 P3 |= 0x04
//#define SIG_0 P3 &= ~0x04
///////////////////////////////////////////////////
#define SIG1_1 P3 |= 0x04
#define SIG1_0 P3 &= ~0x04
#define SIG2_1 P3 |= 0x10
#define SIG2_0 P3 &= ~0x10
#define SIG3_1 P3 |= 0x40
#define SIG3_0 P3 &= ~0x40
#define SIG4_1 P3 |= 0x80
#define SIG4_0 P3 &= ~0x80
///////////////////////////////////////////////////
#define BUZ_ON P3 &= ~0x08
#define BUZ_OFF P3 |= 0x08
unsigned char rx_dt;
/* 서보모터 관련 */
//90도 , 2.3msec 가 Hi 이면 90도 , 100usec * 23 = 2.3usec , 23이어야 하나 24가 더 맞다.
//90도는 잠금 모드
unsigned char ANG = 24;
unsigned char usec_100_serv , pulse = 0;
// 1일 경우만 서모모터 구동
unsigned char serv_flag = 1;
unsigned int serv_cnt = 0;
/******************/
//부져 관련
unsigned char BUZ_FLAG = 0; //부저 플레그 값이 1 이면 부져가 울린다.
unsigned int buz_cnt = 0;
//
//led 디스플레이 관련
unsigned int usec_100_led ;
unsigned char led_data = 0x01;
//
void inter_init(void)
{
// 타이머1 은 시리얼통신 (모드1)
TMOD = 0x22; /* 타이머1모드2 (통신에서 사용) , 타이머0모드2 */
TR1 = 1;
/* Xtal 이 20M 일때 20M / 12분주 = 0.6usec */
/* 0x100 - 167 = 89 , 167 * 0.6usec = 100.2usec 인터럽트 설정 */
TH0 = 89;
TL0 = 89;
TR0 = 1;
ET0 = 1;
/* 보레이트 2370 */
TH1 = 0xEA;
ES = 0; // 시리얼 포트 인터럽트 Disable
PS = 1; // 시리얼 통신 인터럽트 우선순위를 높게 잡는다.
EA = 1;
PCON = 0; // SMOD = 0
SCON = 0x50; // 비동기 통신모드1 10비트 프레임 , 스타트비트(1) + 데이타 (8) + 스돕 (1)
}
// 서보 모터 관련
// _ANG 값이 6이면 -90도 , 24이면 +90도
void servo_motor(unsigned char _ANG, unsigned char _SIG)
{
/*
전체 주기를 4msec 로 하고
Hi 상태가 2.3msec 일때 +90도
Hi 상태가 0.7msec 일때 -90도
*/
switch (pulse)
{
/* 2.3msec 또는 0.7msec 후에 해당포트에 0 을 만들어라. */
case 0:
if (usec_100_serv >= _ANG)
{
//SIG_0; //서모모터 SIG에 Low
///////////////////////////////////////////////////
switch (_SIG)
{
case 1:
SIG1_0;
beak;
case 2:
SIG2_0;
beak;
case 3:
SIG3_0;
beak;
case 4:
SIG4_0;
beak;
}
///////////////////////////////////////////////////
pulse = 1;
}
/* 4msec 이후에 해당포트에 1 을 만들어라 */
case 1:
if (usec_100_serv >= 40)
{
//SIG_1; //서모모터 SIG에 hi
pulse = 0;
usec_100_serv = 0;
}
}
//서보 모터 관련 [끝]
}
/*100.2uSec interrupt rut*/
interrupt [0x0B] void T0_int(void)
{
/* 서보 모터 관련 */
usec_100_serv ++;
if (serv_flag == 1)
{
serv_cnt ++;
if (serv_cnt >= 20000) {serv_flag = 0; serv_cnt = 0;} // 2초 이상 돌리면 자동으로 서모모터 구동을 멈춘다.
servo_motor(ANG);
}
/*****************/
//부저 울리기
if (BUZ_FLAG == 1)
{
BUZ_ON;
buz_cnt ++;
if (buz_cnt >= 1500) // 150msec 정도만 울리게 한다.
{BUZ_OFF; buz_cnt = 0; BUZ_FLAG = 0;}
}
//
//LED 디스플레이 하기
usec_100_led ++;
if (usec_100_led >= 5000) // 0.5초
{
usec_100_led = 0;
P1 |= 0xff; // LED 8개 모두 OFF
//led_data 는 0000 0001 , 0000 0010 , 0000 0100 , 0000 1000 이렇게 된다.
P1 &= ~led_data;
led_data <<= 1;
if (led_data == 0) led_data = 0x01;
}
//
}
void port_init(void)
{
}
void main(void)
{
unsigned char key[4] = {0xff,0xff,0xff,0xff} , key_cnt = 0 , key_4bit_flag = 0;
unsigned char rx_dt;
port_init();
inter_init();
while(1)
{
while(1)
if (RI == 1) {rx_dt = SBUF; RI = 0; break;}
BUZ_FLAG = 1; //부져 울려준다. 부져 울리고 자동으로 0 이 된다.
//1개의 키(암호)를 입력 받고 분석
if (key_4bit_flag == 1)
{
key[key_cnt] = rx_dt;
key_cnt ++;
if (key_cnt >= 4) //분석해본다. 4자리 숫자를...
{
//모두 맞다면 문을 열어준다.
if ((key[0] == '1') )
{
{key_4bit_flag = 0; serv_flag = 1;serv_cnt=0; ANG = 6; SIG=1} // ANG 가 6 이면 -90 도 이고 문을 열어준다.
}
///////////////////////////////////////////////////
else if ((key[0] == '2'))
{
}
else if ((key[0] == '3'))
{
}
else if ((key[0] == '4'))
{
}
else if ((key[0] == '5'))
{
}
else if ((key[0] == '6'))
{
}
else if ((key[0] == '7'))
{
}
else if ((key[0] == '8'))
{
}
///////////////////////////////////////////////////
else //틀렸다. 도둑놈인가!
{
key_4bit_flag = 0;
}
}
}
//4개의 키(암호)를 입력 받고 분석[끝]
//ENT 키 눌리면 처리 => 문이 열리면 닫고, 닫혀 있다면 암호 입력 받는다.
if (rx_dt == 'E') // ENT 키 입력 받았다면
{
//문이 잠겨 있다면 암호를 받는다. 24 이면 +90도
if (ANG == 24) {key_4bit_flag = 1; key_cnt=0; }
else
//문이 열려 있다면 무조껀 잠근다. 6 은 -90도
if (ANG == 6) {serv_flag = 1; serv_cnt=0; ANG = 24;}
}
//
} //while (1)
}
==============================================================
첨부되어 있는 자료는 원래 코딩되어있던 수신부 자료에요~~
이거 구현하시려면 서보모터 타이머 부분에서 서보모터를 4개 돌리도록 프로그램을 바꾸면 됩니다.
의외로 어려운 작업일지도 모릅니다만...홈피에 비슷한 자료가 많이 올라온듯
저도 리모콘 공부하는데요 잘 이해를 못해 헤메고 있습니다
ㅠㅠ