基于WT588F02KD-24SS语音芯片在电子烟设计

电子说

1.3w人已加入

描述

随着社会的不断发展,人们对健康问题也是愈发的重视。而烟民也从传统烟民转变为电子烟民。年轻人作为电子烟民的主力军,追求时尚与炫酷成为电子烟的基本标准。

电子烟需要显示电量,以及追求时尚的一些灯光效果,同时可拓展语音播报功能,电量提示和音乐播放,是追求靓丽的方式之一,市面上的电子烟,需要通过MUC+电量检测芯片+LED呼吸灯驱动芯片+功放芯片 等多个元器件组成,在电子烟有限的空间里,增加了许多面积。

深圳唯创知音研发的WT588F02KD-24SS,支持电量显示、电池电量检测、LED灯光效果、语音功能、等,有丰富的IO口资源开发产品;

应用框架图

电子烟

WT588F02KD-24SS,功能特点

1、可以支持4位数码管调节亮度(可以扩展10个) ;

2、可以支持32个发光二极管LED单独调光;

3、带按键唤醒,主动扫描功能和带按键返回;

4、内置亮度调节的电路---占空比8级可调,使用1K的频率;

5、可控制数码管显示不同字符,也可对单段数码管进行调节;

6、带有DA接口,可检测芯片电池电压等模拟信号;

7、客户也可以通过配套下载器在线更换芯片内部语音内容;

WT588F02KD-24SS

1、可以实时显示电池电量,并可做实时电量语音播报;

2、充电时可做呼吸灯效果,充电结束后也做声音提示和灯光效果提示;

3、可做炫酷彩灯效果(流水灯、呼吸灯);

WT588F02KD-24SS芯片相当于一颗74HC573锁存芯片、一颗PCF8591 AD芯片和一颗语音播报芯片,从根本上节约了成本;而WT588F02KD-24SS支持UART协议调节LED显示状态、控制语音播报等开发步骤,极大的缩短了开发周期。

电子烟

Uart串口通讯程序(参考程序)

#include "reg51.h"
#include "intrins.h"

typedef unsigned char uchar;
typedef unsigned int uint;
#define FOSC 11059200L //系统频率 STC15
#define BAUD 9600 //串口波特率

sfr AUXR = 0x8e; //辅助寄存器
sfr T2H = 0xd6; //定时器2高8位
sfr T2L = 0xd7; //定时器2低8位

bit busy;
uchar rxcnt,rxbuf[64],txbuf[64],sum,song_num,cnt;
void SendData(uchar dat);
void Sendhex(uchar *s,uchar cnt);
void play_single_song(uchar song_num );

void Disp_tube(void );

void Disp_waterfall_light(void );

uint Key_Get_Value(void );
void Delay1000ms();

 

void main()
{
       uchar i,j;
       T2L = (65536 - (FOSC/4/BAUD)); //设置波特率重装值
       T2H = (65536 - (FOSC/4/BAUD))>>8;
       AUXR = 0x14; //T2为1T模式, 并启动定时器2
       AUXR |= 0x01; //选择定时器2为串口1的波特率发生器
       ES = 1; //使能串口1中断
       EA = 1;
       SendString("wt\r\nUart Test!\r\n");
       while(1)
       {
              for(i=0;j<0xdf;i++)
              {
                     play_single_song(i) ;//播放第i首
                    Delay1000ms();//依语音播放时间长短留相应的播放间距
                     Delay1000ms();
              }
    }
}
/*----------------------------UART 中断服务程序-----------------------------*/
void Uart() interrupt 4
{
       if (RI)
       {
              RI = 0; //清除RI位
              rxbuf[rxcnt++] = SBUF; //
              rxcnt&=0x3f; 
       }
       if (TI)
       {
              TI = 0; //清除TI位
              busy = 0; //清忙标志
      }
}
/*----------------------------播放单首数据----------------------------*/
void play_single_song(uchar song_num )
{
       sum=0;
       txbuf[0]=0x7E;
       txbuf[1]=0x04;
       txbuf[2]=0xa0;
       txbuf[3]=song_num;
       for(j=1;j<4;j++)sum+=txbuf[j];//从第二位开始计算累加和
       txbuf[4]=sum;
       txbuf[5]=0xfe;
       Sendhex(txbuf,6);
}

 

/*----------------------------数码管显示“1234”数据--------------------------------------*/

/*-------------------7E 0A B0 40 C0 C0 B5 D5 C9 8F 5C FE-------------------------  ----*/

/*-----“0-F”的显示码分别为"0xFC 0xC0 0xB5  0xD5 0xC9  0x5D 0x7D 0xC4-----*/

/*-----0xEF 0xFD 0xDD 0x7B 0x3E  0xF3  0x3F 0x2F "-----------------------------*/
void Disp_tube(void )
{
       sum=0;
       txbuf[0]=0x7E;
       txbuf[1]=0x0A;
       txbuf[2]=0xB0;

       txbuf[3]=0x40;   // 地址自动递增模式
       txbuf[4]=0xC0;  //第一位数码管地址为0XC0

       txbuf[5]=0xC0;  //第一位数码管显示“1”

       txbuf[6]=0xB5;  //第二位数码管显示“2”

       txbuf[7]=0xD5;  //第三位数码管显示“3”

       txbuf[8]=0xC9;  //第四位数码管显示“4”

txbuf[9]=0x8F;  //显示亮度为“0x8F”
       for(j=1;j<10;j++)sum+=txbuf[j];//从第二位开始计算累加和
       txbuf[10]=sum;
       txbuf[11]=0xfe;
       Sendhex(txbuf,12);
}

 

 

/*-----------------------显示流水灯,从第一位数码开始逐一点亮--------------------------------------*/

/*--------------设置某段YY亮度X"7E  04  CX  YY  Sum  FE "--------------------------------*/
void Disp_waterfall_light(void )
{

uchar i;

for(i=0;i<0x20;i++)

  {

 sum=0;

  txbuf[0]=0x7E;
     txbuf[1]=0x04;
                              txbuf[2]=0xC4;// 设置亮度为0XC4

     txbuf[3]=i;  // 要显示的段(0-31)
     for(j=1;j<4;j++)sum+=txbuf[j];//从第二位开始计算累加和
        txbuf[4]=sum;
     txbuf[5]=0xfe;
         Sendhex(txbuf,6);//     发送串口数据

  Delay500ms();//延时500ms,再亮下一段
 }

/*-----------------------串口接收显示按键值-----------------------------------------------------------------*/

/*--------------串口中断接收一帧数据后取出按键值(接收长度rxcnt)----------------------*/

/*--------------例如收到按键上传数据帧“7E 06 B0 42 00 20 18 FE ”---------------------------*/
uint Key_Get_Value(void )
{

 uchar  i;

 if((rxbuf[0]==0x7E)&&(rxbuf[3]==0x42)&&(rxbuf[7]==0xFE))                                     //判定帧头,帧尾, 命令码是否为0x7E  0xFE 0x42

  {

 sum=0;

 for(i=1;i<6;i++)sum+=rxbuf[i];

 if(sum==rxbuf[6])               //校对累加和是否一致

    {

    rxflag=1;//成功接收到按键,标志位置1

    return   (256*rxbuf[4]+rxbuf[5]) ;//返回按键值0x0020(00 20

    }

  else  return  0XFF;                //返回错误码0XFF
  }

 for(i=0;i<8;i++)rxbuf[i]=0;//清零接收缓冲区


/*----------------------------软件延时1000MS----------------------------*/
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;

_nop_();
_nop_();
i = 43;
j = 6;
k = 203;
       do
       {
              do
                     {
                            while (--k);
                     } while (--j);
       } while (--i);
}
/*----------------------------发送串口数据----------------------------*/
void SendData(uchar dat)
{
       while (busy); //等待前面的数据发送完成
       busy = 1;
       SBUF = dat; //写数据到UART数据寄存器
}

/*----------------------------发送字符串----------------------------*/
void Sendhex(uchar *s,uchar cnt)
{
       unsigned char i;
       for(i=0;i};cnt++)senddata(*s++);

//===========end==================================


  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分