效果图:

 

淘宝网址:http://item.taobao.com/item.htm?id=15953525846

程序:

 

 
  
  1. #include <reg52.h>  
  2. #include <intrins.h>  
  3. #define uchar unsigned char  
  4. #define uint  unsigned int  
  5. //录音和放音键IO口定义:  
  6. sbit   AN=P2^6;//放音键控制接口  
  7. sbit    set_key=P2^7;//录音键控制口  
  8. // ISD4004控制口定义:  
  9. sbit SS  =P1^0;     //4004片选  
  10. sbit MOSI=P1^1;     //4004数据输入  
  11. sbit MISO=P1^2;     //4004数据输出  
  12. sbit SCLK=P1^3;     //ISD4004时钟  
  13. sbit INT =P1^4;     //4004中断  
  14. sbit STOP=P3^4;     //4004复位  
  15. sbit LED1 =P1^6;    //录音指示灯  
  16. //===============================LCD1602接口定义=====================  
  17. /*-----------------------------------------------------  
  18.        |DB0-----P2.0 | DB4-----P2.4 | RW-------P0.1    |  
  19.        |DB1-----P2.1 | DB5-----P2.5 | RS-------P0.2    |  
  20.        |DB2-----P2.2 | DB6-----P2.6 | E--------P0.0    |  
  21.        |DB3-----P2.3 | DB7-----P2.7 | 注意,P0.0到P0.2需要接上拉电阻  
  22.     ---------------------------------------------------  
  23. =============================================================*/ 
  24. #define LCM_Data     P0    //LCD1602数据接口  
  25. sbit    LCM_RW     = P2^3;  //读写控制输入端,LCD1602的第五脚  
  26. sbit    LCM_RS     = P2^4;  //寄存器选择输入端,LCD1602的第四脚  
  27. sbit    LCM_E      = P2^2;  //使能信号输入端,LCD1602的第6脚  
  28. //***************函数声明************************************************  
  29. void    WriteDataLCM(uchar WDLCM);//LCD模块写数据  
  30. void    WriteCommandLCM(uchar WCLCM,BuysC); //LCD模块写指令  
  31. uchar   ReadStatusLCM(void);//读LCD模块的忙标  
  32. void    DisplayOneChar(uchar X,uchar Y,uchar ASCII);//在第X+1行的第Y+1位置显示一个字符  
  33. void    LCMInit(void);  
  34. void    DelayUs(uint us); //微妙延时程序  
  35. void    DelayMs(uint Ms);//毫秒延时程序  
  36. void    init_t0();//定时器0初始化函数  
  37. void    setkey_treat(void);//录音键处理程序  
  38. void    upkey_treat(void);//播放键处理程序  
  39. void    display();//显示处理程序  
  40. void    isd_setrec(uchar adl,uchar adh);//发送setrec指令  
  41. void    isd_rec();//发送rec指令  
  42. void    isd_stop();//stop指令(停止当前操作)  
  43. void    isd_powerup();//发送上电指令  
  44. void    isd_stopwrdn();//发送掉电指令  
  45. void    isd_send(uchar isdx);//spi串行发送子程序,8位数据  
  46. void    isd_setplay(uchar adl,uchar adh);  
  47. void    isd_play();  
  48. //程序中的一些常量定义  
  49. uint    time_total,st_add,end_add=0;  
  50. uint    adds[25];//25段语音的起始地址暂存  
  51. uint    adde[25];//25段语音的结束地址暂时  
  52. uchar   t0_crycle,count,count_flag,flag2,flag3,flag4;  
  53. uchar   second_count=170,msecond_count=0;  
  54. //second_count为芯片录音的起始地址,起始地址本来是A0,也就是160,  
  55. //我们从170开始录音吧。  
  56. #define Busy         0x80   //用于检测LCM状态字中的Busy标识  
  57.  
  58. /*===========================================================================  
  59.  主程序  
  60. ==============&#