BASIC4MCU | 질문게시판 | 답변 : atmega while문 도와주세요 ㅠㅠ
페이지 정보
작성자 master 작성일2022-12-03 10:27 조회243회 댓글0건본문
1. 실시간 온도 fnd로 나타내기
2. 조도센서 이용해서 LED on,off
3. 초음파 거리센서 이용해서 버저 울리기
//
#define F_CPU 16000000UL
#define F_SCK 40000UL
#include <avr/io.h>
#include <util/delay.h>
//
#define LM75A_ADDR 0x90
#define LM75A_TEMP_REG 0
//모터
#define MOTOR_ON 0x40 //PB6=1
#define MOTOR_STOP 0x00 //PB6=0
//
#define TEM1 0x1400 //20도
//조도
#define CDS_10 341
//
int read_twi_2byte_nopreset(char reg){
char high_byte,low_byte;
TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN); while(((TWCR&(1<<TWINT))==0x00)||(TWSR&0xf8)!=0x08);
TWDR=LM75A_ADDR|0;
TWCR=(1<<TWINT)|(1<<TWEN); while(((TWCR&(1<<TWINT))==0x00)||(TWSR&0xf8)!=0x18);
TWDR=reg;
TWCR=(1<<TWINT)|(1<<TWEN); while(((TWCR&(1<<TWINT))==0x00)||(TWSR&0xf8)!=0x28);
TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN); while(((TWCR&(1<<TWINT))==0x00)||(TWSR&0xf8)!=0x10);
TWDR=LM75A_ADDR|1;
TWCR=(1<<TWINT)|(1<<TWEN); while(((TWCR&(1<<TWINT))==0x00)||(TWSR&0xf8)!=0x40);
TWCR=(1<<TWINT)|(1<<TWEN|1<<TWEA); while(((TWCR&(1<<TWINT))==0x00)||(TWSR&0xf8)!=0x50);
high_byte=TWDR;
TWCR=(1<<TWINT)|(1<<TWEN); while(((TWCR&(1<<TWINT))==0x00)||(TWSR&0xf8)!=0x58);
low_byte=TWDR;
TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN); while((TWCR&(1<<TWSTO)));
return((high_byte<<8)|low_byte);
}
//
void display_FND(int value){
char digit[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0x00,0x40};
char fnd_sel[4]={0x01,0x02,0x04,0x08};
int value_int,value_deci,num[4],i;
//
if((value&0x8000)!=0x8000)num[3]=10; else{ num[3]=11; value=(~value)+1; }
value_int=value>>8; value_deci=value&0x80;
num[2]=(value_int/10)%10; num[1]=value_int%10; num[0]=(value_deci==0x80)?5:0;
for(i=0;i<4;i++){ PORTC=digit[num[i]]; PORTG=fnd_sel[i]; _delay_us(2500); }
}
//
int main(){
unsigned int distance,i,value_zodo; int temperature=0;
DDRB=0x50; // PB4 버저, MOTOR_ON(PB6)
DDRE=0x40; // Trigger(PE6),Echo(PE7)
DDRA=0x07; // PA0~2까지 LED
DDRC=0xff; DDRG=0xff; // fnd
TWSR=TWSR&0xfc; TWBR=(F_CPU/F_SCK-16)/2;
ADMUX=0x40; ADCSRA=0xE7; // 조도
while(1){
temperature=read_twi_2byte_nopreset(LM75A_TEMP_REG);
display_FND(temperature);
if(temperature>TEM1)PORTB=MOTOR_ON; else PORTB=MOTOR_STOP;
//-------------------------------------------------------
value_zodo=ADC; // value_zodo=ADW; 낮은 버전에서는 ADCW를 사용 함
if(value_zodo<=CDS_10)PORTA=0xff; else PORTA=0;
//-------------------------------------------------------
_delay_ms(100);
PORTE|=0x40; _delay_us(10); PORTE&=~0x40; // TRIG
while(!(PINE&0x80)); TCNT1=0; TCCR1B=3; // 4us
while(PINE&0x80); TCCR1B=0;
distance=(float)TCNT1*0.6896551724137931; // mm
//
if(distance<300){ // 300mm 이내 접근?
for(i=0;i<10;i++){ PORTB^=0x10; _delay_ms(1); }
}
}
}
댓글 0
조회수 243등록된 댓글이 없습니다.