📄 1420.lst
字号:
C51 COMPILER V8.15 1420 02/21/2009 15:17:33 PAGE 1
C51 COMPILER V8.15, COMPILATION OF MODULE 1420
OBJECT MODULE PLACED IN 1420.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 1420.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /**********************************************************
2 功能: 使用STC2052单片机控制 ISD1420语音芯片的播放
3 1、顺序连续分段放音
4 2、选段播放(播放任意段)
5 3、所有的播放控制都是通过接收串口的命令来执行
6
7 编写: benladn911 AVR猎手
8
9 日期: 2006-6-28创建
10 2008-2-21添加注释和完善
11 **********************************************************/
12
13 #include<STC12C2052.H>
14 #include<intrins.h>
15 #include<stdio.h>
16 #include<string.h>
17
18 //硬件端口的定义
19 #define POW P3_7 //此引脚为单片机控制一个三极管给 ISD1420供电
20
21 #define PL P3_5 //接 ISD1420 的 PLAYL
22 #define PE P3_4 //接 ISD1420 的 PLAYE
23 #define REC P3_3 //接 ISD1420 的 REC
24
25 #define REC_LED P3_2 //ISD1420 的 REC LED
26
27 //操作模式的定义
28 #define mode1 0xC8 //循环放音操作,按一下 PE 键可循环放音,按 PL 键停止;或按 PL 键放音,松开即停止
29
30 #define mode2 0xD0 //按顺序连续分段录放音,每段语音长度不限
31 #define mode3 0xC0 //地址指针复位,开始录放第一段
32 #define mode4 0xD1 //按 PE 键可快速选段放音
33
34 //0xC1 //也为地址指针复位
35
36 unsigned char RX_index=0; //
37 bit FLAG_rev = 0; //
38 unsigned char PC_COMMAND;
39 unsigned char RX_BUFFER[10];//串行接收缓存
40
41 void io_init(void);
42 void init_serialcomm(void);
43 void serial_out(unsigned char d);
44 void delay5ms(void);
45 void delay(unsigned int x);
46 void nop(unsigned char i);
47
48 void paly(unsigned char i);//选择播放当前段操作
49
50
51 void main(void)
52 {
53 1 io_init();
54 1 init_serialcomm();
55 1 delay(1000);
C51 COMPILER V8.15 1420 02/21/2009 15:17:33 PAGE 2
56 1
57 1
58 1 serial_out(0xaa); //发送到PC机,看看PC端是否收到正确数据
59 1 serial_out(0x55);
60 1 serial_out(0x33);
61 1
62 1
63 1 POW = 0;//开启电源
64 1
65 1 //P1 = mode4;
66 1 //P1 = 0X00;
67 1 while(1)
68 1 {
69 2
70 2 }
71 1
72 1 }
73
74 //----- 端口初始化
75 void io_init(void)
76 {
77 1 P1M0 = 0x00; //设置STC的 IO 为标准51 IO模式
78 1 P1M1 = 0x00;
79 1 P3M0 = 0x00;
80 1 P3M1 = 0x00;
81 1 P1 = 0XFF;
82 1 P3 = 0XFF;
83 1 }
84
85 //串行口初始化
86 void init_serialcomm(void)
87 {
88 1 SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
89 1
90 1 TMOD = 0x20; //TMOD: timer 1, mode 2, 8-bit reload
91 1
92 1 TH1 = 0xf3;//12MHz, 2400 bps
93 1 TL1 = 0xf3;
94 1 //IE |= 0x90; //Enable Serial Interrupt
95 1
96 1 TR1 = 1; // timer 1 run
97 1
98 1 ES=1;
99 1 EA=1;
100 1 }
101
102 //串行数据发送,查询模式
103 void serial_out(unsigned char d)
104 {
105 1 ES=0;
106 1 SBUF=d;while(TI==0){;}TI=0;
107 1 ES=1;
108 1 }
109
110 //串行中断接收
111 void receive() interrupt 4
112 {
113 1 if(RI)
114 1 {
115 2 RI = 0;
116 2 ES = 0;
117 2 PC_COMMAND = SBUF;
C51 COMPILER V8.15 1420 02/21/2009 15:17:33 PAGE 3
118 2
119 2
120 2 //RX_BUFFER[RX_index] = PC_COMMAND; //保存数据到数组里面
121 2 //RX_index++;
122 2 switch(PC_COMMAND)
123 2 {
124 3
125 3
126 3 case 0xa0:
127 3
128 3 serial_out(0xa0);
129 3 P1 = mode2; //按顺序连续分段录放音,每段语音长度不限 0xD0 连续寻址,A4
130 3
131 3 PE = 0;
132 3 nop(10);
133 3 PE = 1;
134 3
135 3 P1 = 0XFF;
136 3
137 3 break;
138 3
139 3 case 0xb0:
140 3 serial_out(0xb0);
141 3 P1 = mode3; //地址指针复位 0xC0
142 3
143 3 nop(10);
144 3 P1 = 0XFF;
145 3
146 3 break;
147 3
148 3 case 0xc0: //选段播放控制
149 3 serial_out(0xc0);
150 3
151 3
152 3 P1 = 0xD1; //第二步:快速选段放音
153 3
154 3
155 3 P1_0 = 0;
156 3 nop(10);
157 3 P1_0 = 1;
158 3 nop(10);
159 3
160 3
161 3 PE = 0;
162 3 nop(10);
163 3 PE = 1;
164 3
165 3
166 3 break;
167 3
168 3 case 0xd0:
169 3 serial_out(0xd0);
170 3 paly(3);
171 3 paly(1);
172 3 paly(5);
173 3 paly(5);
174 3 paly(6);
175 3 paly(4);
176 3 paly(3);
177 3 paly(6);
178 3 paly(1);
179 3
C51 COMPILER V8.15 1420 02/21/2009 15:17:33 PAGE 4
180 3
181 3
182 3 break;
183 3
184 3 case 0x30:
185 3 serial_out(0x30);
186 3 //此操作循环放音操作,按一下 PE 键可循环放音,按 PL 键停止;或按 PL 键放音,松开即停止
187 3 //此操作没什么用
188 3 P1 = mode1;
189 3
190 3 PE = 0;
191 3 nop(10);
192 3 PE = 1;
193 3 //
194 3 break;
195 3
196 3 default: break;
197 3 }
198 2
199 2 ES = 1;
200 2 }
201 1 }
202
203 /*************************************************************
204 选段播放,i 的值就是要播放的当前段
205 i的取值:1 ~ ...
206 **************************************************************/
207 void paly(unsigned char i)
208 {
209 1 i--;
210 1
211 1 P1 = mode3; //第一步:地址指针复位 0xC0 A7--A0: 1100 0000 (A2、A5在应用中可直接接地)
-
212 1 nop(10);
213 1 //P1 = 0XFF;
214 1
215 1 delay(30);//必要的延时
216 1
217 1 if(i>0)
218 1 {
219 2 P1 = 0xD1; //第二步:快速选段放音 0xD1 A7--A0: 1101 0001 (A2、A5在应用中可直接接地)
220 2 do
221 2 {
222 3 P1_0 = 0; //给 A0 低电平脉冲
223 3 nop(10);
224 3 P1_0 = 1;
225 3 nop(10);
226 3
227 3 PE = 0;
228 3 nop(10);
229 3 PE = 1;
230 3
231 3 delay(50);//这个延时是非常必要的!
232 3 i--;
233 3 }
234 2 while(i!=0);
235 2
236 2 delay(30);//必要的延时
237 2 }
238 1
239 1
240 1 P1 = mode2; //第三步:播放当前段 0xD0 A7--A0: 1101 0000 (A2、A5在应用中可直接接地)
C51 COMPILER V8.15 1420 02/21/2009 15:17:33 PAGE 5
241 1
242 1 PE = 0;
243 1 nop(10);
244 1 PE = 1;
245 1 //P1 = 0XFF;
246 1
247 1 while(REC_LED==1){;}//等待播放
248 1 while(REC_LED==0){;}//等待播放结束
249 1
250 1 }
251
252
253 //----------------------------软件延时函数----------------------------
254 //50ms延时
255 void delay5ms(void)
256 {
257 1 unsigned char TempCyc = 250;
258 1 while(TempCyc--);
259 1 }
260
261 void delay(unsigned int x)
262 {
263 1 do
264 1 {
265 2 delay5ms();delay5ms();delay5ms();x--;
266 2 }
267 1 while(x!=0);
268 1 }
269
270 void nop(unsigned char i)
271 {
272 1 do
273 1 {
274 2 _nop_();
275 2 i--;
276 2 }
277 1 while(i!=0);
278 1 }
279
280
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 411 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 12 1
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -