?? isd4004.c
字號:
//參考程序A: ISD4004.C
//從分段地址0000H 開始錄音,連續錄音120秒后停止錄音1秒鐘,
//再從ISD4004分段地址0000H 開始放音,再連續放音120秒后停止放音。
#include <c8051f020.h> //ISD4004.C 用SPI接口操作ISD4004錄放音的程序
#include <intrins.h> //按下KEY4為錄音操作.放開KEY4為放音操作
#define SYSCLK 11059200
sbit CS = P0^7; //P0.7作ISD4004的片選信號
sbit KEY4 = P3^7; //KEY4作錄放音選擇開關.
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2 ;
sbit P13=P1^3;
sbit P14=P1^4;
sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7;
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2 ;
sbit P23=P2^3;
sbit P24=P2^4;
sbit P25=P2^5;
sbit P26=P2^6;
sbit P27=P2^7;
sbit BELL=P3^5;
unsigned int Count1msInc;
unsigned char K;
exchg();//一個字節的數據倒置
BELL1();
BELL2();
RECORD();
PLAY();
DELY(unsigned int dely) //延時子程序
{ unsigned int J;
for (J=0;J<dely;J++);
}
void Timer0_Init (void)
{
CKCON|=0x8; //設置定時器T0為方式1
TMOD|=0x1; //T0為16位定時計數器
TR0 = 0;
TH0 = (-SYSCLK/1000) >> 8; //計算T0定時一毫秒的初值
TL0 = -SYSCLK/1000;
IE|= 0x2; // 允許T0中斷
}
void Timer0_ISR (void) interrupt 1 //T0中斷服務子程序
{
TH0 = (-SYSCLK/1000) >> 8;
TL0 = -SYSCLK/1000;
Count1msInc++;
}
void Delay_ms(unsigned char Val_ms) //延時一豪秒
{
Count1msInc=0;
TR0 =1;
while((Count1msInc<Val_ms)==1);
TR0 =0;
}
void Delay_s(unsigned char Val_s) //延時一秒
{
unsigned int temp;
temp = Val_s*1000;
Count1msInc=0;
TR0 =1;
while((Count1msInc<temp)==1);
TR0 = 0;
}
ON_4004() //片選
{
CS=0;
DELY(50000); //延時
}
OFF_4004() //取消片選
{
DELY(50000); //延時
CS=1;
}
void SPIWrOne(unsigned char ch) //傳送一字節指令
{
ON_4004();
SPIF = 0;
K=ch;
exchg();
SPI0DAT = K;
while (SPIF == 0); // 等待8位數據傳送完成
OFF_4004();
}
void SPIWrtwo(unsigned char ch)
{ SPIF = 0;
K=ch;
exchg();
SPI0DAT = K;
while (SPIF == 0); //等待8位數據傳送完成
}
void SPIWrThree(unsigned char addl, unsigned char addh, unsigned char COM)
{ ON_4004(); //傳送三字節指令
SPIWrtwo(addl);
SPIWrtwo(addh);
SPIWrtwo(COM);
OFF_4004();
}
void SYSCLK_Init (void)
{
int i; // 延時計數器i
OSCXCN = 0x67; // 用11.0592MHz 晶振作系統時鐘
for (i=0; i < 256; i++) ; // 等待晶振穩定
while (!(OSCXCN & 0x80)) ;
OSCICN = 0x88; //選擇外部晶振,當時鐘失效時觸發復位
}
void PORT_Init (void)
{
XBR0 = 0x02; // Enable SPI0
XBR1 = 0x00;
XBR2 = 0x40; // Enable crossbar and weak pull-ups
}
void SPI0_Init (void)
{
SPI0CFG = 0x07; // 在第二個時鐘上升沿采集數據
// 時鐘的空閑狀態為高電平
SPI0CFG|=0x0C0; //CKPOL =1,CHPHA=1;
SPI0CN = 0x03; // 主模式,使能SPI
SPI0CKR = SYSCLK/2/100000-1; // 設置SPI的SCLK為100KMZ
P0MDOUT=0x0d;
}
exchg() //SPI送數據時,送到ISD4004的每一個字節的數據需要倒置后再傳送.
{P1=K; //[包括命令(COM)和高8位地址(ahh)及低8位地址(adl)都要倒置]
P20=P17; //倒置就是把最高位和最低位交換, 次高位和次低位交換,依次交換8次
P21=P16;
P22=P15;
P23=P14;
P24=P13;
P25=P12;
P26=P11;
P27=P10;
K=P2;
}
BELL1()// 蜂鳴器鳴一聲
{ BELL=0;
DELY(65000);
BELL=1;
}
BELL2()// 蜂鳴器鳴二聲
{ BELL=0;
DELY(65000);
BELL=1;
DELY(65000);
BELL=0;
DELY(65000);
BELL=1;
}
RECORD()
{ BELL1(); //蜂鳴器響一次
SPIF = 0;
SPIWrOne(0x20); //上電
DELY(10000); //延時25ms
EA=1; //開中斷
SPIWrOne(0x20); //上電
DELY(10000); //延時25ms
BELL2(); //蜂鳴器響二次
SPIWrThree(0x00,0x0,0x0a0); //設置錄音起始地址為0000h
SPIWrOne(0xb0); //連續錄
Delay_s(60); //延時60s
Delay_s(60); //延時60s
SPIWrOne(0x30); //停止錄音
BELL1(); //蜂鳴器響一次
}
PLAY0000H()
{ SPIWrOne(0x20); //上電
DELY(60000); //延時
SPIWrOne(0x20); //上電
DELY(60000);
BELL2(); //蜂鳴器響二次
SPIWrThree(0x0,0x00,0x0E0); //設置放音地址:0000H
SPIWrOne(0x0f0); //連續放音
Delay_s(60); //延時60s
Delay_s(60); //延時60s
SPIWrOne(0x30); //停止放音
; SPIWrOne(0x10); //掉電
DELY(1000);
BELL2(); //蜂鳴器響二次
}
void main (void)
{
WDTCN = 0xde; // 初始化看門狗
WDTCN = 0xad;
SYSCLK_Init (); // 初始化系統時鐘
PORT_Init (); // 初始化I/O口
SPI0_Init (); // 初始化SPI
Timer0_Init() ; // 初始化定時器T0
EA = 1;
while(1)
{
if(!KEY4) //按下KEY4實現錄音操作
RECORD();
if(KEY4) //放開KEY4實現放音操作
PLAY0000H(); //從0000H地址放音
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -