从大二开始,喜欢上AVR,当时的AVR价格和51差不多,mega8的性价比尤其高.当然现在的AVR早已风景不再.不过本人当时编写的一些代码或许对一些朋友会有帮助,这里放出源码,给大家参考.源码都是实际测试过的,但是电路图和PCB,早已不见踪影(很多是在我自己的开发板上做的).所有源码都是基于CVAVR的(1.x版本的,在2.x上编译,好像会有错误).
第一个源码,是利用mega16驱动ISD4004录放音的.
源码如下:
#include <mega16.h>
#include <delay.h>
//4004接口
#define CS PORTB.0
#define SCLK PORTB.3
#define MOSI PORTB.1
//按键接口
#define STOPREC PINA.0
#define REC PINA.1
#define PLAY PINA.2
#define STOP PINA.3
//状态指示接口
#define LED PORTD.0
#define LED2 PORTD.2
/*----------------命令发送程序-------------------
功能:发送命令给4004
参数:commnd 命令代号
命令参考:
0x0c 停止命令
0x08 powerdown命令
0x04 powerup命令
-------------------------------------------------*/
void sendbyte(unsigned char commnd)
{
unsigned char t=0;
SCLK=0;
CS=0;//下降沿使能数据传输
for(t=0;t<8;t++)//发送一个比特的命令数据
{
SCLK=0;
MOSI=commnd&0x80;
SCLK=1;
commnd<<=1;
}
CS=1;//命令在cs上升沿开始执行
}
/*------------------录音程序----------------------
功能:从指定地址开始录音
参数:address 指定录音地址的开始位置
注:address的范围必须从0-2400选一个(对于4004)
-------------------------------------------------*/
void REC4004(unsigned int address)
{
unsigned char i;
sendbyte(0x04);//发送powerup命令
delay_ms(25);//上电延时
sendbyte(0x04);//发送powerup命令
delay_ms(50);//上电延时(两倍)
SCLK=0;
CS=0;//命令转换期间CS必须为0
for(i=0;i<16;i++)//发送十六位地址
{
SCLK=0;
MOSI=address&0x0001;
SCLK=1;
address>>=1;
}
sendbyte(0x05);//发送setrec命令
sendbyte(0x0d);//发送rec命令
//以下部分用来处理录音期间的问题
while(STOPREC)LED=0;//开启指示灯
LED=1;
//处理完毕
sendbyte(0x0c);//发送停止命令
sendbyte(0x08);//发送powerdown命令
}
/*------------------放音程序----------------------
功能:从指定地址开始放音
参数:address 指定放音地址的开始位置
注:address的范围必须从0-2400选一个(对于4004)
-------------------------------------------------*/
void PLAY4004(unsigned int address) //语音播放
{
unsigned char i;
sendbyte(0x04);//发送powerup命令
delay_ms(25);//上电延时
SCLK=0;
CS=0;
for(i=0;i<16;i++)//发送十六位地址
{
SCLK=0;
MOSI=address&0x0001;
SCLK=1;
address=address>>1;
}
sendbyte(0x07);//发送setplay命令
sendbyte(0x0f);//发送play命令
}
void main()
{
DDRB=DDRD=0XFF;
PORTB=PORTD=0Xff;
DDRA=0X00;
PORTA=0XFF;
while(1)
{
if(REC==0)REC4004(0);//录音
if(PLAY==0)
{
  LAY4004(0);//放音
LED2=0;
while(STOP){LED2=!LED2;delay_ms(200);}
sendbyte(0x0c);//停止
sendbyte(0x08);//掉电
LED2=1;
}
}
} |