电子说
随着社会的不断发展,人们对健康问题也是愈发的重视。而烟民也从传统烟民转变为电子烟民。年轻人作为电子烟民的主力军,追求时尚与炫酷成为电子烟的基本标准。
电子烟需要显示电量,以及追求时尚的一些灯光效果,同时可拓展语音播报功能,电量提示和音乐播放,是追求靓丽的方式之一,市面上的电子烟,需要通过MUC+电量检测芯片+LED呼吸灯驱动芯片+功放芯片 等多个元器件组成,在电子烟有限的空间里,增加了许多面积。
深圳唯创知音研发的WT588F02KD-24SS,支持电量显示、电池电量检测、LED灯光效果、语音功能、等,有丰富的IO口资源开发产品;
1、可以支持4位数码管调节亮度(可以扩展10个) ;
2、可以支持32个发光二极管LED单独调光;
3、带按键唤醒,主动扫描功能和带按键返回;
4、内置亮度调节的电路---占空比8级可调,使用1K的频率;
5、可控制数码管显示不同字符,也可对单段数码管进行调节;
6、带有DA接口,可检测芯片电池电压等模拟信号;
7、客户也可以通过配套下载器在线更换芯片内部语音内容;
1、可以实时显示电池电量,并可做实时电量语音播报;
2、充电时可做呼吸灯效果,充电结束后也做声音提示和灯光效果提示;
3、可做炫酷彩灯效果(流水灯、呼吸灯);
WT588F02KD-24SS芯片相当于一颗74HC573锁存芯片、一颗PCF8591 AD芯片和一颗语音播报芯片,从根本上节约了成本;而WT588F02KD-24SS支持UART协议调节LED显示状态、控制语音播报等开发步骤,极大的缩短了开发周期。
#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==================================
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !