⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 isd4004.c

📁 soc单片机试验、实践与应用设计——基于C8051F系列的例程
💻 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 + -