标题: 本人新手,想请教下如何通过声音控制一颗led的亮灭 [打印本页]

作者: great_splendid    时间: 2020-7-17 18:39
标题: 本人新手,想请教下如何通过声音控制一颗led的亮灭
问题:声音通过驻极体,经过放大电路放大(如图所示,这是抄一个实际板子上面的),输出位置的电压是0.95V,如果说话,可以跳动到4.2V,声音大小不同,电压变化也不同,反正电压都在0.95-4.2V范围内,我后来直接接到51单片机的P3.2 I/O口,用中断0程序,发现没反应。这种判断有电压变化,然后控制另外一个I/O口的1颗LED灯进行亮灭,有声音就亮,声音大就亮多一些,是不是一定要用A/D转换的单片机或者外接A/D采集IC,例如ADC0809这样的。有没有什么好的方案,请大神指点。

51hei截图20200717182425.jpg (113.63 KB, 下载次数: 73)

声控放大

声控放大

作者: zcm119    时间: 2020-7-17 21:31
ad转换 pwm输出
作者: zcm119    时间: 2020-7-17 21:32
ad转换,pwm控制亮灭 等!
作者: xianfajushi    时间: 2020-7-17 21:46
说清楚是要亮灭还是要亮度逐渐变化?要求不同设计起来也不同。
作者: xxpp2011    时间: 2020-7-17 23:06
如果只要有声音就亮不需要AD转换,要检测声音大小就要AD转换

1.png (91.59 KB, 下载次数: 91)

1.png

作者: 找人PK    时间: 2020-7-18 09:17
电路不是你这样子玩!你要对你声音分级,比如你声音的频率或其他项,这些应在前期处理好,单片机在内部对应你的数据作判断并输出结果
作者: great_splendid    时间: 2020-7-19 19:15
谢谢大家,我想做的只是要求有声音就亮的,没有声音就灭,比较简单。我用了下面这个电路,通过定时器T0检测P2^4口可以。P2.4口默认是高电平的,这样可以接受输入,我发现一说话,那排灯是可以亮灭的,但是有个疑问就是:我用万用表测了P2.4口的电压,说话和没说话有变化,但是看到数值都是高电平,从测量看没有变成低电平,有声音信号输入,但是灯光为什么可以变化,现在有疑惑。用的是这段程序:
#include "reg51.h"
typedef unsigned char u8;
typedef unsigned int u16;
#define led P1  //流水灯控制
sbit voice=P2^0; //声音输入  1101 1011
u8 code tab1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//上到下
u8 code tab2[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//下到上
u8 code tab3[]={0xe7,0xdb,0xbd,0x7e};//中间到两边
u8 code tab4[]={0x7e,0xbd,0xdb,0xe7};//两边到中间
u8 he[4]={0,0,0,0};

u8 num=0;
u8 counter=0;//定时计数
u8 counter1=0;//定时计数
bit flag=0;//切换闪烁
bit flag1=0;

void delay1m(u16 x)
{
  u16 i,j;
  for(i=0;i<x;i++)  //连数x次,约xms
      for(j=0;j<120;j++); //数120次,约1ms
}

void time0_time1_init()
{
  TMOD=0x11;
  TH1=(65535-50000)/256;
  TL1=(65535-50000)%256;
  TH0=(65535-50000)/256;
  TL0=(65535-50000)%256;
  TR0=0;
  ET0=1;
  TR1=1;
  ET1=1;
  EA=1;
}

void main()
{
  voice=1;          //输入的I/O口要先置1,高电平;
  time0_time1_init();
  delay1m(2000);
  while(1)
  {
     if(!flag1)
            {
                  if(!voice)
                  {
                    num++;flag1=1;
                        he[0]=he[1]=he[2]=he[3]=0;
                        if(num>=5){num=0;}
                        TR0=1;
                  }
               
                }
  }
}

void time1_interrupt()  interrupt 3
{
  TH1=(65535-50000)/256;
  TL1=(65535-50000)%256;
  counter++;
  if(counter>=6)
     {
           counter=0;
           switch(num)
             {
                   case 0:if(flag==0){led=0x00;flag=1;}else {led=0xff;flag=0;} break;//闪烁
                   case 1: led=tab1[he[0]];he[0]++; if(he[0]>=8) he[0]=0;break;//上到下
                   case 2: led=tab2[he[1]];he[1]++; if(he[1]>=8) he[1]=0;break;//下到上
                   case 3: led=tab3[he[2]];he[2]++; if(he[2]>=4) he[2]=0;break;//中间到两边
                   case 4: led=tab4[he[3]];he[3]++; if(he[3]>=4) he[3]=0;break;//两边到中间
                   default:break;
                 }
         }
}

void time0_interrupt() interrupt 1
{
  TH0=(65535-50000)/256;
  TL0=(65535-50000)%256;
  counter1++;
  if(counter1>=20)
    {
          counter1=0;
          flag1=0;
          TR0=0;
        }   
}
作者: TTQ001    时间: 2020-7-20 07:19
很久以前,声控灯非常流行,从原理上讲,您的要求与此相同。
作者: 草草111111    时间: 2020-7-20 08:54
用PWM输出
作者: lxbhcy    时间: 2020-7-28 17:16
要求灯的亮度的话就pwm输出,,
作者: chaos2005    时间: 2020-7-29 08:48
如5楼加个电压比较器LM393即可
作者: k9702    时间: 2020-8-1 15:44
great_splendid 发表于 2020-7-19 19:15
谢谢大家,我想做的只是要求有声音就亮的,没有声音就灭,比较简单。我用了下面这个电路,通过定时器T0检测 ...

说话和不说话量出来的电压数值分别是多少,要知道,不是0V才是低电平,5V才是高电平。举个例子,某款单片机的规格书标注高电平是3.3V~5V,那么3.3V以下的电压对于这款单片机来说就是低电平。
作者: univers    时间: 2020-8-1 16:00
要有一个整形电路才行,整形出来是方波。
作者: 湖南    时间: 2020-9-11 17:24
可以买那种声音识别模块,或者声音传感器,通过AD检测声音的模拟量转化为数字量,最后判断声音的大小
作者: lfc315    时间: 2020-9-11 18:32
D1 D2 C4 R4都可以不要,单片机IO口直接接到三极管C极就可以
作者: 暖西夏    时间: 2020-9-16 15:20
声控用AD,采集高低电平来控制
作者: gfshao    时间: 2020-9-17 11:50
电平整好了就行
作者: dj3365191    时间: 2020-9-17 12:28
不用AD,在你的图基础上后面加一个LM393电压比较器再把输出接到单片机的I/O口就行了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1