制作出來實物圖如下:
IMG_5210.JPG (1.82 MB, 下載次數(shù): 83)
下載附件
實物
2018-6-16 11:16 上傳
IMG_5209.JPG (1.82 MB, 下載次數(shù): 85)
下載附件
實物
2018-6-16 11:16 上傳
IMG_5211.JPG (2.54 MB, 下載次數(shù): 86)
下載附件
實物
2018-6-16 11:17 上傳
IMG_5208.JPG (1.78 MB, 下載次數(shù): 66)
下載附件
實物
2018-6-16 11:17 上傳
IMG_5207.JPG (2.15 MB, 下載次數(shù): 107)
下載附件
實物
2018-6-16 11:16 上傳
單片機源程序如下:
- // 以ISD4004-8錄音時間為8分鐘,即8*60=480S根據(jù)4004的資料,480秒可分為2400段,也就是1S的段數(shù)為
- // 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; //放音和錄音次數(shù)。
- ////////////////放音部分子程序,放音地址由ADDR決定////
- void play(uint addr)
- { uint y;
- SS=0;
- MOSI=0;//發(fā)送開始
- 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_();
- }//發(fā)送結束
- SS=1;//上電結束
- delayms(50);
- SS=0;
- MOSI=0;//發(fā)送地址
- 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_();
- }//發(fā)送地址結束
- 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;//發(fā)送開始
- 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_();
- }//發(fā)送結束
- SS=1;//上電結束
- delayms(50);
- SS=0;
- MOSI=0;//發(fā)送開始
- 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_();
- }//發(fā)送結束
- SS=1;//上電結束
- delayms(50);
- delayms(50);
- SS=0;
- MOSI=0;//發(fā)送地址
- 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_();
- }//發(fā)送地址結束
- 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() ///錄放音子函數(shù)
- {
- 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); //注意:字節(jié)編程時必須要先要擦除整個扇區(qū)
- ISP_PROGRAM(0x2c00, num_rec); //寫入eeprom 掉電保存
- ISP_PROGRAM(0x2c01, reccout);
- play_count=num_rec; //保存播放的段數(shù)
- 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 ");
- }
- }
- }
- ////////////////////////////////////////////////
- /////////以下部分為主程序///////////////////
- void main()
- {
- num_rec = ISP_READ(0x2c00); //保存數(shù)值回讀
- reccout = ISP_READ(0x2c01);
- play_count=num_rec; //保存條數(shù)
- init1602(); //液晶初始化
- LCD_write_str(0,1,"N:");
- stop();
- while(1)
- {
- keyscan(); //按鍵掃描
- playsound(); //錄播放
- Write_num(0xC2,num_rec); //顯示條數(shù)
-
- }
- }
-
復制代碼
所有資料51hei提供下載:
基于單片機錄音筆設計.rar
(10.23 MB, 下載次數(shù): 257)
2018-6-16 11:21 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|