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

📄 录放基本.c

📁 美国ISD公司的ISD4000系列的ISD4002录放程序
💻 C
字号:

#include <reg52.h>
#include <intrins.h>
#include <delay.h>

#define POWERUP     0X2000
#define SETPLAY     0XE000
#define PLAY        0XF000
#define SETREC      0XA000
#define REC         0XB000
#define STOP        0X3000
#define STOPPWRDN   0X1000
#define RINT        0X3000

sbit sclk_4002=P2^2;
sbit cs_4002=P2^1;
sbit mosi_4002=P2^0;
sbit LED=P2^7;   //指示灯

sbit load=P0^0;
sbit din=P0^1;
sbit dclk=P0^2;
unsigned char key;
bit key_flag;
unsigned char data voice_add=0;  //语音地址
unsigned char code seg_7[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,  //0-9
                             0x77,0x7c,0x39,0x5e,0x79,    //A-E
                             0x71,0x40,0x46,0x00,0x38   //F,-,-1,全灭,L
                            };
unsigned int code voice[]={0x0000,0x0010,0x0020,0x0030,0x0040,0x0050,0x0060,
	0x0070,0x0080,0x0090,0x00A0,0x00B0,0x00C0,0x00D0,0x00E0,0x00F0} ;//16段
///**********************延时200ms***********************///
 void delay_200ms(unsigned char n)   //195.067ms
{  unsigned char i;
   for(i=0;i<n;i++)
   {delay_ms(195);
    }
 }

///***************ch451相关函数************************///
////写命令函数
void ch451_wr_cmd(unsigned int cmd)
{unsigned char i;
		din=1;
		dclk=1;
		load=1;
		for(i=0;i<12;i++)
		{
		din=cmd&0x0001;    //取每一位 低位在前输出
		dclk=0;
		dclk=1;
	       cmd=cmd>>1;
		}
		load=0;
		load=1;
}
///功能函数
//设置系统参数
//门狗使能 WDOG,键盘扫描使能 KEYB,显示
//驱动使能 DISP。各个参数均通过 1 位数据控制,将相应的数据位置为 1 则启用该功能,否则关闭该
//功能(默认值)
void set_system(bit wdog,bit keyb,bit disp)
{unsigned int temp1;
	temp1=0x0400;
         if(wdog==1)  temp1=temp1+4;
         if(keyb==1)  temp1=temp1+2;
         if(disp==1)  temp1=temp1+1;
	ch451_wr_cmd(temp1);

	}
//设置显示参数
//译码方式 MODE 置 1时选择 BCD译码方式,置0时选择不译码方式(默认值)
//扫描极限 LIMIT  扫描极限LIMIT通过3位数据控制,数据 001B~111B和 000B 分别设定扫描极限为 1~7和 8(默认值)
//显示亮度 INTENSITY 显示亮度INTENSITY通过4位数据控制,数据 0001B~1111B和 0000B分别设定显示驱动
//占空比为 1/16~15/16 和 16/16(默认值)。
void set_disp(unsigned char mode,unsigned char limit,unsigned char intensity)
{
	unsigned int temp1;
	temp1=0x0500;
	temp1=temp1+128*mode+16*limit+intensity;
	ch451_wr_cmd(temp1);
	}
//设置闪烁功能  ds表示0-7对应于 DIG0~DIG7 引脚
// 驱动的 8 个数码管中一个 闪烁
//因为我们只有4只数码管  所以flash  指 dig3~dig0
// 如1111(15)即四只全闪烁
	void set_flash(unsigned char flash)
	{
	ch451_wr_cmd(0x0600+flash);
	}
//加载字数据  adrress指000-111(0-7)分别表示 对应于 DIG0~DIG7 引脚
//驱动的 8 个数码管
//worddata  若在不译码方式下
//    01010101 表示 dp g f e d c b a
void set_word(unsigned char adrress,unsigned char worddata)
{
	unsigned int temp1;
	temp1=0x0800;
	temp1=temp1+256*adrress+worddata;
	ch451_wr_cmd(temp1);
	}
//////ch451初始化
void ch451_initial()
{ din=1;
  din=0;
  din=1;  //使能4线
  set_system(0,0,1);//开显示和键盘
  set_disp(0,4,0); //不译码方式 扫描极限4 占空比16/16
  set_flash(0x00);//全不闪烁
  set_word(3,seg_7[16]);
  set_word(2,seg_7[16]);
  set_word(1,seg_7[16]);
  set_word(0,seg_7[16]);
	}


///******************ISD4002相关函数**********************///
//写16位命令加数据到4002
void wr_4002(unsigned int dat)
{unsigned char i;
	//cs_4002=1;
	sclk_4002=0;
	cs_4002=0;   //低电平使能
	for(i=0;i<16;i++)
	{mosi_4002=dat&0x0001;   //低位在前 高位在后
		sclk_4002=0;
		_nop_();
		_nop_();
		sclk_4002=1;   //上升沿锁存数据
		dat=dat>>1;    //准备输出下一位
		}
		sclk_4002=0;
		cs_4002=1;
	}

///录音函数  addr录音起始地址   time  延时=0.2*time 秒
void rec_4002(unsigned int addr,unsigned char time)
{           LED=0;
	    delay_ms(10);
	    wr_4002(POWERUP);  //上电录音
	    delay_ms(25);  //25毫秒
	    wr_4002(POWERUP);
	    delay_ms(50);  //50毫秒
	    wr_4002(addr|SETREC);   //设置录音地址
	    delay_10us(1);
	    wr_4002(REC);   //发开始录音命令
	    delay_200ms(time);  // 延时0.2*time 秒
            LED=1;
	    wr_4002(STOP);    //结束录音
	    delay_10us(1);
	    wr_4002(STOPPWRDN);  //节电
	}

///放音函数  addr放音起始地址   time  延时=0.2*time 秒
void play_4002(unsigned int addr,unsigned char time)
{           LED=0;
	    wr_4002(POWERUP);  //上电放音
	    delay_ms(25);  //25毫秒
	    wr_4002(addr|SETPLAY);
 	    delay_10us(1);
	    wr_4002(PLAY);
	    delay_200ms(time);
	    LED=1;
	    wr_4002(STOP);
	    delay_10us(1);
	    wr_4002(STOPPWRDN);  //节电
	}

///**********************主函数***********************///
void main()
{ 
  delay_200ms(4);
  ch451_initial();
  EA=1;
  number=1234;
  while(1)
  {
    if((P0&0xf0)!=0xf0)
    { delay_ms(30);
       if((P0&0xf0)!=0xf0)
         {  key_flag=1;
           switch(P0&0xf0)
           {case 0x70:
               key=1;break;
            case 0xb0:
               key=2;break;
            case 0xd0:
               key=3;break;
            case 0xE0:
               key=4;break;
            default:
               break;
            }
           while((P0&0xf0)!=0xf0);
           delay_ms(20);  //后沿去抖
          }
      }
    if(key_flag==1)
   {  key_flag=0;
      set_word(2,seg_7[key%10 ]);
      switch(key)
      {case 1:    //地址加1
       voice_add++;
       set_word(3,seg_7[16]);     //-
       set_word(1,seg_7[voice_add/10 ]);
       set_word(0,seg_7[voice_add%10 ]);
       break;
       case 2:    //地址减1
       voice_add--;
       set_word(3,seg_7[16]);  //-
       set_word(1,seg_7[voice_add/10 ]);
       set_word(0,seg_7[voice_add%10 ]);
       break;
       case 3:   //录音
        set_word(3,seg_7[19]);  //L   录音标志
        rec_4002(voice[voice_add],4);   //录0.8s
        break;
        case 4:  //放音
        set_word(3,seg_7[15]);  //F  放音标志
        play_4002(voice[voice_add],3);  //放0.6s
        break;
        default:
        break;
        }
    }
   delay_ms(40);
  }//while函数
}//主函数

⌨️ 快捷键说明

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