BASIC4MCU | 질문게시판 | avr 수동부저로 도레미파솔라시 표현하기 부탁드립니다..
페이지 정보
작성자 cretom 작성일2022-11-22 04:08 조회1,328회 댓글3건본문
적외선 센서에서 신호를 받으면 ADC 변환을 통해서 부저를 울리는 소스를 만들었는데
부저에 각자 트리거 0 과 1의 딜레이 길이를 다르게 넣어서 다른 소리를 내려고 했는데 음낮이가 안 바뀌고 같은 소리만 나오네요..
어떻게 바꿔야 할까요..? 코드비전 사용하고있고 키트는 ATMEGA128 pro 키트 사용하고 있습니다
아두이노 부저 모듈 Low + Passive [SZH-SDBJ-007] < 부저는 이 제품을 사용했습니다 .
#include <mega128.h>
#include <delay.h>
char N1=0, N10=0, N100=0,N1000=0,N10000=0,N100000=0, N1000000=0;
void AD(int);
void AA(int);
void AB(int);
void AC(int);
void AE(int);
void AF(int);
void AG(int);
int adval,a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;
#define TRIGGER PORTB.0
void main(void)
{
DDRB = 0xFF;
DDRG = 0xFF;
ADCSRA = 0x87;
delay_ms(5);
while (1)
{
ADMUX = 0b00000000; //시
ADCSRA = 0xC7;
while((ADCSRA & 0x10) ==0);
adval = (int)ADCL + ((int)ADCH<<8);
AD(adval);
if (N100>=3)
{
DDRB = 0x0;
a=0;
b=0;
}
if (N100<3)
{
if(b==0){
DDRB = 0xFF;
TRIGGER = 1;
delay_ms(4);
TRIGGER = 0;
delay_ms(1);}
a++;
if (a>=0.6) //음 지속시간
{
DDRB = 0X0;
b=1;
}
}
ADMUX = 0b00000001; //도
ADCSRA = 0xC7;
while((ADCSRA & 0x10) ==0);
adval = (int)ADCL + ((int)ADCH<<8);
AA(adval); //도
if (N1>=3)
{
DDRB = 0x0;
c=0;
d=0;
}
if (N1<3)
{
if(d==0){
DDRB = 0xFF;
TRIGGER = 1;
delay_ms(15);
TRIGGER = 0;
delay_ms(15);}
c++;
if (c>=1) //음 지속시간
{
DDRB=0X0;
d=1;
}
}
ADMUX = 0b00000010; //레
ADCSRA = 0xC7;
while((ADCSRA & 0x10) ==0);
adval = (int)ADCL + ((int)ADCH<<8);
AB(adval);
if (N10>=3)
{
DDRB = 0x0;
e=0;
f=0;
}
if (N10<3)
{
if(f==0){
DDRB = 0xFF;
TRIGGER = 1;
delay_ms(10);
TRIGGER = 0;
delay_ms(10);}
e++;
if (e>=0.8) //음 지속시간
{
DDRB=0X0;
f=1;
}
}
ADMUX = 0b00000011; //미
ADCSRA = 0xC7;
while((ADCSRA & 0x10) ==0);
adval = (int)ADCL + ((int)ADCH<<8);
AC(adval);
if (N1000>=3)
{
DDRB = 0x0;
g=0;
h=0;
}
if (N1000<3)
{
if(h==0){
DDRB = 0xFF;
TRIGGER = 1;
delay_ms(6);
TRIGGER = 0;
delay_ms(6);}
g++;
if (g>=0.8) //음 지속시간
{
DDRB=0X0;
h=1;
}
}
ADMUX = 0b00000100; //파
ADCSRA = 0xC7;
while((ADCSRA & 0x10) ==0);
adval = (int)ADCL + ((int)ADCH<<8);
AE(adval);
if (N10000>=3)
{
DDRB = 0x0;
i=0;
j=0;
}
if (N10000<3)
{
if(j==0){
DDRB = 0xFF;
TRIGGER = 1;
delay_ms(3);
TRIGGER = 0;
delay_ms(3);}
i++;
if (i>=1) //음 지속시간
{
DDRB=0X0;
j=1;
}
}
ADMUX = 0b00000101; //솔
ADCSRA = 0xC7;
while((ADCSRA & 0x10) ==0);
adval = (int)ADCL + ((int)ADCH<<8);
AF(adval);
if (N100000>=3)
{
DDRB = 0x0;
k=0;
m=0;
}
if (N100000<3)
{
if(m==0){
DDRB = 0xFF;
TRIGGER = 1;
delay_ms(3);
TRIGGER = 0;
delay_ms(3);}
k++;
if (k>=1) //음 지속시간
{
DDRB=0X0;
m=1;
}
}
ADMUX = 0b00000110; //라
ADCSRA = 0xC7;
while((ADCSRA & 0x10) ==0);
adval = (int)ADCL + ((int)ADCH<<8);
AG(adval);
if (N1000000>=3)
{
DDRB = 0x0;
n=0;
o=0;
}
if (N1000000<3)
{
if(o==0){
DDRB = 0xFF;
TRIGGER = 1;
delay_ms(6);
TRIGGER = 0;
delay_ms(16);}
n++;
if (n>0.8) //음 지속시간
{
DDRB=0X0;
o=1;
}
}
}
}
void AD(int val)
{
float fval;
int ival;
fval = (float)val * 5.0/1024.0;
ival = (int)(fval * 100.0 + 0.5);
N100 = ival/100;
delay_ms(3);
}
void AA(int val)
{
float fval;
int ival;
fval = (float)val * 5.0/1024.0;
ival = (int)(fval * 100.0 + 0.5);
N1 = ival/100;
delay_ms(3);
}
void AB(int val)
{
float fval;
int ival;
fval = (float)val * 5.0/1024.0;
ival = (int)(fval * 100.0 + 0.5);
N10 = ival/100;
delay_ms(3);
}
void AC(int val)
{
float fval;
int ival;
fval = (float)val * 5.0/1024.0;
ival = (int)(fval * 100.0 + 0.5);
N1000 = ival/100;
delay_ms(3);
}
void AE(int val)
{
float fval;
int ival;
fval = (float)val * 5.0/1024.0;
ival = (int)(fval * 100.0 + 0.5);
N10000 = ival/100;
delay_ms(3);
}
void AF(int val)
{
float fval;
int ival;
fval = (float)val * 5.0/1024.0;
ival = (int)(fval * 100.0 + 0.5);
N100000 = ival/100;
delay_ms(3);
}
void AG(int val)
{
float fval;
int ival;
fval = (float)val * 5.0/1024.0;
ival = (int)(fval * 100.0 + 0.5);
N1000000 = ival/100;
delay_ms(3);
}
댓글 3
조회수 1,328master님의 댓글
master 작성일
https://cafe.naver.com/circuitsmanual/63528
음계는 이 예제를 참고하세요
적외선센서 ADC 변환은 이해가 안갑니다.
cretom님의 댓글
cretom
아 저 적외선이 인식하면 값이 0으로 뜨고 인식 안 하는 상태일때는 3,4,5가 반복이라서 저런식으로 했습니다! 예제 보고 도레미파솔 나오게 만들었는데 소리가 구불구불하게 나온다고해야하나.. 개구리 울음처럼 나오는데 이건 왜 그런지 알수있을까요..? 볼륨 높이는 방법도 궁금합니다!
master님의 댓글
master 작성일
#include <mega128.h>
#include <delay.h>
//
#define BUZ PORTB.0
//
void main(void){
char i,val[8];
DDRB.0=1;
ADCSRA=0xE7;
while (1){
for(i=0;i<8;i++){ ADMUX=i; delay_ms(1); val[i]=ADCH; }
//-----------
if (val[0]<2){ BUZ=!BUZ; delay_ms( 4); } //시 PF0
else if(val[1]<2){ BUZ=!BUZ; delay_ms(15); } //도 PF1
else if(val[2]<2){ BUZ=!BUZ; delay_ms(10); } //레 PF2
else if(val[3]<2){ BUZ=!BUZ; delay_ms( 6); } //미 PF3
else if(val[4]<2){ BUZ=!BUZ; delay_ms( 3); } //파 PF4
else if(val[5]<2){ BUZ=!BUZ; delay_ms( 3); } //솔 PF5
else if(val[6]<2){ BUZ=!BUZ; delay_ms(16); } //라 PF6
//else if(val[7]<2){ BUZ=!BUZ; delay_ms(15); } //도 PF7
}
}
질문 소스를 정리하면 대략 이런 코드입니다.
AVR c언어 처음이신 것 같은데요
공부를 많이 하셔야겠습니다.