//*************************************** //采用DPCM压缩编码算法对采样得到的 //数字量进行压缩编码,以达到节省存 //储空间延长录音时间的目的.预计每片 //SRAM可存储8s(32KB RAM)的录音数据 //Date: 2010.11.10 //*************************************** #include #include #include //SRAM引脚 //片选端由74LS138引出 sbit SRAMWE = P3^6; sbit SRAMOE = P3^7; //P0、P2^0~P2^6充当地址线 //ADC0809引脚 sbit EOC = P3^3; sbit ADCST= P3^4; sbit ADCOE= P3^5; //74HC573引脚 sbit LE=P3^0; //74LS138引脚 sbit LSA0 = P1^0; sbit LSA1 = P1^1; sbit LSA2 = P1^2; sbit LSOE = P1^3; void main() { int addr; unsigned char page; char temp,temp1=0,getdata1=0,getdata2; //temp用于存储差分值 //getdata1用于存储上次采样值 //getdata2用于存储当次采样值 SRAMOE=1; SRAMWE=1; ADCST=0; ADCST=1; //启动AD转换 ADCST=0; //******************* while(EOC==0); //等待AD转换结束 ADCOE=1; //允许数据输出 ADCOE=0; ADCST=0; ADCST=1; //启动AD转换 ADCST=0; //******************* while(EOC==0); //等待AD转换结束 ADCOE=1; //允许数据输出 ADCOE=0; ADCST=0; ADCST=1; //启动AD转换 ADCST=0; //******************* while(EOC==0); //等待AD转换结束 ADCOE=1; //允许数据输出 ADCOE=0; LE=0; //A/D转换前先不选定存储地址 for(page=0;page<4;page++) { P1=(0xf8|page); for(addr=0;addr<0x7fff;addr++) { P0=0xff; //***将P0设置为输入 ADCST=1; //启动AD转换 ADCST=0; //******************* while(EOC==0); //等待AD转换结束 ADCOE=1; //允许数据输出 getdata2=P0; //转换数据先放入getdata2中 ADCOE=0; temp1=getdata2-getdata1; getdata1=getdata2; if((temp1>=0)&&(temp1<=7)) //将较早的数据放在高位 temp=temp1<<4; else if((temp1>=-7)&&(temp1<0)) temp=((abs(temp1)|0x08)<<4); else if(temp<-7) temp=((7|0x08)<<4); else temp=0x70; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); P0=0xff; //***将P0设置为输入 ADCST=1; //启动AD转换 ADCST=0; //******************* while(EOC==0); //等待AD转换结束 ADCOE=1; getdata2=P0; //转换数据先放入getdata2中 ADCOE=0; temp1=getdata2-getdata1; getdata1=getdata2; if((temp1>=0)&&(temp1<=7)) temp+=temp1; else if((temp1>=-7)&&(temp1<0)) temp+=(abs(temp1)|0x08); else if(temp<-7) temp+=0x0f; else temp+=7; P0=(addr&0xff); P2=(addr>>8)&0xff; LE=1; LE=0; SRAMWE=0; //将数据写入指定地址处 P0=temp; SRAMWE=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } } while(1); }