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

📄 section8.c

📁 是由MSP430 单片机控制实现的 多功能语音的录音和放音系统 可以由外接功放和其他语音设备来实现 其功能
💻 C
字号:
#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;//接收数据长度
int nRX0_Len_temp;
static char nTX0_Flag;//发送完成标志
int nSend_TX0;//发送记数器


void main()
{
    int nRec_Row;
    int nPlay_Row;
    WDTCTL = WDTPW + WDTHOLD;   // 关闭看门狗
    _DINT();//关闭中断
    // 初始化
    Init_CLK();
    PORT_Init();
    SPI_Init();
    
    nPlay = 0;
    nRec = 0;
    nPlay_count = 0;
    nRec_count = 0;
    nRec_Row = 0;
    nPlay_Row = 0;
    
    _EINT();//打开中断
    
    for(;;)
    {
    	// 放音的处理
        if((nPlay == 1) && (nPlay_count == 1))
        {
            // 放音
            Play(nPlay_Row);
            nPlay_Row += 1;
            if(nPlay_Row >= 2400) nPlay_Row = 0;
        }
        // 录音的处理
        if((nRec == 1) && (nRec_count == 1))
        {
            // 录音
            Record(nRec_Row);
            nRec_Row += 1;
            if(nRec_Row >= 2400) nRec_Row = 0;
        }
   
        Delay_us(10);
    }

}
// 字节的比特顺序高低交换
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;
    
    //上电命令
    code = 0x04;
    // 发送命令码
    SendOpCode(code);
    
    return;
}
// 发送掉电指令
int PowerDown(void)
{
    unsigned char code;
    
    //掉电命令
    code = 0x08;
    // 发送命令码
    SendOpCode(code);
    
    return;
}
// 发送停止命令
void Stop(void)
{
    unsigned char code;
    
    //停止命令
    code = 0x0C;
    // 发送命令码
    SendOpCode(code);
    
    return;
}
// 放音操作
void Play(int nAddr)
{
    int i;
    unsigned char code;
    
    // 发送加电指令
    PowerUp();
    // 延时25ms以上
    Delay_ms(30);
    
    // 发送地址信息
    SendAddr(nAddr);
    
    // 发送SETPLAY命令
    code = 0x07;
    SendOpCode(code);
    
    // 发送PLAY命令
    code = 0x0F;
    SendOpCode(code);
    
    // 处理结束
    for(;;)
    {
        // 如果发生溢出的时候则结束录音
        if(nOVF == 1)
    	{
    	    nOVF = 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();
    // 延迟一段时间
    Delay_ms(30);
    nPlay_count = 0;//清除按键次数记录变量
    return;
}
// 录音操作
void Record(int nAddr)
{
    int i;
    unsigned char code;
    
    // 发送加电指令
    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(nOVF == 1)
    	{
    	    nOVF = 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();
    // 延迟一段时间
    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--) ; //延迟一点时间
    //字节的高低顺序变换
    chrHi = ByteSwap(chrHi);
    //字节的高低顺序变换
    chrLow = ByteSwap(chrLow);
    
    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(i = 100;i > 0;i--) ; //延迟一点时间
    UART0_TX_BUF[0] = code;//发送命令
    nTX0_Len = 1;
    IFG1 |= UTXIFG0; // 设置中断标志,进入发送中断程序
    
    for(i = 100;i > 0;i--) ; //延迟一点时间
    while(1)// 等待缓冲区里的数据发送完毕
    {
        if(nTX0_Flag == 1) break;
    }
    // 片选禁止
    SS_Disable();
}

////////////////////////////////////////
// 处理来自串口 0 的接收中断
interrupt [UART0RX_VECTOR] void SPI0_RX_ISR(void)
{
    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;
    }  
}
////////////////////////////////////////
// 处理来自串口 0 的发送中断
interrupt [UART0TX_VECTOR] 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)
{
    // 处理INT中断
    if(P1IFG & BIT0)
    {
    	nVOF = 1;//设置标志
    	P1IFG &= ~(BIT0);//清除中断标志
    	Delay_us(100);
    }

    // 处理录音按钮
    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);
    }
}

⌨️ 快捷键说明

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