C 언어로 배우는 8051 마이크로프로세서
입출력 포트
2/44
학습목표 및 목차
입출력 포트의 기능을 이해한다.
입출력 포트의 구조를 이해한다.
Read-Modify-Write 명령어를 이해한다.
LED, 7-세그먼트, 스위치를 이용하여 입출력 포트를 제어하는 방법을 익힌다.
01. 입출력 포트의 기능과 구조 02. 입출력 포트 실습 1 : LED 구동 03. 입출력 포트 실습 2 : 신호등 제어
04. 입출력 포트 실습 3 : 7-세그먼트 구동
05. 입출력 포트 실습 4 : 스위치 대응 LED 점등
3/44
01. 입출력 포트의 기능과 구조
1.1 입출력 포트의 기능
8051은 4개의 양방향 포트인 P0, P1, P2, P3을 내장
병렬 I/O(Input/Output) 포트들은 CPU와 외부장치를 연결해 주는 병렬 입출력 인터페이스(parallel Input/output interface)를 제공
바이트 단위로 병렬 입출력 포트를 제어하기 위해서는 먼저 P0, P1, P2, P3에 대한 특수기능 레지스터의 주소를 정의
대부분의 C 컴파일러에서는 inc 폴더 내에 8051 계열에 따라 사용할 수 있도 록 sfr 정의 파일을 추가하였다. 따라서 모든 실습에서는 <reg51.h> 파일을 참조하면 된다.
포트 기능을 출력 핀으로 사용하다가 입력 핀으로 바꿀 경우에 반드시 포트 출력을 “1”로 준 다음에 후에 입력 핀으로 사용
sfr P0=0x80; // SFR for P0
sfr P1=0x90; // SFR for P1
sfr P2=0xa0; // SFR for P2
sfr P3=0xb0; // SFR for P3
예
4/44
01. 입출력 포트의 기능과 구조
<reg51.h>를 include하였다는 가정하에 포트 1(90H)에 데이터 7FH를 출력하 려면
비트 단위로 제어하기 위해서는 sbit라는 지정자를 사용하여 각 포트의 비트 를 비트 단위로 정의하여야 한다.
포트로 데이터 출력하기
#include <reg51.h>
void main(void) {
………
P1=0x0f; // P1 포트의 상위 4비트는 0000, 하위 4비트는 1111 출력 }
P1=0x7f;
예
P1_0; // P1포트의 0 번째 비트 (MIDE51 컴파일러)
P1^1; // P1포트의 1 번째 비트 (RIDE7 컴파일러)
예
5/44
01. 입출력 포트의 기능과 구조
포트의 값을 입력하기
포트에 비트 단위로 출력하기 (RIDE7 경우) (MIDE51 경우)
#include <reg51.h>
void main(void) {
unsigned char input; // input을 지역변수로 선언 input=P1; // P1 포트 값을 입력
}
#include <reg51.h>
sbit led0=P1^0; // P1 포트의 비트0을 비트변수 led0으로 선언 sbit led1=P1^1; // P1 포트의 비트1을 비트변수 led1로 선언 sbit led2=P1^2; // P1 포트의 비트2를 비트변수 led2로 선언 sbit led3=P1^3; // P1 포트의 비트3을 비트변수 led3으로 선언 void main(void)
{
led0=1; // P1.0에 1 출력 led1=0; // P1.1에 0 출력 led2=1; // P1.2에 1 출력 led3=0; // P1.3에 0 출력 }
#include <reg51.h>
void main(void) {
P1_0=1; // P1.0에 1 출력 P1_1=0; // P1.1에 0 출력 P1_2=1; // P1.2에 1 출력 P1_3=0; // P1.3에 0 출력 }
6/44
01. 입출력 포트의 기능과 구조
1.2 포트 0(P0.0~P0.7)
CPU는 어드레스 A7~A0과 데이터 D7~D0를 이 라인을 통하여 멀티플렉스하여 하위 어드레스 버스와 데이터 버스로서의 사용.
포트 0을 범용 8비트 양방향 I/O 포트로 사용할 경우에는 반드시 외부에 풀 업저항을 연결해야 한다. 8개의 LS TTL 구동 가능.
1.3 포트 1(P1.0~P1.7)
포트 1은 기본적으로 범용 8비트 양방향 I/O포트로 사용된다. 내부에 풀업저항이 있기 때문에 풀업저항을 연결하지 않아도 된다. 4개의 LS TTL 구동 가능.
1.4 포트 2(P2.0~P2.7)
범용 8비트 양방향 I/O포트로 사용가능하며 내부에 풀업저항이 있다. 4개의 LS TTL 구동 가능.
외부 프로그램, 데이터 메모리와 데이터 전송시 상위 어드레스(A15~A8)로 사용.
7/44
01. 입출력 포트의 기능과 구조
1.5 포트 3(P3.0~P3.7)
내부 풀업을 갖는 있는 8비트 양방향 포트이며, 4개의 LS TTL을 구동 가능
보통 범용 I/O 포트로 사용되며, 인터럽트, 타이머, 직렬포트 외부 메모리 등을 사 용하는 경우에는 특수기능을 수행
INT 0 INT 1
WR RD
포트 핀 명칭 기 능
P3.0 RxD 직렬통신에서 수신 핀으로 사용 P3.1 TxD 직렬통신에서 송신 핀으로 사용 P3.2 외부 인터럽트 0 요청 핀으로 사용 P3.3 외부 인터럽트 1 요청 핀으로 사용
P3.4 T0 타이머/카운터 0의 외부 클록 입력핀으로 사용 P3.5 T1 타이머/카운터 1의 외부 클록 입력핀으로 사용 P3.6 외부 데이터 메모리의 write strobe 신호 P3.7 외부 데이터 메모리의 read strobe 신호
포트 3의 특수기능
8/44
02. 입출력 포트 실습 1 : LED 구동
2.1 기본 이론
LED(Light Emitting Diode) : 상태 표시를 할 수 있는 소자
회로기호
발광효율이 높고, 저 전류에서 고출력을 얻을 수 있다.
응답속도가 빠르고 펄스동작과 같은 고주파 변조가 가능하다.
전류제어로 광 출력을 쉽게 변경할 수 있다.
소형 경량이며, 수명이 길고 소비전력이 적다.
LED 특징
9/44
02. 입출력 포트 실습 1 : LED 구동
포트의 상태가 0이면, LED는 ON
전류 구동 소자로 통상 2V 정도의 전압을 가하면 약 3~20mA의 전류가 흘러서 점등되므로 +5V의 직류전원에서 사용할 때에는 200~350의 저항을 직렬로 연결하여 사용
LED 구동 (기본)회로
] [ 10 330
9
2 5
3
R
] W [ 027 . 0 10
9
3 3
VI
P
sink 전류 구동 source 전류 구동
이 방법을 많이 사용
5V R 9mA
전류 방향 5V 포트 330
전류 방향
포트 330
포트의 상태가 1이면, LED는 ON
10/44
02. 입출력 포트 실습 1 : LED 구동
TTL을 이용한 LED 구동 회로
트랜지스터를 이용한 LED 구동 회로
Sink 전류 구동 Source 전류 구동
Sink 전류 구동 Source 전류 구동
5V
7404 330
포트
7404 330
포트
5V
1K
330
포트
5V
1K
330
포트
포트의 상태가 1이면, LED는 ON 포트의 상태가 0이면, LED는 ON
포트의 상태가 0이면, LED는 ON 포트의 상태가 1이면, LED는 ON
11/44
04. 입출력 포트 실습 3 : 7-세그먼트 구동
4.1 기본 이론
7-Segment 란 ?
LED를 7개 실장 한 것으로 숫자를 표시할 수 있음
접속방식
Common Anode(CA) 방식 (주로 사용 됨)
Common Cathode(CC) 방식 VCC
a b c d e f g dp
a b c d e f g dp
12/44
04. 입출력 포트 실습 3 : 7-세그먼트 구동
7-Segment 핀 배치도
4.2 실습 목적
7-Segment를 이용하여 10진 숫자 0~9까지를 1초 간격으로 순차적으로 표 시하는 프로그램을 작성한다. 여기서 Font는 다음과 같다.
COM a b
c d
e f g
COM
a b
d c e
f g
COM a b c
d e f g COM
a b
d c e
f g
13/44
04. 입출력 포트 실습 3 : 7-세그먼트 구동
+5V 40
31
5 6 7 8 P1.4 P1.5 P1.6 P1.7
a b c d e f g
330 +5V
1 2 3 4 P1.0 P1.1 P1.2 P1.3 Vcc
EA
dp
8051
COM
18
19 20pF
20pF
20 12MHz
RESET
Vss XTAL2
XTAL1 9
10uF +5V
4.7K +
7-세그먼트 구동 회로도
Common Anode(CA) 방식
14/44
04. 입출력 포트 실습 3 : 7-세그먼트 구동
4.3 소요 부품
번호 품명 규격 수량 비고
1 CPU AT89S51 1 AT89C51, Atmel
2 7-세그먼트 FND507 1 공통 애노드(CA)
3 수정 진동자 12MHz 1 크리스털
4 세라믹 커패시터 20pF 2 발진용
5 전해 커패시터 10F 1 16V
6 저항 330 1 1/4W
7 저항 4.7K 1 1/4W
8 스위치 TACT 1 Reset용, 소형
9 IC 소켓 40pin 1 DIP형
10 만능기판 SYP-1108 1 114×79mm, phenol
11 DC 파워 잭 1.3 1 어댑터의 B, C형 잭과 호환
9~11번 : 기판에 제작 시 필요
15/44
부품 모양
AT89S51 수정진동자(12MHz) 20pF
20
10uF
10uF
330
금색(오차) 주황(3) 주황(3) 갈색(1)
금색(오차) 보라(7) 노랑(4) 빨강(2)
4.7K 스위치
만능기판
IC소켓(40핀) DC 파워잭
7-세그먼트
04. 입출력 포트 실습 3 : 7-세그먼트 구동
16/44
04. 입출력 포트 실습 3 : 7-세그먼트 구동
4.4 프로그램
P05_03.c
#include <reg51.h>
code unsigned char table[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78, 0x00,0x10};
void delay(unsigned int ms) // 시간지연(ms) {
unsigned int i, j;
for (i=1; i <= ms; i++)
for (j=1; j <= 125; j++); // 1 ms 지연 }
void main(void) {
unsigned char i;
do {
for (i=0; i<10; i++) {
P1=table[i]; // P1 포트로 데이터 출력 delay(1000); // 1초 지연
}
} while(1);
}
17/44
04. 입출력 포트 실습 3 : 7-세그먼트 구동
4.5 과제
① 7-세그먼트를 이용하여 아래의 영문자를 약 1초 간격으로 교대로 디스플레이하는
프로그램을 작성하여 그 동작을 확인하여라.
18/44
04. 입출력 포트 실습 3 : 7-세그먼트 구동
완성 사진
19/44
05. 입출력 포트 실습 4 : 스위치 대응 LED 점등
5.1 실습 목적
4개 스위치의 on-off에 대응해서 4개의 LED를 점등하는 프로그램을 작성하고 회 로를 동작시킨다. 예를 들어 SW1이 on되면 이에 대응하는 LED1이 on이 된다.
+5V 40
31
5 6 7 8 P1.4 P1.5 P1.6 P1.7
1 2 3 4 P1.0 P1.1 P1.2 P1.3
+5V Vcc
EA
+5V
4.7Kx4
330x4
SW1 SW2 SW3 SW4
LED1 LED2 LED3 LED4
8051
18
19 20pF
20pF
20 12MHz
RESET
Vss XTAL2
XTAL1 9
10uF +5V
4.7K +
스위치 on-off에 따른 LED 점등 회로도
20/44
05. 입출력 포트 실습 4 : 스위치 대응 LED 점등
5.2 소요 부품
번호 품명 규격 수량 비고
1 CPU AT89S51 1 AT89C51, Atmel
2 LED 빨간색 4 5
3 스위치 TACT 5 Reset용, 소형
4 수정 진동자 12MHz 1 크리스털
5 세라믹 커패시터 20pF 2 발진용
6 전해 커패시터 10F 1 16V
7 어레이 저항 4.7K 1 SIP 5P, 풀업용
8 저항 330 4 1/4W
9 저항 4.7K 1 1/4W
10 IC 소켓 40핀 1 DIP형
11 만능기판 SYP-1108 1 114×79mm, phenol
12 DC 파워 잭 1.3 1 어댑터의 B, C형 잭과 호환
10~12번 : 기판에 제작 시 필요
21/44
부품 모양
AT89S51 수정진동자(12MHz) 20pF
20
10uF
10uF
LED(5)
330
금색(오차) 주황(3) 주황(3)
갈색(1) 금색(오차)
보라(7) 노랑(4) 빨강(2)
4.7K 스위치
만능기판
IC소켓(40핀) DC 파워잭
05. 입출력 포트 실습 4 : 스위치 대응 LED 점등
472
어레이 저항(4.7K)
22/44
05. 입출력 포트 실습 4 : 스위치 대응 LED 점등
5.3 프로그램
P05_04.c
#include <reg51.h>
void delay(unsigned char i) {
while(i--);
}
void main(void) {
unsigned char in_data;
P1=0x0f; // P1.3~P1.0를 입력포트로 설정
do {
in_data=P1; // P1 포트 값을 읽음
in_data=(in_data<<4) | 0x0f; // 스위치 상태를 상위 4비트로 이동. 하위 4비트 1111 P1=in_data; // LED on & off
delay(100); // 디바운싱을 위한 지연
} while(1); // 반복
}
23/44
05. 입출력 포트 실습 4 : 스위치 대응 LED 점등
5.4 과제
① 실습 프로그램은 바이트 단위로 입력해서 바이트 단위로 출력했다. 이번에는 비트
단위로 스위치 상태를 입력해서 해당 LED를 on/off하는 프로그램을 작성하고 동
작을 확인하여라.
24/44