Lv. 76 (전무보) 58,919 납
21%
Exp. 58,087/59,290 | 21%
회원가입 ID/PW 찾기
AA

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;
 }

 

댓글 2
  • No Profile
    케일컴파일러 옵션에서 xtal 부분이 있습니다.
     외부 크리스탈이나 오실레이터의 입력주파수를 정확히 입력해보세요.
  • 아크마님께
    No Profile
    글쓴이 근자 09.05.26 23:25 댓글 좋아요 0 싫어요 0
    제가 11.0582 짜리 크리스탈을 쓰는 데요
    xtal에다가 11.0592를 쓰면 되는 거 아닌가요?

    그리고 만약에 쓴다면 신호가 이동하는 텀 즉 시간을 조절하기 위해서는 어떻게 해야 하나요?

    번거롭지만 자세히좀...^^;;

하드웨어 설계 및 개발에 대하여 개발자들이 자유롭게 토론하는 공간입니다.
- Q&A, 자유주재 토론, 관련 정보 공유
- 분야 : 마이크로프로세서 응용, 전기/전자(아날로그/디지털) 회로 설계, C/C++ 프로그래밍, 펌웨어,
         PCB Artwork, 트러블슈팅 등 하드웨어 설계에 관한 전반인 내용
※ 게시글에 맞는 분류를 선택하여 글을 작성해 주시면 쾌적한 사이트 운영에 많은 도움이 됩니다.
※ 하드웨어 인사이트는 회원들간의 거래정보를 게재할 뿐이지, 그 어떤 책임과 의무도 가지지 않습니다.

search
번호 분류 제목 글쓴이 조회 수 날짜
46 개발용역 HOT의뢰:arm으로 펌웨어 개발 해 주실분 있을까요? 땜고수 5178 2010.04.29
45 개발용역 HOT프리랜서 또는 정규직 pic dsp pwm 설계및 개발직모집 연락바랍니다1 요세스키 9423 2010.04.14
44 개발용역 HOT운영자님 및 전문가 여러분께, 개발 관련 문의드립니다.3 랜시스 4430 2010.04.08
43 개발용역 HOTTI C6000 관련 개발 가능하신 분! motionix 4683 2010.02.22
42 개발용역 HOT전력전자 관련한 펨웨어 개발자 모집 합니다. 마정 5274 2010.01.19
41 개발용역 HOTC8051F310으로 Sensorless Motor 제어 프로그램 개발 모젠 5388 2010.01.07
40 개발용역 HOT대학에서 2월까지 모터 구동 아르바이트 하실 분2 남지우 5080 2010.01.07
39 개발용역 HOT하드웨어 설계 및 개발 & 소프트웨어 개발 & PCB 아트웍 해드립니다.5 테나르 9971 2010.01.07
38 개발용역 HOT소프트웨어 알바로 개발 하실분 게시나요5 신지 6877 2009.12.07
37 개발용역 HOTpcb 아트웍 소개1 천사토끼 8652 2009.10.21
36 개발용역 HOT콘덴서 마이크가 AVR16으로 잡는데 신호가 잘 안들어옵니다.5 화니이 4337 2009.08.19
35 개발용역 HOT광센서 LED 기판..이런거 의뢰 가능한가요?4 최대한 3782 2009.08.12
34 개발용역 HOTPCB설계 및 H/W 개발 프리랜서&알바 bobby 6886 2009.08.07
33 개발용역 HOTPCB 설계 (Artwork) take,take,take 3832 2009.07.06
32 개발용역 HOTS/W 개발의뢰 합니다. 전설의교양 4788 2009.07.01
31 개발용역 HOTpads 정규직 채용합니다 세라 3789 2009.06.22
30 개발용역 HOT개발의뢰합니다. 모션맨 3886 2009.06.21
29 개발용역 HOT제작의뢰 합니다. kwanho84 3812 2009.03.23
28 개발용역 HOT프리랜서 혹은 정규직 모십니다. 레컬 4601 2009.03.13
27 개발용역 HOT"저렴한 가격으로, 최고의 품질을!!" ARTWORK 해드립니다!!3 아트비젼 4389 2009.01.29
Prev 1 ... 3 4 5 6 7 8 9 10 11 12 Next
  • 약속을 지키는 최선의 방법은 약속을 하지 않는 것이다.
    - 나폴레옹
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.