//C8051F330控制ISD4004实现语音录放和控制在任意地址开始放音程序;
//程序在硬件电路上实现;硬件SPI控制,3线式SPI模式;
//硬件端口连接关系:SPI连接关系:SCK=P00,MISO=P01,MOSI=P02;
//硬件端口连接关系:液晶连接关系:E_CLK=P16,RW_SID=P17;
//2011-8-25
#include<c8051f330.h> //包涵f330的头文件
#include<intrins.h> //基本函数用的头文件,包涵_nop_()函数
#define uint unsigned int //对部分字符进行伪定义
#define uchar unsigned char //对部分字符进行伪定义
#define SYSCLK 22118400 //系统时钟的频率大小
#define CHIP_SELECT CS=0, _nop_(), _nop_(), _nop_(), _nop_(), _nop_(), _nop_(),_nop_(), _nop_(), _nop_(); //芯片选择口使能,选择芯片
#define CHIP_NOSELECT CS=1, _nop_(), _nop_(), _nop_(), _nop_(), _nop_(), _nop_(),_nop_(), _nop_(), _nop_(); //芯片选择口不使能,不选择芯片
uint code digit1[]={0xA3B0,0xA3B1,0xA3B2,0xA3B3,0xA3B4,0xA3B5,0xA3B6,0xA3B7,0xA3B8,0xA3B9}; //液晶对应0123456789,数字为没加粗的
uint code digit2[]={0x3000,0x3100,0x3200,0x3300,0x3400,0x3500,0x3600,0x3700,0x3800,0x3900}; //液晶对应0123456789,数字为加粗的
//***********************************************************************//
uchar KEY_FLAG=0;
//***********************************************************************//
sbit INT=P0^7; //外部中断0的对应端口,作为输入口使用
sbit Key1=P1^0; //输入端口,按键口Key1
sbit Key2=P1^1; //输入端口,按键口Key2
sbit Key3=P1^2; //输入端口,按键口Key3
sbit Key4=P1^3; //输入端口,按键口Key4
sbit Key5=P1^4; //输入端口,按键口Key5
sbit Key6=P1^5; //输入端口,按键口Key6
sbit E_CLK=P1^6; //同步时钟输入口
sbit RW_SID=P1^7; //串行数据输入、输出口
sbit CS = P2^0;
//***********************************************************************//
void WDT_Init(void); //看门狗的初始化申明
void PORT_Init(void); //端口初始化函数
void SYSCLK_Init(void); //系统时钟初始化函数
//***********************************************************************//
void SPI0_Init(void); //SPI初始化函数,设置SPI工作方式等数据
void SPIWrOne(uchar ch); //SPI写一个数据的函数;实现写一个字节的数据
void SPIWrThree(uchar addl, uchar addh, uchar COM); //SPI写3个字节的数据函数,实现写3个字节的数据
//***********************************************************************//
void Delay_us(uint N); //延时若干us函数申明,通过示波器校验,基本稳定准确
void Delay_ms(uint N); //延时若干ms函数申明,通过示波器校验,基本稳定准确
void Delay_s(uint N); //延时若干 s函数申明,通过示波器校验,基本稳定准确
//***********************************************************************//
void INT01_Init(void); //外部中断01的初始化函数
uchar KEY_Scanf(void); //键盘扫描函数
//***********************************************************************//
void Write_OneByte(uchar dat); //串行液晶写一个字节函数申明
void Write_Com(uchar dat); //串行液晶写指令函数申明
void WriteDatas(uchar dat); //串行液晶写数据函数申明
void Display(uchar x_add,uint dat); //串行液晶显示函数申明
void LCD_Init(void); //12864 初始化函数申明
void Display_Two_Byte(uchar add,uint digit); //显示一个16位的二进制数字,范围是0~65535
void Display_Play_adr(void); //显示“放音地址:”汉字
void Display_Rec_adr(void); //显示“录音地址:”汉字
//***********************************************************************//
void main(void) //主函数
{
WDT_Init(); //看门狗的初始化调用
PORT_Init(); //端口初始化函数调用
SYSCLK_Init(); //系统初始化函数调用
Delay_ms(5); //适当延时,等待系统稳定
SPI0_Init(); //SPI初始化
INT01_Init(); //外部中断01的初始化
LCD_Init(); //液晶初始化
Delay_ms(100); //液晶初始化延时,等待液晶稳定
Display_Play_adr(); //显示“放音地址:”几个字
Display_Rec_adr(); //显示“录音地址:”几个字
SPIF=0; //SPI中断标志位清0
P0=0XFF; //P0口设置为输入口
while(1)
{
SPIF = 0; //SPI中断标志位清0
CHIP_SELECT;
SPIWrOne(0x04); //上电
CHIP_NOSELECT;
Delay_ms(25); //延时25ms
CHIP_SELECT;
SPIWrOne(0x04); //上电
CHIP_NOSELECT;
while(Key1==1) //等待按键的来临才开始录音;
;
Display_Two_Byte(0x98,0x0100); //显示一个16位的二进制数字,范围是0~65535
Delay_ms(25); //延时25ms
SPIWrThree(0x00,0x01,0x05); //设置录音起始地址为0100h
Delay_ms(25); //延时25ms
CHIP_SELECT;
SPIWrOne(0x0d); //设置为连续录音方式
CHIP_NOSELECT;
Delay_s(180); //延时10s
CHIP_SELECT;
SPIWrOne(0x0c); //停止 录音
CHIP_NOSELECT;
Delay_ms(25); //延时25ms
while(1)
{
CHIP_SELECT;
SPIWrOne(0x04); //上电
CHIP_NOSELECT;
Delay_ms(25); //延时25ms
Display_Two_Byte(0x90,0x0100); //显示一个16位的二进制数字,范围是0~65535
SPIWrThree(0x00,0x01,0x07); //设置放音起始地址为0100h
Delay_ms(25); //延时25ms
CHIP_SELECT;
SPIWrOne(0x0f); //设置为连续放音模式
CHIP_NOSELECT;
Delay_s(90); //延时10s
CHIP_SELECT;
// SPIWrOne(0x0c); //停止放音
CHIP_NOSELECT;
CHIP_SELECT;
SPIWrOne(0x04); //上电
CHIP_NOSELECT;
Delay_ms(25); //延时25ms
Display_Two_Byte(0x90,0x0110); //显示一个16位的二进制数字,范围是0~65535
SPIWrThree(0x10,0x01,0x07); //设置放音起始地址为0100h
Delay_ms(25); //延时25ms
CHIP_SELECT;
SPIWrOne(0x0f); //设置为连续放音模式
CHIP_NOSELECT;
Delay_s(90); //延时10s
CHIP_SELECT;
//SPIWrOne(0x0c); //停止放音
CHIP_NOSELECT;
CHIP_SELECT;
SPIWrOne(0x04); //上电
CHIP_NOSELECT;
Delay_ms(25); //延时25ms
Display_Two_Byte(0x90,0x0120); //显示一个16位的二进制数字,范围是0~65535
SPIWrThree(0x20,0x01,0x07); //设置放音起始地址为0120h
Delay_ms(25); //延时25ms
CHIP_SELECT;
SPIWrOne(0x0f); //设置为连续放音模式
CHIP_NOSELECT;
Delay_s(90); //延时10s
CHIP_SELECT;
//SPIWrOne(0x0c); //停止放音
CHIP_NOSELECT;
}
}
}
//**************************************************************外部中断0,中断标志位为IE0
void ISR_INT0(void) interrupt 0
{
KEY_FLAG=KEY_Scanf();
}
//**************************************************************
void WDT_Init(void)
{
PCA0MD&=~0x40; //禁止看门狗定时器
}
void SYSCLK_Init(void)
{
/*内部高频振荡器H-F的控制,该振荡器的标称频率为24.5MHz*/
//OSCICN=0x80;//内部振荡器8分频,频率24.5/8=3.0625M,时钟周期为0.3265us。经过示波器实际测量的频率约为3.08M,周期为324ns左右;
//OSCICN=0x81;//内部振荡器4分频,频率24.5/4=6.125M,时钟周期为0.1632us。经过示波器实际测量的频率约为6.16M,周期为162ns左右;
//OSCICN=0x82;//内部振荡器2分频,频率24.5/2=12.5M,时钟周期为0.08us。经过示波器实际测量的频率约为12.38M,周期为81ns左右;
//OSCICN=0x83;//内部振荡器不分频,频率24.5M,时钟周期为0.04us。经过示波器实际测量的频率约为24.7M,周期为40.5ns左右;
//while(OSCICN&0x40==0)
// ;
//CLKSEL=0x00;//CLKSEL=0x00;CLKSEL=0x01;CLKSEL=0x10分别对应系统时钟选择内部高频振荡器,外部振荡器和内部低频振荡器
/*内部低频振荡器L-F的控制,该振荡器的标称频率为80KHz*/
//OSCLCN=0x80;//内部振荡器运行在低频最高速,使用其8分频,经过示波器实际测量的频率约为14.06K,周期为71.06us左右;
//OSCLCN=0x81;//内部振荡器运行在低频最高速,使用其4分频,经过示波器实际测量的频率约为28.13K,周期为35.55us左右;
//OSCLCN=0x82;//内部振荡器运行在低频最高速,使用其2分频,经过示波器实际测量的频率约为56.27K,周期为17.78us左右;
//OSCLCN=0x83;//内部振荡器运行在低频最高速,不分频,经过示波器实际测量的频率约为112.5K,周期为8.888us左右;
//while(OSCLCN&0x40==0)
// ;
//CLKSEL=0x02;//CLKSEL=0x00;CLKSEL=0x01;CLKSEL=0x10分别对应系统时钟选择内部高频振荡器,外部振荡器和内部低频振荡器
/*外部振荡器晶振控制*/
///*
uint i = 0;
OSCXCN=0x67; //01100110 选用外部晶体震荡器,不分频。分不分频由位4决定。为1二分频,为0不分频,通常使用22.1184M的晶振;
//经过示波器实际测量的频率约为22.12M,周期为45.3ns左右;
for (i=0;i<3000;i++); // 等待振荡器稳定
语音处理芯片ISD4004完整程序
需积分: 50 47 浏览量
2011-11-26
23:46:36
上传
评论 3
收藏 49KB RAR 举报
xiongjinyan
- 粉丝: 6
- 资源: 32
最新资源
- asp代码ASP基于WEB楼宇专业网站毕业设计(源代码+论文)
- 九宫重排.docx 验证重排后的九宫格是否满足所有条件,包括每行、每列和每个子区域的目标和值相等,以及是否包含1到9的所有数字
- asp代码ASP基于WEB聊天室的设计与实现(源代码+论文+任务书)
- 质数的判断条件.docx
- android-ocr-master,android-ocr-master
- asp代码ASP基于WEB教学评估系统设计(源代码+论文)
- asp代码ASP基于WEB购物系统(论文+源代码+开题报告+答辩PPT+操作说明)
- quartus ii安装教程.docx
- 基于Django框架的后台管理系统设计源码
- 众数问题.docx "众数"是统计学中的一个概念,指的是一组数据中出现次数最频繁的值
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈