getchar() , putchar() 함수 사용하기 표준(ANSI) C 언어에서 getchar() 함수는 키보드(표준입력장치)로부터 문자를 입력하는 함수입니다. 8051 C 컴파일러에서 getchar() 함수는 시리얼 통신으로부터 한 문자를 입력받는 함수로 만들어져 있습니다. 마찬가지로 putchar() 함수는 모니터(표준출력장치)로 문자를 출력하는 함수입니다. 8051 C 컴파일러에서 putchar() 함수는 시리얼 통신으로 한 문자를 출력하는 함수로 만들어져 있습니다. #include #include #include "lcd.h" void init_serial(void) { TMOD = 0x20; PCON = 0x80; SCON = 0x52; TH1 = 0xfd; TR1 = 1; SBUF = 0; ..
시리얼 통신으로 받은 데이터를 LCD 에 표시하기 시리얼 통신으로 데이터를 주고 받는 프로그램을 살펴 보았습니다. 시리얼 통신으로 데이터를 주고 받을 때는 아스키 코드로 데이터를 전송합니다. 마찬가지로 LCD 에 데이터를 표시할 때도 아스키 코드를 사용합니다. 그러므로 시리얼 통신으로 받은 데이터는 그대로 LCD 에 표시될 수 있습니다. 이번 강좌에서는 하이퍼 터미널로 보낸 시리얼 통신 데이터를 LCD 에 출력하는 방법을 살펴봅니다. 첫째 시리얼 통신을 초기 설정합니다. 둘째 캐릭터 LCD 를 초기 설정합니다. 세째 시리얼 통신으로 받은 데이터를 16x2 LCD 에 출력합니다. #include #include "lcd.h" void init_serial(void) { TMOD = 0x20; PCON = ..
시리얼 통신으로 데이터 주고 받기 시리얼 통신을 이용하여 데이터를 주고 받는 프로그램을 작성합니다. SCON 레지스터에 있는 TI, RI 플래그를 폴링방식으로 체크해서 데이터를 전송하는 방식입니다. #include typedef unsigned char byte; void init_serial(void) { TMOD = 0x20; PCON = 0x80; SCON = 0x52; TH1 = 0xfd; TR1 = 1; SBUF = 0; } byte RX_D(void) { while(!RI); RI=0; return(SBUF); } void TX_D(byte buffer) { while(!TI); TI=0; SBUF = buffer; } void main() { byte rx; init_serial(); /* ..
타이머 1 을 이용하여 보레이트(Baud rate) 만들기 8051 의 직렬 통신은 통신 모드 1 (8비트 통신, 보레이트 가변 모드) 을 주로 사용합니다. 보레이트는 초당 전송되는 비트수(bps) 로 정의 될 수 있습니다. 이 보레이트를 만들기 위하여 타이머 1 의 모드 2 를 사용합니다. 타이머 모드 2 는 TL1 레지스터를 시정수로 사용합니다. TL1 이 오버플로우 되면 (0xFF -> 0x00) TH1 의 값이 TL1 으로 로드 됩니다. (오토 리로드) 타이머 1 을 사용한 경우의 보레이트 공식은 다음과 같습니다. 시스템 클럭은 22.1184 MHz 이고 SMOD 를 1 로 하고 TH1 을 0xFD(253) 로 해서 보레이트를 계산해 보면 38400 (bps) 이 됩니다. TH1 을 0xFA(25..
직렬 통신에 관계된 레지스터 USART (Unversal Synchronous and Asynchronous serial Receiver and Transmitter) 는 동기식, 비동기식 직렬 통신 장치입니다. 동기식 통신은 고속 전송이 가능하지만 동기를 맞추기위한 하드웨어가 필요하고 제어가 비동기식에 비해 어렵습니다. 비동기식 통신은 RS-232 통신방식을 사용합니다. 보통 UART (비동기식 통신) 라고 합니다. 직렬통신에 관계된 레지스터중에서 실습에 필요한 것만 살펴보겠습니다. UDR (USART I/O Data Register) - $2C UCSRA (USART Control and Status Register A) - $2B UCSRB (USART Control and Status Regist..
타이머 모드(TMOD) 의 GATE 제어하기 타이머 모드를 설정하는 TMOD 레지스터에 GATE 비트가 있습니다. 이 GATE 비트를 1 로 설정하면 타이머의 동작을 일시 정지시킬수 있습니다. 앞의 강좌 '타이머 인터럽트 0 사용하기' 에서 TMOD 값을 0x09 (GATE=1, 모드 1) 로 설정해서 동작하는 것을 살펴보겠습니다. 프로그램을 실행하고 LED 가 이동하는 동안 외부 인터럽트 0 (INT0) 버튼을 누르면 타이머가 정지해서 LED 의 이동이 멈춥니다. 이 버튼을 놓으면 다시 타이머가 동작하고 LED 가 이동하는 것을 볼수 있습니다. GATE 제어를 사용하면 외부 인터럽트 기능을 사용할 수 없습니다. #include typedef unsigned char byte; byte led, cnt;..
SND 와 LED 함께 동작시키기 (타이머 0 인터럽트 사용) main() 함수는 while(); 무한루프를 실행하고 타이머 인터럽트가 발생하면 LED 를 이동하는 프로그램을 작성하였습니다. 이번 강좌에서는 main() 함수에서는 SND 에 숫자를 표시하고, 타이머 인터럽트가 발생하면 LED 를 이동하는 프로그램을 만들겠습니다. SND 를 구동하는 프로그램은 강좌 22 SND 에 숫자 표시하기 (2) - 함수만들기 에서 만들었던 것을 사용합니다. #include char snd_num[10]={0x3f,0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f}; char snd_loc[6]={0x04,0x08,0x10,0x20,0x40,0x80}; char led; void del..
타이머 인터럽트 0 사용하기 (모드 1 사용) AT89S52 의 인터럽트 종류는 6 가지가 있습니다. 1. 외부 인터럽트 0 2. 타이머/카운터 인터럽트 0 3. 외부 인터럽트 1 4. 타이머/카운터 인터럽트 1 5. 시리얼 인터럽트 6. 타이머/카운터 인터럽트 2 이중 두번째 우선순위를 갖고있는 타이머 인터럽트 0 를 사용하는 프로그램을 작성합니다. 베타키트는 AVR(ATmega8515) 과 혼용해서 사용할 수 있도록 제작된 관계로 외부 카운터 입력핀을 사용하지 못합니다. 그래서 타이머 인터럽트를 사용한 프로그램만 작성합니다. 포트 1 에 연결된 LED 를 우로 이동하면서 켜는 프로그램입니다. 이전에는 시간지연함수 (delay() 함수) 를 이용하여 LED 점멸 간격을 조정하였습니다. 이렇게 하면 MC..
타이머/카운터 (에 관계된 레지스터) 타이머/카운터는 시간측정 또는 이벤트를 카운트 하는 기능입니다. 타이머는 내부 시스템 클럭(크리스탈)을 카운트해서 일정 시간을 측정하고, 카운터는 외부 이벤트를 카운트 할 수 있습니다. 베타키트를 중심으로 타이머 사용법을 설명합니다. 타이머에 관계된 레지스터는 TCON(Timer CONtrol) - 88h TMOD(Timer MODe) - 89h TCON 레지스터를 보면 하위 4 비트는 외부 인터럽트에 관계된 비트이고, 상위 4 비트는 타이머에 관계된 비트입니다. TR0, TR1 은 타이머 0 와 타이머 1 을 시작/정지 시키는 비트입니다. 즉, 타이머 0 을 동작시키려면 TR0 에 1 을 입력하면 되고, TR0 에 0 을 입력하면 타이머 0 은 정지합니다. TF0,..