本项目为单片机课程设计成果,实物制作+proteus仿真,相关资料见结尾。
文章目录
前言
基本内容:
- 利用Lcd1602和DS18B20完成环境温度及显示;
- 使用WTD588D进行语音播报,读出显示温度。
拓展内容:
- 电子密码锁:使用P1,扫描矩阵键盘;
- 多路测温:lcd1602四线模式+六路DS18B20,WT588D播报四路温度的平均值;
- HC-SR04P超声波测距模块:测距;
- 74HC595芯片:使小灯亮的个数随输入密码长度变化;
- JQ8900语音模块:单线播放指定内容,播放效果音。
成果展示
仿真如图所示,未启动(上) 启动(下)。
一、系统组成
简要介绍WTD588D语音模块、JQ8900-TF语音模块、HC-SR04-P超声波测距模块和74HC595芯片,以及相应程序。
1.1 WT588D语音模块
WT588D语音芯片是一款可重复擦除烧写的语音单片机芯片。配套WT588D VioceChip上位机操作软件可随意更换WT588D语音单片机芯片的任何一种控制模式,把信息下载到SPI-Flash上即可。
它有7种控制方式: MP3控制模式、按键控制模式、3×8矩阵控制模式、并口控制模式、一线串口控制模式、三线串口控制模式以及三线串口控制I/O口扩展输出模式。可通过电脑软件,随意组合语音,可插入静音,插入的静音不占用内存的容量。一个已加载语音可重复调用到多个地址,最多可加载500段语音,共210段可控制地址位,单个地址位最多可加载128段语音,地址位内的语音组合播放。
引脚图如图所示。
WT588D部分代码如下
/***********************语音模块控制IO口的定义************************/
sbit KEY=P0^5; /*P1_1为P1口的第2位*/
sbit RST=P2^4; /*P1_4为P3口的第3位*/
sbit SCL=P2^3; /*P3_2为P3口的第5位*/
sbit CS=P2^2; /*P3_1为P3口的第4位*/
sbit SDA=P2^1; /*P3_0为P3口的第6位*/
sbit BUSY=P2^0;/*忙信号,判断是否在播音*/
void delay(uint t)
{
for(;t>0;t--); //1=10us
}
void delay1ms(unsigned char count) //1ms时子程序
{
unsigned char i,j,k;
for(k=count;k>0;k--)
for(i=2;i>0;i--)
for(j=248;j>0;j--);
}
void delay150us(void) //150US延时子程序
{
unsigned char j;
for(j=75;j>0;j--);
}
/***********************三线发码子程序***********************/
void Send_threelines(unsigned char addr) //三线发码子程序 //,unsigned char dat
{
unsigned char i;
RST=0;
delay1ms(5); //上届全部delay,上届全部delay,延时影响结果。delay(455)
RST=1;
delay1ms(20); /* 复位拉高20ms 1818*/
CS=0;
delay1ms(5);/* 片选拉低5ms 455*/
for(i=0;i<8;i++)
{
SCL=0;
if(addr & 1)SDA=1;
else SDA=0;
addr>>=1;
delay150us(); /* 150us delay(14) */
SCL=1;
delay150us();
}
CS=1;
}
/*******等待 BUSY 信号变高; 预先设定:播音期间BUSY为低电平********/
void TEST_Busy(void)
{
uint times;
BUSY=1; //对BUSY赋值1,准备读BUSY的状态
for(times=0;times<50;times++) // 等待超过 5 秒最长语音段自动退出;
{
delay(9091); // 调节组合语音间隔为100ms
if(BUSY==1) break; // 语音播完,退出
}
}
调用如下
TEST_Busy(); //忙信号判断
Send_threelines(0x0a);
1.2 JQ8900-TF语音模块
JQ8900-TF模块支持MP3、WAV硬件解码;24位DAC输出内部采用DSP硬件解码,非PWM输出。有两线串口模式、一线串口模式、按键模式多中控制模式。可以直接像操作U盘一样更新SPIFLASH里的语音,也支持各种信息查询。
采用矩阵模式播放时,存储器的语音文件最多只能放19个,超过则会乱码。
引脚图如图所示。
JQ8900单线,指定播放代码如下
/********相关的延时********/
void delay1ms(unsigned char count)
{
unsigned char i,j,k;
for(k=count;k>0;k--)
for(i=2;i>0;i--)
for(j=248;j>0;j--);
}
void delay(uint t)
{
for(;t>0;t--); //1=10us
}
/***********************Jq8900单线发码子程序***********************/
void SendData( uchar addr )//发送函数。
{
uchar i;
EA = 0;//发送时关掉中断,防止中断影响时序
VSDA = 1;//开始拉高
delay ( 1000 );
VSDA = 0;//开始引导码
delay ( 2000 );//此处延时最少要大于 2ms,此参数延时为 310ms
for ( i = 0; i < 8; i++ ) //总共 8 位数据
{
VSDA = 1;
if ( addr & 0x01 ) //3:1 表示数据位 1,每个位用两个脉冲表示
{
delay ( 1200 );
VSDA = 0;
delay ( 400 );
}
else //1:3 表示数据位 0 ,每个位用两个脉冲表示
{
delay ( 400 );
VSDA = 0;
delay ( 1200 );
}
addr >>= 1;
}
VSDA = 1;
EA = 1;//恢复中断
}
/********指定曲目播放 song:(1-255)*********/
void ONE_LINE_PLAY_SONG(uchar song)
{
uchar i;
uchar tmp[3];
tmp[0]=song/100