久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4116|回復: 1
收起左側

STC12C5A60S2驅動ISD1760語音模塊

[復制鏈接]
ID:79544 發表于 2016-8-6 11:38 | 顯示全部樓層 |閱讀模式
  1. /*************************************************
  2. 功 能:STC12C5A60S2驅動ISD1760語音模塊
  3. 單片機:STC12C5A60S2
  4. 晶 振:11.0592M
  5. 作 者:蘇義江根據1730改編
  6. 時 間:2016-8-4
  7. 說 明:單片機4個IO口接1760的SS,SCLK,MOSI,MOSO.
  8. 地址從0x0010開始安自己所錄得語音長度調節
  9. 通過按鍵或傳感器定點播放'你好歡迎光臨。你好請避讓。
  10. 這是你點的菜謝謝。歡迎再次光臨再見'
  11. ***************************************************/
  12. #include<stc12c5a60s2.h>
  13. #define uchar unsigned char
  14. #define uint unsigned int
  15. #define PU 0x01// 上電
  16. #define STOP 0x02//停止
  17. #define RESET 0x03//復位
  18. #define CLI_INT 0x04//清除EOM標志和中斷信號
  19. #define RD_STATUS 0x05//返回狀態寄存器內容
  20. //在1,2字節返回狀態寄存器信息,2,3字節返回放音指針
  21. #define RD_PLAY_PTR 0x06
  22. #define PD 0x07//芯片下電
  23. //在1,2字節返回狀態寄存器信息,2,3字節返回錄音指針
  24. #define RD_REC_PTR 0x08
  25. #define RD_DEVID 0x09//讀取芯片ID號碼
  26. #define PLAY 0x40 //從當前地址放音
  27. #define REC 0x41 //從當前地址錄音
  28. #define ERASE 0x42 //擦除當前語音段
  29. #define G_ERASE 0x43 //擦除芯片所有語音
  30. //返回狀態寄存器信息在1,2字節,APC寄存器信息在3字節
  31. #define RD_APC 0x44
  32. //將<D11:D0>寫入APC寄存器
  33. #define WR_APC1 0x45
  34. #define WR_NVCFG 0x46//將APC內容寫入NVCFG
  35. #define LD_NVCFG 0x47 //將NVCFG內容寫入APC
  36. #define FWD 0x48 //將放音指針指向下一段語音地址處
  37. #define CHK_MEM 0x49//檢查環狀存儲體系
  38. #define EXTCLK 0x4a //外部時鐘使能
  39. //將<D11:D0>寫入APC寄存器,并由<D2:D0>位控制音量
  40. #define WR_APC2 0x65
  41. #define SET_PLAY 0x80//從起始地址<S10:S0>放音到結束地址<E10:E0>結束
  42. #define SET_REC 0x81//從起始地址<S10:S0>錄音到結束地址<E10:E0>結束
  43. #define SET_ERASE 0x82//從起始地址<S10:S0>擦除到結束地址<E10:E0>結束
  44. #define HIGH 1
  45. #define LOW 0
  46. #define NOP _nop_()//定義除命令外剩余字節個數
  47. #define Surplus_One_BYTE 1 //定義字節個數為4
  48. #define Surplus_Two_BYTE 2 //定義字節個數為2
  49. #define Surplus_Three_BYTE 3 //定義字節個數為3

  50. #define ENISD1760_SS ISD1760_SS=0
  51. #define DISENISD1760_SS ISD1760_SS=1
  52. #define ISD1760_MISO_L ISD1760_MISO=0
  53. #define ISD1760_MISO_H ISD1760_MISO=1
  54. #define ISD1760_MOSI_L ISD1760_MOSI=0
  55. #define ISD1760_MOSI_H ISD1760_MOSI=1
  56. #define ISD1760_SCLK_L ISD1760_SCLK=0
  57. #define ISD1760_SCLK_H ISD1760_SCLK=1
  58. ////接收1730內部返回的數
  59. uchar SR0H; // bdata
  60. uchar SR0L; // bdata
  61. uchar SR1; // bdata
  62. uchar SR2;

  63. sbit ISD1760_SS = P1^3;
  64. sbit ISD1760_SCLK= P1^2;
  65. sbit ISD1760_MOSI= P1^1;
  66. sbit ISD1760_MISO= P1^0;
  67. sbit led =P3^7;
  68. sbit s1=P3^0;
  69. sbit s2=P3^1;
  70. sbit s3=P2^6;
  71. sbit s4=P2^7;


  72. volatile uchar ISD1760_Spio(volatile uchar dat) ;
  73. void ISD1760_Write_APC2(void) ;

  74. void ISD1760_delay(uint Count)
  75. {
  76. uint x,y;
  77. for(x=Count;x>0;x--)
  78. for(y=420;y>0;y--);
  79. }

  80. //功能:ISD1730 SPI驅動函數
  81. //輸入:dat:要傳送到ISD1730的數據
  82. //返回:receive:接收的數據
  83. static uchar ISD1760_Spio(uchar dat)
  84. {
  85. uchar i;
  86. // uchar recevice;
  87. ISD1760_SCLK_L; //SCLK==0
  88. ENISD1760_SS ;//為低選擇當前設備,并開啟SPI
  89. for (i=0; i<8; i++)
  90. //將dat字節的8個位數據一一送到MOSI線上
  91. {
  92. ISD1760_SCLK_L;
  93. //先將SCLK拉低
  94. // if(dat&0x01==0x01)
  95. if(dat&0x01)//先發低位
  96. {
  97. ISD1760_MOSI_H; //輸入到1760 上升沿輸入
  98. }
  99. else
  100. {
  101. ISD1760_MOSI_L;
  102. //MOSI和MISO信號同時改變數據,但有前后關系如:左程序
  103. }
  104. dat>>=1;
  105. // ISD1760_delay(1);
  106. // ISD1760_SCLK_H;
  107. // ISD1760_delay(1);
  108. // recevice>>=1;
  109. if(ISD1760_MISO == 1)
  110. {
  111. dat|=0x80;
  112. }
  113. ISD1760_SCLK_H;
  114. // ISD1760_SCLK_L;
  115. //SCLK來一個上升沿鎖存MOSI信號
  116. }
  117. ISD1760_MOSI_L;
  118. //非忙線時MOSI要拉低
  119. return(dat);
  120. }
  121. //功能:ISD1730上電操作
  122. static void ISD1760_PU(void)
  123. {
  124. DISENISD1760_SS;
  125. ISD1760_delay(1);
  126. ISD1760_SCLK_H;
  127. ISD1760_delay(1);
  128. ISD1760_MOSI_L;
  129. ISD1760_delay(1);
  130. ENISD1760_SS;
  131. ISD1760_delay(1);
  132. SR0L = ISD1760_Spio(PU); //發送命令字節
  133. SR0H = ISD1760_Spio(0x00); //發送數據字節1
  134. DISENISD1760_SS;
  135. ISD1760_delay(10);
  136. }
  137. //功能:寫入APC參數
  138. void ISD1760_Write_APC2(void)
  139. {
  140. DISENISD1760_SS;
  141. ISD1760_delay(1);
  142. ISD1760_SCLK_H;
  143. ISD1760_delay(1);
  144. ISD1760_MOSI_L;
  145. ISD1760_delay(1);
  146. ENISD1760_SS;
  147. ISD1760_delay(1);
  148. //SPI總線準備好
  149. SR0L = ISD1760_Spio(WR_APC2); //發送命令字節
  150. SR0H = ISD1760_Spio(0x40); //發送數據字節1
  151. // SR0H = ISD1760_Spio(0x70); //發送數據字節1
  152. SR1 = ISD1760_Spio(0x0C);

  153. DISENISD1760_SS; //一個命令完畢
  154. ISD1760_delay(10);
  155. }

  156. //功 能: 取出當前語音的首末地址
  157. void GetToneAdd(uchar NUM, uint *ipStartAdd, uint *ipEndAdd)
  158. {
  159. uint caToneAdd[]={

  160. 0x0010,0x0020, 0x0021, 0x0031,0x0032,0x0042,
  161. 0x0043,0x0058
  162. //0x0010,0x00ff//
  163. };
  164. *ipStartAdd=caToneAdd[NUM*2];
  165. *ipEndAdd=caToneAdd[NUM*2+1];
  166. }
  167. //定點地址播放
  168. void ISD1760_Set_Play(uchar VOICE_NUM)
  169. {
  170. uint Add_ST, Add_ED; //ST起始地址,ED結束地址
  171. uchar Add_ST_H, Add_ST_L, Add_ED_H, Add_ED_L;
  172. //起始地址高8位,起始地址低8位,結束地址高8位,結束地址低8位
  173. GetToneAdd( VOICE_NUM, &Add_ST, &Add_ED);
  174. Add_ST_L=(uchar)(Add_ST&0x00ff);
  175. Add_ST_H=(uchar)((Add_ST>>8)&0x00ff);
  176. Add_ED_L=(uchar)(Add_ED&0x00ff);
  177. Add_ED_H=(uchar)((Add_ED>>8)&0x00ff);
  178. DISENISD1760_SS;
  179. ISD1760_delay(1);
  180. ISD1760_SCLK_H;
  181. ISD1760_delay(1);
  182. ISD1760_MOSI_L;
  183. ISD1760_delay(1);
  184. ENISD1760_SS;
  185. ISD1760_delay(1);
  186. //發送命令
  187. SR0L = ISD1760_Spio(SET_PLAY);
  188. //發送命令字節
  189. SR0H = ISD1760_Spio(0x00);
  190. //發送數據字節1
  191. SR1 = ISD1760_Spio(Add_ST_L);
  192. //發送數據字節2,放音起始地址低8位<S7:S0>
  193. SR2 = ISD1760_Spio(Add_ST_H);
  194. //發送數據字節3,放音起邕地址高3位<S10:S8>,ISD1730不用
  195. SR0H = ISD1760_Spio(Add_ED_L);
  196. //發送數據字節4,放音結束地址低8位<E7:E0>
  197. SR0H = ISD1760_Spio(Add_ED_H);
  198. //發送數據字節5,放音結束地址低8位<E10:E8>,ISD1730不用
  199. SR0H = ISD1760_Spio(0x00);
  200. //發送數據字節6 DISENISD1730_SS; //
  201. ISD1760_delay(10);
  202. }
  203. //功能:ISD1730下電命令
  204. void ISD1760_PD(void)
  205. {
  206. DISENISD1760_SS;
  207. ISD1760_delay(1);
  208. ISD1760_SCLK_H;
  209. ISD1760_delay(1);
  210. ISD1760_MOSI_L;
  211. ISD1760_delay(1);
  212. ENISD1760_SS;
  213. ISD1760_delay(1);
  214. SR0L = ISD1760_Spio(PD);
  215. //發送命令字節
  216. SR0H = ISD1760_Spio(0x00);
  217. //發送數據字節1
  218. DISENISD1760_SS;
  219. ISD1760_delay(10);
  220. }
  221. //功能:播放指定的語音信息
  222. //輸入:voice_num,語音索引編號(第幾段:0 第一段,1第二段。。。)
  223. void ISD1760_PLAY(uchar voice_name)
  224. {
  225. ISD1760_PU(); // delay10ms(5);
  226. ISD1760_delay(5);
  227. ISD1760_Set_Play(voice_name); // delay10ms(350);
  228. ISD1760_delay(50);
  229. ISD1760_PD(); // delay10ms(15);
  230. ISD1760_delay(5);
  231. }
  232. //功能: 停止
  233. void ISD_Stop(void)
  234. {
  235. ENISD1760_SS;
  236. ISD1760_Spio(STOP); //停止當前操作
  237. ISD1760_Spio(0x00);
  238. DISENISD1760_SS;
  239. ISD1760_delay(50);
  240. }
  241. //功能: 掉電
  242. void ISD_PD(void)
  243. {
  244. ENISD1760_SS;
  245. ISD1760_Spio(PD); //Power down 掉電
  246. ISD1760_Spio(0x00);
  247. DISENISD1760_SS;
  248. ISD1760_delay(50);
  249. }
  250. void keyscan()
  251. {
  252. if(s1==0)
  253. {
  254. ISD1760_delay(10);
  255. if(s1==0)
  256. {
  257. ISD1760_PLAY(0) ; //歡迎光臨

  258. ISD_PD();
  259. ISD_Stop();
  260. led =~led;ISD1760_delay(3000);
  261. }
  262. }
  263. if(s2==0)
  264. {
  265. ISD1760_delay(10);
  266. if(s2==0)
  267. {
  268. ISD1760_PLAY(1) ;//你好請避讓

  269. ISD_PD();
  270. ISD_Stop();
  271. led =~led;ISD1760_delay(3000);
  272. }
  273. }
  274. if(s3==0)
  275. {
  276. ISD1760_delay(10);
  277. if(s3==0)
  278. {
  279. ISD1760_PLAY(2) ; //你好這是你點的菜謝謝

  280. ISD_PD();
  281. ISD_Stop();
  282. led =~led;ISD1760_delay(3000);
  283. }
  284. }
  285. if(s4==0)
  286. {
  287. ISD1760_delay(10);
  288. if(s4==0)
  289. {
  290. ISD1760_PLAY(3) ; //歡迎再次光臨再見

  291. ISD_PD();
  292. ISD_Stop();
  293. led =~led;ISD1760_delay(3000);
  294. }
  295. }
  296. }
  297. void main(void)
  298. {
  299. // ISD1760_Write_APC2(); //設置芯片模擬輸入方式:模擬寄存器APC2
  300. while(1)
  301. {
  302. ISD1760_Write_APC2();
  303. keyscan();
  304. }
  305. }
復制代碼

用STC12C5A60S2單片機驅動ISD1760語音模塊實現分段播放所錄得語音。首先自己先把要播放的語音錄下在用單片機驅動模塊進行定點播放。
回復

使用道具 舉報

ID:225059 發表于 2017-9-21 22:50 | 顯示全部樓層
錄下以后如何存儲?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美成人精品欧美一级 | 日韩在线日韩 | 欧美黑人巨大videos精品 | 亚洲国产精品久久久久 | 久久久久国产一区二区三区 | 国产91一区 | 最新黄色在线观看 | 精品久久久久久亚洲综合网 | 一级片免费视频 | 91网站在线看 | 日韩一区二区在线免费观看 | 天天操人人干 | 久草99 | 亚洲 欧美 另类 综合 偷拍 | 亚洲网站在线观看 | 日韩在线观看 | 亚洲国产aⅴ成人精品无吗 欧美激情欧美激情在线五月 | 成人亚洲视频 | 一区影视| 伊人免费视频二 | 国产精品一区久久久 | 亚洲综合天堂网 | 日韩精品免费一区二区在线观看 | 日韩在线电影 | 国产精品一级 | 日韩欧美在线视频一区 | 国产一区二区三区在线免费 | 操视频网站 | 国产一区二区视频在线 | 亚洲精品短视频 | a免费视频| 中文字幕精品一区二区三区精品 | 日韩精品一区二区三区 | 精品国产欧美 | 欧美视频1区 | 欧美成人在线网站 | 欧美一级二级视频 | 亚洲精品美女视频 | 日本精品视频一区二区 | 美女久久 | 天色综合网 |