목차
없음
본문내용
함수
{
delay_us(2);
ADC_value_temp +=P2 & 0xff; //PORT2로 부터 값을 받아들여 저장
}
void value_check() //받은 값들을 ARRAY변수에 저장(20개)
{
j++;
if(j>9) j=0;
check[j]=(UNIT8)ADC_value;
}
// 여기서 부터
void compare_value() //측정되고 저장된 값들을 비교
{
if(check[j]>180) // 지금 측정값이 그전 측정값보다 크다면
{
P1_5=1; // LED off
heart_situation=0; //맥박신호의 하이를 인식하는 변수를 0으로 set
}
else if(check[j]<180) //지금 측정값이 그전측정값도다 작으면
{
if(heart_situation==0) //하이(heart_situation=0)다음 로우신호를 받았다면
{
if(heart>100) //맥박이 100넘기면 0으로 다시 카운트
heart=0;
else
{
if(k==1) //노이즈를 필터링하는 변수가 1이라면 신호를 측정
{
k=0;
P1_5=0; // LED on
heart++; //맥박수 1증가
heart_situation=1; //다시 하이인식 변수를 1로 set
}
}
}
}
}
void sigan_heart() //카운터함수
{
if(second==60) // 측정 완료
{
second_enable=0; //카운터 그만
buzzer(10); // 부저를 10번 울린다
delay_ms(3000); // 3초 delay
second=0; //카운터 초기화
heart=0; //맥박수 초기화
start_T=1; //처음으로 돌아가라는 변수 1로 set
}
}
void timer1_program() //타이머 인터럽트의 프로그램
{
static UNIT16 t1_second;
if(second_enable) //카운터 신호가 있다면
t1_second++; //1초를 위한 변수 카운터
t1_second_s++; //노이즈필터링을 위한 카운터
segment_number++; //세그먼트 선택 변수
if(segment_number>4)
segment_number=0;
P1_1=0; // 7-segment 모두 off
P1_2=0;
P1_3=0;
P1_4=0;
switch(segment_number)
{
case 0: //카운터 10의 자리
if(second/0==0) //0이면 7-segment OFF
SEGMENT=display_7segment[10];
else
SEGMENT=display_7segment[second/0]; // 카운터 만큼 7-segment ON
P1_1=1;
break;
case 1: //카운터 1의 자리
SEGMENT=display_7segment[second%10]; //카운터 만큼 7-segment ON
P1_2=1;
break;
case 2: //맥박표시 10의 자리
if(heart/10==0) //0이면 7-segment OFF
SEGMENT=display_7segment[10];
else
SEGMENT=display_7segment[heart/10]; //맥박수 만큼 7-segment ON
P1_3=1;
break;
case 3: //맥박 표시 1의 자리
SEGMENT=display_7segment[heart%0]; // 맥박수 만큼 7-segment ON
P1_4=1;
break;
default:
break;
}
if(t1_second_s==12) //0.6초 마다 필터 가동
{
k=1; //필터 가동 변수 1 set
t1_second_s=0;
}
if(t1_second==20)
{ // 1초 마다 Second카운터
t1_second=0;
second++;
}
}
void init_port(void) // 포트 초기화 함수
{
P0=0xf6; // 7-segment 출력
P1=0xff; // 7-segment지정 포트
P2=0xff; // ADC0804로부터 측정값을 받음
P3_2=1; // P3_2: Buzzer
P3_7=1; // ADC 활성화 포트
}
void buzzer(UNIT8 n)
{
while(n--)
{
BUZZER=0; // Buzzer on
delay_ms(20);
BUZZER=1; // Buzzer off
delay_ms(10);
}
}
void main (void)
{
START_MEASURE: //시작지점
init_port(); //포트 초기화
init_INT1(); //타이머 인터럽트
init_INT2(); //외부 인터럽트
init_timer(); //타이머 초기화
ET1=0; //타이머 비활성
while(1)
{
if(start==1) //시작버튼 누르기 전까지 기다림
{
start=0;
ET1=1; // Timer1 Overflow Interrupt enable
buzzer(5); //부저 5번 울림
delay_ms(10);
second_enable=1; //카운터 시작 신호
while(1)
{ // 실제 측정 시작!!
P3_7=0; //ADC활성
delay_us(100);
get_data(); //ADC값 받음
P3_7=1; //ADC비활성
ADC_value=ADC_value_temp; //ADC값을 저장
ADC_value_temp=0;
value_check(); //ADC값을 ARRAY에 저장
compare_value(); //ADC값을들 비교
sigan_heart(); //종료시간 측정
if(start_T==1) //종료변수가 1이면
{
start_T=0;
goto START_MEASURE; //처음으로 돌아감
}
}
} // End of while loof
}
} // End of main()
void int1() interrupt 3 // 5ms 마다 인터럽트가 걸립니다
{
init_timer();
timer1_program();
}
void int2() interrupt 2 // START버튼 누르면 시작변수 1SET시킴
{
while(!INT0);
delay_us(500);
if(INT0);
start=1;
}
작품사진
{
delay_us(2);
ADC_value_temp +=P2 & 0xff; //PORT2로 부터 값을 받아들여 저장
}
void value_check() //받은 값들을 ARRAY변수에 저장(20개)
{
j++;
if(j>9) j=0;
check[j]=(UNIT8)ADC_value;
}
// 여기서 부터
void compare_value() //측정되고 저장된 값들을 비교
{
if(check[j]>180) // 지금 측정값이 그전 측정값보다 크다면
{
P1_5=1; // LED off
heart_situation=0; //맥박신호의 하이를 인식하는 변수를 0으로 set
}
else if(check[j]<180) //지금 측정값이 그전측정값도다 작으면
{
if(heart_situation==0) //하이(heart_situation=0)다음 로우신호를 받았다면
{
if(heart>100) //맥박이 100넘기면 0으로 다시 카운트
heart=0;
else
{
if(k==1) //노이즈를 필터링하는 변수가 1이라면 신호를 측정
{
k=0;
P1_5=0; // LED on
heart++; //맥박수 1증가
heart_situation=1; //다시 하이인식 변수를 1로 set
}
}
}
}
}
void sigan_heart() //카운터함수
{
if(second==60) // 측정 완료
{
second_enable=0; //카운터 그만
buzzer(10); // 부저를 10번 울린다
delay_ms(3000); // 3초 delay
second=0; //카운터 초기화
heart=0; //맥박수 초기화
start_T=1; //처음으로 돌아가라는 변수 1로 set
}
}
void timer1_program() //타이머 인터럽트의 프로그램
{
static UNIT16 t1_second;
if(second_enable) //카운터 신호가 있다면
t1_second++; //1초를 위한 변수 카운터
t1_second_s++; //노이즈필터링을 위한 카운터
segment_number++; //세그먼트 선택 변수
if(segment_number>4)
segment_number=0;
P1_1=0; // 7-segment 모두 off
P1_2=0;
P1_3=0;
P1_4=0;
switch(segment_number)
{
case 0: //카운터 10의 자리
if(second/0==0) //0이면 7-segment OFF
SEGMENT=display_7segment[10];
else
SEGMENT=display_7segment[second/0]; // 카운터 만큼 7-segment ON
P1_1=1;
break;
case 1: //카운터 1의 자리
SEGMENT=display_7segment[second%10]; //카운터 만큼 7-segment ON
P1_2=1;
break;
case 2: //맥박표시 10의 자리
if(heart/10==0) //0이면 7-segment OFF
SEGMENT=display_7segment[10];
else
SEGMENT=display_7segment[heart/10]; //맥박수 만큼 7-segment ON
P1_3=1;
break;
case 3: //맥박 표시 1의 자리
SEGMENT=display_7segment[heart%0]; // 맥박수 만큼 7-segment ON
P1_4=1;
break;
default:
break;
}
if(t1_second_s==12) //0.6초 마다 필터 가동
{
k=1; //필터 가동 변수 1 set
t1_second_s=0;
}
if(t1_second==20)
{ // 1초 마다 Second카운터
t1_second=0;
second++;
}
}
void init_port(void) // 포트 초기화 함수
{
P0=0xf6; // 7-segment 출력
P1=0xff; // 7-segment지정 포트
P2=0xff; // ADC0804로부터 측정값을 받음
P3_2=1; // P3_2: Buzzer
P3_7=1; // ADC 활성화 포트
}
void buzzer(UNIT8 n)
{
while(n--)
{
BUZZER=0; // Buzzer on
delay_ms(20);
BUZZER=1; // Buzzer off
delay_ms(10);
}
}
void main (void)
{
START_MEASURE: //시작지점
init_port(); //포트 초기화
init_INT1(); //타이머 인터럽트
init_INT2(); //외부 인터럽트
init_timer(); //타이머 초기화
ET1=0; //타이머 비활성
while(1)
{
if(start==1) //시작버튼 누르기 전까지 기다림
{
start=0;
ET1=1; // Timer1 Overflow Interrupt enable
buzzer(5); //부저 5번 울림
delay_ms(10);
second_enable=1; //카운터 시작 신호
while(1)
{ // 실제 측정 시작!!
P3_7=0; //ADC활성
delay_us(100);
get_data(); //ADC값 받음
P3_7=1; //ADC비활성
ADC_value=ADC_value_temp; //ADC값을 저장
ADC_value_temp=0;
value_check(); //ADC값을 ARRAY에 저장
compare_value(); //ADC값을들 비교
sigan_heart(); //종료시간 측정
if(start_T==1) //종료변수가 1이면
{
start_T=0;
goto START_MEASURE; //처음으로 돌아감
}
}
} // End of while loof
}
} // End of main()
void int1() interrupt 3 // 5ms 마다 인터럽트가 걸립니다
{
init_timer();
timer1_program();
}
void int2() interrupt 2 // START버튼 누르면 시작변수 1SET시킴
{
while(!INT0);
delay_us(500);
if(INT0);
start=1;
}
작품사진