久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5185|回復: 2
打印 上一主題 下一主題
收起左側

51單片機簡易電子稱程序+PCB文件設計 LCD12864顯示

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

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


簡易介紹
基于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, 下載次數: 164)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品18久久久 | 国产精品九九九 | 欧洲亚洲视频 | 99久久精品视频免费 | 最新午夜综合福利视频 | 涩涩视频在线看 | 在线观看深夜视频 | 欧美video | 国产免费一区二区 | 久热国产精品视频 | 国产成人综合在线 | 亚洲人成网亚洲欧洲无码 | 亚洲 欧美 日韩 精品 | 秋霞在线一区二区 | 国产视频久久久 | 欧美精品一区二区三区在线播放 | 91xx在线观看 | 午夜影院| 精品亚洲一区二区 | 天堂中文资源在线 | www.国产日本| 在线观看视频你懂得 | 国产999精品久久久久久 | 激情一区二区三区 | 成人av一区 | 狠狠艹 | 日本黄色免费视频 | 一级a毛片 | 欧美精品一 | 亚洲国产成人精品一区二区 | 久久中文免费视频 | av激情在线 | 一本一道久久a久久精品蜜桃 | 人操人人干人 | 久久五月婷 | 黄色在线免费观看视频网站 | 天天天堂| 亚洲国产视频一区 | 亚洲成av| 91成人免费观看 | 日韩不卡在线观看 |