Advertisement

51单片机电子体重秤设计(附源码、原理图及相关资料)

阅读量:

目录

1、概要

2、所用到的物料

3、实物照片

4、原理图

​5、模块使用说明

6、程序

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

1、概要

1、支持从0到150公斤的重量测量;
2、称重结果实时显示为1602;
3、测量精度最低可达0.01公斤;
4、当达到稳定状态时自动触发语音播报;
5、系统提供声音提示功能并支持关闭操作;
6、通过手动调整计算参数来弥补传感器的一致性差异。

2、所用到的物料

该系统选用高性能STC89C52单片机作为核心控制器;
所用LCD显示屏采用标准接口(1602液晶);
语音采集系统选用JQ8900-16P语音采集模块;
重量测量装置选用HX711称重传感器;
开发板上配置了多种常用元器件集合,
包括PCB板上的洞洞板安装孔,
以及必要的下载线连接端口,
同时配备晶振元件,
电容组件,
电阻元件,
按键输入,
以及排针连线等基础组件

3、实物照片

4、原理图

5、模块使用说明

JQ8900-16P 采用的是 SOC 方案,并搭载了一个16位的MCU以及专门针对音频解码的应用级数字信号处理器(ADSP),通过硬件实现解码过程以确保系统的稳定性和音质。其紧凑型设计使得该芯片能够轻松集成到其他设备中以满足多样化需求。显著特点之一是支持便捷地更换存储在SPIFlash中的音频文件;相比传统方案,在无需额外硬件的情况下即可轻松完成音频文件的替换。该芯片支持多种串口接口配置选项(包括一线串口控制模式和可选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;  
    
   469.         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;

全部评论 (0)

还没有任何评论哟~