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

📄 dtmf.c

📁 DSP5000实验箱上完整的实验程序,很有参考价值
💻 C
字号:
/*DTMF.c   */
/*;the HPI space in our system
;0x8008	HPIC0      bit 7   6   5  4  3   2   1       0
;0X8009	HPIC1                           TL1  TL0    BIL
;0X800a	HPID0(AUTO)                  1    00  HPIC
;0X800b	HPID1(AUTO)                  1    01  HPID  (ATO)
;0X800c	HPIA0                        1    10  HPIA
;0X800d	HPIA1                        1    11  HPID (NO ATO)
;0X800e	HPID0(NO AUTO)
;0X800f	HPID1(NO AUTO)
;result is 0x1002=AA 0x1003=DD

;A0-->HBIL    HBIL
;A1-->HCNTL0  HCNTL0
;A2-->HCNTL1  HCNTL1
;A15-->HCS    }C_HCS
;A3-->
;other pins connection
;HAS-->1
;HDS1-->IOSTRB   IOSTRB
;HDS2-->1
;HINT-->INT0     INT0
;HREADY-->BREADY BREADY 
;HR/W-->R/W      R/W    
;###########################################################*/
#include "math.h"
#include "stdio.h"
//IO定义
ioport unsigned int port8000;
ioport unsigned int port8001;
ioport unsigned int port8008;
ioport unsigned int port8009;
ioport unsigned int port800a;
ioport unsigned int port800b;
ioport unsigned int port800c;
ioport unsigned int port800d;
ioport unsigned int port800e;
ioport unsigned int port800f;
//函数定义
extern void InitMcBSP0(void);
extern void ms_delay(int);
extern void send_0(void);
extern void send_1(void);
extern void send_2(void);
extern void send_end(void);
extern void INT3_ISR(void);
extern void InitC5402(void);
extern void write_command(void);
extern void write_data(void);
extern void OpenMcBSP(void);
extern void CloseMcBSP(void);
extern void READAD50(void);
extern void WRITEAD50(void);
extern void Int(void);
extern void init_lcm(void);
extern void ddram_clear(void);
interrupt void key_int();
void  gdram_clear(void);
void send_byte( unsigned char out_byte);
void write7279(unsigned int cmd,unsigned int dta);
void long_delay(void);
void short_delay(void);
void SetDAdress(unsigned int Daddr);
void SetDCdata(unsigned int Ddata0,unsigned int Ddata1);
void send_voice(void);
void TranDaToHPI(int *DPOINTER1);
void SenToLcd(unsigned int SData0,unsigned int SData1);
//***HD7279定义指令***
#define CMD_RESET 0xa4
#define CMD_TEST  0xbf
#define DECODE0 0x80
#define DECODE1 0xc8
#define CMD_READ 0x15
#define UNDECODE 0x90
#define RTL_CYCLE 0xa3
#define RTR_CYCLE 0xa2
#define RTL_UNCYL 0xa1
#define RTR_UNCYL 0xa0
#define ACTCTL 0x98
#define SEGON 0xe0
#define SEGOFF 0xc0
#define BLINKCTL 0x88
#define INPUT   0x111
#define AC0  0x80
#define AC1  0x90
#define AC2  0x88
#define AC3  0x98
#define pi 3.1415927
#define Length 102
#define Len 8
  
//变量定义
double x[Length],xc[Length],xr[Length];
double vk[Len][Length],vs1[Len],vs2[Len],v[3],s[Len],z[Len];
double vkn[Len][Length];
double fr0,fr1,fr2,fr3,fc0,fc1,fc2,fc3,fs,fr,fc;
double m1,m0,max1,max2;
int i,j,kong;
int *out = (int*)0x110;
unsigned int byteout;
unsigned int *a=(unsigned int *)0x0015;
unsigned char *data=(unsigned char *)0x121;
unsigned int temp;
unsigned int R0,R1,R2,R3;
unsigned char *DPTR;
int *DPOINTER;
int sedata[102];
unsigned char key_a=0x22,key_b=0x22;
int inkey=0x22;
unsigned int k=0,l=0,m=0,n=0;
unsigned char clear[64][16];
char high = 0,low = 0;
//主函数
void main(void)
{

	  fs = 8000;
  	  fr0 = 697.0;  fc0 = 1209.0;
  	  fr1 = 770.0;  fc1 = 1336.0;
  	  fr2 = 852.0;  fc2 = 1477.0;
  	  fr3 = 941.0;  fc3 = 1633.0;
  	  
  	  s[0] = fr0/fs;  s[4] = fc0/fs;
	  s[1] = fr1/fs;  s[5] = fc1/fs;
	  s[2] = fr2/fs;  s[6] = fc2/fs;
	  s[3] = fr3/fs;  s[7] = fc3/fs;
      for(i=0;i<64;i++)
      {
        for(j=0;j<16;j++)
          {
            clear[i][j]=0x0;
          }
      }
	  InitC5402(); /* initialize C5402 DSP */
 	  OpenMcBSP();
      Int();
      *a=0x08;
      write_command();
      //Clear Ddram
      *a=0x01;
      write_command();
      //Turn on Display
      *a=0x0c;
      write_command();
      SetDAdress(AC0);
      *data=0xbc;
      write_data();
      *data=0xfc;
      write_data();
      *data=0xd6;
      write_data();
      *data=0xb5;
      write_data();
      *data=0xcf;
      write_data();
      *data=0xd4;
      write_data();
      *data=0xca;
      write_data();
      *data=0xbe;
      write_data();
      *data=0xa3;
      write_data();
      *data=0xba;
      write_data();
      SetDAdress(AC1);
      //init_lcm();
      //ddram_clear();
      while (1)
   {                 
   
    	 switch(key_a)     //键值转换
	  	 {
	  	 case 0 : inkey=13;
	  	          break;
		 case 1 : inkey=12;
		          break;
		 case 2 : inkey=11;
		          break;
		 case 3 : inkey=10;
		          break;
		 case 4 : inkey=15;
		          break;
		 case 5 : inkey=9;
		          break;
		 case 6 : inkey=6;
		          break;
		 case 7 : inkey=3;
		          break;
		 case 8 : inkey=0;
		          break;
		 case 9 : inkey=8;
		          break;
	     case 10: inkey=5;
	              break;
	     case 11: inkey=2;
	              break;
	     case 12: inkey=14;
	              break;
	     case 13: inkey=7;
	              break;
	     case 14: inkey=4;
	              break;
	     case 15: inkey=1;
	              break;
	    }
	  	 switch(inkey)
	  	 {
	  	 case 0 : fr=fr3; fc=fc1; 
	  	          SenToLcd(0xa3,0xb0);
	  	          send_voice();
	  	          break;
		 case 1 : fr=fr0; fc=fc0;
		          SenToLcd(0xa3,0xb1);
		          send_voice();
		          break;
		 case 2 : fr=fr0; fc=fc1;
		          SenToLcd(0xa3,0xb2);
		          send_voice();
		          break;
		 case 3 : fr=fr0; fc=fc2;
		          SenToLcd(0xa3,0xb3);
		          send_voice();
		          break;
		 case 4 : fr=fr1; fc=fc0;
		          SenToLcd(0xa3,0xb4);
		          send_voice();
		          break;
		 case 5 : fr=fr1; fc=fc1;
		          SenToLcd(0xa3,0xb5);
		          send_voice();
		          break;
		 case 6 : fr=fr1; fc=fc2;
		          SenToLcd(0xa3,0xb6);
		          send_voice();
		          break;
		 case 7 : fr=fr2; fc=fc0;
		          SenToLcd(0xa3,0xb7); 
		          send_voice();
		          break;
		 case 8 : fr=fr2; fc=fc1;
		          SenToLcd(0xa3,0xb8);
		          send_voice();
		          break;
		 case 9 : fr=fr2; fc=fc2;
		          SenToLcd(0xa3,0xb9);
		          send_voice();
		          break;
	     case 10: fr=fr0; fc=fc3;

	              SenToLcd(0xa3,0xc1);
	              send_voice();
	              break;
	     case 11: fr=fr1; fc=fc3;
	              SenToLcd(0xa3,0xc2);
	              send_voice();
	              break;
	     case 12: fr=fr2; fc=fc3;
	     		  SenToLcd(0xa3,0xc3);
	     		  send_voice();
	              break;
	     case 13: fr=fr3; fc=fc3;
	              SenToLcd(0xa3,0xc4);
	              send_voice();
	              break;
	     case 14: fr=fr3; fc=fc0;
	              SenToLcd(0xa3,0xaa);
	              send_voice();
	              break;
	     case 15: fr=fr3; fc=fc2;
	              SenToLcd(0xa3,0xa3);
	              send_voice();
	              break;
	    }
   }

}    
void TranDaToHPI(int *DPOINTER1)
{
  //SET HPIC
 port8008=0x10;
 port8009=0x10;

 port800c=0x00;
 port800d=0x00;

 port8008=0x00;
 port8009=0x00;
 
//SET ADDRESS
 port800c=0x0f;
 port800d=0xff;
 kong=port800a;
 kong=port800b;
//SEND DATA
for(i=0;i<102;i++)
 {
 low = (char)(*DPOINTER1)&0xff;
 high = (char)(*DPOINTER1>>8)&0xff;
 port800a = high;
 port800b = low;
// port800a=*DPOINTER1/256;
// port800b=*DPOINTER1;

 DPOINTER1++;
 }
}
void send_voice(void)
{
       
       for (i=0; i<Length; i++)
	      {
	      	 xr[i] = sin(2*pi*fr*i/fs);
	  		 xc[i] = sin(2*pi*fc*i/fs);
	  		 x[i] = 1*(1.0*xc[i]+1.0*xr[i]);
	      }
          
          for (j=0; j<32; j++)
 	  	  {
		  	 for (i=0; i<Length; i++)
  		  	 {
	  		 	 *out = (int)(x[i]*16300.0);
	  			 WRITEAD50();  /* Tone output*/
	  	  	 }
	  	  }  
	  	  
	  	    
	  	  for(i=0;i<102;i++)
	  	  {
	          sedata[i]=(int)(16300.0*x[i]);
          }
          DPOINTER=&sedata[0];
          TranDaToHPI(DPOINTER);
          key_a=0x22;
          inkey=0x22;
}
 void send_byte( unsigned char out_byte) //发送8位的控制指令
{
	unsigned char i;
	send_0();
	for(i=0;i<8;i++)
	{
		if(out_byte&0x80)
		{
			send_1();

		}
		else
		{
			send_2();
		}
		out_byte=out_byte*2;
	}
}

void write7279(unsigned int cmd,unsigned int dta)//向7279写控制指令及数据
{
	unsigned char i;
	unsigned int cmddata;
	dta=(dta&0x00ff);
	cmddata=((cmd<<8)|dta);
	send_0();
for (i=0;i<16;i++)
{
	if(cmddata&0x8000)
	{
		send_1();
	}
	else 
	{
		send_2();
	}
	cmddata=cmddata*2;
}
	send_end();
}
void long_delay(void)    //长延时
{
	unsigned char i,j;
	for (i=0;i<0xff;i++)
	{
		for(j=0;j<0xeff;j++)
		{}
	}

}
void short_delay(void)  //短延时
{
    unsigned char i,j;
	for(i=0;i<0x10;i++)
	{  for(j=0;j<0x5ff;j++)
	{}
	}
}
void SenToLcd(unsigned int SData0,unsigned int SData1)
{
   	   init_lcm();
       *data=SData0;
       write_data();
       *data=SData1;
       write_data();
      
}
void SetDAdress(unsigned int Daddr)
{

   *a=Daddr;
  write_command();
}
interrupt void key_int() //按键中断服务子程序
{   
        asm(" SSBX INTM");
        asm(" STM #0xFFFF, IFR ");
        INT3_ISR();
        key_b=*(unsigned char *)0x16;
        if(key_b==0xff)
        {
        ;
        }
        else
        {
        key_a=key_b;
//        write7279(DECODE1,key_a);
        }
        asm(" STM #0x104, IMR ");
        asm(" RSBX INTM");
}

⌨️ 快捷键说明

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