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

📄 main.c

📁 MSP430单片机开发ISDN4004语音录放系统C语言程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <MSP430x14x.h> 
#include "SPI.h" 
#include "ISD4004.h" 
 
//定义全局变量 
static char nPlay;//PLAY按键 
static char nRec;//REC按键 
static char nPlay_count;//PLAY按键次数 
static char nRec_count;//REC按键次数 
static char nVOF;//ISD4004 INT中断标志 
 
//定义串口操作变量 
char nRev_UART0;//串口 0 的接收标志 
unsigned char UART0_TX_BUF[20];// 串口 0 的发送缓冲区 
unsigned char UART0_RX_BUF[20];// 串口 0 的接收缓冲区 
static int nTX0_Len;//发送数据长度 
static int nRX0_Len;//接收数据长度
static int RAC_count;//通过RAC测量语段的长度 
int nRX0_Len_temp; 
static char nTX0_Flag;//发送完成标志 
int nSend_TX0;//发送记数器 
void AvodshekP(void);
void AvodshekR(void);
void Init_UART0(void);
int nRec_Row; 
int nPlay_Row[3]; 
int nPlay_cnt;
int i;
 
 
void main() 
{ 

    WDTCTL = WDTPW + WDTHOLD;   // 关闭看门狗 
    _DINT();//关闭中断 
    // 初始化 
    Init_CLK(); 
    PORT_Init(); 
 //   SPI_Init(); 
    Init_UART0();
     
    nPlay = 0; 
    nRec = 0; 
    nPlay_count = 0; 
    nRec_count = 0; 
    nRec_Row = 0; 
    nPlay_Row[0] = 100;
    nPlay_Row[1] = 200;
    nPlay_Row[2] = 250;
    nPlay_cnt=0;    
    _EINT();//打开中断 

     
    for(;;) 
    { 
    	// 放音的处理     	
        if((nPlay == 1) && (nPlay_count == 1)) 
        { 
            // 放音
            SPI_Init(); 
            RAC_count=0;
            Play(nPlay_Row[nPlay_cnt]);
     //       nPlay_Row[0]+=5; 
     //       i=RAC_count;//测试数组长度
            nPlay_cnt += 1; 
            if(nPlay_Row[nPlay_cnt] >= 2400) nPlay_cnt = 0; 
            if (nPlay_cnt>2) nPlay_cnt=0;
            Init_UART0();
        } 
        // 录音的处理 
        if((nRec == 1) && (nRec_count == 1)) 
        { 
            SPI_Init(); // 录音 
            Record(nPlay_Row[nPlay_cnt]);
            nPlay_cnt+=1; 
            nRec_Row += 1; 
            if(nRec_Row >= 2400) nRec_Row = 0; 
            Init_UART0();
        } 
    
        Delay_us(10); 
    } 
 
} 

void AvodshekR()
{
  if((P1IN&BIT5)==0)
  {
    Delay_ms(10);
    if((P1IN&BIT5)==0)
    {
      Delay_ms(10);
      if((P1IN&BIT5)==0)
      {
        Delay_ms(10);
        if((P1IN&BIT5)==0) 
        {
          Delay_ms(10);
          if((P1IN&BIT5)==0)  Delay_us(100);
          return;      	                  	
        }
      }
    }
  }
  P1IFG &= ~(BIT5);   // 清除中断标志位
  return;
}

void AvodshekP()
{
  if((P1IN&BIT4)==0)
  {
    Delay_ms(10);
    if((P1IN&BIT4)==0)
    {
      Delay_ms(10);
      if((P1IN&BIT4)==0)
      {
        Delay_ms(10);
        if((P1IN&BIT4)==0) 
        {
          Delay_ms(10);
          if((P1IN&BIT4)==0) Delay_us(100);
          return;
        }
      }
    }
  }
  P1IFG &= ~(BIT4); // 清除中断标志位
  return;
}
      
       
  
// 字节的比特顺序高低交换 
unsigned char ByteSwap(unsigned char chrIn) 
{ 
    unsigned char chrTemp; 
    unsigned char chrOut; 
    int i; 
 
    chrOut = 0; 
    for(i = 0;i < 8;i++) 
    { 
	    chrTemp = (chrIn & 0x80) >> 7; 
	    chrIn <<= 1; 
	    if(chrTemp == 1) 
	    { 
	        chrOut |= (chrTemp << i); 
	    }	 
    } 
    return chrOut; 
} 
//片选信号置低 
void SS_Enable(void) 
{ 
    // 置低电平 
    P3OUT &= ~(BIT0); 
    _NOP(); 
    _NOP(); 
    return; 
} 
//片选信号置高 
void SS_Disable(void) 
{ 
    // 置高电平 
    P3OUT |= BIT0; 
    _NOP(); 
    _NOP(); 
    return; 
} 
// 发送上电指令 
void PowerUp(void) 
{ 
    unsigned char code; 
 //   SS_Enable();
     
    //上电命令 
    code = 0x04; 
    // 发送命令码 
    SendOpCode(code); 
 //   SS_Disable();
     
    return; 
} 
// 发送掉电指令 
void PowerDown(void) 
{ 
    unsigned char code; 
 //   SS_Enable();
     
    //掉电命令 
    code = 0x08; 
    // 发送命令码 
    SendOpCode(code); 
 //   SS_Disable();
     
    return; 
} 
// 发送停止命令 
void Stop(void) 
{ 
    unsigned char code; 
 //   SS_Enable();
     
    //停止命令 
    code = 0x08; 
    // 发送命令码 
    SendOpCode(code); 
 //   SS_Disable();
     
    return; 
} 
// 放音操作 
void Play(int nAddr) 
{ 
    int i; 
    unsigned char code; 
 //   SS_Enable();
     
    // 发送加电指令 
    PowerUp(); 
    // 延时25ms以上 
    Delay_ms(100); 
     
    // 发送地址信息 
    SendAddr(nAddr); 
     
    // 发送SETPLAY命令 
    code = 0x07; 
    SendOpCode(code); 
     
    // 发送PLAY命令 
 //   Delay_ms(30); 
 //   SendAddr(nAddr);
    code = 0x0F; 
    SendOpCode(code); 
     
    // 处理结束 
    for(;;) 
    { 
        // 如果发生溢出的时候则结束放音 
        if(nVOF == 1) 
    	{ 
    	    nVOF = 0;//清除中断标志变量 
    	    // 发送停止命令             
            Stop(); 
            // 延迟一点时间 
            for(i = 0;i < 100;i++) ; 
           
            break; 
    	} 
    	// 如果第2次按下放音键,则结束放音 
        if((nPlay == 0) && (nPlay_count == 2)) 
    	{ 
    	    nPlay_count = 0;//清除按键次数记录变量 
    	    // 发送停止命令             
            Stop(); 
            // 延迟一点时间 
            for(i = 0;i < 100;i++) ; 
             
            break; 
    	} 
    	 
    } 
    
    // 发送掉电指令 
    PowerDown(); 
    // 延迟一段时间 
  //  SS_Disable();
    Delay_ms(30); 
    nPlay_count = 0;//清除按键次数记录变量 
    nPlay=0; 
    return; 
} 
// 录音操作 
void Record(int nAddr) 
{ 
    int i; 
    unsigned char code; 
 //   SS_Enable();
     
    // 发送加电指令 
    PowerUp(); 
    // 延时25ms以上 
    Delay_ms(30); 
    // 再次发送加电指令 
    PowerUp(); 
    // 延时25ms以上 
    Delay_ms(30); 
    // 延时25ms以上 
    Delay_ms(30); 
     
    // 发送地址信息 
    SendAddr(nAddr); 
     
    // 发送SETREC命令 
    code = 0x05; 
    SendOpCode(code); 
     
    // 发送REC命令 
    code = 0x0D; 
    SendOpCode(code); 
     
    // 处理结束 
    for(;;) 
    { 
        // 如果发生溢出的时候则结束录音 
        if(nVOF == 1) 
    	{ 
    	    nVOF = 0;//清除中断标志变量 
    	    // 发送停止命令             
            Stop(); 
            // 延迟一点时间 
            for(i = 0;i < 100;i++) ; 
             
            break; 
    	} 
    	// 如果第2次按下录音键,则结束录音 
        if((nRec == 0) && (nRec_count == 2)) 
    	{ 
    	    nRec_count = 0;//清除按键次数记录变量 
    	    // 发送停止命令             
            Stop(); 
            // 延迟一点时间 
            for(i = 0;i < 100;i++) ; 
             
            break; 
    	} 
    	 
    } 
     
    // 发送掉电指令 
    PowerDown(); 
    // 延迟一段时间 
 //   SS_Disable();
    Delay_ms(30); 
    nRec_count = 0;//清除按键次数记录变量 
    return; 
} 
// 发送地址信息 
void SendAddr(int nAddr) 
{ 
    int i; 
    unsigned char chrHi; 
    unsigned char chrLow; 
    // 片选使能 
    SS_Enable(); 
    // 分别取出高、低字节 
    chrHi = (unsigned char)((nAddr & 0xff00) >> 8); 
    chrLow = (unsigned char)(nAddr & 0x00ff); 
    for(i = 100;i > 0;i--) ; //延迟一点时间 

⌨️ 快捷键说明

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