找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3847|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机1602显示的超声波测距源程序

[复制链接]
跳转到指定楼层
楼主

制作超声波测距仪,是很多学生、单片机爱好者学习单片机动手实践的一个实作项目,这款超声波测距程序,针对目前比较广泛使的HC-SR04超声波模块而设计的,这款1602显示的超声波测距距源程序,单片机是51系列单片机,超声波测距模块先用的是HC-SRO4 超声波测距模块,单片机的晶振是12M,接线:模块TRIG接 P2.5 ECH0 接P3.2,当距离超出测量时,范围显示“-”,显示单位是CM。这款程序由于硬件比较简单,制作时焊接工作量小,几乎是百分之百的成功,也可以用PROTEUS软件直接进行。需要超声波测距仿真配套的爱好者,可百度搜索:电子乐屋,这个网上有很多款超声波测距仿真资料。

  1. #include[reg52.h> //注意请把‘ [ ’换成 "<"

  2. #include [intrins.h> //

  3. #define uint unsigned int

  4. #define uchar unsigned char

  5. sbit rs=P2^0; //1602的数据/指令选择控制线

  6. sbit rw=P2^1; //1602的读写控制线

  7. sbit en=P2^2; //1602的使能控制线

  8. sbit trig=P2^5; //超声波测距模块Trig

  9. sbit echo=P3^2; //超声波测距模块Echo

  10. bit flag1; //触发信号标志位//

  11. uchar count; //中断累加变量

  12. long int distance; //测量所得距离

  13. unsigned char code table[ ]={"0123456789"}; //定义字符数组显示数字

  14. void delay(uint n)

  15. {

  16. uint x,y;

  17. for(x=n;x>0;x--)

  18. for(y=110;y>0;y--);

  19. }

  20. void delayt(uint x)

  21. {

  22. uchar j;

  23. while(x-- > 0)

  24. {

  25. for(j = 0;j < 125;j++)

  26. {

  27. ;

  28. }

  29. }

  30. }

  31. void lcd_wcom(uchar com)

  32. {

  33. rs=0; //选择指令寄存器

  34. rw=0; //选择写

  35. P0=com; //把命令字送入P0

  36. delay(5); //延时一小会儿,让1602准备接收数据

  37. en=1; //使能线电平变化,命令送入1602的8位数据口,这点非常重要

  38. en=0;

  39. }

  40. void lcd_wdat(uchar dat)

  41. {

  42. rs=1; //选择数据寄存器

  43. rw=0; //选择写

  44. P0=dat; //把要显示的数据送入P0

  45. delay(5); //延时一小会儿,让1602准备接收数据,也就是检测忙信号,这点非常重要。

  46. en=1; //使能线电平变化,数据送入1602的8位数据口

  47. en=0;

  48. }

  49. void lcd_init()

  50. {

  51. lcd_wcom(0x38); //8位数据,双列,5*7字形 ,用到功能设定指令

  52. lcd_wcom(0x0c); //开启显示屏,关光标,光标不闪烁,用到显示开关控制指令

  53. lcd_wcom(0x06); //显示地址递增,即写一个数据后,显示位置右移一位,用到了写入模式设置指令

  54. lcd_wcom(0x01); //清屏,用到了清屏指令

  55. }

  56. void lcd_xianshi()

  57. {

  58. lcd_wcom(0x80+0x40);

  59. lcd_wdat('D');

  60. lcd_wdat('i');

  61. lcd_wdat('s');

  62. lcd_wdat('t');

  63. lcd_wdat('a');

  64. lcd_wdat('n');

  65. lcd_wdat('c');

  66. lcd_wdat('e');

  67. lcd_wdat(':');

  68. lcd_wcom(0x80+0x4c);

  69. lcd_wdat('.');

  70. lcd_wcom(0x80+0x4e);//单位是厘米//

  71. lcd_wdat('c');

  72. lcd_wdat('m');

  73. }

  74. void init_t0()

  75. {

  76. TMOD=0x01;

  77. TL0=0x66;

  78. TH0=0xfc; //1ms

  79. ET0=1;

  80. EA=1;

  81. }

  82. void trigger()

  83. {

  84. trig=0;

  85. _nop_();

  86. _nop_();

  87. _nop_();

  88. _nop_();

  89. _nop_();

  90. _nop_();

  91. _nop_();

  92. _nop_();

  93. _nop_();

  94. _nop_();

  95. _nop_();

  96. _nop_();

  97. _nop_();

  98. _nop_();

  99. _nop_();

  100. _nop_();

  101. _nop_();

  102. _nop_();

  103. _nop_();

  104. _nop_();

  105. _nop_();

  106. trig=1;

  107. }

  108. void init_measuring()

  109. {

  110. trig=1;

  111. echo=1;

  112. count=0;

  113. }

  114. void measuring()

  115. {

  116. uchar l;

  117. uint h,y;

  118. TR0 = 1;

  119. while(echo==1)

  120. {

  121. ;

  122. }

  123. TR0 = 0;

  124. l = TL0;

  125. h = TH0;

  126. y = (h << 8) + l;

  127. y = y - 0xfc66;//us部分

  128. distance = y + 1000 * count;//计算总时间,单位是微秒

  129. TL0 = 0x66;

  130. TH0 = 0xfc;

  131. delayt(30);

  132. distance = 3453* distance / 20000;//原始为:(0.34毫米/us)*时间/2//

  133. }

  134. void display(uint x)

  135. {

  136. uchar qian,bai,shi,ge;

  137. qian=x/1000;

  138. bai=(x/100);

  139. shi=(x/10);

  140. ge=x;

  141. lcd_wcom(0x80+0x49);//单位是厘米//

  142. lcd_wdat(table[qian]);

  143. lcd_wdat(table[bai]);

  144. lcd_wdat(table[shi]);

  145. lcd_wcom(0x80+0x4d);

  146. lcd_wdat(table[ge]);

  147. }

  148. void main()

  149. { lcd_init(); //液晶初始化

  150. init_t0(); //定时器0初始化

  151. init_measuring(); //超声波相应端口初始化

  152. while(1)

  153. {

  154. lcd_xianshi(); //液晶显示特定字符

  155. trigger(); //触发超声波启动

  156. while(echo==0) //等待回声

  157. {

  158. ;

  159. }

  160. measuring(); //进行距离测量

  161. display(distance); //对测量结果进行显示

  162. init_measuring(); //超声波相应端口初始化

  163. delayt(600); //每次测量间隔60ms

  164. }

  165. }

  166. //……………………………………………中断服务函数…………………………………………………//

  167. void T_0()interrupt 1

  168. {

  169. TF0 = 0;

  170. TL0 = 0x66;

  171. TH0 = 0xfc;

  172. count++;

  173. if(count==18)

  174. {

  175. TR0 =0;

  176. TL0 = 0x66;

  177. TH0 = 0xfc;

  178. count = 0;

  179. }

  180. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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