BASIC4MCU | 질문게시판 | 답변 : atmega128 코드 합치기
페이지 정보
작성자 master 작성일2024-06-19 06:38 조회157회 댓글0건본문
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <string.h>
//
#include "lcd.h"
//
#define NULL 0
//
#define sensor1 PIND&0x01 // PD0
#define sensor2 PIND&0x02 // PD1
#define sensor3 PIND&0x20 // PD5
#define sensor4 PIND&0x40 // PD6
//
#define G1_ON PORTB&=~0x02 // PB1
#define G2_ON PORTB&=~0x04 // PB2
#define G3_ON PORTB&=~0x20 // PB5
#define G4_ON PORTB&=~0x40 // PB6
#define G1_OFF PORTB|= 0x02 // PB1
#define G2_OFF PORTB|= 0x04 // PB2
#define G3_OFF PORTB|= 0x20 // PB5
#define G4_OFF PORTB|= 0x40 // PB6
//
#define R1_ON PORTC&=~0x01 // PC0
#define R2_ON PORTC&=~0x02 // PC1
#define R3_ON PORTC&=~0x04 // PC2
#define R4_ON PORTC&=~0x08 // PC3
#define R1_OFF PORTC|= 0x01 // PC0
#define R2_OFF PORTC|= 0x02 // PC1
#define R3_OFF PORTC|= 0x04 // PC2
#define R4_OFF PORTC|= 0x08 // PC3
//
enum State {IDLE,WAITING_TO_OPEN,OPENING,OPEN_WAIT,OPEN,WAITING_TO_CLOSE,CLOSING,CLOSED_WAIT};
enum State state=IDLE;
//
char EnteredPSWD[5]; // 입력된 비밀번호를 저장할 배열
char SetPSWD[5]; // 설정된 비밀번호를 저장할 배열
uint8_t passwordIndex=0;
uint8_t isPSWDSet=0; // 비밀번호가 설정되었는지 여부
//
char getchar1() { while(!(UCSR1A&0x80)); return UDR1; }
void putchar1(char c){ while(!(UCSR1A&0x20)); UDR1=c; }
void puts1(char *s) { while(*s)putchar1(*s++); }
//
void servo(uint16_t angle){ TCCR3A|=(1<<COM3A1); OCR3A=(angle*250/180)+250; _delay_ms(500); TCCR3A&=~(1<<COM3A1); OCR3A=0; } // 각도에 따른 PWM 값을 계산(0도=250,180도=500)
//
void reset_password(){ isPSWDSet=0; passwordIndex=0; SetPSWD[0]='\0'; puts1("PSWD Reset\r\n"); }
//
int count_red_leds(void){
int red_led_count=0;
if(sensor1==0){ R1_ON; G1_OFF; red_led_count++; } else{ G1_ON; R1_OFF; } // 센서 1 처리
if(sensor2==0){ R2_ON; G2_OFF; red_led_count++; } else{ G2_ON; R2_OFF; } // 센서 2 처리
if(sensor3==0){ R3_ON; G3_OFF; red_led_count++; } else{ G3_ON; R3_OFF; } // 센서 3 처리
if(sensor4==0){ R4_ON; G4_OFF; red_led_count++; } else{ G4_ON; R4_OFF; } // 센서 4 처리
return red_led_count;
}
//
int main(){
char c,buffer[4]; int red_led_count,available_spaces;
// PD0,PD1,PD5,PD6(적외선 센서 입력 핀)를 입력으로 설정
DDRB=0x1E; // PB1,PB2,PB3,PB4(초록색 LED
DDRC=0x0F; // PC0,PC1,PC2,PC3(빨강색 LED
DDRE|=(1<<PE3); TCCR3A=(1<<WGM31)|(1<<COM3A1); TCCR3B=(1<<WGM32)|(1<<WGM33)|(1<<CS31)|(1<<CS30); ICR3=4999; OCR3A=375; // Fast PWM,10-bit // 초기값 90도 // PE3(OC3A)출력 // init_servo();
UCSR1B=0x18; UBRR1L=8; // init_uart1();
LCD_init();
while(1){
if(UCSR1A&0x80){ c=UDR1; UDR1=c;
if(!isPSWDSet){ // 비밀번호 설정 단계
if(c>='0' && c<='9'){
EnteredPSWD[passwordIndex++]=c; EnteredPSWD[passwordIndex]=0;
if(passwordIndex==4){ strcpy(SetPSWD,EnteredPSWD); isPSWDSet=1; passwordIndex=0; puts1("PSWD Set\r\n"); } // 비밀번호가 4자리일 때
}
}
else{
if(c>='0' && c<='9'){ // 비밀번호 입력 단계
EnteredPSWD[passwordIndex++]=c; EnteredPSWD[passwordIndex]=0;
if(passwordIndex==4){ // 비밀번호가 4자리일 때
if(strcmp(EnteredPSWD,SetPSWD)==0)state=WAITING_TO_OPEN; // 올바른 비밀번호 입력 시 서보 모터 작동
passwordIndex=0;
}
}
else if(c=='R')reset_password(); // 비밀번호 초기화
}
//
switch(state){
case IDLE: break;
case WAITING_TO_OPEN: servo(275); state=OPEN; break; // 차단기 10도
case OPEN: _delay_ms(5000); state=WAITING_TO_CLOSE; break; // 차단기 OPEN
case WAITING_TO_CLOSE: servo(500); state=CLOSED_WAIT; break; // 차단기 150도
case CLOSED_WAIT: state=IDLE; break;
}
}
//-----------------------------------------------------
red_led_count=count_red_leds(); available_spaces=red_led_count; itoa(available_spaces,buffer,10);
LCD_clear();
LCD_goto_XY(0,0); LCD_write_string("Spaces:");
LCD_goto_XY(0,8); LCD_write_string(buffer);
LCD_goto_XY(1,0); if(available_spaces==0)LCD_write_string("No More Space!"); else LCD_write_string("Welcome!");
//-----------------------------------------------------
_delay_ms(100);
}
}
댓글 0
조회수 157등록된 댓글이 없습니다.