找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5217|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)簡易電子稱程序+PCB文件設(shè)計(jì) LCD12864顯示

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
這是我的單片機(jī)設(shè)計(jì),主要是使用壓力傳感器、HX711模塊和51單片機(jī)做的,附件里包含了電子稱的原理圖和源代碼
這個(gè)簡易電子稱共有三個(gè)模式:
模式1:進(jìn)行普通的物體測量;
模式2:計(jì)價(jià)模式;
模式3:累計(jì)測量模式;
此外,除了可以用按鍵進(jìn)行模式的切換,還可通過上位機(jī)發(fā)送指令進(jìn)行模式的切換。
此次課程設(shè)計(jì)主要是針對51單片機(jī)的基礎(chǔ)知識的運(yùn)用,其中主要運(yùn)用了以下知識點(diǎn):對矩陣按鍵、LED燈、蜂鳴器、AD轉(zhuǎn)換、LCD12864、
定時(shí)器0、定時(shí)器1、外部中斷0、外部中斷1、串口(使用到定時(shí)器2,所以在燒錄時(shí)芯片請用STC89C52)等。

Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)


簡易介紹
基于51單片機(jī)設(shè)計(jì)的簡易電子稱,性能比較簡單,共分為3個(gè)模式,模式一是用于重物的測量,模式2主要用于物品的計(jì)價(jià),不過單價(jià)輸入只能是整數(shù),由于重物重量精確到小數(shù)點(diǎn)后兩位,所以單計(jì)價(jià)后的價(jià)格可以是小數(shù)的。模式三是重物的累計(jì)測量。同時(shí)處理按鍵進(jìn)行模式切換后,還可以通過上位機(jī)發(fā)送指令進(jìn)行模式切換,當(dāng)上位機(jī)發(fā)送1時(shí),接收機(jī)接到指令后啟動(dòng)模式1,并發(fā)送“模式1啟動(dòng)”。其他模式也與此相似,但當(dāng)上位機(jī)發(fā)送其他字符時(shí),單片機(jī)會返回“模式切換失敗,請輸入正確序號”類似的字樣。
模式說明
模式1
普通測量模式,只進(jìn)行普通的測量
模式2
計(jì)價(jià)測量模式,可根據(jù)輸入的價(jià)格和被測物重量計(jì)算價(jià)格
模式3
累計(jì)測量模式,可在按鍵按下后累計(jì)被測物重量,結(jié)束鍵按下后顯示總重量
按鍵說明
數(shù)字鍵
模式2下的價(jià)格輸入鍵,只在模式2下有效
功能鍵A
按下A鍵進(jìn)入模式1
功能鍵B
按下B鍵進(jìn)入模式2
功能鍵C
按下C鍵進(jìn)入模式3
功能鍵D
模式3下按下后被測物體重量被確認(rèn),若沒按下模式3結(jié)束鍵,繼續(xù)進(jìn)行下一被測物體的測量。只在模式3下有效
功能鍵*
模式2下的價(jià)格清除鍵,按下后價(jià)格歸0,顯示清空。只在模式2下有效
功能鍵#
模式2下的價(jià)格確認(rèn)鍵,按下后下個(gè)被固定,再按下數(shù)字鍵時(shí)價(jià)格處于重新輸入的狀態(tài)。模式3下作為模式3結(jié)束鍵,按下按鍵后顯示累計(jì)測量的總重量。

界面簡介模式1界面
模式2界面
模式3界面
模式3最終界面
程序主流程圖
各個(gè)模塊流程圖(略)
單片機(jī)源程序如下:
  1. #include "reg52.h"
  2. #include "HX711.h"
  3. #include "lcd12864.h"
  4. #include "module.h"
  5. #include "keyborad.h"

  6. //*************************************************************************
  7. // 定時(shí)器0初始化函數(shù)
  8. //*************************************************************************
  9. void timer0_init(void)//50ms
  10. {
  11. ET0 = 1; //允許定時(shí)器0中斷
  12. TMOD = 0x11; //定時(shí)器工作方式選擇
  13. TL0 = 0xb0;
  14. TH0 = 0x3c; //定時(shí)器賦予初值
  15. TR0 = 1; //啟動(dòng)定時(shí)器
  16. EA = 1;
  17. }


  18. //*************************************************************************
  19. // 定時(shí)器0中斷服務(wù)函數(shù)
  20. // 每秒中刷新5次
  21. //*************************************************************************
  22. bit weight_flag=0; //定時(shí)器0的標(biāo)志位
  23. uchar time0_count=0; //定時(shí)器0計(jì)數(shù)標(biāo)志
  24. void timer0() interrupt 1
  25. {
  26. TL0 = 0xb0;
  27. TH0 = 0x3c; //定時(shí)器賦予初值
  28. time0_count++;
  29. if(time0_count>=4){
  30. time0_count = 0;
  31. weight_flag = 1;
  32. }
  33. }

  34. //*************************************************************************
  35. // 定時(shí)器1初始化函數(shù)
  36. //*************************************************************************
  37. void timer1_init(void)        //50ms
  38. {
  39. ET1 = 1;
  40. TL1 = 0xB0;        //設(shè)置定時(shí)初值
  41. TH1 = 0x3C;        //設(shè)置定時(shí)初值
  42. //        TR1 = 1;        //定時(shí)器1開始計(jì)時(shí)
  43. }

  44. //*************************************************************************
  45. // 定時(shí)器0中斷服務(wù)函數(shù)
  46. // 計(jì)時(shí)3秒鐘
  47. //*************************************************************************
  48. bit weight_flag1; //定時(shí)器1的標(biāo)志位
  49. uchar timer1_count;//定時(shí)器計(jì)1數(shù)標(biāo)志
  50. void timer1(void) interrupt 3
  51. {
  52. TL1 = 0xB0;        //設(shè)置定時(shí)初值
  53. TH1 = 0x3C;        //設(shè)置定時(shí)初值
  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. // 用來調(diào)整超重報(bào)警值
  64. //*************************************************************************
  65. ulong weight_alarm=200000;
  66. void INIT0_int()
  67. {
  68. EX0 = 1;
  69. IT0 = 1;
  70. }
  71. //*************************************************************************
  72. // 外部中斷0服務(wù)函數(shù)
  73. //*************************************************************************
  74. void INIT0_deal() interrupt 0
  75. {
  76. weight_alarm-=50000;if(weight_alarm<=100000)weight_alarm=450000;
  77. }

  78. //*************************************************************************
  79. // 外部中斷1初始化
  80. // 用來調(diào)整超重報(bào)警值
  81. //*************************************************************************
  82. void INIT1_int()
  83. {
  84. EX1 = 1;
  85. IT1 = 1;
  86. }
  87. //*************************************************************************
  88. // 外部中斷1服務(wù)函數(shù)
  89. //*************************************************************************
  90. void INIT1_deal() interrupt 2
  91. {
  92. weight_alarm+=50000;if(weight_alarm>=450000)weight_alarm=200000;
  93. }

  94. //*************************************************************************
  95. // 串口發(fā)送數(shù)據(jù)函數(shù)
  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. // 串口初始化函數(shù)
  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. // 串口中斷服務(wù)函數(shù)
  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啟動(dòng)\n");
  137. }
  138. else if(ReceiveData=='2')
  139. {
  140. SendData("模式2啟動(dòng)\n");
  141. }
  142. else if(ReceiveData=='3')
  143. {
  144. SendData("模式3啟動(dòng)\n");        
  145. }
  146. else
  147. {
  148. SendData("切換失敗,");
  149. SendData("非所屬模式\n");
  150. }
  151. }
  152. //*************************************************************************
  153. // 串口模式切換界面函數(shù)
  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. // 報(bào)警函數(shù)
  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. // 主函數(shù)
  198. //*************************************************************************
  199. void main()
  200. {
  201. lcd_init();        //LCD12864初始化
  202. USTAR_init();        //串口中斷初始化
  203. timer0_init();        //定時(shí)器0初始化
  204. timer1_init();        //定時(shí)器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;} //每次標(biāo)志位為1的時(shí)候刷新
  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;}//超重報(bào)警
  223. if(module3_flag != 1){thing_count=1;Totle_weight=0;}//非模式3下的計(jì)數(shù)量全部清零
  224. }        
  225. }
復(fù)制代碼

全部資料51hei下載地址:
單片機(jī)程序pcb設(shè)計(jì).7z (1005.13 KB, 下載次數(shù): 164)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:253767 發(fā)表于 2019-6-23 07:50 | 只看該作者
已經(jīng)收藏。謝謝分享!!
回復(fù)

使用道具 舉報(bào)

板凳
ID:818776 發(fā)表于 2020-9-14 11:04 | 只看該作者
可以發(fā)一下pcb制作過程嗎
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表