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)
还没有任何评论哟~
