当前位置: 首页 > news >正文

基于51单片机语音实时采集系统

基于51单片机语音实时采集

(程序+原理图+PCB+设计报告)

功能介绍

具体功能:

系统由STC89C52单片机+ISD4004录音芯片+LM386功放模块+小喇叭+LCD1602+按键+指示灯+电源构成

1.可通过按键随时选择相应的录音进行播放;

2.可以通过按键随时录音,可以录制4段声音,并可以按键控制播放和暂停,最长可以录制8分钟;

3.播放的音量可以通过调节电位器改变;

添加图片注释,不超过 140 字(可选)

硬件设计

使用元器件:

单片机:STC89C52;

(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)

15*9万用板;LCD1602液晶;

16P排针;16P排母;

10k电阻;5MM LED灯;

10欧姆电阻;1k电阻;

40脚IC座;28脚IC座;

ISD4004语音芯片;

LM386;8脚IC座;

2P母座;3.3V芯片;

咪头;喇叭;红黑并线;

103电位器;1uf电容*2;

220uf*4;2.2uf电容*1;

10uf电容*2;22pf电容*2;

小按键*4;自锁开关;

DC电源接口;12M晶振;

2k电阻*1;晶振:8M;

添加图片注释,不超过 140 字(可选)

流程图:

添加图片注释,不超过 140 字(可选)

程序

// 以ISD4004-8录音时间为8分钟,即8*60=480S根据4004的资料,480秒可分为2400段,也就是1S的段数为
//  5段,即从,0000-0005H的内容为1秒。0X0000-0X012C ;0X012D-0X0258;0X259-0X0384;0X0385-0X04B0.
#include <reg52.h>
#include <intrins.h>
#include"1602.c"
#include"eeprom.h"
#define uchar unsigned  char
#define uint  unsigned  int
bit playbit,recbit;	//定义两个位变量,放音和录音位
/***微信公众号:木子单片机********/
定义放音命令,定义常量//
#define ISDPOWERUP      0X20           //ISD4004上电
#define ISDSTOP         0X10           //ISD4004下电
#define OPERSTOP        0X30           //ISD4004停止当前操作
#define PLAYSET         0XE0           //ISD4004从指定地址开始放音
#define PLAYCUR         0XF0           //ISD4004从当前地址开始放音
#define RECSET          0XA0      	   //ISD4004从指定地址开始录音
#define RECCUR          0XB0		   //ISD4004从当前地址开始录音

sbit   SCLK=P3^7; 
sbit   SS=P3^6;            //LOW IS ACTIVELY
sbit   MOSI=P3^5;
//sbit   MISO=P3^4;

sbit   K1=P1^2;
sbit   K2=P1^3;
sbit   K3=P1^4;		  //按键输入

sbit   LED1=P1^0;
sbit   LED2=P1^1;	  //指示灯

uchar aa,bb,cc,dd,ee;
uchar num_rec=0;
void  delayms(uchar ms);
uchar playcout,reccout;	 //放音和录音次数。		
放音部分子程序,放音地址由ADDR决定
void play(uint addr)
 { 	uint y;
	SS=0;
	MOSI=0;//发送开始
	SCLK=0;
	for(y=0;y<8;y++)
	{
		SCLK=0;
		if((0x20>>y)&0x01)MOSI=1;
		else MOSI=0;
		_nop_();
		_nop_();
		_nop_();
		SCLK=1;
		_nop_();
		_nop_();
		_nop_();
	}//发送结束
	SS=1;//上电结束
	delayms(50);
	SS=0;
	MOSI=0;//发送地址
	SCLK=0;
	for(y=0;y<16;y++)
	{
		SCLK=0;
		if((addr>>y)&0x01)MOSI=1;
		else MOSI=0;
		_nop_();
		_nop_();
		_nop_();
		 SCLK=1;
		_nop_();
		_nop_();
		_nop_();
	}//发送地址结束
	MOSI=0;//放音
	SCLK=0;
	for(y=0;y<8;y++)
	{
		SCLK=0;
		if((0xe0>>y)&0x01)MOSI=1;
		else MOSI=0;
		_nop_();
		_nop_();
		_nop_();
		SCLK=1;
		_nop_();
		_nop_();
		_nop_();
	}
	SS=1;
	SS=0;
	MOSI=0;//放音
	SCLK=0;
	for(y=0;y<8;y++)
	{
		SCLK=0;
		if((0xf0>>y)&0x01)MOSI=1;
		else MOSI=0;
		_nop_();
		_nop_();
		_nop_();
		SCLK=1;
		_nop_();
		_nop_();
		_nop_();
	}
	SS=1;	  }	
//lu音部分子程序,地址由ADDR决定/
/***全部文件关注********/
/***微信公众号:木子单片机********/
void rec(addr)                
{ 	uint y;	
	SS=0;
	MOSI=0;//发送开始
	SCLK=0;
	for(y=0;y<8;y++)
	{
		SCLK=0;
		if((0x20>>y)&0x01)MOSI=1;
		else MOSI=0;
		_nop_();
		_nop_();
		_nop_();
		SCLK=1;
		_nop_();
		_nop_();
		_nop_();
	}//发送结束
	SS=1;//上电结束
	delayms(50);
	SS=0;
	MOSI=0;//发送开始
	SCLK=0;
	for(y=0;y<8;y++)
	{
		SCLK=0;
		if((0x20>>y)&0x01)MOSI=1;
		else MOSI=0;
		_nop_();
		_nop_();
		_nop_();
		SCLK=1;
		_nop_();
		_nop_();
		_nop_();
	}//发送结束
	SS=1;//上电结束
	delayms(50);
	delayms(50);
	SS=0;
	MOSI=0;//发送地址
	SCLK=0;
	for(y=0;y<16;y++)
	{
		SCLK=0;
		if((addr>>y)&0x01)MOSI=1;
		else MOSI=0;
		_nop_();
		_nop_();
		_nop_();
		SCLK=1;
		_nop_();
		_nop_();
		_nop_();
	}//发送地址结束
	MOSI=0;
	SCLK=0;
	for(y=0;y<8;y++)
	{
		SCLK=0;
		if((0xa0>>y)&0x01)MOSI=1;
		else MOSI=0;
		_nop_();
		_nop_();
		_nop_();
		SCLK=1;
		_nop_();
		_nop_();
		_nop_();
	}
	SS=1;
	SS=0;
	MOSI=0;
	SCLK=0;
	for(y=0;y<8;y++)
	{
		SCLK=0;
		if((0xb0>>y)&0x01)MOSI=1;
		else MOSI=0;
		_nop_();
		_nop_();
		_nop_();
		SCLK=1;
		_nop_();
		_nop_();
		_nop_();
	}
	SS=1;	  }



void stop()
{ 
    uchar y;
	SS=1;
	SS=0;
	MOSI=0;//放音
	SCLK=0;
	for(y=0;y<8;y++)
	{
		SCLK=0;
		if((0x30>>y)&0x01)MOSI=1;
		else MOSI=0;
		_nop_();
		_nop_();
		_nop_();
		SCLK=1;
		_nop_();
		_nop_();
		_nop_();
	}
	SS=1;
}


 void delayms(uchar ms)	
// 延时子程序
{						
	uchar j;
	while(ms--)
	{
		for(j = 0; j < 120; j++);
	}
}

void playsound()	///录放音子函数
{
  if(playbit)
  {
     playbit=0;
     switch(playcout)
    {			 ///====每段60S=====
	 case 0x01:{play(0x0000);LCD_write_str(0,0,"NUM:1 Playing  ");}break;	//此处第一段音乐的开始地址为0X00,到0X012d地址结束,约为60秒。
     case 0x02:{play(0x012d);LCD_write_str(0,0,"NUM:2 Playing  ");}break;
     case 0x03:{play(0x0259);LCD_write_str(0,0,"NUM:3 Playing  ");}break;
     case 0x04:{play(0x0385);LCD_write_str(0,0,"NUM:4 Playing  ");}break; 
    }
   }
  if(recbit)
   {
    recbit=0;
    switch(reccout)
	{    
	     case 0x01:{rec(0x0000); LCD_write_str(0,0,"NUM:1 Recording");aa=1;}break;
	     case 0x02:{rec(0x012d);LCD_write_str(0,0,"NUM:2 Recording");aa=1;}break;
	     case 0x03:{rec(0x0259);LCD_write_str(0,0,"NUM:3 Recording");aa=1;}break;
	     case 0x04:{rec(0x0385);LCD_write_str(0,0,"NUM:4 Recording");aa=1;}break; 
     }
    }
}
bit key_bit1=0,key_bit2=0;
uchar num11;
uchar  play_count=4,rec_count=4;

void keyscan()  //直控键盘扫描子程序。
{

		   if(K1==0)
	      { 
		    while(K1==0);
			key_bit1=1;
		    recbit=1;
		    reccout++;
		 	LED2=0;LED1=1;
		    if(reccout>rec_count)	  //
		    reccout=1;
		  }
		  if(K2==0&&key_bit2==0)
		    {
			   while(K2==0);
			   key_bit1=1;
			   playbit=1;
		       playcout++;
			   LED1=0;LED2=1;
			   if(playcout>play_count)
			   playcout=1;	
		//	   reccout=num_rec;		   
		   }			      
		 if(K3==0&&key_bit1==1)
		    { 
			  while(K3==0);
			  stop();
			  LED2=1;
			  LED1=1;
			  if(aa==1){
			  num_rec++;
			  aa=0;	
			  if(num_rec>4){
				 num_rec=1;
				key_bit1=0;
			  }
			  }
			  ISP_ERASE(0x2c00);		//注意:字节编程时必须要先要擦除整个扇区	
			  ISP_PROGRAM(0x2c00, num_rec);	//写入eeprom 掉电保存
			  ISP_PROGRAM(0x2c01, reccout);
			  play_count=num_rec;		//保存播放的段数
		      reccout=num_rec;		//从第几段录起
			  LCD_write_str(0,0,"                ");
			  key_bit1=0;
         	 }
 
		 if(K3==0&&key_bit1==0)					//选择播放哪段
		    { 
			   while(K3==0&&key_bit1==0);
				key_bit2=1;
			    num11++;			
			   if(num11>play_count)
			   {
				   num11=0;
				   bb=0;cc=0;dd=0;
				   key_bit2=0;
				   LCD_write_str(0,0,"                ");
			   }
				switch(num11)
		          {    
				     case 1:{LCD_write_str(0,0,"NUM:1 Rec    ");bb=1;cc=0;dd=0;ee=0;}break;
				     case 2:{LCD_write_str(0,0,"NUM:2 Rec    ");bb=0;cc=1;dd=0;ee=0;}break;
				     case 3:{LCD_write_str(0,0,"NUM:3 Rec    ");cc=0;bb=0;dd=1;ee=0;}break;
				     case 4:{LCD_write_str(0,0,"NUM:4 Rec    ");cc=0;bb=0;dd=0;ee=1;}break; 
	              }		
			}
			if(bb==1){

				  if(K2==0&&key_bit2==1)
		          {
				    while(K2==0); 	
					key_bit1=1;
					play(0x0000);
					LCD_write_str(0,0,"NUM:1 Playing  ");
				
				  }
			 }
			 if(cc==1){

				  if(K2==0&&key_bit2==1)
		          {
				    while(K2==0); 
					key_bit1=1;
					play(0x012d);
					LCD_write_str(0,0,"NUM:2 Playing  ");
				  }
			 }
			 if(dd==1){

				  if(K2==0&&key_bit2==1)
		          {
				    while(K2==0); 
					key_bit1=1;
					play(0x0259);
					LCD_write_str(0,0,"NUM:3 Playing  ");

				  }
			 }
		     if(ee==1){

				  if(K2==0&&key_bit2==1)
		          {
				    while(K2==0); 
					key_bit1=1;
					play(0x0385);
					LCD_write_str(0,0,"NUM:4 Playing  ");
				  }
			 }

 } 

设计资料

01原理图

本系统原理图采用Altium Designer19设计,具体如图!

添加图片注释,不超过 140 字(可选)

02PCB

本系统pcb采用Altium Designer19设计,具体如图!

添加图片注释,不超过 140 字(可选)

03程序

本设计使用软件Keil5版本编程设计!具体如图!

添加图片注释,不超过 140 字(可选)

04设计报告

一万三千字设计报告,具体如下!

添加图片注释,不超过 140 字(可选)

05设计资料

全部资料包括程序(含注释)、AD原理图、PCB、设计报告、流程图、实物图、元件清单等。具体内容如下,全网最全! !

添加图片注释,不超过 140 字(可选)

​大家共同学习进步:

点赞分享一起学习成长。

相关文章:

  • 仙剑奇侠传98柔情版游戏秘籍
  • 工业级安卓一体机在智能自助终端中的应用
  • Spark运行架构 RDD相关概念Spark-Core编程
  • 基于李永乐线性代数基础的行列式的起源于理解
  • Hqst的超薄千兆变压器HM82409S在Unitree宇树Go2智能机器狗的应用
  • 初步认识java
  • 关于香橙派OrangePi 5 Ultra 这个开源板子,开发Android
  • 通信算法之261: 时频分析- findpeaks 函数查找满足宽度要求的峰值
  • PyQt6基础_pyqtgraph_k线图缩放
  • 41、web前端开发之Vue3保姆教程(五 项目实战)
  • 足球比分分析页面可视化展示
  • ImportError: The ‘read_file‘ function requires the ‘pyogrio‘ or ‘fiona‘ package
  • 【深度学习与实战】3.1 逻辑回归模型
  • 网络相关基本概念
  • Rasa总体目录架构介绍
  • Python中如何用正则表达式精准匹配IP地址?
  • 常用环境部署(二十六)——Centos搭建MQTT服务端EMQX
  • 35.Java线程池(线程池概述、线程池的架构、线程池的种类与创建、线程池的底层原理、线程池的工作流程、线程池的拒绝策略、自定义线程池)
  • OpenStack Yoga版安装笔记(十九)启动一个实例(Self-service networks)
  • mysql 重复读自己事务中可以看到新插入数据
  • 蛋糕网站模板/随州网络推广
  • 广州网络引流公司/电商seo优化
  • 专业app网站建设/公司网站如何推广
  • 山西太原做网站/51链
  • 软件开发的阶段/济南seo顾问
  • 如何用api方式做网站/加强服务保障满足群众急需m