欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機LCD1602液晶的轉速表程序設計

[復制鏈接]
跳轉到指定樓層
樓主
單片機又稱單片微控制器(MCU),它把一個計算機系統集成到一個芯片上。它的體積小、質量輕、價格便宜、為學習、應用和開發提供了便利條件。    本文便是運用AT89C51單片機控制的轉速表設計。電機在運行過程中,需要對其進行監控,轉速是一個必不可少的參數。數字式轉速表就是對電機轉速進行測量,并可以和PC機進行通信,顯示電機的轉速,并觀察電機運行的基本情況。本設計主要是運用了AT89C51作為控制核心,由霍爾傳感器,LED數碼顯示管,施密特觸發器等構成。充分發揮單片機的性能。 本設計優點是電路較簡單、功能完善、測量速度快、精度高、控制系統可靠,性價比較高等特點。

電路原理圖如下:


單片機源程序如下:
  1.   #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit COUNT_IN=P3^2;
  5. // 定義1602 相關管腳
  6. sbit rs=P2^7;
  7. sbit en=P2^6;
  8. // 按鍵定義
  9. sbit add=P3^3;
  10. sbit dec=P3^4;
  11. sbit BUZZ=P1^0;
  12. uint count,m,n;
  13. unsigned long RPM;
  14. long shangxian=10000;
  15. bit flag;
  16. uchar code tab1[]={" VH: r/min "}; // 一行顯示的固定字符
  17. uchar code tab2[]={" RV: r/min "}; // 轉速顯示的固定字符
  18. void delay(uint x)
  19. {
  20. uint i,j;
  21. for(i=0;i<x;i++)
  22. for(j=0;j<110;j++);
  23. }
  24. void init()
  25. {
  26. IT0=1; //INT0 負跳變觸發
  27. TMOD=0x01;// 定時器工作于方式1
  28. TH0=0xfc; //1ms
  29. TL0=0x18;
  30. EA=1; //CPU 開中斷總允許
  31. ET0=1;// 開定時中斷
  32. EX0=1;// 開外部INTO中斷
  33. TR0=1;// 啟動定時
  34. }
  35. /******** 液晶寫入指令函數與寫入數據函數, 以后可調用
  36. **************/
  37. void write_1602com(uchar com)//**** 液晶寫入指令函數****
  38. {
  39. rs=0;// 數據/ 指令選擇置為指令
  40. P0=com;// 送入數據
  41. delay(1);
  42. en=1;// 拉高使能端,為制造有效的下降沿做準備
  43. delay(1);
  44. en=0;//en 由高變低,產生下降沿,液晶執行命令
  45. }
  46. void write_1602dat(uchar dat)//*** 液晶寫入數據函數****
  47. {
  48. rs=1;// 數據/ 指令選擇置為數據
  49. P0=dat;// 送入數據
  50. delay(1);
  51. en=1; //en 置高電平,為制造下降沿做準備
  52. delay(1);
  53. en=0; //en 由高變低,產生下降沿,液晶執行命令
  54. }
  55. void lcd_init()//*** 液晶初始化函數****
  56. {
  57. uchar a;
  58. write_1602com(0x38);// 設置液晶工作模式,意思: 16*2 行顯示,5*7 點陣, 8 位數據
  59. write_1602com(0x0c);// 開顯示不顯示光標
  60. write_1602com(0x06);// 整屏不移動,光標自動右移
  61. write_1602com(0x01);// 清顯示
  62. write_1602com(0x80);// 顯示固定符號從第一行第1 個位置之后開始顯示
  63. for(a=0;a<16;a++)
  64. {
  65. write_1602dat(tab1[a]);// 向液晶屏寫固定符號部分
  66. }
  67. write_1602com(0x80+0x40);// 顯示固定符號寫入位置,從第2 個位置后開始顯示
  68. for(a=0;a<16;a++)
  69. {
  70. write_1602dat(tab2[a]);// 寫顯示固定符號
  71. }
  72. }
  73. void display()
  74. {
  75. uchar gw,sw,bw,qw,ww;
  76. if(RPM<=99999) // 范圍內時
  77. {
  78. ww=RPM/10000;
  79. qw=RPM%10000/1000;
  80. bw=RPM%1000/100;//取得百位
  81. sw=RPM%100/10;//取得十位數字
  82. gw=RPM%10;// 取得個位數字
  83. write_1602com(0x80+0x40+5);
  84. if(ww==0)
  85. write_1602dat(' ');
  86. else
  87. write_1602dat(0x30+ww);
  88. if((ww+qw)==0)
  89. write_1602dat(' ');
  90. else
  91. write_1602dat(0x30+qw);
  92. if((ww+qw+bw)==0)
  93. write_1602dat(' ');
  94. else
  95. write_1602dat(0x30+bw);
  96. if((ww+qw+bw+sw)==0)
  97. write_1602dat(' ');
  98. else
  99. write_1602dat(0x30+sw);
  100. write_1602dat(0x30+gw);// 數字+30 得到該數字的LCD1602顯示碼
  101. }
  102. else // 超過范圍時顯示-----
  103. {
  104. write_1602com(0x80+0x40+2);
  105. write_1602dat('-');
  106. write_1602dat('-');
  107. write_1602dat('-');
  108. write_1602dat('-');
  109. write_1602dat('-');
  110. }
  111. }
  112. void display_shangxian()
  113. {
  114. write_1602com(0x80+5);
  115. if(shangxian/10000==0)
  116. write_1602dat(' ');
  117. else
  118. write_1602dat(0x30+shangxian/10000);
  119. if((shangxian/1000)==0)
  120. write_1602dat(' ');
  121. else
  122. write_1602dat(0x30+shangxian%10000/1000);
  123. if((shangxian/100)==0)
  124. write_1602dat(' ');
  125. else
  126. write_1602dat(0x30+shangxian%10000%1000/100);
  127. if((shangxian/10)==0)
  128. write_1602dat(' ');
  129. else
  130. write_1602dat(0x30+shangxian%10000%1000%100%10);// 數字+30得到該數字的LCD1602顯示碼
  131. }
  132. void key()
  133. {
  134. uint key_press_num;
  135. uchar p;
  136. if(add==0)
  137. {
  138. delay(20);
  139. if(add==0)
  140. {
  141. while(!add)
  142. {
  143. key_press_num++;
  144. if(key_press_num>=20)
  145. {
  146. key_press_num=0;
  147. while(!add)
  148. {
  149. shangxian=shangxian+10;
  150. if(shangxian>20000)
  151. shangxian=0;
  152. // for(p=0;p<20;p++)
  153. display_shangxian();
  154. }
  155. }
  156. display();
  157. delay(10);
  158. }
  159. if(key_press_num!=0)
  160. {
  161. key_press_num=0;
  162. shangxian++;
  163. if(shangxia
  164. {
  165. key_press_num=0;
  166. while(!dec)
  167. {
  168. shangxian=shangxian-10;
  169. if(shangxian<0)
  170. shangxian=20000;
  171. // for(p=0;p<20;p++)
  172. display_shangxian();
  173. }
  174. }
  175. display();
  176. delay(10);
  177. }
  178. if(key_press_num!=0)
  179. {
  180. key_press_num=0;
  181. shangxian--;
  182. if(shangxian<0)
  183. shangxian=20000;
  184. }
  185. }
  186. }
  187. }
  188. void alarm()
  189. {
  190. if(RPM>=shangxian)
  191. BUZZ=0;
  192. else
  193. BUZZ=1;
  194. }
  195. void main()
  196. {
  197. init();
  198. lcd_init();
  199. while(1)
  200. {
  201. display();
  202. display_shangxian();
  203. key();
  204. alarm();
  205. }
  206. }
  207. void EXINT0() interrupt 0
  208. {
  209. count++;
  210. flag=1;
  211. n=0;
  212. if(count>=10)
  213. 下載附件編輯查看
復制代碼

Keil源程序下載: 固件.7z (22.5 KB, 下載次數: 0)

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:520967 發表于 2025-10-28 16:36 | 只看該作者
很好的學習資料,受益匪淺
回復

使用道具 舉報

板凳
ID:1147727 發表于 2025-11-1 08:35 | 只看該作者
能編寫出這么一段程序,樓主還是下了功夫的:但是程序的編寫格式:如果能按規范點來編寫,就更完美……
回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表