找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 899|回复: 3
收起左侧

基于51单片机LCD1602液晶的转速表程序设计

[复制链接]
ID:109858 发表于 2025-10-25 14:11 | 显示全部楼层 |阅读模式
单片机又称单片微控制器(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 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:520967 发表于 2025-10-28 16:36 | 显示全部楼层
很好的学习资料,受益匪浅
回复

使用道具 举报

ID:1147727 发表于 2025-11-1 08:35 | 显示全部楼层
能编写出这么一段程序,楼主还是下了功夫的:但是程序的编写格式:如果能按规范点来编写,就更完美……
回复

使用道具 举报

ID:1143518 发表于 2026-1-6 16:06 | 显示全部楼层
感谢楼主无私分享!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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