BASIC4MCU | 질문게시판 | 답변4 : 8051 인터럽트 관련해서 질문드립니다.
페이지 정보
작성자 master 작성일2018-02-02 00:05 조회4,688회 댓글0건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=168
본문
앞의 답변3에서
초음파 센서의 예가 적절치 않을 수도 있습니다.
왜냐하면 초음파센서의 측정 주기는 50ms 안밖이고
초음파 센서로 거리를 읽은 후에 그 값으로 어떤 처리를 한다고 할 때에 시간 지연이 없다면
메인함수의 루프 주기는 50ms 안밖이 됩니다.
이 시간은 스위치 채터링 딜레이 정도 밖에 안되는 시간이라서
50ms마다 스위치를 체크해서 처리 한다고 해도 동시에 처리 되는 것처럼 보일 수 있기 때문입니다.
스위치 누르고 있는 동안 대기하는 딜레이는 엣지 체크 코드를 추가하면 대기하지 않아도 됩니다.
그렇다면 외부 인터럽트를 사용할 필요가 없다는 얘기가 되는 것이죠
#include <reg51.h>//void delay(unsigned long i){ while(i--); }//void main(void){char sw0_flag=0;P1=~(0x01);while(1){//초음파센서 읽고//거리값으로 어떤 처리//다음 트리거 출력을 하기 전에 10ms 딜레이를 가짐//if(!P3.2){if(sw0_flag==0){ sw0_flag=1; P1=(P1<<1)|0x01; if(P1==0xFF)P1=~(0x01); }}else sw0_flag=0;}}플래그 변수를 하나 사용해서while() 또는 딜레이 없이 스위치를 처리하고 있습니다.스위치의 하강엣지를 검출하는 예제입니다.플래그 변수는 0과 1을 가지는 용도로 많이 사용하는데8051에서는 비트 변수를 사용할 수도 있지만 char 타입을 사용했습니다.//논리 부정 연산자에 대해서 알고 계신가요?if(sw0_flag==0){ sw0_flag=1; }if(!sw0_flag){ sw0_flag=1; }위 두개의 조건문은 같은 동작을 합니다.! 논리부정 연산자는 참은 거짓으로, 거짓은 참으로 바꿉니다.여기서 참과 거짓을 명확히 이해해야합니다.0이면 거짓0이 아니면 참unsigned int 타입은 0~65535 범위의 값을 가지는데이 중에서 거짓은 0 한 개 뿐이며참은 1~65535로 아주 많습니다.unsigned long 타입은 0~4294967295 범위의 값을 가지는데이 중에서 거짓은 0 한 개 뿐이며참은 1~4294967295로 아주 많습니다.unsigned char 타입도 거짓은 0 한 개 뿐이고, 참은 1~255 입니다.sw0_flag 변수는 0과 1만 사용하고 있는데sw0_flag=0 일 때의 !sw0_flag는 (!거짓)이므로 결과는 참sw0_flag=1 일 때의 !sw0_flag는 (!참)이므로 결과는 거짓그러므로 위 예제에서 아래 두 문장의 결과는 동일하게 됩니다.if(sw0_flag==0){ sw0_flag=1; }if(!sw0_flag){ sw0_flag=1; }//위에서는 unsigned 타입에 대해서만 설명 했지만signed 타입도 마찬가지로 거짓은 0 한 개 뿐입니다.
댓글 0
조회수 4,688등록된 댓글이 없습니다.