找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4567|回复: 2
收起左侧

51单片机简易电子称程序+PCB文件设计 LCD12864显示

[复制链接]
ID:569701 发表于 2019-6-22 21:29 | 显示全部楼层 |阅读模式
这是我的单片机设计,主要是使用压力传感器、HX711模块和51单片机做的,附件里包含了电子称的原理图和源代码
这个简易电子称共有三个模式:
模式1:进行普通的物体测量;
模式2:计价模式;
模式3:累计测量模式;
此外,除了可以用按键进行模式的切换,还可通过上位机发送指令进行模式的切换。
此次课程设计主要是针对51单片机的基础知识的运用,其中主要运用了以下知识点:对矩阵按键、LED灯、蜂鸣器、AD转换、LCD12864、
定时器0、定时器1、外部中断0、外部中断1、串口(使用到定时器2,所以在烧录时芯片请用STC89C52)等。

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
0.png 0.png 0.png

简易介绍
基于51单片机设计的简易电子称,性能比较简单,共分为3个模式,模式一是用于重物的测量,模式2主要用于物品的计价,不过单价输入只能是整数,由于重物重量精确到小数点后两位,所以单计价后的价格可以是小数的。模式三是重物的累计测量。同时处理按键进行模式切换后,还可以通过上位机发送指令进行模式切换,当上位机发送1时,接收机接到指令后启动模式1,并发送“模式1启动”。其他模式也与此相似,但当上位机发送其他字符时,单片机会返回“模式切换失败,请输入正确序号”类似的字样。
模式说明
模式1
普通测量模式,只进行普通的测量
模式2
计价测量模式,可根据输入的价格和被测物重量计算价格
模式3
累计测量模式,可在按键按下后累计被测物重量,结束键按下后显示总重量
按键说明
数字键
模式2下的价格输入键,只在模式2下有效
功能键A
按下A键进入模式1
功能键B
按下B键进入模式2
功能键C
按下C键进入模式3
功能键D
模式3下按下后被测物体重量被确认,若没按下模式3结束键,继续进行下一被测物体的测量。只在模式3下有效
功能键*
模式2下的价格清除键,按下后价格归0,显示清空。只在模式2下有效
功能键#
模式2下的价格确认键,按下后下个被固定,再按下数字键时价格处于重新输入的状态。模式3下作为模式3结束键,按下按键后显示累计测量的总重量。

界面简介模式1界面
模式2界面
模式3界面
模式3最终界面
程序主流程图
各个模块流程图(略)
单片机源程序如下:
  1. #include "reg52.h"
  2. #include "HX711.h"
  3. #include "lcd12864.h"
  4. #include "module.h"
  5. #include "keyborad.h"

  6. //*************************************************************************
  7. // 定时器0初始化函数
  8. //*************************************************************************
  9. void timer0_init(void)//50ms
  10. {
  11. ET0 = 1; //允许定时器0中断
  12. TMOD = 0x11; //定时器工作方式选择
  13. TL0 = 0xb0;
  14. TH0 = 0x3c; //定时器赋予初值
  15. TR0 = 1; //启动定时器
  16. EA = 1;
  17. }


  18. //*************************************************************************
  19. // 定时器0中断服务函数
  20. // 每秒中刷新5次
  21. //*************************************************************************
  22. bit weight_flag=0; //定时器0的标志位
  23. uchar time0_count=0; //定时器0计数标志
  24. void timer0() interrupt 1
  25. {
  26. TL0 = 0xb0;
  27. TH0 = 0x3c; //定时器赋予初值
  28. time0_count++;
  29. if(time0_count>=4){
  30. time0_count = 0;
  31. weight_flag = 1;
  32. }
  33. }

  34. //*************************************************************************
  35. // 定时器1初始化函数
  36. //*************************************************************************
  37. void timer1_init(void)        //50ms
  38. {
  39. ET1 = 1;
  40. TL1 = 0xB0;        //设置定时初值
  41. TH1 = 0x3C;        //设置定时初值
  42. //        TR1 = 1;        //定时器1开始计时
  43. }

  44. //*************************************************************************
  45. // 定时器0中断服务函数
  46. // 计时3秒钟
  47. //*************************************************************************
  48. bit weight_flag1; //定时器1的标志位
  49. uchar timer1_count;//定时器计1数标志
  50. void timer1(void) interrupt 3
  51. {
  52. TL1 = 0xB0;        //设置定时初值
  53. TH1 = 0x3C;        //设置定时初值
  54. timer1_count++;
  55. if (timer1_count == 60) {
  56. TR1 = 0;
  57. timer1_count = 0;
  58. weight_flag1 = 1;
  59. }
  60. }

  61. //*************************************************************************
  62. // 外部中断0初始化
  63. // 用来调整超重报警值
  64. //*************************************************************************
  65. ulong weight_alarm=200000;
  66. void INIT0_int()
  67. {
  68. EX0 = 1;
  69. IT0 = 1;
  70. }
  71. //*************************************************************************
  72. // 外部中断0服务函数
  73. //*************************************************************************
  74. void INIT0_deal() interrupt 0
  75. {
  76. weight_alarm-=50000;if(weight_alarm<=100000)weight_alarm=450000;
  77. }

  78. //*************************************************************************
  79. // 外部中断1初始化
  80. // 用来调整超重报警值
  81. //*************************************************************************
  82. void INIT1_int()
  83. {
  84. EX1 = 1;
  85. IT1 = 1;
  86. }
  87. //*************************************************************************
  88. // 外部中断1服务函数
  89. //*************************************************************************
  90. void INIT1_deal() interrupt 2
  91. {
  92. weight_alarm+=50000;if(weight_alarm>=450000)weight_alarm=200000;
  93. }

  94. //*************************************************************************
  95. // 串口发送数据函数
  96. //*************************************************************************
  97. void SendData(unsigned char *s)
  98. {
  99. while(*s>0)
  100. {
  101. SBUF = *s;
  102. while(!TI);
  103. TI = 0;
  104. s++;
  105. }
  106. }
  107. //*************************************************************************
  108. // 串口初始化函数
  109. //*************************************************************************
  110. sfr T2MOD = 0x9C;
  111. void USTAR_init()
  112. {
  113. PS = 1;
  114. SCON = 0x50;
  115. T2MOD = 0x01;
  116. T2CON = 0x30;
  117. TH2 = 0xFF;
  118. TL2 = 0xDC;        
  119. RCAP2H = 0XFF;
  120. RCAP2L = 0xDC; //波特率9600
  121. TR2 = 1;
  122. ES = 1;
  123. EA = 1;
  124. }
  125. //*************************************************************************
  126. // 串口中断服务函数
  127. //*************************************************************************
  128. uchar ReceiveData=0;
  129. void USTAR() interrupt 4
  130. {
  131. ReceiveData = SBUF;
  132. while(!RI);
  133. RI = 0;
  134. if(ReceiveData=='1')
  135. {
  136. SendData("模式1启动\n");
  137. }
  138. else if(ReceiveData=='2')
  139. {
  140. SendData("模式2启动\n");
  141. }
  142. else if(ReceiveData=='3')
  143. {
  144. SendData("模式3启动\n");        
  145. }
  146. else
  147. {
  148. SendData("切换失败,");
  149. SendData("非所属模式\n");
  150. }
  151. }
  152. //*************************************************************************
  153. // 串口模式切换界面函数
  154. //*************************************************************************
  155. void BoundaryChange()
  156. {
  157. if(ReceiveData==0)return;
  158. if(ReceiveData=='1')
  159. {
  160. module1_flag=1;
  161. module2_flag=0;
  162. module3_flag=0;
  163. ReceiveData=0;
  164. module1_init();
  165. }
  166. else if(ReceiveData=='2')
  167. {
  168. module1_flag=0;
  169. module2_flag=1;
  170. module3_flag=0;
  171. ReceiveData=0;
  172. module2_init();
  173. }
  174. else if(ReceiveData=='3')
  175. {
  176. module1_flag=0;
  177. module2_flag=0;
  178. module3_flag=1;
  179. ReceiveData=0;
  180. module3_init();        
  181. }
  182. }

  183. //*************************************************************************
  184. // 报警函数
  185. //*************************************************************************
  186. sbit beep = P2^7;
  187. sbit led = P0^0;
  188. void beep_alarm()
  189. {
  190. uint i=500;
  191. while(i--){
  192. beep = ~beep;
  193. if(i==1)led =~led;
  194. delay(1);}
  195. }
  196. //*************************************************************************
  197. // 主函数
  198. //*************************************************************************
  199. void main()
  200. {
  201. lcd_init();        //LCD12864初始化
  202. USTAR_init();        //串口中断初始化
  203. timer0_init();        //定时器0初始化
  204. timer1_init();        //定时器1初始化
  205. INIT0_int();        //外部中断0初始化
  206. INIT1_int();        //外部中断1初始化
  207. Get_MaoPi();        
  208. Get_MaoPi();
  209. delay(1000);
  210. Get_MaoPi();
  211. Get_MaoPi();        //获取毛皮重量
  212. while(1)
  213. {
  214. BoundaryChange();
  215. if(weight_flag==1){
  216. Get_Weight();
  217. weight_flag=0;} //每次标志位为1的时候刷新
  218. Key_Deal();        
  219. if(module1_flag==1) module1();
  220. else if(module2_flag==1)module2();
  221. else if(module3_flag==1)module3();
  222. if(weight >= weight_alarm){beep_alarm();}else{led=1;}//超重报警
  223. if(module3_flag != 1){thing_count=1;Totle_weight=0;}//非模式3下的计数量全部清零
  224. }        
  225. }
复制代码

全部资料51hei下载地址:
单片机程序pcb设计.7z (1005.13 KB, 下载次数: 163)

评分

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

查看全部评分

回复

使用道具 举报

ID:253767 发表于 2019-6-23 07:50 | 显示全部楼层
已经收藏。谢谢分享!!!
回复

使用道具 举报

ID:818776 发表于 2020-9-14 11:04 | 显示全部楼层
可以发一下pcb制作过程吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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