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

📄 voice.c

📁 一款关于ISD4004语音芯片的开发实例
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "reg52.h"
#include  "stdio.h"
#include  "intrins.h"
#include  "absacc.h"
#define   uchar   unsigned char
#define   uint    unsigned int
#define ROM                 XBYTE[0X8001]
#define   SECOND            XBYTE[0XA000]
#define   MINUTE            XBYTE[0XA002]
#define   HOUR              XBYTE[0XA004]
#define   WEEK              XBYTE[0XA006]
#define   DATE              XBYTE[0XA007]
#define   MONTH             XBYTE[0XA008]
#define   YEAR              XBYTE[0XA009]
#define   REG_A             XBYTE[0XA00A]
#define   REG_B             XBYTE[0XA00B]
#define   REG_C             XBYTE[0XA00C]
#define   CENTURY           XBYTE[0XA032]

#define SEG7_DATA           XBYTE[0X8003]
#define SEG7_SCAN           XBYTE[0X8004]
#define I2C_ADDR            XBYTE[0X8005]
#define READ_KEY            XBYTE[0X8006]


#define  K1      0XfE
#define  K2      0xfd
#define  K3      0xfb
#define  K4      0xf7
#define  K5      0xef
#define  K6      0xdf
#define  K7      0xbf
#define  K8      0X7F


#define ERRORCOUNT 10

sbit    MISO=P1^0;
sbit    MOSI=P1^1;
sbit    RAC =P3^5;
sbit    SCLK=P1^2;
sbit    SS  =P1^3;
sbit    SDA=P1^6;
sbit    SCL=P1^5;

uchar    code       seg7_a[19]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X00,0XFF,0x8c,0xc7,0x88,0x91,0xaf,0x86,0xa7};
//                                0   1    2     3    4    5    6    7   8    9          8.   P    L    A   Y     r   E    c
uchar    code       seg7_b[19]={0xc0,0xf9,0x64,0x70,0x59,0x52,0x42,0xf8,0x40,0x50,0X00,0XFF,0x8c,0xc7,0x88,0x91,0xaf,0x86,0xa7};
uchar    code       scan_tab[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned long int sec_count;
unsigned int   timer;
unsigned int   Segment;
unsigned int   CurrentSeg;
unsigned int   iic_addr=0;    //操作 IIC 存储器内部地址
unsigned long  int start;    // 延时播放参数

bit    VoiceRun;
bit    sec_flag;
bit    BufferFlag;
uchar    row;
uchar    key;
uchar    prekey;
bit      keyflag;
bit      EomFlag;
bit      OvfFlag;
uchar   idata   led_buffer[4];
bit    OVF;
bit    EOM;
bit    rflag;
uint  RAC_Read;
uint  RAC_Count;
uchar status;
 uchar   idata rdata[6];
 uchar  data  sbufcount;

enum eepromtype {M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256};
enum eepromtype EepromType;
/***********************************************************************************/
bit RW24XX(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address,
unsigned char ControlByte,enum eepromtype EepromType)
{
        void Delay(unsigned char DelayCount);
        void IICStart(void);
        void IICStop(void);
        bit IICRecAck(void);
        void IICNoAck(void);
        void IICAck(void);
        unsigned char IICReceiveByte(void);
        void IICSendByte(unsigned char sendbyte);
        unsigned char data j,i=ERRORCOUNT;
        bit errorflag=1;
        while(i--)
        {
            IICStart();
            IICSendByte(ControlByte&0xfe);
            if(IICRecAck())
            continue;
            if(EepromType>M2416)
            {
                IICSendByte((unsigned char)(Address>>8));
                if(IICRecAck())
                continue;
            }
            IICSendByte((unsigned char)Address);
            if(IICRecAck())
                      continue;
            if(!(ControlByte&0x01))
            {
                j=ByteQuantity;
                errorflag=0; //********clr errorflag
                while(j--)
                {
                    IICSendByte(*DataBuff++);
                    if(!IICRecAck())
                                    continue;
                    errorflag=1;
                                break;
                 }
                 if(errorflag==1)
                                 continue;
                 break;
            }
            else
            {
                IICStart();
                IICSendByte(ControlByte);
                if(IICRecAck())
                               continue;
                 while(--ByteQuantity)
                 {
                      *DataBuff++=IICReceiveByte();
                      IICAck();
                 }
                 *DataBuff=IICReceiveByte(); //read last byte data
                 IICNoAck();
                 errorflag=0;
                 break;
            }
    }
    IICStop();
    if(!(ControlByte&0x01))
    {
       Delay(255);
       Delay(255);
       Delay(255);
       Delay(255);
    }
    return(errorflag);
}


/*****************以下是对IIC总线的操作子程序***/
/*****************启动总线**********************/
void IICStart(void)
{
    SCL=0; //
    SDA=1;
    SCL=1;
    _nop_();
    _nop_();
    _nop_();
    SDA=0;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    SCL=0;
    SDA=1; //
}

/*****************停止IIC总线****************/
void IICStop(void)
{
    SCL=0;
    SDA=0;
    SCL=1;
    _nop_();
    _nop_();
    _nop_();
    SDA=1;
    _nop_();
    _nop_();
    _nop_();
    SCL=0;
}

/**************检查应答位*******************/
bit IICRecAck(void)
{
    SCL=0;
    SDA=1;
    SCL=1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    CY=SDA; //因为返回值总是放在CY中的
    SCL=0;
    return(CY);
}

/***************对IIC总线产生应答*******************/
void IICACK(void)
{
   SDA=0;
   SCL=1;
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   SCL=0;
   _nop_();
   SDA=1;
}

/*****************不对IIC总线产生应答***************/
void IICNoAck(void)
{
    SDA=1;
    SCL=1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    SCL=0;
}

/*******************向IIC总线写数据*********************/
void IICSendByte(unsigned char sendbyte)
{
   unsigned char data j=8;
   for(;j>0;j--)
   {
      SCL=0;
      sendbyte<<=1; //无论C51怎样实现这个操作,始终会使CY=sendbyte^7;
      SDA=CY;
      SCL=1;
   }
   SCL=0;
}

/**********************从IIC总线上读数据子程序**********/
unsigned char IICReceiveByte(void)
{
   register receivebyte,i=8;
   SCL=0;
   while(i--)
   {
     SCL=1;
     receivebyte=(receivebyte<<1)|SDA;
     SCL=0;
   }
   return(receivebyte);
}

/***************一个简单延时程序************************/
void Delay(unsigned char DelayCount)
{
        while(DelayCount--);
}


void  Delay_ms(uchar delay)
{
   uint  i;

   while(delay--)
   {
     i=500;
     while(i--);
   }
}

unsigned long int GetStartDelay(uint segment)
{
  union
  {
     uchar byte[4];
     unsigned long int spd;
  } num;
  uint iic_addr;
  iic_addr=segment*8;
  RW24XX(num.byte,4,iic_addr,0xa1,M24256);
  return(num.spd);

}

void SaveStartDelay(uint segment,unsigned long delay)
{
  union
  {
     uchar byte[4];
     unsigned long int spd;
  } num;
  uint iic_addr;
  num.spd=delay;
  iic_addr=segment*8;
  RW24XX(num.byte,4,iic_addr,0xa0,M24256);

}

uint CheckStartDelay(unsigned long delay)
{
  union
  {
     uchar byte[4];
     unsigned long int spd;
  } num;
  uint iic_addr;
  uint seg;
  for(seg=0;seg<4096;seg++)
  {
     iic_addr=seg*8;
     RW24XX(num.byte,4,iic_addr,0xa1,M24256);
     if(num.spd==delay)
             break;

  }
  if(seg>4095)
           seg=0;
  return(seg);
}

uint  ISD_WriteByte(uint addr,uchar command)
{
   uchar j;
   uint rac;
   rac=0;
   SCLK=1;
   SS=0;
   for(j=0;j<16;j++)
   {
      SCLK=0;
      if(j==0)
      {
           OVF=MISO;

      }
      else
      if(j==1)
      {
           EOM=MISO;
      }
      else
      {
          if(MISO)
          {
             rac=rac|0x4000;
          }
          else
          {
             rac=rac&0x3fff;
          }
          rac=rac>>1;
      }

      if(addr&0x01)
               MOSI=1;
      else
               MOSI=0;
      addr=addr>>1;

       SCLK=1;


   }
   for(j=0;j<8;j++)
   {
       SCLK=0;
      if(command&0x01)
               MOSI=1;
      else
               MOSI=0;
      command=command>>1;

      SCLK=1;
    //  SCLK=0;
   }
   SS=1;
   return(rac);
}

void ISD_PowerUp()
{
    ISD_WriteByte(0x00,0x20);
    Delay_ms(50);
    Delay_ms(50);
    Delay_ms(50);
    Delay_ms(50);
}
void  ISD_Stop()
{
  ISD_WriteByte(0x00,0x30);
   VoiceRun=0;
}
void  ISD_StopPwrDn()
{
  ISD_WriteByte(0x00,0x10);
  VoiceRun=0;
}
void  ISD_REC()
{
  ISD_WriteByte(0x00,0xb0);
   VoiceRun=1;
}
void  ISD_SET_REC(uint addr)
{
  ISD_WriteByte(addr,0xa0);
   VoiceRun=1;
}
void  ISD_Play()
{
  ISD_WriteByte(0x00,0xf0);
   VoiceRun=1;
}
void  ISD_SetPlay()
{
  ISD_WriteByte(0,0xe0);
   VoiceRun=1;
}
void ISD_MC()
{
  ISD_WriteByte(0x00,0xf8);
   VoiceRun=1;
}
void ISD_SET_MC()
{
  ISD_WriteByte(0x00,0xe8);
   VoiceRun=1;
}
void RINT()
{
  ISD_WriteByte(0x00,0x30);
   VoiceRun=0;
}

uint  ByteToInt(uchar byte1,byte2)
{
  union
  {
     uchar byte[2];
     uint  int_num;
  } Num;
  Num.byte[0]=byte2;
  Num.byte[1]=byte1;

  return(Num.int_num);
}
void  ResetCounter()
{
    TH1=0;
    TL1=0;
}
void  DispIntToLED(unsigned int num)
{
    led_buffer[0]=num%10;
    led_buffer[1]=(num%100)/10;
    led_buffer[2]=(num%1000)/100;
    led_buffer[3]=num/1000;
}
unsigned int   Total_Segment()
{
   unsigned int segment;
   segment=0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -