声音信号是怎样写入单片机的

 我来答
骏驰飞车族
推荐于2016-10-13 · TA获得超过2710个赞
知道小有建树答主
回答量:685
采纳率:100%
帮助的人:298万
展开全部
声音信号经话筒采集后变换为随声音变化的电压信号。此信号经高速模数转换器后转换为数字信号。也就是一连串的0和1。这时,就可以将此一连串的数字信号下载到单片机中。要存储这些信息,需要将这些信息编写为码表。但是,这些信息会很大。音质的要求越高、长度越长。占用的空间就会越大。所以,在语音电路中都会有大容量的存储器出现。

回放的时候,需要单片机以采样相同的速率将这一连串的信号取出。然后送入高速数模转换器。这样就输出了预先存储的模拟信号。当然。此信号还不能直接推动扬声器。还需要经过带通滤波器滤除高频谐波。主要就是数模转换器转换时的高速开关干扰。然后经过音量控制或是直接接入低放进行功率放大。最后才能送至扬声器。
宿兴电子
2024-11-28 广告
联系我们一、有无震荡源 无源这里的“源”不是指电源,而是指震荡源。也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。 二、价格不同 有源蜂鸣器往比无源蜂鸣器贵,就是因为里面多个震荡... 点击进入详情页
本回答由宿兴电子提供
unlorzzop
2011-07-16 · TA获得超过713个赞
知道小有建树答主
回答量:514
采纳率:0%
帮助的人:384万
展开全部
LCD1602显示,如果转速达到5000R/MIN,蜂鸣器就会报警
#include <reg52.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
/*-----------------------端口命名------------------------*/
sbit lcdrs=P2^7; //LCD的数据/命令选择端
sbit lcdrw=P2^6; //LCD的读写选择端
sbit lcden=P2^5; //LCD的使能信号端
sbit warning=P3^1; //蜂鸣器端
/*-------------------------------------------------------*/
/*-----------------------定义参数------------------------*/
uint i,j,z,count,zhuan,msec; //定义参数
uchar num,ge,shi,bai,qian; //变量声明
uchar code table0[]=; //定义显示参数
uchar code table1[]=;
/*-------------------------------------------------------*/
/*-----------------------毫秒延时------------------------*/
void delay0(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=50;y>0;y--);
}

/*-------------------------------------------------------*/
/*--------------------向LCD1602写命令--------------------*/
void write_com(uchar com)//写命令子函数--写指令
{
lcdrs=0;lcden=0;lcdrw=0; //此时命令
P0=com;//命令写入P0口
delay0(5);
lcden=1;
delay0(5);//出现下降沿
lcden=0;
}

/*-------------------------------------------------------*/
/*--------------------向LCD1602写数据--------------------*/
void write_data(uchar date)//写命令子函数--写数据
{
lcdrs=1;lcden=0;lcdrw=0;
P0=date;//数据写入P0
delay0(5);
lcden=1;
delay0(5);//出现下降沿
lcden=0;
}

/*-------------------------------------------------------*/
/*-------------------外部中断0计数程序-------------------*/
void counter(void) interrupt 0
{
EX0=0; //关外部中断0
count++;
if(count==4) //4次循环为电机转一圈
{
count=0; //初始化计数
z++; //转圈计数加1
} //计数+1
EX0=1; //开外部中断0
return;
}

/*-------------------------------------------------------*/
/*-----------------内部中断0计时计数程序-----------------*/
void Timer_0(void) interrupt 1
{
TH0=0x3C; //50ms定时
TL0=0xB0;
msec++;
if(msec==20) //50*20=1S
{
msec=0;
zhuan=z*60;
z=0;
}
}
/*-------------------------------------------------------*/
/*----------------------端口初始化-----------------------*/
void int_all()
{
warning=0; //关蜂鸣器
z=0; //初始化z的值
count=0; //初始化count的值
zhuan=0; //初始化转的值
TMOD=0x01; //内部中断定时器选择
TH0=0x3C; //50ms定时
TL0=0xB0;
lcdrw=0; //选择LCD写数据指令
lcden=0; //使能信号开始为低
write_com(0x38); //16*2显示,5*7点阵,八位数据
delay0(15);
write_com(0x38);
delay0(15);
write_com(0x38);
write_com(0x08);//显示关、关光标,不闪烁
write_com(0x01);//清屏
delay0(15);
write_com(0x04);
delay0(15);
write_com(0x0c);
EA=1; //开中断总开关
ET0=1; //开内部中断0
TR0=1; //计时器开始工作
IT0=1; //外部中断0为下降沿触发
EX0=1; //开外部中断0
}

/*-------------------------------------------------------*/
/*------------------------LCD显示------------------------*/
void display ()
{
write_com(0x01); //清屏
write_com(0x06); //调用写命令函数,向右移动光标(增量)
write_com(0x80|0x03); //初始位置
for(num=0;table0[num] != '\0';num++) //第一行的字符
{
write_data(table0[num]);
delay0(1);
}
write_com(0x80|0x40); //换行
for(num=0;table1[num]!='\0';num++)
{
write_data(table1[num]);
delay0(1);
}
qian=(zhuan/1000+'0'); //转换转速的千位
bai=(zhuan/100%10+'0'); //转换转速的百位
shi=(zhuan/10%10+'0'); //转换转速的十位
ge=(zhuan%10+'0'); //转换转速的个位
write_com(0x80|0x46);
write_data(qian);
delay0(50);
write_com(0x80|0x47);
write_data(bai);
delay0(50);
write_com(0x80|0x48);
write_data(shi);
delay0(50);
write_com(0x80|0x49);
write_data(ge);
delay0(5000);
}

/*-------------------------------------------------------*/
/*-------------------转速过高警告程序--------------------*/
void warning_speed()
{
if(zhuan>2400||zhuan<800) //高于5000转打开警告
{
warning=1;
}
if(zhuan<=2400&&zhuan>800) //低于5000转关闭警告
{
warning=0;
}
}
/*-------------------------------------------------------*/
/*------------------------主函数-------------------------*/
void main()
{
int_all(); //全局初始化
while(1)
{
warning_speed(); //转速警告
display (); //LCD显示
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wwww小王
2011-07-15 · TA获得超过257个赞
知道小有建树答主
回答量:400
采纳率:100%
帮助的人:275万
展开全部
我觉得如果你要用声音信号的话,用那些什么AD,DA的,太麻烦,直接弄个isd系列的语音芯片,单片机控制,要录要放,轻松简单
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友7324d02
2011-07-15 · TA获得超过476个赞
知道答主
回答量:352
采纳率:0%
帮助的人:311万
展开全部
经过A/D转换后,根据采样学原理采足够多的样,就可以通过数字设备回放了。
例如高保真的声音取每秒44000个采样,每个采样16位,通常是双声道的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式