📄 4004.lst
字号:
C51 COMPILER V7.50 4004 09/14/2008 12:50:00 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE 4004
OBJECT MODULE PLACED IN F:\资料\报站\ISD400~1\4004.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE F:\资料\报站\ISD400~1\4004.C DB SB OE OT(0)
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.50 4004 09/14/2008 12:50:00 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.50 4004 09/14/2008 12:50:00 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 //***********************************
164 //入口:录音的起始位置,高低位
165 //录音程序
166 //功能:从指定位置录音
167 //***********************************
168 void rec(unsigned char adl,unsigned char adh)
169 {
170 1 delayms(200);//延时录音
171 1 isd_setrec(adl,adh);//发送0x0000h地址的setplay指令//adl为低位, adh为高位
172 1 do
173 1 {
174 2 isd_rec();//发送rec指令
175 2 while(AN == 0)//等待录音完毕
176 2 {
177 3 if(ISD_INT == 0) //如果芯片益出,进行LED闪烁指示
178 3 isd_overflow();//如果取消录音(松下AN键)则停止录音,芯片复位
179 3 }
C51 COMPILER V7.50 4004 09/14/2008 12:50:00 PAGE 4
180 2 if(ISD_INT == 0)
181 2 break;
182 2 LED = 1;//录音完毕,LED熄灭
183 2 isd_stop();//发送停止命令
184 2 while(AN == 1) //如果AN再次按下,开始录制下一段语音
185 2 {
186 3 if(STOP == 0) //如果按下STOP按键,则芯片复位
187 3 break;
188 3 if(AN == 0)
189 3 delayms(500);
190 3 }
191 2 }while(AN == 0);
192 1 }
193
194 //***********************************
195 //入口:放音位置的高低位
196 //放音程序
197 //功能:从指定位置放音
198 //***********************************
199 void play(unsigned char adl,unsigned char adh)
200 {
201 1 unsigned char ovflog;
202 1 while(AN == 0) {;}
203 1 isd_setplay(adl,adh);//发送setplay指令,从0x0000地址开始放音
204 1 do
205 1 {
206 2 isd_play();//发送放音指令
207 2 delay(20);
208 2 while(ISD_INT == 1) //等待放音完毕的EOM中断信号
209 2 {;}
210 2 LED = 1;
211 2 isd_stop();//放音完毕,发送stop指令
212 2 if(ovflog == chk_isdovf()) //检查芯片是否溢出,如溢出则停止放音,芯片复位
213 2 break;
214 2 while(AN == 1) //等待AN键再次按下
215 2 {
216 3 if(STOP == 0)
217 3 break;
218 3 if(AN == 0)
219 3 delayms(20);
220 3 }
221 2 }while(AN == 0);//An键再次按下,播放下一段语音
222 1 }
223
224 //初始化程序
225 //初始化单片机,并等待按键按下
226 void in_stc()
227 {
228 1
229 1
230 1 P0 = P1 = P2 = P3 = 0xff;//初始化
231 1 while(AN == 1)//等待AN键按下
232 1 {
233 2 if(AN == 0) //按键防抖动
234 2 {delayms(20);}
235 2 }
236 1 isd_pu();//AN键按下,isd上电并延迟50ms
237 1 isd_pd();
238 1 isd_pu();
239 1
240 1 }
241
C51 COMPILER V7.50 4004 09/14/2008 12:50:00 PAGE 5
242 //**********************************************
243 //主程序
244 //功能:1.录音时,按住AN键,LED点亮开始录音,松开AN键即可停止录音
245 //再次按下AN键,LED点亮开始录音第二段,依次类推,直至芯片溢出
246 //按stop键芯片复位
247 //2.放音时,按下AN键,即可播放一段语音,按stop键芯片复位.
248 //***************************************************
249 void main(void)
250 {
251 1 while (1)
252 1 {
253 2 in_stc();
254 2 if(PR == 1) //如果PR==1则转入录音部分
255 2 {
256 3 rec(0x00,0x00);
257 3 }
258 2
259 2 else //如果PR=0则转入放音部分
260 2 {
261 3 play(0x00,0x00);
262 3 }
263 2 isd_stop();
264 2 isd_pd();
265 2 }
266 1 }
C51 COMPILER V7.50 4004 09/14/2008 12:50:00 PAGE 6
NAME CLASS MSPACE TYPE OFFSET SIZE
==== ===== ====== ==== ====== ====
P0 . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0080H 1
P1 . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0090H 1
P2 . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00A0H 1
P3 . . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 00B0H 1
in_stc . . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
isd_pu . . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
_isd_setplay . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
adl. . . . . . . . . . . . . . . . . AUTO DATA U_CHAR 0000H 1
adh. . . . . . . . . . . . . . . . . AUTO DATA U_CHAR 0001H 1
_isd_setrec. . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
adl. . . . . . . . . . . . . . . . . AUTO DATA U_CHAR 0000H 1
adh. . . . . . . . . . . . . . . . . AUTO DATA U_CHAR 0001H 1
AN . . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 00B7H 1
_play. . . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
adl. . . . . . . . . . . . . . . . . AUTO DATA U_CHAR 0000H 1
adh. . . . . . . . . . . . . . . . . AUTO DATA U_CHAR 0001H 1
ovflog . . . . . . . . . . . . . . . AUTO DATA U_CHAR 0002H 1
_rec . . . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
adl. . . . . . . . . . . . . . . . . AUTO DATA U_CHAR 0000H 1
adh. . . . . . . . . . . . . . . . . AUTO DATA U_CHAR 0001H 1
isd_overflow . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
PR . . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 0094H 1
SS . . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 0091H 1
main . . . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
chk_isdovf . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
ISD_INT. . . . . . . . . . . . . . . . ABSBIT ----- BIT 00B2H 1
SCLK . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 0090H 1
TMOD . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 0089H 1
MISO . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 0093H 1
MOSI . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 0092H 1
_spi_send. . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
isdx . . . . . . . . . . . . . . . . AUTO DATA U_CHAR 0000H 1
isx_counter. . . . . . . . . . . . . AUTO DATA U_CHAR 0001H 1
STOP . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 00B6H 1
TF0. . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 008DH 1
TH0. . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 008CH 1
TL0. . . . . . . . . . . . . . . . . . SFR DATA U_CHAR 008AH 1
_delayms . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
time . . . . . . . . . . . . . . . . AUTO DATA U_INT 0000H 2
LED. . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 0097H 1
TR0. . . . . . . . . . . . . . . . . . ABSBIT ----- BIT 008CH 1
isd_play . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
isd_rec. . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
isd_stop . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
_delay . . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
time . . . . . . . . . . . . . . . . AUTO DATA U_INT 0000H 2
isd_pd . . . . . . . . . . . . . . . . PUBLIC CODE PROC 0000H -----
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 541 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 15 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILER V7.50 4004 09/14/2008 12:50:00 PAGE 7
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -