带语音播报的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;

最近更新

  1. TCP协议是安全的吗?

    2024-03-21 10:16:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-21 10:16:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-21 10:16:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-21 10:16:04       18 阅读

热门阅读

  1. 特殊的三角形

    2024-03-21 10:16:04       15 阅读
  2. ES6 Fetch API的基础使用

    2024-03-21 10:16:04       17 阅读
  3. 使用verilog设计实现16位CPU及仿真

    2024-03-21 10:16:04       17 阅读
  4. 算法刷题day33

    2024-03-21 10:16:04       17 阅读
  5. leetcode 1969.数组元素的最小非零乘积

    2024-03-21 10:16:04       18 阅读
  6. 大语言模型的参数级别和能力之间的关系

    2024-03-21 10:16:04       18 阅读
  7. 深拷贝与浅拷贝

    2024-03-21 10:16:04       17 阅读
  8. [linux] Key is stored in legacy trusted.gpg keyring

    2024-03-21 10:16:04       17 阅读
  9. rust - 对文件进行zip压缩加密

    2024-03-21 10:16:04       14 阅读
  10. 小程序返回webview h5 不刷新问题

    2024-03-21 10:16:04       16 阅读
  11. Redis持久化策略

    2024-03-21 10:16:04       18 阅读
  12. 大数据开发(Hadoop面试真题)

    2024-03-21 10:16:04       18 阅读