當前位置:編程學習大全網 - 編程語言 - 基於52單片機ISD1760語音芯片的原理圖和程序代碼。

基於52單片機ISD1760語音芯片的原理圖和程序代碼。

#include <reg51.h>

#define uchar unsigned char

#define uint unsigned int

//******************定義端口******************//

sbit SS = P1^0;

sbit SCK = P1^1;

sbit MOSI = P1^2;

sbit MISO = P1^3;

sbit PR = P1^4;//PLAY = 0;REC = 1;

sbit STOP = P1^5;

sbit AN = P1^6;

sbit LED = P1^7;

//******************定義ISD1700狀態寄存器及各標誌位******************//

uchar bdata SR0_L;//SR0寄存器低位、高位

uchar bdata SR0_H;

uchar bdata SR1;//SR1寄存器

uchar APC_L = 0, APC_H = 0;//APC寄存器

uchar PLAYADDL = 0, PLAYADDH = 0;//放音指針低位、高位

uchar RECADDL = 0, RECADDH = 0;//錄音指針低位、高位

sbit CMD_ERR = SR0_L^0;//SPI指令無效標誌位

sbit FULL = SR0_L^1;//芯片存儲空間滿標誌位

sbit PU = SR0_L^2;//上電標誌位

sbit EOM = SR0_L^3;//EOM標誌位

sbit INT = SR0_L^4;//操作完成標誌位

sbit RDY = SR1^0;//芯片空閑標誌位

sbit ERASE = SR1^1;//擦除標誌位

sbit PLAY = SR1^2;//放音標誌位

sbit REC = SR1^3;//錄音標誌位

//******************定義標誌位******************//

uchar bdata fang;

sbit PR_fang = fang^1;//錄音、放音標誌位,放音=0,錄音=1

sbit Erase_fang = fang^4;//擦出標誌位

sbit STOP_fang = fang^7;//停止放音標誌位

//******************延時μs******************//

void delay(uint time)//延時n微秒

{

while(time!=0)

{

time--;

}

}

//******************延時ms******************//

void delayms(uint time)//延時n毫秒

{

for(time; time>0; time--)

{

TH0 = 0xfc;

TL0 = 0x18;

TR0 = 1;//計數器0啟動

while(TF0!=1);//計數溢出處理

TF0 = 0;

TR0 = 0;

}

}

//******************CPU初始化******************//

void cpu_init (void)

{

P1 = 0xFF;

P2 = 0xFF;

P3 = 0xFF;

TMOD = 0x01;//定時器初始化,工作於方式1

EA = 0;//關中斷

fang = 0;//標誌位歸0

LED = 1;//關指示燈

}

//******************發送、讀回數據******************//

uchar isd_senddata (uchar dat)

{

uchar i, BUF_ISD = dat;

SS = 0;

SCK = 1;

delay(4);

for(i=0; i<8; i++)

{

SCK = 0;

if((BUF_ISD&0x01)==1)

{

MOSI = 1;

}

else

{

MOSI = 0;

}

BUF_ISD = BUF_ISD >> 1;

if(MISO)

{

BUF_ISD = BUF_ISD|0x80;

}

SCK = 1;

delay(6);

}

MOSI = 0;

return(BUF_ISD);

}

//******************上電******************//

void isd_pu (void)

{

isd_senddata (0x01);

isd_senddata (0x00);

SS = 1;

delayms(50);

}

//******************停止當前操作******************//

void isd_stop (void)

{

isd_senddata (0x02);

isd_senddata (0x00);

SS = 1;

delayms(50);

}

//******************復位******************//

void isd_reset (void)

{

isd_senddata (0x03);

isd_senddata (0x00);

SS = 1;

}

//******************清除中斷******************//

void isd_clr_int (void)

{

isd_senddata (0x04);

isd_senddata (0x00);

SS = 1;

}

//******************讀狀態寄存器內容******************//

void isd_rd_status (void)

{

isd_senddata (0x05);

isd_senddata (0x00);

isd_senddata (0x00);

SS = 1;

delay(2);

SR0_L = isd_senddata (0x05);

SR0_H = isd_senddata (0x00);

SR1 = isd_senddata (0x00);

SS = 1;

}

//******************讀放音指針******************//

void isd_rd_playptr (void)

{

isd_senddata (0x06);

isd_senddata (0x00);

isd_senddata (0x00);

isd_senddata (0x00);

SS = 1;

delay(2);

SR0_L = isd_senddata (0x06);

SR0_H = isd_senddata (0x00);

PLAYADDL = isd_senddata (0x00);

PLAYADDH = isd_senddata (0x00);

SS = 1;

}

//******************下電******************//

void isd_pd (void)

{

isd_senddata (0x07);

isd_senddata (0x00);

SS = 1;

delayms(50);

}

//******************讀錄音指針******************//

void isd_rd_recptr (void)

{

isd_senddata (0x08);

isd_senddata (0x00);

isd_senddata (0x00);

isd_senddata (0x00);

SS = 1;

delay(2);

SR0_L = isd_senddata (0x08);

SR0_H = isd_senddata (0x00);

RECADDL = isd_senddata (0x00);

RECADDH = isd_senddata (0x00);

SS = 1;

}

//******************讀芯片ID******************//

uchar isd_devid (uchar deviceNO)

{

isd_senddata (0x09);

isd_senddata (0x00);

isd_senddata (0x00);

SS = 1;

delay(2);

isd_senddata (0x09);

isd_senddata (0x00);

deviceNO = isd_senddata (0x00);

SS = 1;

return(deviceNO);

}

//******************放音******************//

void isd_play (void)

{

isd_senddata (0x40);

isd_senddata (0x00);

SS = 1;

}

//******************錄音******************//

void isd_rec (void)

{

isd_senddata (0x41);

isd_senddata (0x00);

SS = 1;

}

//******************擦除******************//

void isd_erase (void)

{

isd_senddata (0x42);

isd_senddata (0x00);

SS = 1;

}

//******************全部擦出******************//

void isd_g_erase (void)

{

isd_senddata (0x43);

isd_senddata (0x00);

SS = 1;

}

//******************讀APC寄存器內容******************//

void isd_rd_apc (void)

{

isd_senddata (0x44);

isd_senddata (0x00);

isd_senddata (0x00);

isd_senddata (0x00);

SS = 1;

delay(2);

SR0_L = isd_senddata (0x44);

SR0_H = isd_senddata (0x00);

APC_L = isd_senddata (0x00);

APC_H = isd_senddata (0x00);

SS = 1;

}

//******************寫APC寄存器******************//

void isd_wr_apc2 (uchar apcdatl,apcdath)

{

isd_senddata (0x65);

isd_senddata (apcdatl);

isd_senddata (apcdath);

SS = 1;

}

//******************將APC寄存器內容寫入NVCFG******************//

void isd_wr_nvcfg (uchar apcdatl,apcdath)

{

isd_senddata (0x46);

isd_senddata (apcdatl);

isd_senddata (apcdath);

SS = 1;

}

//******************將NVCFG內容寫入APC******************//

void isd_ld_nvcfg (void)

{

isd_senddata (0x47);

isd_senddata (0x00);

SS = 1;

}

//******************快進******************//

void isd_fwd (void)

{

isd_senddata (0x48);

isd_senddata (0x00);

SS = 1;

}

//******************空檢查******************//

void isd_chk_mem (void)

{

isd_senddata (0x49);

isd_senddata (0x00);

SS = 1;

}

//******************外部時鐘的啟用、關閉******************//

void isd_extclk (void)

{

isd_senddata (0x4a);

isd_senddata (0x00);

SS = 1;

}

//******************指定地址放音******************//

void isd_set_play (uchar saddl,saddh,eaddl,eaddh)

{

isd_senddata (0x80);

isd_senddata (0x00);

isd_senddata (saddl);

isd_senddata (saddh);

isd_senddata (eaddl);

isd_senddata (eaddh);

isd_senddata (0x00);

SS = 1;

}

//******************指定地址錄音******************//

void isd_set_rec (uchar saddl,saddh,eaddl,eaddh)

{

isd_senddata (0x81);

isd_senddata (0x00);

isd_senddata (saddl);

isd_senddata (saddh);

isd_senddata (eaddl);

isd_senddata (eaddh);

isd_senddata (0x00);

SS = 1;

}

//******************指定地址擦除******************//

void isd_set_erase (uchar saddl,saddh,eaddl,eaddh)

{

isd_senddata (0x82);

isd_senddata (0x00);

isd_senddata (saddl);

isd_senddata (saddh);

isd_senddata (eaddl);

isd_senddata (eaddh);

isd_senddata (0x00);

SS = 1;

}

//******************芯片系統初始化******************//

void isd_init (void)

{

uchar i = 2;

SS = 1;

SCK = 1;

MOSI = 0;

do

{

isd_pu ();

isd_rd_status ();

}while(CMD_ERR||(!PU));

isd_wr_apc2 (0x40,0x04);

do

{

isd_rd_status ();

}while(RDY==0);

do

{

LED = 0;

delayms(300);

LED = 1;

delayms(300);

i--;

}while(i>0);

}

//******************isd1700的相關操作******************//

void isdwork (void)

{

uchar i;

switch (fang)

{

case 0x00:

{

do

{

isd_rd_status ();

}while(RDY==0);

delayms(10);

isd_play ();

delayms(2);

LED = 0;

do

{

isd_rd_status ();

if(STOP==0)

{

delayms (10);

if(STOP==0)

{

LED = 1;

isd_clr_int ();

isd_stop ();

isd_reset ();

isd_pd ();

isd_init ();

return;

}

}

}while(PLAY==1);

LED = 1;

isd_clr_int ();

do

{

isd_rd_status ();

}while(RDY==0);

delayms (10);

isd_fwd ();

do

{

isd_rd_status ();

}while(RDY==0);

}

break;

case 0x02:

{

isd_clr_int ();

do

{

isd_rd_status ();

}while(RDY==0);

delayms(10);

isd_rec ();

delayms(2);

LED = 0;

do

{

isd_rd_status ();

if(FULL==1)

{

for(i=3; i>0; i--)

{

LED = 0;

delayms (300);

LED = 1;

delayms (200);

}

}

}while(AN==0);

isd_clr_int ();

isd_stop ();

LED = 1;

}

break;

case 0x10:

{

do

{

isd_rd_status ();

}while(RDY==0);

delayms (10);

isd_g_erase ();

delayms (2);

do

{

isd_rd_status ();

}while(RDY==0);

for(i=3; i>0; i--)

{

LED = 0;

delayms (300);

LED = 1;

delayms (200);

}

}

break;

case 0x80:

{

isd_clr_int ();

isd_stop ();

isd_reset ();

isd_pd ();

}

break;

}

}

//******************主程序******************//

void main (void)

{

uchar i;

cpu_init ();

delayms (1);

isd_init ();

while(1)

{

if(AN==0)

{

delayms (10);

if(AN==0)

{

if(PR==1)

{

PR_fang = 1;

}

else

{

PR_fang = 0;

}

isdwork ();

}

}

if(STOP==0)

{

delayms (10);

if(STOP==0)

{

for(i=100; i>0; i--)

{

if(STOP==1)

{

STOP_fang = 1;

isdwork ();

isd_init ();

break;

}

delayms(30);

}

if (STOP_fang==1)

{

fang = 0;

continue;

}

Erase_fang = 1;

isdwork ();

}

}

}

}

這個是按鍵錄放的例程,妳可以根據這個例程自己修改壹下

  • 上一篇:Android Binder Hook的實現
  • 下一篇:android studio的編輯程序在哪
  • copyright 2024編程學習大全網