当前位置:   article > 正文

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

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、程序

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

  1. #include <reg52.H>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define PX_1602 P1
  5. sbit RS =P3^2;
  6. sbit RW =P3^3;
  7. sbit E =P3^4;
  8. /*sbit RS =P1^3;
  9. sbit RW =P1^4;
  10. sbit E =P1^5;*/
  11. sbit kset =P2^0;
  12. sbit kup =P2^2;
  13. sbit kdown=P2^1;
  14. sbit ADDO = P2^4;
  15. sbit ADSK = P2^3;
  16. sbit sda =P3^5;
  17. sbit busy=P3^6;
  18. uchar code str1[]={"Test weight: "};
  19. uchar code str2[]={" 00.0Kg Voice"};
  20. uchar code str11[]={"Welcome to use"};
  21. uchar code str22[]={"Password:"};
  22. uchar code set1[]={"Voice"};
  23. uchar code set2[10]={" "};
  24. unsigned long buf=0,maopi=0,shiwu=0,shiwu2=0,shiwu_buf=0,gu=84866;
  25. uchar key,TSS,flag=0;
  26. uint t;
  27. int set_num,xishu=38;
  28. double kg;
  29. void ddelay(uint cnt)
  30. {
  31. while(cnt--);
  32. }
  33. void delay(uint z)
  34. {
  35. uint x,y;
  36. for(x=z;x>0;x--)
  37. for(y=110;y>0;y--);
  38. }
  39. void Delay1us (uint T )
  40. {
  41. while ( T-- );
  42. }
  43. void SendData (uchar addr)
  44. {
  45. uchar i;
  46. EA = 0;
  47. sda = 1;
  48. Delay1us ( 1000 );
  49. sda = 0;
  50. Delay1us ( 420 );
  51. for ( i = 0; i < 8; i++ )
  52. {
  53. sda = 1;
  54. if ( addr & 0x01 )
  55. {
  56. Delay1us ( 300 );
  57. sda = 0;
  58. Delay1us ( 100 );
  59. }
  60. else
  61. {
  62. Delay1us ( 100 );
  63. sda = 0;
  64. Delay1us ( 300 );
  65. }
  66. addr >>= 1;
  67. }
  68. sda = 1;
  69. EA = 1;//????
  70. }
  71. void WriteCMD(uchar command)
  72. {
  73. RS = 0;
  74. RW = 0;
  75. ddelay(20);
  76. E = 1;
  77. ddelay(20);
  78. PX_1602 = command;
  79. ddelay(30);
  80. E = 0;
  81. ddelay(50);
  82. }
  83. void WriteDAT(uchar dat)
  84. {
  85. RS = 1;
  86. RW = 0;
  87. ddelay(20);
  88. E = 1;
  89. ddelay(20);
  90. PX_1602 = dat;
  91. ddelay(30);
  92. E = 0;
  93. ddelay(50);
  94. }
  95. void init_1602()
  96. {
  97. uchar num;
  98. E=0;
  99. WriteCMD(0x38);
  100. WriteCMD(0x38);
  101. WriteCMD(0x0c);
  102. WriteCMD(0x06);
  103. WriteCMD(0x01);
  104. WriteCMD(0x80);
  105. for(num=0;num<16;num++)
  106. {
  107. WriteDAT(str1[num]);
  108. //if(num==4){WriteCMD(0x80+4);WriteDAT(0xd0+15);}
  109. delay(20);
  110. }
  111. WriteCMD(0x80+0x40);
  112. for(num=0;num<16;num++)
  113. {
  114. WriteDAT(str2[num]);
  115. delay(20);
  116. }
  117. delay(200); //yan shi 100us(12Mjingzheng)
  118. }
  119. void password()
  120. {
  121. uchar num,kk=1;
  122. uchar ps1,ps2,ps3,ps4,ps5,ps6,ps7;
  123. E=1;
  124. WriteCMD(0x38);
  125. WriteCMD(0x38);
  126. WriteCMD(0x0c);
  127. WriteCMD(0x06);
  128. WriteCMD(0x01);
  129. WriteCMD(0x80);
  130. for(num=0;num<14;num++)
  131. {
  132. WriteDAT(str11[num]);
  133. delay(20);
  134. }
  135. WriteCMD(0x80+0x40);
  136. for(num=0;num<9;num++)
  137. {
  138. WriteDAT(str22[num]);
  139. delay(20);
  140. }
  141. delay(200); //yan shi 100us(12Mjingzheng)
  142. WriteCMD(0x80+0x49);
  143. WriteCMD(0x0f);
  144. while(1)
  145. {
  146. if(kset==0)
  147. {
  148. delay(10);
  149. if(kset==0)
  150. {
  151. kk++;
  152. while(kset==0);
  153. WriteCMD(0x0f);
  154. switch (kk)
  155. {
  156. case 1 : WriteCMD(0x80+0x49); break;
  157. case 2 : WriteCMD(0x80+0x4a); break;
  158. case 3 : WriteCMD(0x80+0x4b); break;
  159. case 4 : WriteCMD(0x80+0x4c); break;
  160. case 5 : WriteCMD(0x80+0x4d); break;
  161. case 6 : WriteCMD(0x80+0x4e); break;
  162. case 7 : WriteCMD(0x80+0x4f); break;
  163. case 8 : kk=1;WriteCMD(0x80+0x49); break;
  164. }
  165. }
  166. }
  167. if(kk==1)
  168. {
  169. if(ps1==2&&ps2==0&&ps3==1&&ps4==8&&ps5==6&&ps6==6&&ps7==6)break;
  170. if(kup==0)
  171. {
  172. delay(100);
  173. if(kup==0)
  174. {
  175. if(kdown==0)break;
  176. ps1++;if(ps1>=10)ps1=0;
  177. WriteCMD(0x80+0x49);
  178. WriteDAT(0x30+ps1);
  179. WriteCMD(0x80+0x49);
  180. WriteCMD(0x0e);
  181. }
  182. }
  183. if(kdown==0)
  184. {
  185. delay(100);
  186. if(kdown==0)
  187. {
  188. if(kup==0)break;
  189. if(ps1>0)ps1--;
  190. else ps1=9;
  191. WriteCMD(0x80+0x49);
  192. WriteDAT(0x30+ps1);
  193. WriteCMD(0x80+0x49);
  194. WriteCMD(0x0e);
  195. }
  196. }
  197. }
  198. if(kk==2)
  199. {
  200. if(kup==0)
  201. {
  202. delay(100);
  203. if(kup==0)
  204. {
  205. ps2++;if(ps2>=10)ps2=0;
  206. WriteCMD(0x80+0x4a);
  207. WriteDAT(0x30+ps2);
  208. WriteCMD(0x80+0x4a);
  209. WriteCMD(0x0e);
  210. }
  211. }
  212. if(kdown==0)
  213. {
  214. delay(100);
  215. if(kdown==0)
  216. {
  217. if(ps2>0)ps2--;
  218. else ps2=9;
  219. WriteCMD(0x80+0x4a);
  220. WriteDAT(0x30+ps2);
  221. WriteCMD(0x80+0x4a);
  222. WriteCMD(0x0e);
  223. }
  224. }
  225. }
  226. if(kk==3)
  227. {
  228. if(kup==0)
  229. {
  230. delay(100);
  231. if(kup==0)
  232. {
  233. ps3++;if(ps3>=10)ps3=0;
  234. WriteCMD(0x80+0x4b);
  235. WriteDAT(0x30+ps3);
  236. WriteCMD(0x80+0x4b);
  237. WriteCMD(0x0e);
  238. }
  239. }
  240. if(kdown==0)
  241. {
  242. delay(100);
  243. if(kdown==0)
  244. {
  245. if(ps3>0)ps3--;
  246. else ps3=9;
  247. WriteCMD(0x80+0x4b);
  248. WriteDAT(0x30+ps3);
  249. WriteCMD(0x80+0x4b);
  250. WriteCMD(0x0e);
  251. }
  252. }
  253. }
  254. if(kk==4)
  255. {
  256. if(kup==0)
  257. {
  258. delay(100);
  259. if(kup==0)
  260. {
  261. ps4++;if(ps4>=10)ps4=0;
  262. WriteCMD(0x80+0x4c);
  263. WriteDAT(0x30+ps4);
  264. WriteCMD(0x80+0x4c);
  265. WriteCMD(0x0e);
  266. }
  267. }
  268. if(kdown==0)
  269. {
  270. delay(100);
  271. if(kdown==0)
  272. {
  273. if(ps4>0)ps4--;
  274. else ps4=9;
  275. WriteCMD(0x80+0x4c);
  276. WriteDAT(0x30+ps4);
  277. WriteCMD(0x80+0x4c);
  278. WriteCMD(0x0e);
  279. }
  280. }
  281. }
  282. if(kk==5)
  283. {
  284. if(kup==0)
  285. {
  286. delay(100);
  287. if(kup==0)
  288. {
  289. ps5++;if(ps5>=10)ps5=0;
  290. WriteCMD(0x80+0x4d);
  291. WriteDAT(0x30+ps5);
  292. WriteCMD(0x80+0x4d);
  293. WriteCMD(0x0e);
  294. }
  295. }
  296. if(kdown==0)
  297. {
  298. delay(100);
  299. if(kdown==0)
  300. {
  301. if(ps5>0)ps5--;
  302. else ps5=9;
  303. WriteCMD(0x80+0x4d);
  304. WriteDAT(0x30+ps5);
  305. WriteCMD(0x80+0x4d);
  306. WriteCMD(0x0e);
  307. }
  308. }
  309. }
  310. if(kk==6)
  311. {
  312. if(kup==0)
  313. {
  314. delay(100);
  315. if(kup==0)
  316. {
  317. ps6++;if(ps6>=10)ps6=0;
  318. WriteCMD(0x80+0x4e);
  319. WriteDAT(0x30+ps6);
  320. WriteCMD(0x80+0x4e);
  321. WriteCMD(0x0e);
  322. }
  323. }
  324. if(kdown==0)
  325. {
  326. delay(100);
  327. if(kdown==0)
  328. {
  329. if(ps6>0)ps6--;
  330. else ps6=9;
  331. WriteCMD(0x80+0x4e);
  332. WriteDAT(0x30+ps6);
  333. WriteCMD(0x80+0x4e);
  334. WriteCMD(0x0e);
  335. }
  336. }
  337. }
  338. if(kk==7)
  339. {
  340. if(kup==0)
  341. {
  342. delay(100);
  343. if(kup==0)
  344. {
  345. ps7++;if(ps7>=10)ps7=0;
  346. WriteCMD(0x80+0x4f);
  347. WriteDAT(0x30+ps7);
  348. WriteCMD(0x80+0x4f);
  349. WriteCMD(0x0e);
  350. }
  351. }
  352. if(kdown==0)
  353. {
  354. delay(100);
  355. if(kdown==0)
  356. {
  357. if(ps7>0)ps7--;
  358. else ps7=9;
  359. WriteCMD(0x80+0x4f);
  360. WriteDAT(0x30+ps7);
  361. WriteCMD(0x80+0x4f);
  362. WriteCMD(0x0e);
  363. }
  364. }
  365. }
  366. }
  367. }
  368. /*void write_kg(unsigned long date)
  369. {
  370. unsigned long shi,ge,bai,qian;
  371. if(date>9999)date=9999;
  372. qian=date/1000;
  373. bai=date%1000/100;
  374. shi=date%100/10;
  375. ge=date%10;
  376. WriteCMD(0x80+0x42);
  377. WriteDAT(0x30+qian);
  378. WriteDAT(0x30+bai);
  379. WriteDAT(0x30+shi);
  380. WriteDAT(0x30+ge);
  381. }*/
  382. void write_kgg(unsigned long date)
  383. {
  384. unsigned long shi,ge,bai;
  385. if(date>99999)date=99999;
  386. (unsigned long)date=(float)date/100;
  387. bai=date/100;
  388. shi=date%100/10;
  389. ge=date%10;
  390. WriteCMD(0x80+0x43);
  391. WriteDAT(0x30+bai);
  392. WriteDAT(0x30+shi);
  393. WriteCMD(0x80+0x46);
  394. WriteDAT(0x30+ge);
  395. }
  396. void write_n(uint date)
  397. {
  398. uchar shi,ge,bai;
  399. bai=date/100;
  400. shi=date%100/10;
  401. ge=date%10;
  402. WriteCMD(0x8d);
  403. WriteDAT(0x30+bai);
  404. WriteDAT(0x30+shi);
  405. WriteDAT(0x30+ge);
  406. }
  407. void write_xishu(uint date)
  408. {
  409. uchar shi,ge;
  410. shi=date/10;
  411. ge=date%10;
  412. WriteCMD(0x80+0x40);
  413. WriteDAT(0x30+shi);
  414. WriteDAT(0x30+ge);
  415. }
  416. void delay_us(uint z)
  417. {
  418. while(z--);
  419. }
  420. /*unsigned long get_kg(void)
  421. {
  422. unsigned long Count;
  423. unsigned char i;
  424. ADDO=1;
  425. delay_us(2);
  426. ADSK=0; //使能AD(PD_SCK 置低)
  427. Count=0;
  428. while(ADDO); //AD转换未结束则等待,否则开始读取
  429. for (i=0;i<24;i++)
  430. {
  431. ADSK=1; //PD_SCK 置高(发送脉冲)
  432. Count=Count<<1; //下降沿来时变量Count左移一位,右侧补零
  433. ADSK=0; //PD_SCK 置低
  434. if(ADDO)
  435. Count++;
  436. }
  437. ADSK=1;
  438. Count=Count^0x800000;//第25个脉冲下降沿来时,转换数据
  439. delay_us(2);
  440. ADSK=0;
  441. shiwu=Count/100-gu;
  442. //shiwu=(unsigned int)((float)shiwu/4.22+0.05);
  443. return(shiwu);
  444. }*/
  445. unsigned long hx711_read(void)
  446. {
  447. unsigned long Count;
  448. unsigned char i;
  449. ADDO=1;
  450. delay_us(2);
  451. ADSK=0; //使能AD(PD_SCK 置低)
  452. Count=0;
  453. while(ADDO); //AD转换未结束则等待,否则开始读取
  454. for (i=0;i<24;i++)
  455. {
  456. ADSK=1; //PD_SCK 置高(发送脉冲)
  457. Count=Count<<1; //下降沿来时变量Count左移一位,右侧补零
  458. ADSK=0; //PD_SCK 置低
  459. if(ADDO)
  460. Count++;
  461. }
  462. ADSK=1;
  463. Count=Count^0x800000;//第25个脉冲下降沿来时,转换数据
  464. delay_us(2);
  465. ADSK=0;
  466. return(Count);
  467. }
  468. void get_maopi()
  469. {
  470. buf=hx711_read();
  471. maopi=buf/100;
  472. }
  473. void gei_weight()
  474. {
  475. // uint n;
  476. buf=hx711_read();
  477. buf=buf/100;
  478. if(buf>maopi)
  479. {
  480. shiwu=buf-maopi;
  481. shiwu=(unsigned long)((double)shiwu*xishu/10.0);
  482. //shiwu=(unsigned int)((float)shiwu/3.0+0.05); //需要矫正4.22数值
  483. }
  484. if(shiwu>99000||buf<maopi-30)
  485. {
  486. write_n(999);
  487. while(1);
  488. }
  489. //shiwu-=(gu/10);
  490. }
  491. void scankey()
  492. {
  493. uchar num;
  494. if(kset==0)
  495. {
  496. delay(10);
  497. if(kset==0)
  498. {
  499. key++;
  500. while(kset==0);
  501. write_xishu(xishu);
  502. switch (key)
  503. {
  504. case 1 : WriteCMD(0x80+0x4f);WriteCMD(0x0f); break;
  505. case 2 : WriteCMD(0x80+0x41); break;
  506. case 3 : WriteCMD(0x80+0x40);
  507. for(num=0;num<5;num++)
  508. {
  509. WriteDAT(set2[num]);
  510. delay(20);
  511. }key=0; WriteCMD(0x0c);break;
  512. }
  513. }
  514. }
  515. if(key==1)
  516. {
  517. if(kup==0)
  518. {
  519. delay(10);
  520. if(kup==0)
  521. {
  522. set_num++;if(set_num>=2)set_num=0;
  523. while(!kup);
  524. WriteCMD(0x80+0x4b);
  525. for(num=0;num<5;num++)
  526. {
  527. if(set_num==0)
  528. {WriteDAT(set1[num]);flag=1;}
  529. if(set_num==1)
  530. {WriteDAT(set2[num]);flag=0;}
  531. delay(20);
  532. }
  533. WriteCMD(0x80+0x4f);
  534. WriteCMD(0x0f);
  535. }
  536. }
  537. if(kdown==0)
  538. {
  539. delay(10);
  540. if(kdown==0)
  541. {
  542. set_num--;if(set_num<0)set_num=1;
  543. while(!kdown);
  544. WriteCMD(0x80+0x4b);
  545. for(num=0;num<5;num++)
  546. {
  547. if(set_num==0)
  548. {WriteDAT(set1[num]);flag=1;}
  549. if(set_num==1)
  550. {WriteDAT(set2[num]);flag=0;}
  551. delay(20);
  552. }
  553. WriteCMD(0x80+0x4f);
  554. WriteCMD(0x0f);
  555. }
  556. }
  557. }
  558. if(key==2)
  559. {
  560. if(kup==0)
  561. {
  562. delay(10);
  563. if(kup==0)
  564. {
  565. xishu++;if(xishu>=99)xishu=0;
  566. write_xishu(xishu);
  567. WriteCMD(0x80+0x41);
  568. WriteCMD(0x0f);
  569. }
  570. }
  571. if(kdown==0)
  572. {
  573. delay(10);
  574. if(kdown==0)
  575. {
  576. xishu--;if(xishu<0)xishu=99;
  577. write_xishu(xishu);
  578. WriteCMD(0x80+0x41);
  579. WriteCMD(0x0f);
  580. }
  581. }
  582. }
  583. }
  584. void bobao()
  585. {
  586. uint buff;
  587. uchar ge,shi,bai;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/706884
推荐阅读
相关标签
  

闽ICP备14008679号