📄 录放基本.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 + -