⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yunying.c

📁 实现语音的采集和回放
💻 C
字号:
#include "yunying.h"
#define dat XBYTE[0x0000]

 void delay(unsigned char time)                    /*延时函数*/                 
{
   unsigned char i,j;
   for(i=0;i<time;i++)
   for(j=0;j<10;j++);
} 

unsigned char receive()                 /*接收函数 */
{
 unsigned char i;
 unsigned char t;
 unsigned char rev=0x00;
 unsigned char con_or_dat=0x15;            //0x15:读指令
  cs=0;                                     //片选,读键值
  clk=0;
delay(1);
for(i=0;i<8;i++)
{
    if((con_or_dat&0x80)==0x80)            //发送读命令
    	dio=1;
    else
    	dio=0;
    clk=1;
    delay(1);
    clk=0;
    con_or_dat =con_or_dat<<1;  
    delay(2);
   
}  
   dio=1;
 for(t=0;t<8;t++)                          //读键值
 {
    delay(1);
    clk=1;
    delay(1);
   
    if(dio==1)
	rev=rev|0x01;
	
    rev =rev<<1;
    clk=0;
    delay(1);
 } 
   dio=0;
   cs=1; 
   return rev;
}

void externserver0(void) interrupt 0       /*外部中断服务程序*/
{    
    EX0 = 0;                               //关外部中断
    ctr=0xff;                              //复位
    ctr=(receive())>>1;                    //接收键值
    
    
}
 
 
 void clockserver0(void) interrupt 1         /*定时器中断服务程序*/
{ 
	TH0=0xff;
	TL0=0xa6;
	P0=0xff;                                //复位
	oe=1;                                   //ad输出使能               
	oe=1;
	adin=P0;                                //将ad转换结果存入单片机       
    oe=0;                                   //关闭ad输出

	ad_start=1;                             //启动ad转换
	ad_start=0;
		
	P0=0xff;                                  //复位
	*p=adin;                                 //写入ram
	p++;                                     //地址加
	 if(p==0xffff)
		{
			p=&dat;                           //地址赋初值
			TR0=0;
			sendcad(0xe0,61);
		}

	
 
}
 void clockserver1(void) interrupt 3
 {
 
	TH1=0xff;
	TL1=0x9a;
	P0=0xff;          //复位
	    dac_cs=1;                        	  
		dain=*p;                            //ram数据读出单片机 
		P0=dain;                            //写到da输入口		
		dac_cs=0;                           //da输出使能
		p++;                                 //地址加

	if(p==0xffff)
		{
			p=&dat;                          //地址赋初值 可以循环赋值
			
		}
 }
 
void send(unsigned char con_or_dat)      /*发送控制&数据函数*/
{
    unsigned char i;
    EX0=0;                            //关外部中断
	cs = 0;                            //片选 
	delay(5);
	clk=0;
 for(i=0;i<8;i++)                 
{
    if((con_or_dat&0x80)==0x80)             
      dio=1;
    else
      dio=0;
    clk=1;
    delay(1);
    clk=0;
    con_or_dat =con_or_dat<<1;  
    delay(1);
   
}
  
  dio=0;
  cs=1;                            
  delay(2);
  EX0=1;                                                    // 开外部中断
}      
      

void sendcad(unsigned char con,unsigned char con_or_dat)      /*发送控制&数据函数*/
{
 unsigned char i;
 
  EX0=0;                                                     //关外部中断
  cs = 0;
  delay(1);
  clk=0;
 for(i=0;i<8;i++)                                             //发指令
 {
    if((con&0x80)==0x80)
      dio=1;
     else
       dio=0;
    clk=1;
    delay(1);
    clk=0;
    con =con<<1;  
    delay(1);   
 }
   
  for(i=0;i<8;i++)                                   //发数据
  {
   if((con_or_dat&0x80)==0x80)
     dio=1;
   else
     dio=0;  
    clk=1;
    delay(1);
    clk=0;
    con_or_dat = con_or_dat<<1;  
    delay(1);    
  }
  EX0=1;
  cs=1;
}  
void initial(void)
	{
   
   	 TMOD=0x11;                 //定时计数器0,定时计数器1   方式1
	 TH0=0xff;
     TL0=0xa9;                  // 可以适当调整
     TH0=0xff;
     TL0=0x9a;                  //

     cs=1;                         /*初始化*/
     dio=1;
     key=1;  
     clk = 0;                   

     oe=0;
     ad_start=0;
     dac_cs=1;

     delay(3);
     IT0=1;
     ET0 = 1;                  //开定时器中断0
     EX0 = 1;                 //开外部中断
     ET1 = 1;                  //开定时器中断1
     EA  = 1;  
     send(0xbf);
    }
void main(void)
{
 initial();       

 while(1)
  {                   
     switch(ctr)
			{
		    	case 0x0d:        //写入ram
		    	      send(0xa4);
		    	      p=&dat;      //地址赋初值	
		    	      sendcad(0xe0,63);			                         
                      TR0 =1;      //开定时器0中断
                     ad_start=1;//启动AD转换
			         ad_start=0;
			           ctr=0xff;
			           EX0=1;
			           
	                  break;

                case 0x0c:       //从ram读出数据
                      send(0xa4);
                      p=&dat;       //地址赋初值		
                      sendcad(0xe0,60);
                       TR1=1;       //开定时器1中断       
                      ctr=0xff;
                        EX0=1;
                      break;
                case 0x0e:
                        send(0xbf);
                        TR0=0;      //关定时器0中断   
                        TR1=0;      //关定时器1中断   
                          ctr=0xff;
                        EX0=1;
                      break;

	            default:
	                   EX0 =1; 
	                   break;

	          } 
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -