找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15145|回复: 46
收起左侧

基于单片机的电子称设计综合包 HX711传感器 16键 1602显示 带论文

  [复制链接]
ID:201968 发表于 2017-5-17 21:42 | 显示全部楼层 |阅读模式
帮助广大51hei论坛友人快速解决HX711传感器的单片机电子称的设计问题
还带开题报告与完整的设计论文,毕业党这下有救了.

制作的成品实物图:
0.png 0.png 0.png
0.png 0.png

元件清单:
元件型号
元件名称
元件标号
数量
蜂鸣器
Bell
B1
1
10uF
电容
C1
1
20pF
电容
C2, C3
2
LCD1602
液晶
LCD1
1
Header 2
电源接口
P1
1
9012
三极管
Q5
1
2.7K
电阻
R1
1
10K
电阻
R2
1
SW-PB
按键
S1, S3, S4, S5, S6,  S7, S8, S9, S10, S11, S12, S13, S14, S15, S16, S17, S18
17
sw-灰色
电源开关
SW1
1
U1
单片机
U1
1
12M
晶振
Y1
1

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
0.png
DXP格式用            Altium designer Summer 软件打开
protel99格式用       protel99SE 软件打开
PDF格式用            PDF 软件打开
Word格式用           Word 或用WPS 软件打开

4种格式的原理图都内容是一样的  只是打开方式不同
请看原理图焊接,不要看仿真图焊接。
wrod格式里面的原理图是复制出来的,有一点点变行变形,麻烦大家注意一下,尽量看其他三种格式的图焊接,
如果论文里面的原理图和原理图文件夹内的图不一样的话,请大家以原理图文件夹内的为准,原理图文件夹的图是和实物配套的,可以自己截图或复制,然后粘贴到论文里面去。
0.png

资料包含以下目录(里面很多都有详细的视频教程,非常值得大家学习)
Altium Designer Sunner画图软件学习视频\
Altium Designer Sunner画图软件安装视频\
AltiumDesignerSummer9 画图软件安装包\
C语言视频教程\
KEIL 软件安装视频\
keil4软件安装包 开发工具地址\
MCU 单片机芯片资料\
PCB图\
Protel 99 软件安装包\
Protel 99 软件安装视频\
Protel 99画图软件学习视频\
Proteus ISIS  仿真软件学习视频\
Proteus 软件安装包\
PROTEUS仿真软件的安装方法\
元件清单\
制作过程\
单片机初学者视频教程 郭天祥老师\
单片机初学者视频教程 霖锋老师\
单片机程序下载软件 STC-ISP-V4.83\
原理图 电子称\
原理图 电子称  没有字\
参考论文\
实物照片\
工程新建  程序下载 视频教程\
开发工具地址 keil4软件安装包\
开题报告\
操作视频地址\
毕设答辩技巧\
焊接注意事项和调试讲解\
程序\
答辩常见问题解答\
设计资料\
使用前必读.doc
原理图 打开方式.txt
基于单片机的电子秤系统设计任务书.doc
电子秤文献翻译.doc
程序打开方法.txt


单片机源程序如下:
  1. #include <reg52.h>                 //调用单片机头文件
  2. #define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
  3. #define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535

  4. #define ulong unsigned long

  5. #include<intrins.h>

  6. uchar code table_num[]="0123456789abcdefg";

  7. sbit rs=P1^0;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
  8. sbit rw=P1^1;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
  9. sbit e =P1^2;         //片选信号   下降沿触发

  10. sbit hx711_dout=P2^1;
  11. sbit hx711_sck=P2^0;

  12. sbit beep = P1^3;     //蜂鸣器

  13. long weight;

  14. uint temp,qi_weight;
  15. bit chaozhong_flag;
  16. bit leiji_flag;
  17. bit flag_300ms ;

  18. ulong price,z_price;   //单价 总价
  19. uchar flag_p;

  20. /***************
  21. 删除键
  22. 去皮
  23. 价格清零

  24. ***************/

  25. /******1ms延时函数***12M晶振**************/
  26. void delay_1ms(uint q)
  27. {
  28.         uint i,j;
  29.         for(i=0;i<q;i++)
  30.                 for(j=0;j<120;j++);
  31. }

  32. /********************************************************************
  33. * 名称 : delay_uint()
  34. * 功能 : 小延时。
  35. * 输入 : 无
  36. * 输出 : 无
  37. ***********************************************************************/
  38. void delay_uint(uint q)
  39. {
  40.         while(q--);
  41. }

  42. /********************************************************************
  43. * 名称 : write_com(uchar com)
  44. * 功能 : 1602命令函数
  45. * 输入 : 输入的命令值
  46. * 输出 : 无
  47. ***********************************************************************/
  48. void write_com(uchar com)
  49. {
  50.         e=0;
  51.         rs=0;
  52.         rw=0;
  53.         P0=com;
  54.         delay_uint(3);
  55.         e=1;
  56.         delay_uint(25);
  57.         e=0;
  58. }

  59. /********************************************************************
  60. * 名称 : write_data(uchar dat)
  61. * 功能 : 1602写数据函数
  62. * 输入 : 需要写入1602的数据
  63. * 输出 : 无
  64. ***********************************************************************/
  65. void write_data(uchar dat)
  66. {
  67.         e=0;
  68.         rs=1;
  69.         rw=0;
  70.         P0=dat;
  71.         delay_uint(3);
  72.         e=1;
  73.         delay_uint(25);
  74.         e=0;        
  75. }


  76. /***********************lcd1602上显示这字符函数************************/
  77. void write_string(uchar hang,uchar add,uchar *p)
  78. {
  79.         if(hang==1)   
  80.                 write_com(0x80+add);
  81.         else
  82.                 write_com(0x80+0x40+add);
  83.         while(1)                                                                                                                 
  84.         {
  85.                 if(*p == '\0')  break;
  86.                 write_data(*p);
  87.                 p++;
  88.         }        
  89. }

  90. /***********************lcd1602初始化设置************************/
  91. void init_1602()         //lcd1602初始化设置
  92. {
  93.         write_com(0x38);        //
  94.         write_com(0x0c);
  95.         write_com(0x06);
  96.         delay_uint(1000);
  97. }

  98. ////////////////在指定位置显示指定字符//////////
  99. void write_zifu(uchar hang,uchar add,uchar dat)
  100. {
  101.         if(hang==1)   
  102.                 write_com(0x80+add);
  103.         else
  104.                 write_com(0x80+0x40+add);
  105.         write_data(dat);
  106. }

  107. /********************************************************************
  108. * 名称 : write_sfm4_price(uchar hang,uchar add,uchar date)
  109. * 功能 : 显示价格
  110. * 输入 : 行,列,需要输入1602的数据
  111. * 输出 : 无
  112. ***********************************************************************/
  113. void write_sfm4_price(uchar hang,uchar add,uint date)
  114. {
  115.         if(hang==1)   
  116.                 write_com(0x80+add);
  117.         else
  118.                 write_com(0x80+0x40+add);
  119.         write_data(0x30+date/1000%10);
  120.         write_data(0x30+date/100%10);
  121.         write_data('.');
  122.         write_data(0x30+date/10%10);
  123.         write_data(0x30+date%10);        
  124. }

  125. /****************开机液晶显示函数 初始化液晶的内容********************************/
  126. void init_1602_dis_csf()  //初始化液晶
  127. {                                                                    
  128.         write_string(1,0,"   W:0.000kg    ");
  129.         write_string(2,0,"P:00.00  Z:00.00");
  130.         write_zifu(2,7,0x5c);        //¥               
  131. //        write_zifu(2,15,0x5c);        //¥               

  132. }

  133. /*******************压力显示程序***********************/
  134. void write_1602_yl(uchar hang,uchar add,uint date)
  135. {
  136.         if(hang==1)   
  137.                 write_com(0x80+add);
  138.         else
  139.                 write_com(0x80+0x40+add);
  140.         write_data(0x30+date/1000%10);
  141.         write_data('.');
  142.         write_data(0x30+date/100%10);
  143.         write_data(0x30+date/10%10);
  144.         write_data(0x30+date%10);        
  145.         
  146. }


  147. void Delay__hx711_us(void)
  148. {
  149.         _nop_();
  150.         _nop_();
  151. }

  152. ulong ReadCount(void)        //增益128
  153. {
  154.         ulong count,value = 0;
  155.         uchar i;
  156.           hx711_dout=1;
  157.         Delay__hx711_us();
  158.           hx711_sck=0;
  159.           count=0;
  160.           while(hx711_dout)          ;
  161.           for(i=0;i<24;i++)
  162.         {
  163.                   hx711_sck=1;
  164.                   count=count<<1;
  165.                 hx711_sck=0;
  166.                   if(hx711_dout)
  167.                         count++;
  168.         }
  169.          hx711_sck=0;
  170.         Delay__hx711_us();
  171.         hx711_sck=1;  
  172.         return(count);
  173. }

  174. void get_pizhong()          //获取皮重,秤盘重量
  175. {
  176.         ulong hx711_dat;
  177.         hx711_dat=ReadCount();                //HX711AD转换数据处理
  178.         temp=(uint)(hx711_dat/100);        
  179. }

  180. void get_weight()          //获取被测物体重量
  181. {
  182.         ulong hx711_data,a;
  183.         uint get,aa;        
  184.         hx711_data=ReadCount();                   //HX711AD转换数据处理
  185.         get=(uint)(hx711_data/100);
  186.         if(get>temp)
  187.         {
  188.                 a=ReadCount();
  189.                 aa=(uint)(a/100)-temp;
  190.                 weight=(uint)((float)aa/4.9+0.05);//重量转换函数,传感器型号不同此函数要适当修改
  191.         }
  192. }

  193. /************************************************/
  194. /*  由于称重传感器线性度参数的不同,而对获得的重量数据处理,
  195. 此处可能会根据不同称重传感器,程序的代码会有所不同      */        
  196. /************************************************/


  197. /*************定时器0初始化程序***************/
  198. void time_init()         
  199. {
  200.         EA   = 1;                   //开总中断
  201.         TMOD = 0X01;          //定时器0、定时器1工作方式1
  202.         ET0  = 1;                  //开定时器0中断
  203.         TR0  = 1;                  //允许定时器0定时
  204. }

  205. /********************独立按键程序*****************/
  206. uchar key_can;         //按键值

  207. void key()         //独立按键程序
  208. {
  209.         static uchar key_new = 0, key_l;
  210.         key_can = 20;                   //按键值还原
  211.         P3 = 0x0f;
  212.         if((P3 & 0x0f) != 0x0f)                //按键按下
  213.         {
  214.                 delay_1ms(1);                     //按键消抖动
  215.                 if(((P3 & 0x0f) != 0x0f) && (key_new == 1))
  216.                 {                                                //确认是按键按下
  217.                         key_new = 0;
  218.                         key_l = P3 | 0xf0;   //矩阵键盘扫描
  219.                         P3 = key_l;
  220.                         switch(P3)
  221.                         {
  222.                                 case 0xee:  key_can = 1;  break;  //得到按键值
  223.                                 case 0xde:  key_can = 4;  break;   //得到按键值
  224.                                 case 0xbe:  key_can = 7;  break;   //得到按键值
  225.                                 case 0x7e:  key_can = 10;  break;   //得到按键值
  226.         
  227.                                 case 0xed:  key_can = 2;  break;  //得到按键值
  228.                                 case 0xdd:  key_can = 5;  break;   //得到按键值
  229.                                 case 0xbd:  key_can = 8;  break;   //得到按键值
  230.                                 case 0x7d:  key_can = 0;  break;   //得到按键值
  231.         
  232.                                 case 0xeb:  key_can = 11;  break;  //得到按键值
  233.                                 case 0xdb:  key_can = 9;  break;   //得到按键值
  234.                                 case 0xbb:  key_can = 6;  break;   //得到按键值
  235.                                 case 0x7b:  key_can = 3;  break;   //得到按键值
  236.         
  237.                                 case 0xe7:  key_can = 15;  break;  //得到按键值
  238.                                 case 0xd7:  key_can = 14;  break;  //得到按键值
  239.                                 case 0xb7:  key_can = 13;  break;   //得到按键值
  240.                                 case 0x77:  key_can = 12;  break;  //得到按键值         
  241.                         }        
  242.                         beep = 0;  //蜂鸣器叫一声
  243.                         delay_1ms(100);
  244.                         beep = 1;
  245.                 }                        
  246.         }
  247.         else
  248.                 key_new = 1;        
  249. }

  250. /************按键控制函数*************/
  251. void key_with()
  252. {
  253.         if(key_can <= 9)   //数字键
  254.         {
  255.                 if(flag_p >= 4)
  256.                 {
  257.                         flag_p = 0;
  258.                 }
  259.                 if(flag_p == 0)
  260.                         price = key_can;
  261.                 else
  262.                 {
  263.                         price = price * 10 + key_can;            
  264.                 }           
  265.                 write_sfm4_price(2,2,price);        //显示单价               
  266.                 flag_p ++;
  267.         }
  268.         if(key_can == 15)   //删除键
  269.         {   
  270.                 if(price != 0 )
  271.                 {
  272.                         flag_p --;
  273.                         price /= 10;                 //删除
  274.                         write_sfm4_price(2,2,price);//显示单价                                
  275.                 }
  276.         }
  277.         if(key_can == 14)   //去皮
  278.         {
  279.                 get_pizhong();          //获取皮重,秤盘重量
  280.         }
  281.         if(key_can == 13)   //价格清零
  282.         {
  283.                 flag_p = 0;
  284.                 price = 0;
  285.                 write_sfm4_price(2,2,price);//显示单价                                
  286.         }
  287. }

  288. /*****************主函数********************/
  289. void main()
  290. {        
  291.         beep = 0;  //蜂鸣器叫一声
  292.         delay_1ms(100);
  293.         P0 = P1 = P2 = P3 = 0xff;                //单片机IO口初始化为1
  294.         time_init();                    //初始化定时器
  295.         init_1602();                 //lcd1602初始化
  296.         init_1602_dis_csf(); //lcd1602初始化显示
  297. ……………………

  298. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供打包下载:
## 电子称 16键 1602.rar (12.17 MB, 下载次数: 779)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:82765 发表于 2017-5-19 16:12 | 显示全部楼层
非常感谢分享这么好的资源
回复

使用道具 举报

ID:82765 发表于 2017-5-19 17:31 | 显示全部楼层
好资料,程序在仿真里面完全通过

1.jpg
2.jpg
回复

使用道具 举报

ID:202734 发表于 2017-5-20 00:22 | 显示全部楼层
厉害了我的大兄弟
回复

使用道具 举报

ID:203968 发表于 2017-5-23 19:46 | 显示全部楼层
dbj123 发表于 2017-5-20 00:22
厉害了我的大兄弟

咨询下怎么下载呢
回复

使用道具 举报

ID:203968 发表于 2017-5-23 20:02 | 显示全部楼层
怎么下载呢
回复

使用道具 举报

ID:220276 发表于 2017-7-21 22:09 | 显示全部楼层
下载下来不知道是什么文件,浪费5黑币
回复

使用道具 举报

ID:208443 发表于 2017-7-23 18:56 | 显示全部楼层
xiaohui3991 发表于 2017-7-21 22:09
下载下来不知道是什么文件,浪费5黑币

用迅雷可以下载
回复

使用道具 举报

ID:196311 发表于 2017-7-28 11:22 | 显示全部楼层
想看看数值转换算法,谢谢
回复

使用道具 举报

ID:243406 发表于 2017-11-7 13:26 | 显示全部楼层
xiaohui3991 发表于 2017-7-21 22:09
下载下来不知道是什么文件,浪费5黑币

是rar格式的压缩包文件啊,可以直接解压。
回复

使用道具 举报

ID:134968 发表于 2017-11-7 16:12 | 显示全部楼层
挺好的 资源 以前我也做过这个
回复

使用道具 举报

ID:252068 发表于 2017-11-21 21:21 | 显示全部楼层

好资料,程序在仿真里面完全通过
回复

使用道具 举报

ID:258174 发表于 2017-12-6 14:32 | 显示全部楼层
非常好!
回复

使用道具 举报

ID:258844 发表于 2017-12-7 21:47 | 显示全部楼层
非常好!
回复

使用道具 举报

ID:259132 发表于 2017-12-8 16:18 | 显示全部楼层
easee 发表于 2017-7-23 18:56
用迅雷可以下载

怎么下载啊,可以给我私发一下吗?谢谢
回复

使用道具 举报

ID:259132 发表于 2017-12-8 16:20 | 显示全部楼层
怎么下载啊,还有怎么解压
回复

使用道具 举报

ID:230543 发表于 2017-12-9 08:56 | 显示全部楼层
为什么我下载的不能打开啊,我都下载2次了,有人回复么
回复

使用道具 举报

ID:230543 发表于 2017-12-9 09:02 | 显示全部楼层
解压一直在说创建失败
回复

使用道具 举报

ID:230543 发表于 2017-12-9 09:49 | 显示全部楼层
下载成功了,资料很棒
回复

使用道具 举报

ID:260531 发表于 2017-12-12 10:46 | 显示全部楼层
easee 发表于 2017-7-23 18:56
用迅雷可以下载

怎么用迅雷下载啊
回复

使用道具 举报

ID:279469 发表于 2018-2-23 18:17 | 显示全部楼层
感谢分享这么好的资源
回复

使用道具 举报

ID:303068 发表于 2018-4-16 18:07 | 显示全部楼层
无法解压啊??怎么回事啊?请问有谁可以发一份吗?
回复

使用道具 举报

ID:303068 发表于 2018-4-16 18:18 | 显示全部楼层
ahmas 发表于 2018-2-23 18:17
感谢分享这么好的资源

你好,可以分享下文件吗?我下载了两次都不可以解压
回复

使用道具 举报

ID:279469 发表于 2018-4-17 18:50 | 显示全部楼层
楼主的电子称 16键,解压能用.

## 电子称 16键 1602.rar

14.66 MB, 下载次数: 29, 下载积分: 黑币 -5

回复

使用道具 举报

ID:323830 发表于 2018-5-6 22:25 | 显示全部楼层
挺详细的
回复

使用道具 举报

ID:323830 发表于 2018-5-6 23:10 | 显示全部楼层
找仿真图没找到,发现这里有
回复

使用道具 举报

ID:323916 发表于 2018-5-7 08:32 | 显示全部楼层
666感谢分享
回复

使用道具 举报

ID:333109 发表于 2018-5-18 16:41 | 显示全部楼层
大学毕业设计可以用到
回复

使用道具 举报

ID:333109 发表于 2018-5-18 16:44 | 显示全部楼层

要有黑币
回复

使用道具 举报

ID:134968 发表于 2018-5-28 10:11 | 显示全部楼层
为什么打不开啊 是个假文件吗
回复

使用道具 举报

ID:134968 发表于 2018-5-28 10:11 | 显示全部楼层
ahmas 发表于 2018-4-17 18:50
楼主的电子称 16键,解压能用.

坑积分 我擦
回复

使用道具 举报

ID:306869 发表于 2018-7-10 09:24 | 显示全部楼层
下载下来用什么软件打开啊 不是个压缩包呀
回复

使用道具 举报

ID:306869 发表于 2018-7-10 09:31 | 显示全部楼层
你好 能加一下QQ微信吗
下载下来的不是压缩包  不知道什么文件求私发
1263079057@qq.com
回复

使用道具 举报

ID:306869 发表于 2018-7-12 10:24 | 显示全部楼层
问题解决了  不知道怎么弄的往文件名后面加个.rar  就好了  自动变成压缩文件了
回复

使用道具 举报

ID:370051 发表于 2018-7-12 16:23 | 显示全部楼层
后缀加个.rar就可以压缩了
回复

使用道具 举报

ID:282520 发表于 2018-9-20 21:37 | 显示全部楼层
可以 正好 在做这个项目
回复

使用道具 举报

ID:421173 发表于 2018-11-9 16:41 | 显示全部楼层
不是正常文件,打不开怎么回事啊?
回复

使用道具 举报

ID:428060 发表于 2018-11-24 22:18 | 显示全部楼层
下载完重命名后面+rar.就可以解压了
回复

使用道具 举报

ID:406702 发表于 2018-12-9 16:05 来自手机 | 显示全部楼层
非常不错啊,兄弟
回复

使用道具 举报

ID:424725 发表于 2019-3-31 16:55 | 显示全部楼层
谢谢楼主分享!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表