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

📄 ch8-7.c

📁 单片机接口技术(C51版)例程源代码
💻 C
字号:
#include <reg51.h>

sbit   SS=P1^0;            				//片选
sbit   SCLK=P1^1;            			//ISD4004时钟
sbit   MOSI=P1^2;            			//数据输入
sbit   MISO=P1^3;            			//数据输出
sbit   LED=P1^7;            			//指示灯
sbit   AN=P1^6;            			//执行
sbit   STOP=P1^5;            			//复位
sbit   PR=P1^4;            				//PR=1录音,PR=0放音
sbit   INT=P3^4;            			//中断

void   YS50();
void   ISDX(unsigned char d);
void   UP();
void   STOPP();
void   DSTOP();
	
main()
{
    unsigned char delay;        			//延时参数
    unsigned char isdl,isdh;    			//ISD高低位
    unsigned char n1;
	
    SP=0x10;
    P0=0xFF;
    P1=0xFF;
    P2=0xFF;
    P3=0xFF;
    EA=0;
lab1:
    LED=1;                       			//关指示灯
    DSTOP();                     			//ISD掉电
    delay=200;
    while(AN);                   			//等按AN键
    while(delay--);              			//延时
    UP();                        				//ISD上电
    isdl=isdh=0;                 			//ISD高低位地址置0
    if(PR)                       				//PR=1 录音
    {
       ISDX(isdl);
       ISDX(isdl);
       ISDX(isdh);
       SS=1;
     b1:
       n1=10;
        while(n1--)
       YS50();
       LED=0;
       ISDX(0xB0);
       SS=1;
      if(INT)
         {
          while(!AN);
          n1=200;
          while(n1--);
          LED=1;                    		//关指示灯
          STOPP();                  		//停止当前操作
          if(STOP)
          {
            while(!AN);
            STOPP();
            goto b1;
          }
        }
     else
          {
          b2:
          LED=1;
          n1=15;
          while(!AN)
            {
            while(!n1--)
            YS50();
            LED=0;
            n1=15;
            while(!AN)
             {
             while(!n1--)
             YS50();
             goto b2;
            }
           }
          }
     }
   else                         			//PR=0 放音
    {
       while(!AN);
       ISDX(isdl);
       ISDX((isdh|0xE0)&0xE7);
       SS=1;
     b3:
       LED=0;
       ISDX(0xF0);
       SS=1;
       if(STOP)
       {
         while(INT);
         LED=1;
         STOPP();
         SS=0;
         SCLK=0;
         SCLK=1;
         if(!MISO)
         {
           SCLK=0;
           SS=1;
           STOPP();
           if(STOP)
           {
             while(!AN);
             goto b3;
           }
        }
      }
    }
    SCLK=0;
    SS=1;
    STOPP();
    goto lab1;
}

/*ISD4004芯片驱动*/
/********************************50mS延时*********************************/
void  YS50()
{
    TMOD=1;
    TH0=0x3C;                			//50mS延时初值置入
    TL0=0xB0;
    TR0=1;
    while(!TF0);
    TF0=0;
    TR0=0;
}
/*ISD3300.4003 SPI写入程序*/
void  ISDX(unsigned char d)
{
    unsigned char i,j;
    SS=0;                      			//开片选
    SCLK=0;                    			//时钟SCLK=0
    j=d;
    for(i=0;i<8;i++)
     {
       if(j&0x01)               			//数据写 MOSI
          MOSI=1;
        else
          MOSI=0;
       SCLK=1;                  			//时钟SCLK=1
       j=j>>1;
       SCLK=0;                  			//时钟SCLK=0
    }
}

/*ISD上电*/
void  UP()
{
    ISDX(20);                 			//发00100XXXXXXXXXXX
    SS=1;                     			//关片选
    YS50();                   			//50mS延时
    YS50();                   			//50mS延时
}

/*停止当前操作*/
void  STOPP()
{
    ISDX(30);                 			//发 0X110XXX
    SS=1;                     			//关片选
    YS50();                   			//50mS延时
    YS50();                   			//50mS延时
}

/*停止当前操作掉电*/
void  DSTOP()
{
    ISDX(10);                 			//发0X010XXXXXXXXXX
    SS=1;                     			//关片选
    YS50();                   			//50mS延时
    YS50();                   			//50mS延时
}

⌨️ 快捷键说明

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