新闻中心

EEPW首页>嵌入式系统>设计应用> ISD4004语音程序

ISD4004语音程序

作者: 时间:2016-11-11 来源:网络 收藏
  1. ///////////ISD4004语音播放部分/////////////////////////////
  2. ////当按下P3.5键时,从指定地址开始录音
  3. /// 当按下P3.6键时,从指定地址开始放音
  4. /// 当按下P3.7键时,停止当前的操作
  5. /// 程序中的录放停部分已做成子函数,可以直接调用, 只需要输入录音的地址就行
  6. // 录音地址的设定与芯片型号有关系,以ISD4004-16为例,ISD40044-16录音时间为16
  7. // 分钟,即16*60=960S, 根据4004的资料,960秒可分为2400段,也就是1S的段数为
  8. // 25段,即从,0000-0019H的内容为1S,
  9. ///作者:长沙致望科技电子公司 WWW.CSMCU.COM
  10. ///版本:V1.0(2008.12.1)
  11. //实验使用注意,按录音键,要切换到放音时,可按停止再放音,也可以先按一下放音键,再按一次放音键,那可
  12. //原因:本程序在放音前,没有做停止和下电处理,感兴趣的朋友可以直接到停止部分加到放音子函数中。
  13. #include
  14. #include
  15. #defineucharunsignedchar
  16. #defineuintunsignedint
  17. ////////定义放音命令,定义常量//////
  18. #defineISDPOWERUP 0X20//ISD4004上电
  19. #defineISDSTOP 0X10//ISD4004下电
  20. #defineOPERSTOP 0X30//ISD4004停止当前操作
  21. #definePLAYSET 0XE0//ISD4004从指定地址开始放音
  22. #definePLAYCUR 0XF0//ISD4004从当前地址开始放音
  23. #defineRECSET 0XA0//ISD4004从指定地址开始录音
  24. #defineRECCUR 0XB0//ISD4004从当前地址开始录音
  25. sbit SS=P1^4;//LOW IS ACTIVELY
  26. sbit MOSI=P1^5;
  27. //sbit MISO=P1^7;
  28. sbit SCLK=P1^7;
  29. sbit K1=P3^5;
  30. sbit K2=P3^6;
  31. sbit K3=P3^7;
  32. sbitINT=P3^2;
  33. sbitLED1=P1^0;
  34. sbit LED2=P1^3;
  35. voiddelayms(uchar ms);
  36. uint addr;////全局变量//// 放音地址
  37. ////////////////放音部分子程序,放音地址由ADDR决定////
  38. voidplay()
  39. {
  40. uint y;
  41. SS=0;
  42. MOSI=0;//发送开始
  43. SCLK=0;
  44. for(y=0;y<8;y++)//上电
  45. {
  46. SCLK=0;
  47. if((0x20>>y)&0x01)MOSI=1;
  48. elseMOSI=0;
  49. _nop_();
  50. _nop_();
  51. _nop_();
  52. SCLK=1;
  53. _nop_();
  54. _nop_();
  55. _nop_();
  56. }//发送结束
  57. SS=1;//上电结束
  58. delayms(50);
  59. SS=0;
  60. MOSI=0;//发送地址
  61. SCLK=0;
  62. for(y=0;y<16;y++)
  63. {
  64. SCLK=0;
  65. if((addr>>y)&0x01)MOSI=1;
  66. elseMOSI=0;
  67. _nop_();
  68. _nop_();
  69. _nop_();
  70. SCLK=1;
  71. _nop_();
  72. _nop_();
  73. _nop_();
  74. }//发送地址结束
  75. MOSI=0;//放音
  76. SCLK=0;
  77. for(y=0;y<8;y++)
  78. {
  79. SCLK=0;
  80. if((0xe0>>y)&0x01)MOSI=1;
  81. elseMOSI=0;
  82. _nop_();
  83. _nop_();
  84. _nop_();
  85. SCLK=1;
  86. _nop_();
  87. _nop_();
  88. _nop_();
  89. }
  90. SS=1;
  91. SS=0;
  92. MOSI=0;//放音
  93. SCLK=0;
  94. for(y=0;y<8;y++)
  95. {
  96. SCLK=0;
  97. if((0xf0>>y)&0x01)MOSI=1;
  98. elseMOSI=0;
  99. _nop_();
  100. _nop_();
  101. _nop_();
  102. SCLK=1;
  103. _nop_();
  104. _nop_();
  105. _nop_();
  106. }
  107. SS=1;
  108. }
  109. //////////////////////////lu音部分子程序,地址由ADDR决定/////////////////////////
  110. voidrec()
  111. {uint y;
  112. SS=0;
  113. MOSI=0;//发送开始
  114. SCLK=0;
  115. for(y=0;y<8;y++)
  116. {
  117. SCLK=0;
  118. if((0x20>>y)&0x01)MOSI=1;
  119. elseMOSI=0;
  120. _nop_();
  121. _nop_();
  122. _nop_();
  123. SCLK=1;
  124. _nop_();
  125. _nop_();
  126. _nop_();
  127. }//发送结束
  128. SS=1;//上电结束
  129. delayms(50);
  130. SS=0;
  131. MOSI=0;//发送开始
  132. SCLK=0;
  133. for(y=0;y<8;y++)
  134. {
  135. SCLK=0;
  136. if((0x20>>y)&0x01)MOSI=1;
  137. elseMOSI=0;
  138. _nop_();
  139. _nop_();
  140. _nop_();
  141. SCLK=1;
  142. _nop_();
  143. _nop_();
  144. _nop_();
  145. }//发送结束
  146. SS=1;//上电结束
  147. delayms(50);
  148. delayms(50);
  149. SS=0;
  150. MOSI=0;//发送地址
  151. SCLK=0;
  152. for(y=0;y<16;y++)
  153. {
  154. SCLK=0;
  155. if((addr>>y)&0x01)MOSI=1;
  156. elseMOSI=0;
  157. _nop_();
  158. _nop_();
  159. _nop_();
  160. SCLK=1;
  161. _nop_();
  162. _nop_();
  163. _nop_();
  164. }//发送地址结束
  165. MOSI=0;
  166. SCLK=0;
  167. for(y=0;y<8;y++)
  168. {
  169. SCLK=0;
  170. if((0xa0>>y)&0x01)MOSI=1;
  171. elseMOSI=0;
  172. _nop_();
  173. _nop_();
  174. _nop_();
  175. SCLK=1;
  176. _nop_();
  177. _nop_();
  178. _nop_();
  179. }
  180. SS=1;
  181. SS=0;
  182. MOSI=0;
  183. SCLK=0;
  184. for(y=0;y<8;y++)
  185. {
  186. SCLK=0;
  187. if((0xb0>>y)&0x01)MOSI=1;
  188. elseMOSI=0;
  189. _nop_();
  190. _nop_();
  191. _nop_();
  192. SCLK=1;
  193. _nop_();
  194. _nop_();
  195. _nop_();
  196. }
  197. SS=1;
  198. }
  199. ////////////////////////////////////
  200. ////////////////////////////////
  201. voidstop()
  202. {
  203. uchar y;
  204. SS=1;
  205. SS=0;
  206. MOSI=0;//放音
  207. SCLK=0;
  208. for(y=0;y<8;y++)
  209. {
  210. SCLK=0;
  211. if((0x30>>y)&0x01)MOSI=1;
  212. elseMOSI=0;
  213. _nop_();
  214. _nop_();
  215. _nop_();
  216. SCLK=1;
  217. _nop_();
  218. _nop_();
  219. _nop_();
  220. }
  221. SS=1;
  222. }
  223. ////////////////////////////////////
  224. ////////////////////////////////////void press_key()
  225. voiddelayms(uchar ms)
  226. // 延时子程序
  227. {
  228. uchar j;
  229. while(ms--)
  230. {
  231. for(j=0;j<120;j++);
  232. }
  233. }
  234. ////////////////////////////////
  235. ////////////////////////////////////
  236. voidmain()
  237. {
  238. P1=0xff;
  239. P2=0XFF;
  240. P3=0XFF;
  241. while(1)
  242. {
  243. LED1=INT;
  244. LED2=0;
  245. if(K1==0)
  246. {
  247. delayms(10);
  248. while(K1==0);///松手判断
  249. LED2=1;
  250. addr=0X05;/////从0X05单元开始
  251. rec();
  252. P1=0XFF;
  253. while(K1==1);
  254. delayms(10);
  255. while(K1==0);///松手判断
  256. }
  257. if(K2==0)
  258. {
  259. delayms(10);
  260. while(K2==0);
  261. addr=0X05;
  262. play();
  263. P1=0XFF;
  264. }
  265. if(K3==0)
  266. {
  267. delayms(10);
  268. while(K3==0);
  269. LED1=1;
  270. LED2=1;
  271. stop();
  272. P1=0XFF;
  273. }
  274. }
  275. }


关键词:ISD4004语音程

评论


技术专区

关闭