搜索
bottom↓
回复: 10

51单片机控制ISD1420实现选段播放功能的实现(C程序 电路图)

[复制链接]

出0入0汤圆

发表于 2009-2-21 15:26:04 | 显示全部楼层 |阅读模式
在2006年时候记得我在做 ISD1420的播放控制,当时在 选段播放上遇到了问题,当时网络上也没有详细描述具体的控制方法,也在咱们坛子里问过。
折腾了很久,后来还是实现出来了。但资料后来没有实际应用到产品上,今天翻看资料的时候发现了,拿出来给同样碰到问题的朋友做为参考。
以前写的C程序比较菜,注释比较多。(现在写的程序注释也很多 :)

电路图简单画了下,大家都看得懂:

(原文件名:1420.jpg)

程序不长,先附上 KEIL完整工程,再把程序直接贴上:
点击此处下载 ourdev_421265.rar(文件大小:22K) (原文件名:1420_code.rar)

程序原文:
/**********************************************************
功能:  使用STC2052单片机控制 ISD1420语音芯片的播放
       1、顺序连续分段放音
       2、选段播放(播放任意段)
       3、所有的播放控制都是通过接收串口的命令来执行
      
编写:  benladn911  AVR猎手

日期:  2006-6-28创建
       2008-2-21添加注释和完善
**********************************************************/

#include<STC12C2052.H>
#include<intrins.h>
#include<stdio.h>
#include<string.h>

//硬件端口的定义
#define  POW P3_7   //此引脚为单片机控制一个三极管给 ISD1420供电

#define  PL  P3_5   //接 ISD1420 的 PLAYL
#define  PE  P3_4   //接 ISD1420 的 PLAYE
#define  REC P3_3   //接 ISD1420 的 REC

#define  REC_LED  P3_2   //ISD1420 的 REC LED

//操作模式的定义
#define  mode1  0xC8 //循环放音操作,按一下 PE 键可循环放音,按 PL 键停止;或按 PL 键放音,松开即停止

#define  mode2  0xD0 //按顺序连续分段录放音,每段语音长度不限
#define  mode3  0xC0 //地址指针复位,开始录放第一段
#define  mode4  0xD1 //按 PE 键可快速选段放音

                //0xC1 //也为地址指针复位
               
unsigned char RX_index=0;                //
bit FLAG_rev = 0; //
unsigned char PC_COMMAND;
unsigned char RX_BUFFER[10];//串行接收缓存

void io_init(void);
void init_serialcomm(void);
void serial_out(unsigned char d);
void delay5ms(void);
void delay(unsigned int x);
void nop(unsigned char i);

void paly(unsigned char i);//选择播放当前段操作


void main(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)
        {

        }                
}

//----- 端口初始化
void io_init(void)
{       
        P1M0 = 0x00; //设置STC的 IO 为标准51 IO模式
        P1M1 = 0x00;
        P3M0 = 0x00;
        P3M1 = 0x00;       
        P1 = 0XFF;
        P3 = 0XFF;
}

//串行口初始化
void init_serialcomm(void)
{
    SCON  = 0x50;       //SCON: serail mode 1, 8-bit UART, enable ucvr

    TMOD = 0x20;       //TMOD: timer 1, mode 2, 8-bit reload

    TH1 = 0xf3;//12MHz, 2400 bps
    TL1 = 0xf3;
        //IE   |= 0x90;       //Enable Serial Interrupt
   
    TR1   = 1;          // timer 1 run
   
        ES=1;
        EA=1;
}

//串行数据发送,查询模式
void serial_out(unsigned char d)
{
        ES=0;
        SBUF=d;while(TI==0){;}TI=0;       
        ES=1;       
}

//串行中断接收
void receive() interrupt 4
{
        if(RI)
        {
                RI = 0;
                ES = 0;
                PC_COMMAND = SBUF;

                //RX_BUFFER[RX_index] = PC_COMMAND;                //保存数据到数组里面
                //RX_index++;
          switch(PC_COMMAND)
          {

                            
                  case 0xa0:
                 
                            serial_out(0xa0);
                            P1 = mode2;      //按顺序连续分段录放音,每段语音长度不限  0xD0  连续寻址,A4
                                                        
                            PE = 0;
                            nop(10);
                            PE = 1;
                            
                            P1 = 0XFF;

                            break;
                            
                  case 0xb0:
                            serial_out(0xb0);
                            P1 = mode3;      //地址指针复位  0xC0
                            
                            nop(10);
                            P1 = 0XFF;
                                        
                            break;
                            
                  case 0xc0:                 //选段播放控制
                            serial_out(0xc0);
                            
                  
                            P1 = 0xD1;      //第二步:快速选段放音


                            P1_0 = 0;                            
                            nop(10);
                            P1_0 = 1;                             
                            nop(10);
                            
                            
                            PE = 0;
                            nop(10);
                            PE = 1;
                            
                            break;
                            
                  case 0xd0:
                            serial_out(0xd0);  //播放任意段的组合
                            paly(3);
                            paly(1);
                            paly(5);
                            paly(5);
                            paly(6);
                            paly(4);
                            paly(3);
                            paly(6);
                            paly(1);                   
                     
                            break;

                  case 0x30:                 
                            serial_out(0x30);
                            //此操作循环放音操作,按一下 PE 键可循环放音,按 PL 键停止;或按 PL 键放音,松开即停止
                            //此操作没什么用
                            P1 = mode1;
                                        
                            PE = 0;
                            nop(10);
                            PE = 1;
                            //
                            break;
                                                        
                  default: break;
          }
               
                ES = 1;       
        }
}

/*************************************************************
          选段播放,i 的值就是要播放的当前段
          i的取值:1 ~ ...
**************************************************************/
void paly(unsigned char i)
{
        i--;

        P1 = mode3;      //第一步:地址指针复位  0xC0                  A7--A0: 1100 0000  (A2、A5在应用中可直接接地)                  
        nop(10);
        //P1 = 0XFF;               
               
        delay(30);//必要的延时
       
        if(i>0)
        {       
                P1 = 0xD1;      //第二步:快速选段放音 0xD1     A7--A0: 1101 0001  (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;     //第三步:播放当前段  0xD0        A7--A0: 1101 0000  (A2、A5在应用中可直接接地)
       
        PE = 0;
        nop(10);
        PE = 1;                                    
        //P1 = 0XFF;       
       
        while(REC_LED==1){;}//等待播放
        while(REC_LED==0){;}//等待播放结束

}

//----------------------------软件延时函数----------------------------
//50ms延时
void delay5ms(void)
{
unsigned char TempCyc = 250;
while(TempCyc--);
}

void delay(unsigned int x)
{
        do
        {
                delay5ms();delay5ms();delay5ms();x--;
        }
        while(x!=0);
}

void nop(unsigned char i)
{
        do
        {
                _nop_();
                i--;
        }
        while(i!=0);       
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2009-2-21 15:30:03 | 显示全部楼层
网站数据丢失一些,积分也少了。嘿嘿,多发帖子,多努力!

出0入0汤圆

发表于 2009-2-21 15:34:39 | 显示全部楼层
哈哈,这个片子现在好像都买不到了,以前曾经涨到30多块一块

出0入0汤圆

 楼主| 发表于 2009-2-21 15:38:11 | 显示全部楼层
是的,好像是停产了,价格也高。思路大家可以参考,特别是选段播放。
器件手册可以参考 周立功翻译的那个版本,比较详细。

出0入0汤圆

发表于 2009-2-21 16:29:22 | 显示全部楼层
【2楼】 lookavr 新 您说的价钱实在是太可怕了...

benladn911 AVR猎手做得东西不错.

出0入0汤圆

发表于 2009-2-23 19:48:17 | 显示全部楼层
呵呵,我以前买了一块,好像不到10元,O(∩_∩)O哈哈~
我看过一个车载报警器就是这么做的,at2051+1420

出0入0汤圆

发表于 2009-8-23 16:13:06 | 显示全部楼层
楼主有没有ISD1720和AT89S52配合使用的资料啊!有的话提供下

出0入0汤圆

发表于 2010-10-23 14:55:35 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-1 22:06:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-7-11 16:28:14 | 显示全部楼层
谢谢,下载下来研究下怎么播音。

出0入0汤圆

发表于 2013-4-13 13:51:28 | 显示全部楼层
顶,楼主有没有ISD1820和AT89S52配合使用的资料啊?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-18 08:44

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表