基于51单片机的密码锁多路测温+测距+语音播报

本文详细介绍了基于51单片机的密码锁系统,集成了超声波测距、多路DS18B20温度测量、LCD1602显示、WT588D和JQ8900语音模块播报等功能。通过矩阵键盘输入密码,系统能播报温度、执行测距操作。文章涵盖了硬件焊接、程序设计和问题排查等多个方面。
摘要由CSDN通过智能技术生成

本项目为单片机课程设计成果,实物制作+proteus仿真,相关资料见结尾。



前言

基本内容:

  1. 利用Lcd1602和DS18B20完成环境温度及显示;
  2. 使用WTD588D进行语音播报,读出显示温度。

拓展内容:

  1. 电子密码锁:使用P1,扫描矩阵键盘;
  2. 多路测温:lcd1602四线模式+六路DS18B20,WT588D播报四路温度的平均值;
  3. HC-SR04P超声波测距模块:测距;
  4. 74HC595芯片:使小灯亮的个数随输入密码长度变化;
  5. 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
  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值