BASIC4MCU | 질문게시판 | Atmega128 블루투스 코드 질문입니다.
페이지 정보
작성자 초보코드 작성일2021-12-15 21:15 조회9,214회 댓글1건본문
1.교수님이 주신 코드를 금요일 까지 바꿔야 합니다...급해요...ㅠㅠ
2.블루투스 JMOD-BT-1 모듈을 사용합니다
3.Micro Chip Studio 프로그램을 사용합니다.
4.동작은 블루투스 연결하여 LED on,Buzz on,Motor on 동작하는 코드 입니다.
5.과제는 1,2,3,4,5,6,7 입력하면 동작하는코드를 단어로 바꿔야 합니다...
예)1 -> LED ON 으로 2.->BUZZ ON....7-> STATUS 이런식으로 바꿔야합니다.
추가)) 6.만약 힘들면 'O','X' 디스플레이를 'LED ON' 이런식으로 화면에 출력되게 해주셔도 됩니다ㅠㅠ
#include <avr/io.h>
#define F_CPU 16000000UL
#define __DELAY_BACKWARD_COMPATIBLE__
#include <util/delay.h>
#define ON 1
#define OFF 0
#define STOP_SPEED 00 // duty Cycle 0%의 값
#define MID_SPEED 153 // duty Cycle 60%의 값
//PB7 = AIN1, PB6 = AIN2, PB5 = PWMA, PB4 = STBY
#define MOTOR_CW 0xb0 // 모터 Forward: AIN1=1, AIN2=0, PWMA=1,STBY=1
#define MOTOR_Standby 0x00 // 모터 Standby: AIN1=0. AIN2=0, PWMA=0. STBY=0
void putchar1(char c) // 1 문자를 송신(Transmit)하는 함수
{
while(!(UCSR1A & (1<<UDRE1))) // UDRE1: UCSR1A 5번 비트,
; // 즉, 1을 5번 왼쪽으로 shift한 값이므로 0x20과 &
UDR1 = c; // 1 문자 전송, 송신 데이터를 UDR1에 넣음
}
char avalilable1() // 문자 입력을 확인하는 함수
{
if (UCSR1A & (1<<RXC1)) // 입력된 문자가 있는지 확인
return(1); // 입력된 문자가 있으면 “1“의 값으로 return
else return(0); //입력된 문자가 없으면 "0" 의 값으로 return
}
char getchar1() // 1 문자를 수신(receive)하는 함수
{
return(UDR1); //1 문자 수신, UDR1에서 수신 데이터를 가져옴
}
void buzzer(int hz, int count) //hz의 주파수를 갖는 펄스를 count 개수만큼 생성
{
int i, millis, micros;
millis = 1000 /(2*hz); // 1개 펼스의 ON 또는 OFF 의 ms 단위
micros = (1000.0/(2*hz) - 1000/(2*hz)) * 1000;
// 1개 펄스의 ON 또는 OFF us 단위
for (i=0; i<count; i++)
{
PORTE |= 1 << 4; // buzzer ON
_delay_ms(millis); // (millis)ms 동안 delay
_delay_us(micros); // (micros)us 동안 delay
PORTE &=~(1<<4); // buzzer OFF
_delay_ms(millis); // (millis)ms 동안 delay
_delay_us(micros); // (micros)us 동안 delay
}
}
void BUZZER_Control()
{
int i;
for(i=0; i<2; i++) // 0.1초 정도 짧은 경고음.
// 2개 주파수의 소리 혼합 생성
{
buzzer(480, 12); // 480 Hz로 12회
buzzer(320, 8); // 320 Hz로 8회
}
}
void init_uart1() // UART1 초기화 함수
{
UCSR1B = 0x18; // 송신 Transmit(TX), Receive(RX) Enable
UCSR1C = 0x06; // UART Mode, 8Bit Data, No Parity, 1 Stop Bit
UBRR1H = 0; // Baudrate 세팅
UBRR1L = 8; // 16Mhz, 115200 baud (주의:초기 셋팅 값 확인)
}
int main()
{
char c;
int st_light=OFF, st_buzz=OFF, st_fan=OFF ; //전등,버저,선풍기 초기상태
DDRA = 0x0f; // 전등(LED) 포트 = PA3~PA0 : 출력
DDRB = 0xf0; //선풍기(모터) 포트 = PB7~PB4 출력
DDRE = 0x10; //경고음 (버저) 포트 = PE4
PORTB = MOTOR_Standby; //모터 초기화 : 정지 상태
init_uart1(); // UART1 초기화
while(1) // 명령을 받아서 실행
{
if(!avalilable1()) // 만약 입력된 문자가 없으면
{
if (st_buzz == ON) // 버저 ON 상태를 확인한 후 계속 버저 울림
BUZZER_Control();
continue; // while 문 맨 처음으로 되돌아감
}
c = getchar1(); // 입력된 문자를 스마트폰으로부터 받아서
putchar1(c); // echo back 후
switch(c) // 명령의 종류에 따라 아래를 실행
{
case '1': PORTA = 0x0f; st_light = ON; break; // 전등 ON
case '2': st_buzz = ON; break; // 버저 ON
case '3': PORTB = MOTOR_CW; st_fan = ON; break; // 선풍기 ON
case '4': PORTA = 0x00; st_light = OFF; break; // 전등 OFF
case '5' :st_buzz = OFF; break; // 버저 OFF
case '6' : PORTB = MOTOR_Standby; st_fan = OFF; break; //선풍기 OFF
case '7' :
putchar1('\n'); //New Line
if(st_light) //전등 현재 상태 체크
putchar1('O'); //전등 ON이면 ‘O’ 디스플레이
else
putchar1('X'); //전등 OFF이면 ‘X’ 디스플레이
if(st_buzz) //버저 현재 상태 체크
putchar1('O'); //버저 ON이면 ‘O’ 디스플레이
else
putchar1('X'); //버저 OFF이면 ‘X’ 디스플레이
if(st_fan) //선풍기 현재 상태 체크
putchar1('O'); //선풍기 ON이면 ‘O’ 디스플레이
else
putchar1('X'); //선풍기 OFF이면 ‘X’ 디스플레이
break;
default: break;
}
}
}
제발 도와주세요~~ㅠㅠ
댓글 1
조회수 9,214master님의 댓글
master 작성일
도와드리는 것과 숙제를 대신 해드리는 것은 전혀 다른 얘기입니다.
숙제는 직접하시고
기술적으로 막히는 작은 한 부분씩 질문글을 작성해주세요