//使用89S52单片机,12M晶振
#include
#include<1602.h>
sbit ss=P0^0;
sbit mosi=P0^1;
sbit sclk=P0^2;
sbit int0=P0^3;
sbit rac=P0^4;
sbit key_stop=P3^7;//停止键
sbit key_rec=P3^5;//录音键
sbit key_play=P3^6;//放音键
uint rec_hang;//录音所用去的行数
void display()//显示函数 显示录音所用去的行数
{
uchar i;
uchar shu[]={'0','0','0','0'};
shu[0]=rec_hang/1000+'0';
shu[1]=rec_hang%1000/100+'0';
shu[2]=rec_hang%100/10+'0';
shu[3]=rec_hang%10+'0';
write_com(0x80);
//if(moden>=1)write_date('1');
for(i=0;i<4;i++)
{
write_date(shu[i]);
}
}
void send_8(uchar date)//仿SPI通信
{
uchar i;
//ss=1;如果不屏蔽掉该语句和下面的///ss=1;,且不另外在各子函数和
//指令后面加ss=1;,则4004不能从指定地址进行录放操作,而从其他某个地址
//进行操作,且按下停止键后,再按下放音键,4004会继续播放之前的音乐
//而不会从指定的地址进行放音
ss=0;//下降沿开始传输数据
sclk=0;
for(i=0;i<8;i++)
{
mosi=date&0x01;
sclk=1;
date>>=1;
sclk=0;
}
///ss=1;
}
void stop()
{
send_8(0x30);//停止信号的控制码
ss=1;
}
void power_up()
{
send_8(0x20);//上电信号的控制码
ss=1;
}
void setrec(uchar ad_high,uchar ad_low)//从指定地址开始录音 控制信号函数
{
send_8(ad_low);//发送低8位地址码
send_8(ad_high);//发送高8位地址码
send_8(0xa0);//发送8位控制码
ss=1;
}
void setplay(uchar ad_high,uchar ad_low)//从指定地址开始放音 控制信号函数
{
send_8(ad_low);//发送低8位地址码
send_8(ad_high);//发送高8位地址码
send_8(0xe0);//发送8位控制码
ss=1;
}
void record(uchar ad_high,uchar ad_low)//从某个地址录音
{
power_up();//上电
delay(27);
power_up();
delay(27);
delay(27);
setrec(ad_high,ad_low);//录音地址
send_8(0xb0);//从当前地址开始录音
ss=1;
}
void play(uchar ad_high,uchar ad_low)//从某个地址放音
{
power_up();//上电
delay(27);
setplay(ad_high,ad_low);//放音地址
send_8(0xf0);//从当前地址开始放音
ss=1;
}
void main()
{
init0();
while(1)
{
if(key_rec==0)//按下录音键,开始录音
{
while(key_rec==0);
record(0x00,0x00);
while(1)
{
if(rac){delay(200);rec_hang++;}//计算录音所用去的行数
if(key_stop==0)//如果按下停止键,则停止录音,并显示录音所用去的行数
{
while(key_stop==0);
stop();display();break;
}
}
}
if(key_play==0)//按下放音键,开始放音
{
while(key_play==0);
play(0x00,0x00);
while(int0);display();//这两条语句仅用来检测ISD4004放完一段音乐后int0脚产生下降沿,这两条语句可不用
}
if(key_stop==0)//按下停止键,停止录音或者放音
{
while(key_stop==0);
stop();
}
}
}
//1602液晶显示头文件
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs=P3^3;
sbit lcden=P3^2;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
lcdrs=0;
P2=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
lcdrs=1;
P2=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init0()
{
lcden=0;
write_com(0x38);//设置1602显示模式为5*7点阵
write_com(0x01);//清屏
write_com(0x0c);//开显示,不显示光标,光标不闪烁
write_com(0x06);//设置当读或写一个字符后,地址指针加一,且光标加一
//write_com(0x80);//设置写数据起始地址
}
上一篇:基于AT89S52的24C02使用
下一篇:基于51单片机的直流PTC热敏电阻恒温控制系统
推荐阅读最新更新时间:2024-03-16 15:17
设计资源 培训 开发板 精华推荐
- 【答题有奖】赛灵思工业与医疗专题有奖问答
- 永不过时的物联网解决方案 Intel带你6的飞起来!
- 易电源电源模块试用!
- 抢先体验NUCLEO家族新贵,ST STM32 NUCLEO-F091RC开发板28元包邮!
- 【EEWORLD第三十九届】2012年06月社区明星人物揭晓!
- 免费申请评测:1.3元起的国产USB和Touchkey单片机CH554评估板
- 带上速度与激情,晒出你的TI WEBENCH 得意之作!
- 智能家居当下趋势与挑战 泰科电子助力连接舒适未来
- 2022 Digi-Key KOL 视频系列:你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍
- 有奖活动“庖丁”解智能睡眠监测仪,一波“水军”来围观