基于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 字(可選)
?大家共同學習進步:
點贊分享一起學習成長。