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

📄 main.c

📁 MSP430单片机开发ISDN4004语音录放系统C语言程序
💻 C
📖 第 1 页 / 共 2 页
字号:
    //字节的高低顺序变换 
    chrHi = ByteSwap(chrHi); 
    //字节的高低顺序变换 
    chrLow = ByteSwap(chrLow);
 //   chrLow = 0x00;
 //   chrHi = 0x00;     //更换地址依然没有作用,
     
    UART0_TX_BUF[0] = chrLow;//低地址字节 
    UART0_TX_BUF[1] = chrHi;//高地址字节 
    nTX0_Len = 2; 
    IFG1 |= UTXIFG0; // 设置中断标志,进入发送中断程序 
     
    for(i = 100;i > 0;i--) ; //延迟一点时间 
    while(1)// 等待缓冲区里的数据发送完毕 
    { 
        if(nTX0_Flag == 1) break; 
    } 
    // 片选禁止 
    SS_Disable(); 
     
    return; 
} 
// 发送命令码 
void SendOpCode(unsigned char code) 
{ 
    // 片选使能 
    SS_Enable(); 
    for(int i = 100;i > 0;i--) ; //延迟一点时间 
 //   code = ByteSwap(code);
    UART0_TX_BUF[0] = code;//发送命令 
    nTX0_Len = 1; 
    IFG1 |= UTXIFG0; // 设置中断标志,进入发送中断程序 
     
    for(int i = 100;i > 0;i--) ; //延迟一点时间 
    while(1)// 等待缓冲区里的数据发送完毕 
    { 
        if(nTX0_Flag == 1) break; 
    } 
    // 片选禁止 
    SS_Disable(); 

} 

 
//////////////////////////////////////// 
// 处理来自串口 0 的接收中断 
//interrupt [UART0RX_VECTOR] void SPI0_RX_ISR(void) 
#pragma vector=UART0RX_VECTOR
__interrupt void SPI0_RX_ISR (void)
{ 
   if (U0CTL & BIT2)    //SYNC=1,同步SPI
   {
    UART0_RX_BUF[nRX0_Len_temp] = RXBUF0;//接收来自的数据 
     
    nRX0_Len_temp += 1; 
    //接收满10个设置标志 
    if(nRX0_Len_temp >= 10) 
    { 
        nRX0_Len = nRX0_Len_temp; 
        nRev_UART0 = 1; 
        nRX0_Len_temp = 0; 
    }
   }
   else             //异步UART
   {
    UART0_RX_BUF[nRX0_Len_temp] = RXBUF0;   //接收来自的数据   
    switch (UART0_RX_BUF[nRX0_Len_temp])
    {
      case 0x11:nPlay=1;nPlay_count=1;nPlay_cnt=0;break;
      case 0x12:nPlay=1;nPlay_count=1;nPlay_cnt=1;break;
      case 0x13:nPlay=1;nPlay_count=1;nPlay_cnt=2;break;
      case 0x01:nRec=1;nRec_count=1;nPlay_cnt=0;break;
      case 0x02:nRec=1;nRec_count=1;nPlay_cnt=1;break;
      case 0x03:nRec=1;nRec_count=1;nPlay_cnt=2;break;
      default:nRX0_Len_temp=0;
    }
    nRX0_Len_temp += 1;   
   
    if(UART0_RX_BUF[nRX0_Len_temp - 1] == 13)      //??
    {   
        nRX0_Len = nRX0_Len_temp;   
        nRev_UART0 = 1;   
        nRX0_Len_temp = 0;   
    }   
  }  
      
}


//////////////////////////////////////// 
// 处理来自串口 0 的发送中断 
//interrupt [UART0TX_VECTOR] void SPI0_TX_ISR(void) 
#pragma vector=UART0TX_VECTOR
__interrupt void SPI0_TX_ISR (void)
{ 
    if(nTX0_Len != 0) 
    { 
    	nTX0_Flag = 0;	// 表示缓冲区里的数据没有发送完 
    	 
    	TXBUF0 = UART0_TX_BUF[nSend_TX0]; 
    	nSend_TX0 += 1; 
    	Delay_us(5); 
    	if(nSend_TX0 >= nTX0_Len) 
    	{ 
    	    nSend_TX0 = 0; 
    	    nTX0_Len = 0; 
    	    nTX0_Flag = 1; 
    	} 
    } 
} 


/////////////////////////////////////// 
// 处理来自端口 1 的中断 
//interrupt [PORT1_VECTOR] void R_B_ISR(void) 
#pragma vector=PORT1_VECTOR
__interrupt void R_B_ISR (void)
{   
   
    // 处理INT中断 
    if(P1IFG & BIT0) 
    { 
    	nVOF = 1;//设置标志 
    	P1IFG &= ~(BIT0);//清除中断标志 
    	Delay_us(100); 
    }
    
    if(P1IFG & BIT1) 
    { 
    	RAC_count+=1; 
    }
    
    AvodshekP();
    AvodshekR();
    
    // 处理录音按钮 
    if(P1IFG & BIT5) 
    {       
        if(nRec == 1) 
    	{ 
    	    nRec = 0; 
    	    nRec_count += 1; 
    	} 
    	else if(nRec == 0) 
    	{ 
    	    nRec = 1; 
    	    nRec_count += 1; 
    	} 
     
    	P1IFG &= ~(BIT5);	// 清除中断标志位 
    	Delay_us(100); 
     
    } 
 
    // 处理放音按钮 
    if(P1IFG & BIT4) 
    { 
        if(nPlay == 1) 
    	{ 
    	    nPlay = 0; 
    	    nPlay_count += 1; 
    	} 
    	else if(nPlay == 0) 
    	{ 
    	    nPlay = 1; 
    	    nPlay_count += 1; 
    	} 
    	P1IFG &= ~(BIT4);	// 清除中断标志位 
    	Delay_us(100); 
    } 
}


void SPI_Init(void)
{
  P3SEL=BIT3+BIT2+BIT1;
  P3DIR|=BIT1;
  P3DIR|=BIT0;
  P3DIR|=BIT3;
  P3OUT|=BIT0;
  P3OUT|=BIT1;
  P3OUT|=BIT3;
  
  U0CTL=0X00;
  U0CTL|=CHAR+SYNC+MM;
  U0TCTL=0X00;
  U0TCTL=CKPH+SSEL1+SSEL0+STC;
  
  UBR0_0=0X45;
  UBR1_0=0X00;
  UMCTL_0=0X49;
  
  ME1=USPIE0;
  IE1|=URXIE0;
  IE1|=UTXIE0;
}


void PORT_Init(void)   
{   
    //将P1口、P3口设置为输入方式   
    P1DIR = 0;   
    P3DIR = 0;   
       
    //将P1口、P3口设置为一般I/O口   
    P1SEL = 0;   
  //  P3SEL = 0;   
       
    // 将P1.1和P1.2设置为输出方向   
 //   P1DIR |= BIT1;   
    P1DIR |= BIT2;   
    // 将SS管脚先设置为高电平   
    P1OUT |= BIT2;   
    // 将RAC管脚先设置为高电平   
 //   P1OUT |= BIT1;     //这段不知道什么意思
       
    // 将中断寄存器清零   
    P1IE = 0;   
    P1IES = 0;   
    P1IFG = 0;   
    // 管脚P1.4(Play)使能中断   
    P1IE |= BIT4;   
    // 对应的管脚由高到低电平跳变使相应的标志置位   
    P1IES |= BIT4;   
    // 管脚P1.5(Record)使能中断   
    P1IE |= BIT5;   
    // 对应的管脚由高到低电平跳变使相应的标志置位   
    P1IES |= BIT5;   
    // 管脚P1.0(INT)使能中断   
    P1IE |= BIT0;   
    // 对应的管脚由高到低电平跳变使相应的标志置位   
    P1IES |= BIT0; 
     // 管脚P1.2(RAC)使能中断     
 //   P1IE |= BIT1;               //   RAC调整为输入之后,不受键盘控制 12.3  中断太频繁,无法读出play键值
    // 对应的管脚由高到低电平跳变使相应的标志置位   
 //   P1IES |= BIT1;       
}  

void Init_CLK(void)   
{   
    unsigned int i;   
    BCSCTL1 = 0X00;//将寄存器的内容清零   
                   //XT2震荡器开启   
                   //LFTX1工作在低频模式   
                   //ACLK的分频因子为1   
    do    
    {   
        IFG1 &= ~OFIFG;                       // 清除OSCFault标志   
        for (i = 0x20; i > 0; i--);                   
    }   
    while ((IFG1 & OFIFG) == OFIFG);      // 如果OSCFault =1      
                       
    BCSCTL2 = 0X00;         //将寄存器的内容清零   
    BCSCTL2 += SELM1;       //MCLK的时钟源为TX2CLK,分频因子为1   
    BCSCTL2 += SELS;        //SMCLK的时钟源为TX2CLK,分频因子为1   
}   



void Delay_us(unsigned long nValue)// 主时钟8M 微秒为单位
{
  unsigned long nCount;
  int i;
  int j;
  nCount=3;
  for(i=nValue;i>0;i--)
  {
    for(j=nCount;j>0;j--);
  }
  return;
}

void Delay_ms(unsigned long nValue)// 主时钟8M 毫秒为单位
{
  unsigned long nCount;
  int i;
  unsigned long j;
  nCount=2667;
  for(i=nValue;i>0;i--)
  {
    for(j=nCount;j>0;j--);
  }
  return;
}

void Init_UART0(void)   
{   
    U0CTL = 0X00;   //将寄存器的内容清零   
    U0CTL += CHAR;  //数据位为8bit   
       
    U0TCTL = 0X00;  //将寄存器的内容清零   
    U0TCTL += SSEL1;    //波特率发生器选择SMCLK   
       
    UBR0_0 = 0X45;  //波特率为115200   
    UBR1_0 = 0X00;   
       
    UMCTL_0 = 0X55; //调整寄存器   
       
    ME1 |= UTXE0 + URXE0; //使能UART0的TXD和RXD   
    IE1 |= URXIE0;  //使能UART0的RX中断   
    IE1 |= UTXIE0;  //使能UART0的TX中断   
       
    P3SEL |= BIT4;  //设置P3.4为UART0的TXD   
    P3SEL |= BIT5;  //设置P3.5为UART0的RXD   
       
    P3DIR |= BIT4;  //P3.4为输出管脚   
       
    return;   
}
 
/*
////////////////////////////////////////   
// 处理来自串口 0 的发送中断   
//interrupt [UART1TX_VECTOR] void UART1_TX_ISR(void)   
#pragma vector=UART0TX_VECTOR
__interrupt void UART0_TX_ISR (void)
{   
    if(nTX0_Len != 0)   
    {   
        nTX0_Flag = 0;              // 表示缓冲区里的数据没有发送完   
           
        TXBUF0 = UART0_TX_BUF[nSend_TX0];   
        nSend_TX0 += 1;   
        Delay_us(5);   
        if(nSend_TX0 >= nTX0_Len)   
        {   
            nSend_TX0 = 0;   
            nTX0_Len = 0;   
            nTX0_Flag = 1;   
        }   
    }   
}  
 

///////////////////////////////////////   
// 处理来自串口 0 的接收中断   
//interrupt [UART0RX_VECTOR] void UART0_RX_ISR(void)   
#pragma vector=UART0RX_VECTOR
__interrupt void UART0_RX_ISR (void)
{   
    UART0_RX_BUF[nRX0_Len_temp] = RXBUF0;   //接收来自的数据   
       
    nRX0_Len_temp += 1;   
    if(UART0_RX_BUF[nRX0_Len_temp - 1] == 13)   
    {   
        nRX0_Len = nRX0_Len_temp;   
        nRev_UART0 = 1;   
        nRX0_Len_temp = 0;   
    }     
}   
*/

⌨️ 快捷键说明

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