📄 isd4004.lst
字号:
C51 COMPILER V7.05 ISD4004 02/14/2006 08:58:54 PAGE 1
C51 COMPILER V7.05, COMPILATION OF MODULE ISD4004
OBJECT MODULE PLACED IN ISD4004.OBJ
COMPILER INVOKED BY: C:\SiLabs\MCU\IDEfiles\C51\BIN\C51.exe ISD4004.C DB OE
stmt level source
1 //参考程序A: ISD4004.C
2 //从分段地址0000H 开始录音,连续录音120秒后停止录音1秒钟,
3 //再从ISD4004分段地址0000H 开始放音,再连续放音120秒后停止放音。
4 #include <c8051f020.h> //ISD4004.C 用SPI接口操作ISD4004录放音的程序
5 #include <intrins.h> //按下KEY4为录音操作.放开KEY4为放音操作
6 #define SYSCLK 11059200
7 sbit CS = P0^7; //P0.7作ISD4004的片选信号
8 sbit KEY4 = P3^7; //KEY4作录放音选择开关.
9 sbit P10=P1^0;
10 sbit P11=P1^1;
11 sbit P12=P1^2 ;
12 sbit P13=P1^3;
13 sbit P14=P1^4;
14 sbit P15=P1^5;
15 sbit P16=P1^6;
16 sbit P17=P1^7;
17 sbit P20=P2^0;
18 sbit P21=P2^1;
19 sbit P22=P2^2 ;
20 sbit P23=P2^3;
21 sbit P24=P2^4;
22 sbit P25=P2^5;
23 sbit P26=P2^6;
24 sbit P27=P2^7;
25 sbit BELL=P3^5;
26 unsigned int Count1msInc;
27 unsigned char K;
28 exchg();//一个字节的数据倒置
29 BELL1();
30 BELL2();
31 RECORD();
32 PLAY();
33 DELY(unsigned int dely) //延时子程序
34 { unsigned int J;
35 1 for (J=0;J<dely;J++);
36 1 }
37 void Timer0_Init (void)
38 {
39 1 CKCON|=0x8; //设置定时器T0为方式1
40 1 TMOD|=0x1; //T0为16位定时计数器
41 1 TR0 = 0;
42 1 TH0 = (-SYSCLK/1000) >> 8; //计算T0定时一毫秒的初值
43 1 TL0 = -SYSCLK/1000;
44 1 IE|= 0x2; // 允许T0中断
45 1 }
46 void Timer0_ISR (void) interrupt 1 //T0中断服务子程序
47 {
48 1 TH0 = (-SYSCLK/1000) >> 8;
49 1 TL0 = -SYSCLK/1000;
50 1 Count1msInc++;
51 1 }
52 void Delay_ms(unsigned char Val_ms) //延时一豪秒
53 {
54 1 Count1msInc=0;
55 1 TR0 =1;
C51 COMPILER V7.05 ISD4004 02/14/2006 08:58:54 PAGE 2
56 1 while((Count1msInc<Val_ms)==1);
57 1 TR0 =0;
58 1 }
59 void Delay_s(unsigned char Val_s) //延时一秒
60 {
61 1 unsigned int temp;
62 1 temp = Val_s*1000;
63 1 Count1msInc=0;
64 1 TR0 =1;
65 1 while((Count1msInc<temp)==1);
66 1 TR0 = 0;
67 1 }
68 ON_4004() //片选
69 {
70 1 CS=0;
71 1 DELY(50000); //延时
72 1 }
73 OFF_4004() //取消片选
74 {
75 1 DELY(50000); //延时
76 1 CS=1;
77 1 }
78 void SPIWrOne(unsigned char ch) //传送一字节指令
79 {
80 1 ON_4004();
81 1 SPIF = 0;
82 1 K=ch;
83 1 exchg();
84 1 SPI0DAT = K;
85 1 while (SPIF == 0); // 等待8位数据传送完成
86 1 OFF_4004();
87 1 }
88 void SPIWrtwo(unsigned char ch)
89 { SPIF = 0;
90 1 K=ch;
91 1 exchg();
92 1 SPI0DAT = K;
93 1 while (SPIF == 0); //等待8位数据传送完成
94 1 }
95 void SPIWrThree(unsigned char addl, unsigned char addh, unsigned char COM)
96 { ON_4004(); //传送三字节指令
97 1 SPIWrtwo(addl);
98 1 SPIWrtwo(addh);
99 1 SPIWrtwo(COM);
100 1 OFF_4004();
101 1 }
102 void SYSCLK_Init (void)
103 {
104 1 int i; // 延时计数器i
105 1 OSCXCN = 0x67; // 用11.0592MHz 晶振作系统时钟
106 1 for (i=0; i < 256; i++) ; // 等待晶振稳定
107 1 while (!(OSCXCN & 0x80)) ;
108 1 OSCICN = 0x88; //选择外部晶振,当时钟失效时触发复位
109 1 }
110 void PORT_Init (void)
111 {
112 1 XBR0 = 0x02; // Enable SPI0
113 1 XBR1 = 0x00;
114 1 XBR2 = 0x40; // Enable crossbar and weak pull-ups
115 1 }
116 void SPI0_Init (void)
117 {
C51 COMPILER V7.05 ISD4004 02/14/2006 08:58:54 PAGE 3
118 1 SPI0CFG = 0x07; // 在第二个时钟上升沿采集数据
119 1 // 时钟的空闲状态为高电平
120 1 SPI0CFG|=0x0C0; //CKPOL =1,CHPHA=1;
121 1 SPI0CN = 0x03; // 主模式,使能SPI
122 1
123 1 SPI0CKR = SYSCLK/2/100000-1; // 设置SPI的SCLK为100KMZ
124 1 P0MDOUT=0x0d;
125 1 }
126 exchg() //SPI送数据时,送到ISD4004的每一个字节的数据需要倒置后再传送.
127 {P1=K; //[包括命令(COM)和高8位地址(ahh)及低8位地址(adl)都要倒置]
128 1 P20=P17; //倒置就是把最高位和最低位交换, 次高位和次低位交换,依次交换8次
129 1 P21=P16;
130 1 P22=P15;
131 1 P23=P14;
132 1 P24=P13;
133 1 P25=P12;
134 1 P26=P11;
135 1 P27=P10;
136 1 K=P2;
137 1 }
138 BELL1()// 蜂鸣器鸣一声
139 { BELL=0;
140 1 DELY(65000);
141 1 BELL=1;
142 1 }
143 BELL2()// 蜂鸣器鸣二声
144 { BELL=0;
145 1 DELY(65000);
146 1 BELL=1;
147 1 DELY(65000);
148 1 BELL=0;
149 1 DELY(65000);
150 1 BELL=1;
151 1 }
152 RECORD()
153 { BELL1(); //蜂鸣器响一次
154 1 SPIF = 0;
155 1 SPIWrOne(0x20); //上电
156 1 DELY(10000); //延时25ms
157 1 EA=1; //开中断
158 1 SPIWrOne(0x20); //上电
159 1 DELY(10000); //延时25ms
160 1 BELL2(); //蜂鸣器响二次
161 1 SPIWrThree(0x00,0x0,0x0a0); //设置录音起始地址为0000h
162 1 SPIWrOne(0xb0); //连续录
163 1 Delay_s(60); //延时60s
164 1 Delay_s(60); //延时60s
165 1 SPIWrOne(0x30); //停止录音
166 1 BELL1(); //蜂鸣器响一次
167 1
168 1 }
169
170 PLAY0000H()
171 { SPIWrOne(0x20); //上电
172 1 DELY(60000); //延时
173 1 SPIWrOne(0x20); //上电
174 1 DELY(60000);
175 1 BELL2(); //蜂鸣器响二次
176 1 SPIWrThree(0x0,0x00,0x0E0); //设置放音地址:0000H
177 1 SPIWrOne(0x0f0); //连续放音
178 1 Delay_s(60); //延时60s
179 1 Delay_s(60); //延时60s
C51 COMPILER V7.05 ISD4004 02/14/2006 08:58:54 PAGE 4
180 1 SPIWrOne(0x30); //停止放音
181 1 ; SPIWrOne(0x10); //掉电
182 1 DELY(1000);
183 1 BELL2(); //蜂鸣器响二次
184 1 }
185 void main (void)
186 {
187 1 WDTCN = 0xde; // 初始化看门狗
188 1 WDTCN = 0xad;
189 1 SYSCLK_Init (); // 初始化系统时钟
190 1 PORT_Init (); // 初始化I/O口
191 1 SPI0_Init (); // 初始化SPI
192 1 Timer0_Init() ; // 初始化定时器T0
193 1 EA = 1;
194 1 while(1)
195 1 {
196 2 if(!KEY4) //按下KEY4实现录音操作
197 2 RECORD();
198 2 if(KEY4) //放开KEY4实现放音操作
199 2 PLAY0000H(); //从0000H地址放音
200 2 }
201 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 486 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 3 2
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 + -