|
一、要求與目的:
1、實(shí)現(xiàn)0~150KG的量程稱量;
2、實(shí)時(shí)顯示稱量結(jié)果在1602上;
3、最小誤差為0.01KG;
4、稱量體重或物體時(shí)待結(jié)果穩(wěn)定后,實(shí)現(xiàn)語(yǔ)音播報(bào)結(jié)果;
5、語(yǔ)音播報(bào)可手動(dòng)關(guān)閉或打開(kāi);
6、由于傳感器一致性差異,體重計(jì)算的系數(shù)可手動(dòng)調(diào)節(jié)。
二、所用到的物料:
1、STC89C52單片機(jī)
2、1602液晶
3、JQ8900-16P語(yǔ)音模塊
4、HX711稱重模塊
5、洞洞板、下載線、晶振、電容、電阻、按鍵、排針等
三、實(shí)物照片:
四、原理圖:
JQ8900-16P語(yǔ)音模塊原理圖:
三、模塊使用說(shuō)明
JQ8900-16P 選用的是 SOC 方案,集成了一個(gè) 16 位的 MCU,以及一個(gè)專門(mén)針對(duì)音頻解碼的ADSP,采用硬解碼的方式,更加保證了系統(tǒng)的穩(wěn)定性和音質(zhì)。小巧尺寸更加滿足嵌入其它產(chǎn)品的需求。
SPI-flash 更換語(yǔ)音內(nèi)容
此芯片最大的優(yōu)勢(shì)在于能夠靈活的更換 SPI-flash 內(nèi)的語(yǔ)音內(nèi)容,省去了傳統(tǒng)語(yǔ)音芯片需要安裝上位機(jī)更換語(yǔ)音的麻煩,SPI FLASH 直接模擬成 U 盤(pán),跟拷貝 U 盤(pán)一樣,非常方便。使得產(chǎn)品研發(fā)和生產(chǎn)變得便捷簡(jiǎn)單。一線串口控制模式、RX232 串口控制可選,為研發(fā)提供更多的選擇性。 USB 數(shù)據(jù)線連接芯片,插上電腦,電腦會(huì)自動(dòng)識(shí)別,如下圖所示:
五、源代碼和模塊資料(附件中)
單片機(jī)源程序如下:
- #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轉(zhuǎn)換未結(jié)束則等待,否則開(kāi)始讀取
- for (i=0;i<24;i++)
- {
- ADSK=1; //PD_SCK 置高(發(fā)送脈沖)
- Count=Count<<1; //下降沿來(lái)時(shí)變量Count左移一位,右側(cè)補(bǔ)零
- ADSK=0; //PD_SCK 置低
- if(ADDO)
- Count++;
- }
- ADSK=1;
- Count=Count^0x800000;//第25個(gè)脈沖下降沿來(lái)時(shí),轉(zhuǎn)換數(shù)據(jù)
- 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轉(zhuǎn)換未結(jié)束則等待,否則開(kāi)始讀取
- for (i=0;i<24;i++)
- {
- ADSK=1; //PD_SCK 置高(發(fā)送脈沖)
- Count=Count<<1; //下降沿來(lái)時(shí)變量Count左移一位,右側(cè)補(bǔ)零
- ADSK=0; //PD_SCK 置低
- if(ADDO)
- Count++;
- }
- ADSK=1;
- Count=Count^0x800000;//第25個(gè)脈沖下降沿來(lái)時(shí),轉(zhuǎn)換數(shù)據(jù)
- 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數(shù)值
- }
- 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;
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
JQ8900-16P語(yǔ)音模塊資料包V1.1.rar
(6.8 MB, 下載次數(shù): 425)
2018-5-20 08:35 上傳
點(diǎn)擊文件名下載附件
Realplay+HX711模塊稱重傳感器專用24位精度AD模塊+壓力傳感器.rar
(3.94 MB, 下載次數(shù): 373)
2018-5-20 08:35 上傳
點(diǎn)擊文件名下載附件
電子秤+語(yǔ)言播報(bào)_程序.zip
(63.11 KB, 下載次數(shù): 511)
2018-5-20 08:35 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|