📄 main3.lst
字号:
C51 COMPILER V7.20 MAIN3 09/09/2008 11:28:45 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE MAIN3
OBJECT MODULE PLACED IN main3.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main3.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg51.h>
2 sbit SS=P1^1; //片选
3 sbit SCLK=P1^0; //ISD4004时钟
4 sbit MOSI=P1^2; //数据输入
5 sbit MISO=P1^3; //数据输出
6 sbit LED=P1^7; //指示灯
7 sbit ISD_INT=P3^2; //中断
8 sbit AN=P3^7; //执行
9 sbit STOP=P3^6; //复位
10 sbit PR=P1^4;//PR=1 录音 PR=0放音
11 void delay(unsigned int time) //延时n微秒
12 {while(time!=0)
13 1 {time--;
14 2 }
15 1 }
16
17 void delayms(unsigned int time) //延时n毫秒
18
19 {TMOD=0x01;
20 1 for(time;time>0;time--)
21 1 {TH0=0xfc;
22 2 TL0=0x18;
23 2 TR0=1;
24 2 while(TF0!=1)
25 2 {;}
26 2 TF0=0;
27 2 TR0=0;
28 2 }
29 1 }
30 //************************************
31 //IS4004 spi串行发送子程序,8位数据
32 //************************************
33 void spi_send(unsigned char isdx)
34 {
35 1 unsigned char isx_counter;
36 1 SS=0;
37 1 SCLK=0;
38 1 for(isx_counter=0;isx_counter<8;isx_counter++)//先送低位,再送高位
39 1 {if((isdx&0x01)==1)
40 2 MOSI=1;
41 2 else
42 2 MOSI=0;
43 2 isdx=isdx>>1;
44 2 SCLK=1;
45 2 delay(2);
46 2 SCLK=0; //送数MOSI
47 2 delay(2);
48 2 }
49 1 }
50
51 //*****************************************
52 //发送stop指令
53 //*****************************************
54 void isd_stop(void)
55 {delay(10);
C51 COMPILER V7.20 MAIN3 09/09/2008 11:28:45 PAGE 2
56 1 spi_send(0x30);
57 1 SS=1;
58 1 delayms(50);
59 1 }
60
61 //**************************************
62 //发送上电指令,并延时50ms
63 //**************************************
64 void isd_pu(void)
65 {delay(10);
66 1 SS=0;
67 1 spi_send(0x20);
68 1 SS=1;
69 1 delayms(50);
70 1 }
71
72 //**************************************
73 //发送掉电指令,并延时50ms
74 //**************************************
75 void isd_pd(void)
76 {delay(10);
77 1 spi_send(0x10);
78 1 SS=1;
79 1 delayms(50);
80 1 }
81 //***************************************
82 //发送play指令
83 //***************************************
84 void isd_play(void)
85 {LED=0;
86 1 spi_send(0xf0);
87 1 SS=1;
88 1 }
89
90 //***************************************
91 //发送rec指令
92 //***************************************
93 void isd_rec(void)
94 {LED=0;
95 1 spi_send(0xb0);
96 1 SS=1;
97 1 }
98
99 //*******************************************
100 //发送setplay指令
101 //*******************************************
102 void isd_setplay(unsigned char adl,unsigned char adh)
103 {delayms(1);
104 1 spi_send(adl);//发送放音起始地址低位
105 1 delay(2);
106 1 spi_send(adh); //发送放音起始地址高位
107 1 delay(2);
108 1 spi_send(0xe0);
109 1 SS=1;
110 1 }
111 //*******************************************
112 //发送setrec指令
113 //*******************************************
114 void isd_setrec(unsigned char adl,unsigned char adh)
115 {
116 1
117 1 delayms(1);
C51 COMPILER V7.20 MAIN3 09/09/2008 11:28:45 PAGE 3
118 1 spi_send(adl);//发送录音起始地址低位
119 1 delay(2);
120 1 spi_send(adh); //发送录音起始地址高位
121 1 delay(2);
122 1 spi_send(0xa0);
123 1 SS=1;
124 1 }
125 //**********************************************
126 //芯片益出,LED闪烁提醒停止录音
127 //**********************************************
128 void isd_overflow(void)
129 {while(AN==0)
130 1 {LED=1;
131 2 delayms(300);
132 2 LED=0;
133 2 delayms(300);
134 2 }
135 1 }
136 //**********************************************
137 //检查芯片是否益出(读OVF,并返回OVF值)
138 //**********************************************
139
140 unsigned char chk_isdovf(void)
141 {SS=0;
142 1 delay(2);
143 1 SCLK=0;
144 1 delay(2);
145 1 SCLK=1;
146 1 SCLK=0;
147 1 delay(2);
148 1 if(MISO==1)
149 1 {SCLK=0;
150 2 SS=1;//关闭spi通信端
151 2 isd_stop();//发送stop指令
152 2 return 1; //OVF为1,返回1
153 2 }
154 1 else
155 1 {SCLK=0; //关闭spi通信端
156 2 SS=1;
157 2 isd_stop(); //发送stop指令
158 2 return 0;//OVF为0,返回0
159 2 }
160 1
161 1 }
162
163 void ledflash()
164 {LED=1;
165 1 delayms(600);
166 1 LED=0;
167 1 delayms(600);
168 1 LED=1;
169 1 delayms(600);
170 1 LED=0;
171 1 delayms(600);
172 1 LED=1;
173 1 delayms(600);
174 1 LED=0;
175 1 delayms(600);
176 1 LED=1;
177 1 delayms(600);
178 1 LED=0;
179 1 delayms(600);
C51 COMPILER V7.20 MAIN3 09/09/2008 11:28:45 PAGE 4
180 1
181 1 }
182 RECORD()
183 {LED=0;
184 1 delay(10);
185 1 SS=0;
186 1 spi_send(0x20);
187 1 SS=1;
188 1 delayms(100);
189 1 SS=0;
190 1 spi_send(0x20);
191 1 SS=1;
192 1 delayms(100);
193 1
194 1 spi_send(0);//发送录音起始地址低位
195 1 spi_send(0); //发送录音起始地址高位
196 1 spi_send(0xa0);
197 1 spi_send(0xb0);
198 1 delayms(6600);
199 1 delayms(6600);
200 1 spi_send(0x30);
201 1 ledflash();
202 1 }
203
204 PLAY0000H()
205 {
206 1 LED=1;
207 1 delay(10);
208 1 SS=0;
209 1 spi_send(0x20);
210 1 SS=1;
211 1 delayms(50);
212 1 SS=0;
213 1 spi_send(0x20);
214 1 SS=1;
215 1 delayms(100);
216 1
217 1
218 1 spi_send(0);//发送录音起始地址低位
219 1 spi_send(0); //发送录音起始地址高位
220 1 spi_send(0xe0);
221 1 spi_send(0xf0);
222 1 delayms(6600);
223 1 delayms(6600);
224 1 spi_send(0x30);
225 1 spi_send(0x10);
226 1 LED=0;
227 1
228 1 }
229 main()
230 { ledflash();
231 1
232 1 if(!AN) //按下KEY4实现录音操作
233 1 RECORD();
234 1 if(AN) //放开KEY4实现放音操作
235 1 {PLAY0000H(); //从0000H地址放音
236 2 LED=1;
237 2 delayms(100);
238 2 LED=0;
239 2 delayms(100);
240 2 }
241 1 while(1)
C51 COMPILER V7.20 MAIN3 09/09/2008 11:28:45 PAGE 5
242 1 {;
243 2
244 2 }
245 1 }
246 /*
247 //**********************************************
248 //主程序
249 //功能:1.录音时,按住AN键,LED点亮开始录音,松开AN键即可停止录音
250 //再次按下AN键,LED点亮开始录音第二段,依次类推,直至芯片溢出
251 //按stop键芯片复位
252 //2.放音时,按下AN键,即可播放一段语音,按stop键芯片复位.
253 //***************************************************
254 void main(void)
255 {unsigned char ovflog;
256 while(1)
257 {P0=P1=P2=P3=0xff;//初始化
258 while(AN==1)//等待AN键按下
259 {if(AN==0) //按键防抖动
260 {delayms(20);}
261 }
262 isd_pu();//AN键按下,isd上电并延迟50ms
263 isd_pd();
264 isd_pu();
265 if(PR==1) //如果PR==1则转入录音部分
266 {delayms(200);//延时录音
267 isd_setrec(0x00,0x00);//发送0x0000h地址的setplay指令
268 do
269 {isd_rec();//发送rec指令
270 while(AN==0)//等待录音完毕
271 {if(ISD_INT==0) //如果芯片益出,进行LED闪烁指示
272 isd_overflow();//如果取消录音(松下AN键)则停止录音,芯片复位
273 }
274 if(ISD_INT==0)
275 break;
276 LED=1;//录音完毕,LED熄灭
277 isd_stop();//发送停止命令
278 while(AN==1) //如果AN再次按下,开始录制下一段语音
279 {if(STOP==0) //如果按下STOP按键,则芯片复位
280 break;
281 if(AN==0)
282 delayms(500);
283 }
284 }while(AN==0);
285 }
286 else //如果PR=0则转入放音部分
287 {
288 while(AN==0){;}
289 isd_setplay(0x00,0x00);//发送setplay指令,从0x0000地址开始录音
290 do
291 {isd_play();//发送放音指令
292 delay(20);
293 while(ISD_INT==1) //等待放音完毕的EOM中断信号
294 {;}
295 LED=1;
296 isd_stop();//放音完毕,发送stop指令
297 if(ovflog=chk_isdovf()) //检查芯片是否溢出,如溢出则停止放音,芯片复位
298 break;
299 while(AN==1) //等待AN键再次按下
300 {if(STOP==0)
301 break;
302 if(AN==0)
303 delayms(20);
C51 COMPILER V7.20 MAIN3 09/09/2008 11:28:45 PAGE 6
304 }
305 }while(AN==0);//An键再次按下,播放下一段语音
306 }
307 isd_stop();
308 isd_pd();
309 }
310 }
311 */
312
313
314
315
316
317
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 507 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -