목차
문제 1. 외부 인터럽트 버튼을 누를 때마다 시간 표현이 24h, 12h로 변경되도록 프로그램을 수정하시오.
문제 2. 시계를 Stop Watch 로 이용하려 한다. 이때 4개의 7-세그먼트 중 왼쪽 2개는 분을 나타내고 오른쪽 2개는 초를 나타내도록 프로그램을 수정하고 동작을 확인하시오.
※ 결과 및 토의
문제 2. 시계를 Stop Watch 로 이용하려 한다. 이때 4개의 7-세그먼트 중 왼쪽 2개는 분을 나타내고 오른쪽 2개는 초를 나타내도록 프로그램을 수정하고 동작을 확인하시오.
※ 결과 및 토의
본문내용
%10;
Font[1]=hex/=10;
}
main()
{
initconfig();
inittimer0();
HexToDec(clock[1]);// 현재시간의 clock[1] 즉, 분 부분을 십의자리와 일이자리로 변환해서 왼쪽 7-세그먼트 두 개에 표현한다
C_8255_A=segment[Font[1]];
C_8255_B=segment[Font[0]];
HexToDec(clock[2]);// 현재시간의 clock[2] 즉, 초 부분을 십의자리와 일의자리로 변환해서 오른쪽 7-세그먼트 두 개에 표현한다
C_8255_C=segment[Font[1]];
LOCK_SEG=segment[Font[0]];
while(1)// 무한 loop를 돌면서 아래의 if절들을 실행한다
{
if(minflag == 1){// minflag가 1이면, 즉 1분(60초)에 한 번씩 분 부분을 왼쪽 7-세그먼트 두 개에 표현하고 다시 minflag=0으로 한다
HexToDec(clock[1]);
C_8255_A=segment[Font[1]];
C_8255_B=segment[Font[0]];
minflag = 0;
}
if(secflag == 1){// secflag가 1이면 즉, 1초에 한 번씩 초 부분을
오른쪽 7-세그먼트 2개에 포현하고 다시 secflag=0으로 한다
HexToDec(clock[2]);
C_8255_C=segment[Font[1]];
LOCK_SEG=segment[Font[0]];
secflag = 0;
}
}
}
void Int1_ISR(void) interrupt 2
{
TR0 = ~TR0;// 외부 인터럽트1 버튼을 누를 때마다 TR0값이 반전되서
시계가 멈추고, 다시 동작할 수 있도록한다
}
void Timer0_Int_ISR(void) interrupt 1
{
++t0_ovf_count;
if(t0_ovf_count >= 10) // 시간변화를 빨리 보기위해 오버플래그 수를 조절하였다
{
t0_ovf_count = 0;
++clock[2];// 오버플래그수를 만족하면 clock[2]가 1씩 증가한다.(즉 1초)
secflag = 1; // 1초마다 secflag를 1로 한다
if(clock[2] >= 60)
{
clock[2] = 0;
++clock[1];
minflag = 1;
if(clock[1] >= 60)
{
clock[1] = 0;
++clock[0];
hourflag = 1;
if(clock[0] >= 24)
{
clock[0] = 0;
}
}
}
}
}
※ 결과 및 토의
이번 실험에서는 제한된 I/O 포트를 가진 8051에 7-세그먼트가 연결된 8255를 응용해서 어떤 회로를 거쳐서 확장 I/O의 기능이 구현되는지 확인했다. 7-세그먼트는 자주 다루어지는 10진수 표현 소자이고 공통 캐소드와 공통 애노드의 두 가지 방식이 있음을 알아야한다. 시간을 표현할 때 7-세그먼트가 유용하게 사용되고 또 시계 프로그램을 응용하면 우리가 실제로 사용하는 기능을 만들 수 있다.
예를 들어 12시 24시 표현, 스톱워치, 알람 등 여러 가지가 있을 수 있다. 수업에서 배운 포트1의 LED, 타이머, 인터럽트가 계속해서 사용됨을 알 수 있는데 응용력이 중요한 것 같다.
그리고 8051의 외부 인터럽트1 버튼을 눌러도 접합 문제가 있는데 정상적으로 인터럽트가 발생되지 않을 때가 가끔있었다. 그래서 Jumper Setting의 JP4: Interrupt1 의 소스를 버튼이 아닌 적외선 sensor로 바꾸어서 프로그램을 실행했다. 적외선센서에 손을 한 번 가져다 대었을 때 인터럽트가 발생하고 버튼을 누를 때와는 달리 항상 제대로 동작했다. 유용한 기능인 것 같다.
Font[1]=hex/=10;
}
main()
{
initconfig();
inittimer0();
HexToDec(clock[1]);// 현재시간의 clock[1] 즉, 분 부분을 십의자리와 일이자리로 변환해서 왼쪽 7-세그먼트 두 개에 표현한다
C_8255_A=segment[Font[1]];
C_8255_B=segment[Font[0]];
HexToDec(clock[2]);// 현재시간의 clock[2] 즉, 초 부분을 십의자리와 일의자리로 변환해서 오른쪽 7-세그먼트 두 개에 표현한다
C_8255_C=segment[Font[1]];
LOCK_SEG=segment[Font[0]];
while(1)// 무한 loop를 돌면서 아래의 if절들을 실행한다
{
if(minflag == 1){// minflag가 1이면, 즉 1분(60초)에 한 번씩 분 부분을 왼쪽 7-세그먼트 두 개에 표현하고 다시 minflag=0으로 한다
HexToDec(clock[1]);
C_8255_A=segment[Font[1]];
C_8255_B=segment[Font[0]];
minflag = 0;
}
if(secflag == 1){// secflag가 1이면 즉, 1초에 한 번씩 초 부분을
오른쪽 7-세그먼트 2개에 포현하고 다시 secflag=0으로 한다
HexToDec(clock[2]);
C_8255_C=segment[Font[1]];
LOCK_SEG=segment[Font[0]];
secflag = 0;
}
}
}
void Int1_ISR(void) interrupt 2
{
TR0 = ~TR0;// 외부 인터럽트1 버튼을 누를 때마다 TR0값이 반전되서
시계가 멈추고, 다시 동작할 수 있도록한다
}
void Timer0_Int_ISR(void) interrupt 1
{
++t0_ovf_count;
if(t0_ovf_count >= 10) // 시간변화를 빨리 보기위해 오버플래그 수를 조절하였다
{
t0_ovf_count = 0;
++clock[2];// 오버플래그수를 만족하면 clock[2]가 1씩 증가한다.(즉 1초)
secflag = 1; // 1초마다 secflag를 1로 한다
if(clock[2] >= 60)
{
clock[2] = 0;
++clock[1];
minflag = 1;
if(clock[1] >= 60)
{
clock[1] = 0;
++clock[0];
hourflag = 1;
if(clock[0] >= 24)
{
clock[0] = 0;
}
}
}
}
}
※ 결과 및 토의
이번 실험에서는 제한된 I/O 포트를 가진 8051에 7-세그먼트가 연결된 8255를 응용해서 어떤 회로를 거쳐서 확장 I/O의 기능이 구현되는지 확인했다. 7-세그먼트는 자주 다루어지는 10진수 표현 소자이고 공통 캐소드와 공통 애노드의 두 가지 방식이 있음을 알아야한다. 시간을 표현할 때 7-세그먼트가 유용하게 사용되고 또 시계 프로그램을 응용하면 우리가 실제로 사용하는 기능을 만들 수 있다.
예를 들어 12시 24시 표현, 스톱워치, 알람 등 여러 가지가 있을 수 있다. 수업에서 배운 포트1의 LED, 타이머, 인터럽트가 계속해서 사용됨을 알 수 있는데 응용력이 중요한 것 같다.
그리고 8051의 외부 인터럽트1 버튼을 눌러도 접합 문제가 있는데 정상적으로 인터럽트가 발생되지 않을 때가 가끔있었다. 그래서 Jumper Setting의 JP4: Interrupt1 의 소스를 버튼이 아닌 적외선 sensor로 바꾸어서 프로그램을 실행했다. 적외선센서에 손을 한 번 가져다 대었을 때 인터럽트가 발생하고 버튼을 누를 때와는 달리 항상 제대로 동작했다. 유용한 기능인 것 같다.
소개글