8051 신호등 C언어론 한건데요 딜레이....
이 소슨데요. 제가 Keil로 변환해서 라이터기로 구우면 실행은 되는데 LED 변하는 시간이 너무 느려서요
시간 조절하는 부분이 어딘가요??
다른 곳에는 Delay 문도 없고,
빨간 부분에 값을 줄여보니 조금 빨라졌는데 그래도 느리더라고요...
아니면 혹시 Keil 에서 변환할때 설정하는 부분이 있나요??
#include <reg51.h>
/*
딜레이 설정한다.
주의할점은 D_BLU 값이 D_BLU_M + D_BLU_M_ON_OFF 보다 커야 한다.
*/
#define D_BLU_M 5
#define D_BLU_M_ON_OFF 2
#define D_BLU 10
#define D_YEL 2
/* PORT0 */
#define E_RED 0x01
#define E_YEL 0x02
#define E_BLU2 0x04
#define E_BLU 0x08
#define E_RED_M 0x10
#define E_BLU_M 0x20
/* PORT1 */
#define W_RED 0x01
#define W_YEL 0x02
#define W_BLU2 0x04
#define W_BLU 0x08
#define W_RED_M 0x10
#define W_BLU_M 0x20
/* PORT2 */
#define S_RED 0x01
#define S_YEL 0x02
#define S_BLU2 0x04
#define S_BLU 0x08
#define S_RED_M 0x10
#define S_BLU_M 0x20
/* PORT3 */
#define N_RED 0x01
#define N_YEL 0x02
#define N_BLU2 0x04
#define N_BLU 0x08
#define N_RED_M 0x10
#define N_BLU_M 0x20
unsigned sec_500m ,sec_1s , count_sec;
/*
아래의 변수는 위에서 세팅된 딜레이 값들을 처음 기준값에 의한 시간으로
계산하기 위한 변수 선언이다. 초기화할때 처음 실행한다.
*/
unsigned d_blu_m , d_blu_m_on_off , d_blu , d_yel;
unsigned char ON_OFF_CHK;
/* 아래의 변수 NEWS 는 파란불 켜짐이 어느쪽인지를 알기위해서 사용되는 변수이다
NEWS = 0 일때, 북쪽에 파란불 켜짐,
NEWS = 1 일때, 동쪽에 파란불 켜짐.
NEWS = 2 일때, 남쪽에 파란불 켜짐.
NEWS = 3 일때, 서쪽에 파란불 켜짐. */
unsigned char NEWS;
void interrupt_init()
{
TMOD = 0X20;
TR1 = 1;
EA = 1;
ET1 = 1;
TH1 = 0X38;
TL1 = 0X38;
}
void initialize()
{
P3 &= ~(N_BLU2 | N_BLU);
P0 &= ~E_BLU_M;
P0 &= ~E_RED;
P1 &= ~W_RED;
P2 &= ~S_RED;
P3 &= ~N_RED_M;
P1 &= ~W_RED_M;
P2 &= ~S_RED_M;
/*
처음에 세팅한 딜레이 값들을 기준 0 시간에 대한 값으로 부터 다시 세팅한다.
소문자 변수에...
*/
d_blu_m = D_BLU_M;
d_blu_m_on_off = d_blu_m + D_BLU_M_ON_OFF;
d_blu = D_BLU;
d_yel = d_blu + D_YEL;
}
/*
신호등은 시계방향으로 돌리는 것으로 한다.
북쪽이 먼저 켜지며, 다음엔 동쪽, 다음엔 남쪽, 다음엔 서쪽 순서로 한다.
*/
void main()
{
initialize();
interrupt_init();
while (1)
{
}
}
/*
횡단보도에서 파란불 깜빡 거리는 함수
*/
void control_on_off()
{
switch (NEWS)
{
/*북쪽에 파란색 불이 켜져있으면, 동쪽의 횡단보드의 파란불을 깜빡인다. */
case 0: P0 ^= E_BLU_M;
break;
/*동쪽에 파란색 불이 켜져있으면, 남쪽의 횡단보도의 파란불을 깜빡인다. */
case 1: P2 ^= S_BLU_M;
break;
/*남쪽에 파란색 불이 켜져있으면, 서쪽의 횡단보도의 파란불을 깜빡인다. */
case 2: P1 ^= W_BLU_M;
break;
/*서쪽에 파란색 불이 켜져있으면, 북쪽의 횡단보도의 파란불을 깜빡인다. */
case 3: P3 ^= N_BLU_M;
break;
}
}
/*
횡단 보도에서 깜빡이던 파란색불 끄고 적색 불을 킨다.
*/
void control_on_off_end()
{
switch (NEWS)
{
/*북쪽에 파란색 불이 켜져있으면, 동쪽의 횡단보드 파란불을 끄고 적색불을킨다.*/
case 0: P0 |= E_BLU_M; P0 &= ~E_RED_M;
break;
/*동쪽에 파란색 불이 켜져있으면, 남쪽의 횡단보드 파란불을 끄고 적색불을킨다.*/
case 1: P2 |= S_BLU_M; P2 &= ~S_RED_M;
break;
/*남쪽에 파란색 불이 켜져있으면, 서쪽의 횡단보드 파란불을 끄고 적색불을킨다.*/
case 2: P1 |= W_BLU_M; P1 &= ~W_RED_M;
break;
/*서쪽에 파란색 불이 켜져있으면, 북쪽의 횡단보드 파란불을 끄고 적색불을킨다.*/
case 3: P3 |= N_BLU_M; P3 &= ~N_RED_M;
break;
}
}
/* 파란색불을 끄고 , 노란색(황색)불로 바꾸는 함수 */
void control_yel()
{
switch (NEWS)
{
/*북쪽에 파란색 불이 켜져있으면, 북쪽에 파란불을 끄고 노란색(황색)으로 킨다*/
case 0: P3 |= (N_BLU | N_BLU2); P3 &= ~N_YEL;
break;
/*동쪽에 파란색 불이 켜져있으면, 동쪽에 파란불을 끄고 노란색(황색)으로 킨다.*/
case 1: P0 |= (E_BLU | E_BLU2); P0 &= ~E_YEL;
break;
/*남쪽에 파란색 불이 켜져있으면, 남쪽에 파란불을 끄고 노란색(황색)으로 킨다.*/
case 2: P2 |= (S_BLU | S_BLU2); P2 &= ~S_YEL;
break;
/*서쪽에 파란색 불이 켜져있으면, 서쪽에 파란불을 끄고 노란색(황색)으로 킨다.*/
case 3: P1 |= (W_BLU | W_BLU2); P1 &= ~W_YEL;
break;
}
}
/*
신호등켜기를 시계방향으로 돌려서 다음차례에 대한 신호등을 켠다.
*/
void control_change()
{
switch (NEWS)
{
/* 북쪽에 노란색불을 끄고 적색불을 키며,
동쪽신호등에 파란불을켜며 적색불을 끄며,
남쪽에 있는 횡단보도에 파란색불을 키고 적색불은 끈다.*/
case 0: P3 |= N_YEL; P3 &= ~N_RED;
P0 &= ~(E_BLU | E_BLU2); P0 |= E_RED;
P2 &= ~S_BLU_M; P2 |= S_RED_M;
break;
/* 동쪽에 노란색불을 끄고 적색불을 키며,
남쪽신호등에 파란불을켜며 적색불을 끄며,
서쪽에 있는 횡단보도에 파란색불을 키고 적색불은 끈다.*/
case 1: P0 |= E_YEL; P0 &= ~E_RED;
P2 &= ~(N_BLU | N_BLU2); P2 |= N_RED;
P1 &= ~W_BLU_M; P1 |= W_RED_M;
break;
/* 남쪽에 노란색불을 끄고 적색불을 키며,
서쪽신호등에 파란불을켜며 적색불을 끄며,
북쪽에 있는 횡단보도에 파란색불을 키고 적색불은 끈다.*/
case 2: P2 |= S_YEL; P2 &= ~S_RED;
P1 &= ~(W_BLU | W_BLU2); P1 |= W_RED;
P3 &= ~N_BLU_M; P3 |= N_RED_M;
break;
/* 서쪽에 노란색불을 끄고 적색불을 키며,
북쪽신호등에 파란불을켜며 적색불을 끄며,
동쪽에 있는 횡단보도에 파란색불을 키고 적색불은 끈다.*/
case 3: P1 |= W_YEL; P1 &= ~W_RED;
P3 &= ~(N_BLU | N_BLU2); P3 |= N_RED;
P0 &= ~E_BLU_M; P0 |= E_RED_M;
break;
}
외부 크리스탈이나 오실레이터의 입력주파수를 정확히 입력해보세요.
xtal에다가 11.0592를 쓰면 되는 거 아닌가요?
그리고 만약에 쓴다면 신호가 이동하는 텀 즉 시간을 조절하기 위해서는 어떻게 해야 하나요?
번거롭지만 자세히좀...^^;;