新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機控制ISD1420實現選段播放功能的實現

        51單片機控制ISD1420實現選段播放功能的實現

        作者: 時間:2016-11-21 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/201611/319371.htm

        程序原文:


        #i nclude
        #i nclude
        #i nclude
        #i nclude

        //硬件端口的定義
        #definePOWP3_7//此引腳為單片機控制一個三極管ISD1420供電

        #definePLP3_5//接ISD1420PLAYL
        #definePEP3_4//接ISD1420PLAYE
        #defineRECP3_3//接ISD1420REC

        #defineREC_LEDP3_2//ISD1420RECLED

        //操作模式的定義
        #definemode10xC8//循環放音操作,按一下PE鍵可循環放音,按PL鍵停止;或按PL鍵放音,松開即停止

        #definemode20xD0//按順序連續分段錄放音,每段語音長度不限
        #definemode30xC0//地址指針復位,開始錄放第一段
        #definemode40xD1//按PE鍵可快速選段放音

        //0xC1//也為地址指針復位

        unsignedcharRX_index=0;//
        bitFLAG_rev=0;//
        unsignedcharPC_COMMAND;
        unsignedcharRX_BUFFER[10];//串行接收緩存

        voidio_init(void);
        voidinit_serialcomm(void);
        voidserial_out(unsignedchard);
        voiddelay5ms(void);
        voiddelay(unsignedintx);
        voidnop(unsignedchari);

        voidpaly(unsignedchari);//選擇播放當前段操作


        voidmain(void)
        {
        io_init();
        init_serialcomm();
        delay(1000);

        serial_out(0xaa);//發送到PC機,看看PC端是否收到正確數據
        serial_out(0x55);
        serial_out(0x33);

        POW=0;//開啟電源

        //P1=mode4;
        //P1=0X00;
        while(1)
        {

        }
        }

        //-----端口初始化
        voidio_init(void)
        {
        P1M0=0x00;//設置STC的IO為標準51IO模式
        P1M1=0x00;
        P3M0=0x00;
        P3M1=0x00;
        P1=0XFF;
        P3=0XFF;
        }

        //串行口初始化
        voidinit_serialcomm(void)
        {
        SCON=0x50;//SCON:serailmode1,8-bitUART,enableucvr

        TMOD=0x20;//TMOD:timer1,mode2,8-bitreload

        TH1=0xf3;//12MHz,2400bps
        TL1=0xf3;
        //IE|=0x90;//EnableSerialInterrupt

        TR1=1;//timer1run

        ES=1;
        EA=1;
        }

        //串行數據發送,查詢模式
        voidserial_out(unsignedchard)
        {
        ES=0;
        SBUF=d;while(TI==0){;}TI=0;
        ES=1;
        }

        //串行中斷接收
        voidreceive()interrupt4
        {
        if(RI)
        {
        RI=0;
        ES=0;
        PC_COMMAND=SBUF;

        //RX_BUFFER[RX_index]=PC_COMMAND;//保存數據到數組里面
        //RX_index++;
        switch(PC_COMMAND)
        {


        case0xa0:

        serial_out(0xa0);
        P1=mode2;//按順序連續分段錄放音,每段語音長度不限0xD0連續尋址,A4

        PE=0;
        nop(10);
        PE=1;

        P1=0XFF;

        break;

        case0xb0:
        serial_out(0xb0);
        P1=mode3;//地址指針復位0xC0

        nop(10);
        P1=0XFF;

        break;

        case0xc0://選段播放控制
        serial_out(0xc0);


        P1=0xD1;//第二步:快速選段放音


        P1_0=0;
        nop(10);
        P1_0=1;
        nop(10);


        PE=0;
        nop(10);
        PE=1;

        break;

        case0xd0:
        serial_out(0xd0);//播放任意段的組合
        paly(3);
        paly(1);
        paly(5);
        paly(5);
        paly(6);
        paly(4);
        paly(3);
        paly(6);
        paly(1);

        break;

        case0x30:
        serial_out(0x30);
        //此操作循環放音操作,按一下PE鍵可循環放音,按PL鍵停止;或按PL鍵放音,松開即停止
        //此操作沒什么用
        P1=mode1;

        PE=0;
        nop(10);
        PE=1;
        //
        break;

        default:break;
        }

        ES=1;
        }
        }


        voidpaly(unsignedchari)
        {
        i--;

        P1=mode3;//第一步:地址指針復位0xC0A7--A0:11000000(A2、A5在應用中可直接接地)
        nop(10);
        //P1=0XFF;

        delay(30);//必要的延時

        if(i>0)
        {
        P1=0xD1;//第二步:快速選段放音0xD1A7--A0:11010001(A2、A5在應用中可直接接地)
        do
        {
        P1_0=0;//給A0低電平脈沖
        nop(10);
        P1_0=1;
        nop(10);

        PE=0;
        nop(10);
        PE=1;

        delay(50);//這個延時是非常必要的!
        i--;
        }
        while(i!=0);

        delay(30);//必要的延時
        }


        P1=mode2;//第三步:播放當前段0xD0A7--A0:11010000(A2、A5在應用中可直接接地)

        PE=0;
        nop(10);
        PE=1;
        //P1=0XFF;

        while(REC_LED==1){;}//等待播放
        while(REC_LED==0){;}//等待播放結束

        }

        //----------------------------軟件延時函數----------------------------
        //50ms延時
        voiddelay5ms(void)
        {
        unsignedcharTempCyc=250;
        while(TempCyc--);
        }

        voiddelay(unsignedintx)
        {
        do
        {
        delay5ms();delay5ms();delay5ms();x--;
        }
        while(x!=0);
        }

        voidnop(unsignedchari)
        {
        do
        {
        _nop_();
        i--;
        }
        while(i!=0);
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 富蕴县| 琼海市| 连江县| 邓州市| 从化市| 安阳县| 马鞍山市| 三都| 惠东县| 临桂县| 阿巴嘎旗| 定南县| 南部县| 康马县| 格尔木市| 赤峰市| 民和| 云林县| 达尔| 西宁市| 武胜县| 铜梁县| 四川省| 新野县| 灌南县| 同德县| 平乐县| 突泉县| 古浪县| 平阴县| 莫力| 黄梅县| 阳原县| 东乡族自治县| 体育| 晋江市| 仙游县| 钟山县| 临泽县| 疏附县| 克什克腾旗|