找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 17844|回复: 10
打印 上一主题 下一主题
收起左侧

单片机控制的电子秤 实物图,电路图,pcb及程序全套资料

  [复制链接]
跳转到指定楼层
楼主
数码管显示,实物图,电路图,pcb及全套资料
拟采取的方法、技术或设计(开发)工具:
本设计主要以MCS-51系列单片机STC89C52为控制核心,它自带8KFLASH程序存储器,它的核心处理单元为8位。数据处理主要是对压力传感器进行AD采集,并进行逻辑判断,根据数据的具体情况输出到数码管显示和使蜂鸣器动作。整个单片机应用系统的设计分为硬件电路设计和软件编程设计两大部分;其中硬件电路设计包括压力检测电路,单片机控制电路显示电路和报警与控制电路。软件设计部分包括系统主程序,压力采集子程序,数码管显示子程序和输出驱动子程序,均采用51系列C语言编程实现。


原理图:



论文:


元件型号
元件名称
元件标号
数量
蜂鸣器
蜂鸣器
B1
1
10uF
电容
C1
1
20PF
电容
C2, C3
2
发光二极管
发光二极管
D2
1
SMG04_1
数码管
DS1
1
Header 2
电源接口
P2
1
HX711
AD采集芯片
P3
1
9012
三极管
Q1, Q2, Q3, Q4, Q5
5
10K
电阻
R14
1
1K
电阻
R1-R9
9
SW-PB
按键
S1, S2, S3, S4
4
sw-灰色
电源开关
SW1
1
STC89C52
单片机
U1
1
12M
晶振
Y1
1


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

  5. //数码管段选定义      0     1    2    3    4    5        6         7          8           9        
  6. uchar code smg_du[]={0x28,0xe1,0x32,0xa2,0x54,0xa1,0x21,0xea,0x20,0xa0,
  7.                                            0x60,0x25,0x39,0x26,0x31,0x71,0xff};         //断码
  8. //数码管位选定义
  9. uchar code smg_we[]={0xef,0xdf,0xbf,0x7f};
  10. uchar dis_smg[8] = {0};        
  11. uchar smg_i = 4;    //显示数码管的个位数
  12. sbit beep = P2^3;   //蜂鸣器IO口定义

  13. bit flag_lj_en;                 //按键连加使能
  14. bit flag_lj_3_en;         //按键连3次连加后使能  加的数就越大了
  15. uchar key_time,key_value;      //用做连加的中间变量
  16. bit key_500ms  ;

  17. bit flag_300ms ;
  18. uchar menu_1;       //菜单设计的变量
  19. uint t_high = 300;           //上限报警值

  20. sbit hx711_dout=P2^7;
  21. sbit hx711_sck=P2^6;

  22. long weight;

  23. unsigned long HX711_Buffer = 0;
  24. unsigned long Weight_Maopi = 0;

  25. uint temp,qi_weight;
  26. bit chaozhong_flag;
  27. bit leiji_flag;
  28. uchar flag_200ms ;

  29. #define GapValue 437.0

  30. uint temp,qi_weight;
  31. bit chaozhong_flag;
  32. bit leiji_flag;

  33. /***********************1ms延时函数*****************************/
  34. void delay_1ms(uint q)
  35. {
  36.         uint i,j;
  37.         for(i=0;i<q;i++)
  38.                 for(j=0;j<120;j++);
  39. }

  40. /***********************数码显示函数*****************************/
  41. void display()
  42. {
  43.         static uchar i;   
  44.         i++;
  45.         if(i >= smg_i)
  46.                 i = 0;        
  47.         P1 = 0xff;                         //消隐
  48.         P3 = smg_we[i];                          //位选
  49.         P1 = dis_smg[i];                 //段选               
  50. }


  51. /*************定时器0初始化程序***************/
  52. void time_init()         
  53. {
  54.         EA   = 1;                   //开总中断
  55.         TMOD = 0X01;          //定时器0、定时器1工作方式1
  56.         ET0  = 1;                  //开定时器0中断
  57.         TR0  = 1;                  //允许定时器0定时
  58. }

  59. /********************独立按键程序*****************/
  60. uchar key_can;         //按键值

  61. void key()         //独立按键程序
  62. {
  63.         static uchar key_new;
  64.         key_can = 20;                   //按键值还原
  65.         P2 |= 0x07;
  66.         if((P2 & 0x07) != 0x07)                //按键按下
  67.         {
  68.                 if(key_500ms == 1)        //连加
  69.                 {
  70.                         key_500ms = 0;
  71.                         key_new = 1;
  72.                 }
  73.                 delay_1ms(1);                     //按键消抖动
  74.                 if(((P2 & 0x07) != 0x07) && (key_new == 1))
  75.                 {                                                //确认是按键按下
  76.                         key_new = 0;
  77.                         switch(P2 & 0x07)
  78.                         {
  79.                                 case 0x06: key_can = 3; break;           //得到k2键值
  80.                                 case 0x05: key_can = 2; break;           //得到k3键值
  81.                                 case 0x03: key_can = 1; break;           //得到k4键值
  82.                         }
  83.                         flag_lj_en = 1;         //连加使能
  84.                 }                        
  85.         }
  86.         else
  87.         {
  88.                 if(key_new == 0)
  89.                 {
  90.                         key_new = 1;
  91.                         flag_lj_en = 0;                //关闭连加使能
  92.                         flag_lj_3_en = 0;        //关闭3秒后使能
  93.                         key_value = 0;                //清零
  94.                         key_time = 0;
  95.                         key_500ms = 0;
  96.                 }
  97.         }        
  98. }

  99. /****************按键处理数码管显示函数***************/
  100. void key_with()
  101. {
  102.         if(key_can == 1)          //设置键
  103.         {
  104.                 menu_1 ++;
  105.                 if(menu_1 >= 2)
  106.                 {
  107.                         menu_1 = 0;
  108.                         smg_i = 4;                  //数码管显示3位
  109.                         flag_300ms = 1;
  110.                 }
  111.         }
  112.         if(menu_1 == 1)                        //设置高温报警
  113.         {
  114.                 smg_i = 4;                  //数码管显示4位
  115.                 if(key_can == 2)
  116.                 {
  117.                         if(flag_lj_3_en == 0)
  118.                                 t_high += 10 ;                //按键按下未松开自动加三次        
  119.                         else
  120.                                 t_high += 100;        //按键按下未松开自动加三次之后每次自动加10
  121.                         if(t_high > 9990)
  122.                                 t_high = 9990;
  123.                 }
  124.                 if(key_can == 3)
  125.                 {
  126.                         if(flag_lj_3_en == 0)
  127.                                 t_high -= 10 ;                //按键按下未松开自动减三次        
  128.                         else
  129.                                 t_high -= 100;        //按键按下未松开自动减三次之后每次自动减10
  130.                         if(t_high <= 10)
  131.                                 t_high = 10;
  132.                 }
  133.                 dis_smg[0] = smg_du[t_high / 10 % 10];                   //取小数显示
  134.                 dis_smg[1] = smg_du[t_high / 100 % 10] ;  //取个位显示
  135.                 dis_smg[2] = smg_du[t_high / 1000 % 10] & 0xdf;           //取十位显示
  136.                 dis_smg[3] = 0x64;         //H
  137.         }        
  138. }  

  139. /****************报警函数***************/
  140. void clock_h_l()
  141. {
  142.         static uchar value;
  143.         if(weight >= t_high)
  144.         {
  145.                 value ++;  //消除实际距离在设定距离左右变化时的干扰
  146.                 if(value >= 2)
  147.                 {
  148.                         beep = ~beep;           //蜂鸣器报警                        
  149.                 }        
  150.         }
  151.         else
  152.         {
  153.                 beep = 1;        
  154.         }                        
  155. }


  156. void Delay__hx711_us(void)
  157. {
  158.         _nop_();
  159.         _nop_();
  160. }

  161. unsigned long HX711_Read(void)        //增益128
  162. {
  163.         unsigned long count;
  164.         unsigned char i;
  165.           hx711_sck=0;
  166.         Delay__hx711_us();
  167.           hx711_dout=1;
  168.           while(hx711_dout==0);
  169.           for(i=0;i<24;i++)
  170.         {
  171.                 hx711_sck=0;
  172.                   count=count<<1;
  173.                   hx711_sck=1;
  174.                   if(hx711_dout)
  175.                         count++;
  176.         }
  177.          hx711_sck=1;
  178.     count=count^0x8000;//下降沿来时,转换数据
  179.         Delay__hx711_us();
  180.         hx711_sck=0;  
  181.         return(count);
  182. }

  183. void get_weight()          //获取被测物体重量
  184. {
  185.         weight = HX711_Read();
  186.         weight = weight - Weight_Maopi;                //获取净重
  187.         if(weight > 0)                        
  188.         {        
  189.                 weight = (unsigned int)((float)weight/GapValue);         //计算实物的实际重量                                                                                                                                       
  190.         }
  191.         else
  192.         {
  193.                 weight = 0;
  194.         }
  195. }


  196. /****************主函数***************/
  197. void main()
  198. {
  199.         time_init();                    //初始化定时器
  200.         while(1)
  201.         {               
  202.                 key();                                        //按键程序
  203.                 if(key_can < 10)
  204.                 {
  205.                         key_with();                        //设置报警压力        
  206.                 }
  207.                 if(flag_300ms == 1)            //300ms 处理一次压力程序
  208.                 {           
  209.                         flag_300ms = 0;        
  210.                         get_weight();          //获取被测物体重量
  211.                         clock_h_l();        //报警函数
  212.                         if(menu_1 == 0)
  213.                         {        
  214.                                 smg_i = 4;
  215.                                 dis_smg[0] = smg_du[weight % 10];         //取压力的小数显示
  216.                                 dis_smg[1] = smg_du[weight / 10 % 10] ; //取压力的个位显示
  217.                                 dis_smg[2] = smg_du[weight / 100 % 10] ;           //取压力的十位显示
  218.                                 dis_smg[3] = smg_du[weight / 1000 % 10] & 0xdf;           //取压力的百位显示
  219.                         }
  220.                 }
  221.                 display();                //数码管显示函数
  222.         }
  223. ……………………

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

所有资料51hei提供下载:
1.52单片机电子秤数码管显示.zip (12.01 MB, 下载次数: 288)




评分

参与人数 3黑币 +65 收起 理由
zh2773251csb + 5 很给力!
tieq1952 + 10 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏13 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:253767 发表于 2017-12-21 09:12 | 只看该作者
很有价值,可以收藏
回复

使用道具 举报

板凳
ID:216722 发表于 2017-12-21 11:40 | 只看该作者
文件里怎么没有pcb图
回复

使用道具 举报

地板
ID:264958 发表于 2017-12-28 18:17 | 只看该作者
这里面没有用到压力传感器吧?
回复

使用道具 举报

5#
ID:129918 发表于 2018-3-29 10:29 | 只看该作者
好像没有PCB图啊,相对于HX711,我毕业设计打算做的电子秤可行性分析:悬臂梁+应变片+电桥+51单片机,通过1602或者数码管显示重量

这样是不是不如HX711精度高啊,在纠结这两个的差别
回复

使用道具 举报

6#
ID:406005 发表于 2018-10-7 20:32 | 只看该作者
VCC几伏的
回复

使用道具 举报

7#
ID:442160 发表于 2018-12-18 12:04 | 只看该作者
感谢楼主
回复

使用道具 举报

8#
ID:489773 发表于 2019-3-25 09:47 | 只看该作者
很好,谢谢分享
回复

使用道具 举报

9#
ID:494226 发表于 2019-3-28 11:21 | 只看该作者
谢谢 分享
回复

使用道具 举报

10#
ID:494226 发表于 2019-3-28 11:21 | 只看该作者

哥们你下载了吗
回复

使用道具 举报

11#
ID:336789 发表于 2019-4-13 15:52 | 只看该作者
请问HX711的接线位置在哪里呢,为什么我在原理图上没有见到P3啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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