带语音播报的51单片机电子体重秤设计(源码+原理图+资料)

1、概要

1、实现0~150KG的量程称量;
2、实时显示称量结果在1602上;
3、最小误差为0.01KG;
4、称量体重或物体时待结果稳定后,实现语音播报结果;
5、语音播报可手动关闭或打开;
6、由于传感器一致性差异,体重计算的系数可手动调节。

2、所用到的物料

1、STC89C52单片机
2、1602液晶
3、JQ8900-16P语音模块
4、HX711称重模块
5、洞洞板、下载线、晶振、电容、电阻、按键、排针等

3、实物照片

4、原理图

5、模块使用说明

        JQ8900-16P 选用的是 SOC 方案,集成了一个 16 位的 MCU,以及一个专门针对音频解码的ADSP,采用硬解码的方式,更加保证了系统的稳定性和音质。小巧尺寸更加满足嵌入其它产品的需求。
        SPI-flash 更换语音内容
        此芯片最大的优势在于能够灵活的更换 SPI-flash 内的语音内容,省去了传统语音芯片需要安装上位机更换语音的麻烦,SPI FLASH 直接模拟成 U 盘,跟拷贝 U 盘一样,非常方便。使得产品研发和生产变得便捷简单。一线串口控制模式、RX232 串口控制可选,为研发提供更多的选择性。 USB 数据线连接芯片,插上电脑,电脑会自动识别。

6、程序

完整代码点击顶部链接下载

#include <reg52.H>
#define uchar unsigned char
#define uint unsigned int
#define PX_1602 P1

sbit RS =P3^2;               
sbit RW =P3^3;
sbit E  =P3^4;

/*sbit RS =P1^3;               
sbit RW =P1^4;
sbit E  =P1^5;*/

sbit kset =P2^0;
sbit kup  =P2^2;
sbit kdown=P2^1;

sbit ADDO = P2^4;
sbit ADSK = P2^3;

sbit sda =P3^5;
sbit busy=P3^6;

uchar code str1[]={"Test weight:         "};
uchar code str2[]={"   00.0Kg  Voice"};
uchar code str11[]={"Welcome to use"};
uchar code str22[]={"Password:"};
uchar code set1[]={"Voice"};
uchar code set2[10]={"      "};
unsigned long buf=0,maopi=0,shiwu=0,shiwu2=0,shiwu_buf=0,gu=84866;
uchar  key,TSS,flag=0;
uint t;
int set_num,xishu=38;
double kg;

void ddelay(uint cnt)
{
        while(cnt--);
}

void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
           for(y=110;y>0;y--);        
}

void Delay1us (uint T )
{
    while ( T-- );
}

void SendData (uchar addr)
{
    uchar i;

    EA = 0;

    sda = 1;
    Delay1us ( 1000 );
    sda = 0;
    Delay1us ( 420 );

    for ( i = 0; i < 8; i++ )
    {
        sda = 1;
        if ( addr & 0x01 )
        {
            Delay1us ( 300 );
            sda = 0;
            Delay1us ( 100 );
        }
        else      
        {
            Delay1us ( 100 );
            sda = 0;
            Delay1us ( 300 );
        }
        addr >>= 1;
    }
    sda = 1;
    EA = 1;//????
}
               
void WriteCMD(uchar command)               
{
        RS = 0;
        RW = 0;
        ddelay(20);
        E = 1;
        ddelay(20);
        PX_1602 = command;
        ddelay(30);
        E = 0;
        ddelay(50);
}

void WriteDAT(uchar dat)               
{
        RS = 1;
        RW = 0;
        ddelay(20);
        E = 1;
        ddelay(20);
        PX_1602 = dat;
        ddelay(30);
        E = 0;
        ddelay(50);
}

void init_1602()                  
{
        uchar num;
        E=0;
        WriteCMD(0x38);
        WriteCMD(0x38);         
        WriteCMD(0x0c);        
        WriteCMD(0x06);      
        WriteCMD(0x01);        
        WriteCMD(0x80);      

  for(num=0;num<16;num++)
        {
                WriteDAT(str1[num]);
                //if(num==4){WriteCMD(0x80+4);WriteDAT(0xd0+15);}        
                delay(20);
  }
        
        WriteCMD(0x80+0x40);
        for(num=0;num<16;num++)
        {
                WriteDAT(str2[num]);
                delay(20);
          }
        delay(200);                                  //yan shi 100us(12Mjingzheng)
}

void password()
{
        uchar num,kk=1;
        uchar ps1,ps2,ps3,ps4,ps5,ps6,ps7;
        E=1;
        WriteCMD(0x38);
        WriteCMD(0x38);         
        WriteCMD(0x0c);        
        WriteCMD(0x06);      
        WriteCMD(0x01);        
        WriteCMD(0x80);

  for(num=0;num<14;num++)
        {
                WriteDAT(str11[num]);
                delay(20);
  }        
        WriteCMD(0x80+0x40);
        for(num=0;num<9;num++)
        {
                WriteDAT(str22[num]);
                delay(20);
          }
        delay(200);                                  //yan shi 100us(12Mjingzheng)
        WriteCMD(0x80+0x49);
        WriteCMD(0x0f);
        while(1)
        {
                if(kset==0)
                {
                        delay(10);
                        if(kset==0)
                        {
                                kk++;
                                while(kset==0);
                                WriteCMD(0x0f);
                                switch (kk)
                                {
                                        case 1 : WriteCMD(0x80+0x49); break;
                                        case 2 : WriteCMD(0x80+0x4a); break;
                                        case 3 : WriteCMD(0x80+0x4b); break;
                                        case 4 : WriteCMD(0x80+0x4c); break;
                                        case 5 : WriteCMD(0x80+0x4d); break;
                                        case 6 : WriteCMD(0x80+0x4e); break;
                                        case 7 : WriteCMD(0x80+0x4f); break;
                                        case 8 : kk=1;WriteCMD(0x80+0x49); break;
                                }
                        }
                }
                if(kk==1)
                {
                        if(ps1==2&&ps2==0&&ps3==1&&ps4==8&&ps5==6&&ps6==6&&ps7==6)break;
                        if(kup==0)
                        {
                                delay(100);
                                if(kup==0)
                                {
                                        if(kdown==0)break;
                                        ps1++;if(ps1>=10)ps1=0;
                                        WriteCMD(0x80+0x49);
                                        WriteDAT(0x30+ps1);
                                        WriteCMD(0x80+0x49);
                                        WriteCMD(0x0e);
                                }
                        }
                        if(kdown==0)
                        {
                                delay(100);
                                if(kdown==0)
                                {
                                        if(kup==0)break;
                                        if(ps1>0)ps1--;
                                        else ps1=9;
                                        WriteCMD(0x80+0x49);
                                        WriteDAT(0x30+ps1);
                                        WriteCMD(0x80+0x49);
                                        WriteCMD(0x0e);
                                }
                        }
                }
                if(kk==2)
                {
                        if(kup==0)
                        {
                                delay(100);
                                if(kup==0)
                                {
                                        ps2++;if(ps2>=10)ps2=0;
                                        WriteCMD(0x80+0x4a);
                                        WriteDAT(0x30+ps2);
                                        WriteCMD(0x80+0x4a);
                                        WriteCMD(0x0e);
                                }
                        }
                        if(kdown==0)
                        {
                                delay(100);
                                if(kdown==0)
                                {
                                        if(ps2>0)ps2--;
                                        else ps2=9;
                                        WriteCMD(0x80+0x4a);
                                        WriteDAT(0x30+ps2);
                                        WriteCMD(0x80+0x4a);
                                        WriteCMD(0x0e);
                                }
                        }
                }
                if(kk==3)
                {
                        if(kup==0)
                        {
                                delay(100);
                                if(kup==0)
                                {
                                        ps3++;if(ps3>=10)ps3=0;
                                        WriteCMD(0x80+0x4b);
                                        WriteDAT(0x30+ps3);
                                        WriteCMD(0x80+0x4b);
                                        WriteCMD(0x0e);
                                }
                        }
                        if(kdown==0)
                        {
                                delay(100);
                                if(kdown==0)
                                {
                                        if(ps3>0)ps3--;
                                        else ps3=9;
                                        WriteCMD(0x80+0x4b);
                                        WriteDAT(0x30+ps3);
                                        WriteCMD(0x80+0x4b);
                                        WriteCMD(0x0e);
                                }
                        }
                }                        
                if(kk==4)
                {
                        if(kup==0)
                        {
                                delay(100);
                                if(kup==0)
                                {
                                        ps4++;if(ps4>=10)ps4=0;
                                        WriteCMD(0x80+0x4c);
                                        WriteDAT(0x30+ps4);
                                        WriteCMD(0x80+0x4c);
                                        WriteCMD(0x0e);
                                }
                        }
                        if(kdown==0)
                        {
                                delay(100);
                                if(kdown==0)
                                {
                                        if(ps4>0)ps4--;
                                        else ps4=9;
                                        WriteCMD(0x80+0x4c);
                                        WriteDAT(0x30+ps4);
                                        WriteCMD(0x80+0x4c);
                                        WriteCMD(0x0e);
                                }
                        }
                }
                if(kk==5)
                {
                        if(kup==0)
                        {
                                delay(100);
                                if(kup==0)
                                {
                                        ps5++;if(ps5>=10)ps5=0;
                                        WriteCMD(0x80+0x4d);
                                        WriteDAT(0x30+ps5);
                                        WriteCMD(0x80+0x4d);
                                        WriteCMD(0x0e);
                                }
                        }
                        if(kdown==0)
                        {
                                delay(100);
                                if(kdown==0)
                                {
                                        if(ps5>0)ps5--;
                                        else ps5=9;
                                        WriteCMD(0x80+0x4d);
                                        WriteDAT(0x30+ps5);
                                        WriteCMD(0x80+0x4d);
                                        WriteCMD(0x0e);
                                }
                        }
                }
                if(kk==6)
                {
                        if(kup==0)
                        {
                                delay(100);
                                if(kup==0)
                                {
                                        ps6++;if(ps6>=10)ps6=0;
                                        WriteCMD(0x80+0x4e);
                                        WriteDAT(0x30+ps6);
                                        WriteCMD(0x80+0x4e);
                                        WriteCMD(0x0e);
                                }
                        }
                        if(kdown==0)
                        {
                                delay(100);
                                if(kdown==0)
                                {
                                        if(ps6>0)ps6--;
                                        else ps6=9;
                                        WriteCMD(0x80+0x4e);
                                        WriteDAT(0x30+ps6);
                                        WriteCMD(0x80+0x4e);
                                        WriteCMD(0x0e);
                                }
                        }
                }
                if(kk==7)
                {
                        if(kup==0)
                        {
                                delay(100);
                                if(kup==0)
                                {
                                        ps7++;if(ps7>=10)ps7=0;
                                        WriteCMD(0x80+0x4f);
                                        WriteDAT(0x30+ps7);
                                        WriteCMD(0x80+0x4f);
                                        WriteCMD(0x0e);
                                }
                        }
                        if(kdown==0)
                        {
                                delay(100);
                                if(kdown==0)
                                {
                                        if(ps7>0)ps7--;
                                        else ps7=9;
                                        WriteCMD(0x80+0x4f);
                                        WriteDAT(0x30+ps7);
                                        WriteCMD(0x80+0x4f);
                                        WriteCMD(0x0e);
                                }
                        }
                }                                                                                
        }
}

/*void write_kg(unsigned long date)
{
        unsigned long shi,ge,bai,qian;
        if(date>9999)date=9999;
        qian=date/1000;
        bai=date%1000/100;
        shi=date%100/10;
        ge=date%10;
        WriteCMD(0x80+0x42);
        WriteDAT(0x30+qian);
        WriteDAT(0x30+bai);
        WriteDAT(0x30+shi);
        WriteDAT(0x30+ge);
}*/

void write_kgg(unsigned long date)
{
        unsigned long shi,ge,bai;
        if(date>99999)date=99999;
        (unsigned long)date=(float)date/100;

        bai=date/100;
        shi=date%100/10;
        ge=date%10;        
        WriteCMD(0x80+0x43);        
        WriteDAT(0x30+bai);
        WriteDAT(0x30+shi);
        WriteCMD(0x80+0x46);        
        WriteDAT(0x30+ge);        
}

void write_n(uint date)
{
        uchar shi,ge,bai;
        bai=date/100;
        shi=date%100/10;
        ge=date%10;
        WriteCMD(0x8d);
        WriteDAT(0x30+bai);
        WriteDAT(0x30+shi);
        WriteDAT(0x30+ge);
}

void write_xishu(uint date)
{
        uchar shi,ge;
        shi=date/10;
        ge=date%10;
        WriteCMD(0x80+0x40);
        WriteDAT(0x30+shi);
        WriteDAT(0x30+ge);
}

void delay_us(uint z)
{
        while(z--);
}

/*unsigned long get_kg(void)
{  
        unsigned long Count;  
        unsigned char i;  
        ADDO=1;
        delay_us(2);        
        ADSK=0;       //使能AD(PD_SCK 置低)  
        Count=0;  
        while(ADDO);    //AD转换未结束则等待,否则开始读取  
        for (i=0;i<24;i++)  
        {   
                ADSK=1;     //PD_SCK 置高(发送脉冲)   
                Count=Count<<1; //下降沿来时变量Count左移一位,右侧补零   
                ADSK=0;     //PD_SCK 置低   
                if(ADDO)
                Count++;  
        }  
        ADSK=1;  
        Count=Count^0x800000;//第25个脉冲下降沿来时,转换数据
        delay_us(2);  
        ADSK=0;  

        shiwu=Count/100-gu;
        //shiwu=(unsigned int)((float)shiwu/4.22+0.05);
        return(shiwu);
}*/

unsigned long hx711_read(void)
{
        unsigned long Count;  
        unsigned char i;  
        ADDO=1;
        delay_us(2);
        ADSK=0;       //使能AD(PD_SCK 置低)  
        Count=0;  
        while(ADDO);    //AD转换未结束则等待,否则开始读取  
        for (i=0;i<24;i++)  
        {   
                ADSK=1;     //PD_SCK 置高(发送脉冲)   
                Count=Count<<1; //下降沿来时变量Count左移一位,右侧补零   
                ADSK=0;     //PD_SCK 置低   
                if(ADDO)
                Count++;  
        }  
        ADSK=1;  
        Count=Count^0x800000;//第25个脉冲下降沿来时,转换数据  
        delay_us(2);
        ADSK=0;  
        return(Count);

}

void get_maopi()
{
        buf=hx711_read();
        maopi=buf/100;        
}

void gei_weight()
{
//        uint n;
        buf=hx711_read();
        buf=buf/100;
        if(buf>maopi)
        {
                shiwu=buf-maopi;
                shiwu=(unsigned long)((double)shiwu*xishu/10.0);
                //shiwu=(unsigned int)((float)shiwu/3.0+0.05);            //需要矫正4.22数值        
        }
        if(shiwu>99000||buf<maopi-30)
        {
                write_n(999);
                while(1);
        }
        //shiwu-=(gu/10);        
}

void scankey()
{
        uchar num;
        if(kset==0)
        {
                delay(10);
                if(kset==0)
                {
                        key++;
                        while(kset==0);
                        write_xishu(xishu);
                        switch (key)
                        {
                                case 1 : WriteCMD(0x80+0x4f);WriteCMD(0x0f); break;
                                case 2 : WriteCMD(0x80+0x41); break;
                                case 3 : WriteCMD(0x80+0x40);                        
                                        for(num=0;num<5;num++)
                                        {
                                                WriteDAT(set2[num]);                                       
                                                delay(20);
                                        }key=0;        WriteCMD(0x0c);break;
                        }
                }
        }
                        
        if(key==1)
        {
                if(kup==0)
                {
                        delay(10);
                        if(kup==0)
                        {
                                set_num++;if(set_num>=2)set_num=0;
                                while(!kup);
                                WriteCMD(0x80+0x4b);
                                for(num=0;num<5;num++)
                                {
                                        if(set_num==0)
                                        {WriteDAT(set1[num]);flag=1;}
                                        if(set_num==1)
                                        {WriteDAT(set2[num]);flag=0;}                                                                                
                                        delay(20);
                                }
                                WriteCMD(0x80+0x4f);
                                WriteCMD(0x0f);
                        }
                }
                if(kdown==0)
                {
                        delay(10);
                        if(kdown==0)
                        {
                                set_num--;if(set_num<0)set_num=1;
                                while(!kdown);
                                WriteCMD(0x80+0x4b);
                                for(num=0;num<5;num++)
                                {
                                        if(set_num==0)
                                        {WriteDAT(set1[num]);flag=1;}
                                        if(set_num==1)
                                        {WriteDAT(set2[num]);flag=0;}                                                
                                        delay(20);
                                }
                                WriteCMD(0x80+0x4f);
                                WriteCMD(0x0f);
                        }
                }
        }
        if(key==2)
        {
                if(kup==0)
                {
                        delay(10);
                        if(kup==0)
                        {
                                xishu++;if(xishu>=99)xishu=0;
                                write_xishu(xishu);
                                WriteCMD(0x80+0x41);
                                WriteCMD(0x0f);
                        }
                }
                if(kdown==0)
                {
                        delay(10);
                        if(kdown==0)
                        {
                                xishu--;if(xishu<0)xishu=99;
                                write_xishu(xishu);
                                WriteCMD(0x80+0x41);
                                WriteCMD(0x0f);
                        }
                }
        }               
}

void bobao()
{
        uint buff;
        uchar ge,shi,bai;

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 基于STM32的智能蓝牙电子设计源码原理图等是一个将传统电子与蓝牙技术相结合的项目。该项目主要包括硬件设计和软件开发两个方面。 在硬件设计方面,项目采用STM32微控制器作为主控芯片,配合其它硬件模块,如称重传感器、LCD屏幕、蓝牙模块等,构成了完整的电子设备。在原理图设计上,需要根据硬件模块的特性和接口要求进行布线和连接,同时考虑到电源管理和保护等关键问题。在PCB设计中,需要根据原理图进行布板,使得各个模块可以良好地连接并协同工作。 在软件开发方面,项目主要涉及到嵌入式软件的编写和调试。首先,需要根据硬件设计的接口要求,编写STM32的驱动代码,使得其可以正确地控制和处理各个硬件模块。其次,需要编写相应的算法和逻辑,将传感器采集到的数据转化为实际的重量值,并通过LCD屏幕进行显示。最后,需要编写蓝牙通信的相关代码,将电子的数据通过蓝牙无线传输给其他设备。 总结起来,基于STM32的智能蓝牙电子设计涉及到硬件设计和软件开发两个方面。在硬件设计中,需要考虑模块的连接和布线,保证各个硬件模块的正常工作。在软件开发中,需要编写嵌入式软件的驱动代码、算法以及蓝牙通信代码。这样才能实现电子的功能,使其能够通过蓝牙无线传输数据给其他设备,实现智能化的功能。 ### 回答2: 基于STM32的智能蓝牙电子是一种集蓝牙功能和电子称功能于一体的智能设备。该设备基于STM32单片机进行设计和开发,结合了电子的重量测量功能和蓝牙通信功能,能够通过蓝牙将测得的重量数据传输到智能手机、平板电脑等移动设备上进行显示和存储。 在硬件设计方面,智能蓝牙电子采用了STM32系列单片机作为主控芯片,并使用AD模数转换器来进行重量数据的采集。设计中需要考虑到台的材质和结构,选用合适的传感器来实现重量的测量,同时还需要一个合适的显示模块来显示测量结果。蓝牙模块负责与外部设备进行无线通信,并传输测量数据。 在软件开发方面,首先需要编写固件程序来控制STM32的各个模块和进行重量数据的采集和处理。可以利用STM32提供的开发工具和库函数进行开发,编写相应的驱动程序和算法。同时,需要编写蓝牙通信相关的代码,实现与移动设备的连接和数据传输。在移动设备上,可以开发相应的应用程序,接收和解析蓝牙传输的数据,并进行显示和存储。 整个设计过程中,需要进行电路设计、PCB布局及焊接、固件编程、调试等多个环节。同时,也需要进行严格的测试和验证,确保设备的准确和可靠性。最终,设计完成后,还可以根据需求进行功能扩展,如添加温湿度传感器、数据存储等功能模块,实现更加智能化的应用。 总的来说,基于STM32的智能蓝牙电子设计需要一定的硬件和软件开发能力,同时需要充分考虑到电子和蓝牙通信的特性和要求,以确保设计的稳定性和可用性。 ### 回答3: 基于STM32的智能蓝牙电子设计是一种使用STM32微控制器开发的电子产品。该设计通过集成蓝牙模块,可以方便地将测量结果传输到移动设备,实现了智能化的功能。 在这个设计中,首先需要进行硬件的设计和连接。设计采用STM32微控制器作为处理器,利用其丰富的接口和功能,可以实现测量传感器的数据采集、数据处理和控制功能。除此之外,还需要添加蓝牙模块以实现与移动设备的通信。根据具体需求,还可以添加LCD显示屏、按键、背光等外设。 其次,需要编写嵌入式软件程序。在程序中,需要使用相应的编程语言,如C语言,来编写各种功能的代码。核心代码包括测量传感器的数据采集和处理、蓝牙模块的通信和数据传输等等。此外,还需要为用户提供界面友好的操作界面,使用户可以方便地操作和查看测量结果。 最后,整个设计需要进行测试和调试。测试应包括硬件和软件的功能测试,确保电子的测量结果准确可靠,并且蓝牙通信功能正常。同时,还需要进行性能测试,以确保电子在长时间使用和不同环境下的稳定性和可靠性。 总结而言,基于STM32的智能蓝牙电子设计是一种通过利用STM32微控制器和蓝牙模块实现的电子产品。通过硬件设计、嵌入式软件编程和测试调试等过程,可以实现测量结果的即时传输和智能化操作,为用户提供更加便捷和智能的使用体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森旺电子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值