找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2012|回复: 0
收起左侧

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

[复制链接]
ID:101545 发表于 2023-3-22 14:20 | 显示全部楼层 |阅读模式
超声波测距,单片机51控制液晶屏1602显示的源程序~
接线方法:(老版本就是板子没有集成超声波插座,需要自己I/O口接线)

VCC----VCC
TRIG---P1.0
ECHO---P3.2
GND----GND

单片机源程序如下:
  1. /******************
  2. *  晶振:11.0592MHZ
  3. ******************************************************************/
  4. /**********************************包含头文件**********************************/
  5. #include <reg52.h>
  6. #include "1602.h"
  7. /************************************宏定义************************************/
  8. #define VELOCITY_30C        3495       //30摄氏度时的声速,声速V= 331.5 + 0.6*温度;
  9. #define VELOCITY_23C        3453       //23摄氏度时的声速,声速V= 331.5 + 0.6*温度;
  10. /************************************位定义************************************/
  11. sbit INPUT  = P3^2;                //回声接收端口
  12. sbit OUTPUT = P1^0;                //超声触发端口
  13. sbit Beep   = P2^3 ;                           // 蜂鸣器 
  14. /********************************定义变量和数组********************************/
  15. long int distance=0;               //距离变量
  16. uchar table[]="    Welcome to   ";
  17. uchar table0[]=" 0000hjmcu0000  ";
  18. uchar table1[]="There's no echo.";
  19. uchar table2[]=" 0000hjmcu0000  ";
  20. uchar table3[]="Distance:";
  21. uchar count;
  22. /***********************************函数声明***********************************/
  23. extern void initLCD();
  24. extern void write_date(uchar date);
  25. extern void write_com(uchar com);
  26. extern void delay(uint x);
  27. /******************************************************************************/
  28. /* 函数名称  : Delay_xMs                                                      */
  29. /* 函数描述  : 延时函数                                                       */
  30. /* 输入参数  : x                                                              */
  31. /* 参数描述  : 延时时间                                                       */
  32. /* 返回值    : 无                                                             */
  33. /******************************************************************************/
  34. void Delay_xMs(unsigned int x)
  35. {
  36.     unsigned int i,j;
  37.     for(i = 0;i < x;i++ )
  38.     {
  39.         for(j = 0;j < 3;j++ )
  40.         {
  41.             ;
  42.         }
  43.     }
  44. }
  45. /******************************************************************************/
  46. /* 函数名称  : Alarm                                                          */
  47. /* 函数描述  : 蜂鸣器发声函数                                                 */
  48. /* 输入参数  : t                                                              */
  49. /* 参数描述  : 发声的次数                                                     */
  50. /* 返回值    : 无                                                             */
  51. /******************************************************************************/
  52. void Alarm(uchar t)
  53. {
  54.         uchar i;
  55.         for(i = 0;i < t;i++)
  56.         {
  57.                 Beep = 0;
  58.                 Delay_xMs(1000);
  59.                 Beep = 1;
  60.                 Delay_xMs(1000);
  61.         }
  62. }        
  63. /******************************************************************************/
  64. /* 函数名称  : delayt                                                         */
  65. /* 函数描述  : 延时函数                                                       */
  66. /* 输入参数  : x                                                              */
  67. /* 参数描述  : 延时时间数据                                                   */
  68. /* 返回值    : 无                                                             */
  69. /******************************************************************************/        
  70. void delayt(uint x)
  71. {
  72.     uchar j;
  73.     while(x-- > 0)
  74.     {
  75.               for(j = 0;j < 125;j++)
  76.         {
  77.             ;
  78.         }
  79.     }
  80. }
  81. /******************************************************************************/
  82. /* 函数名称  : Init_MCU                                                       */
  83. /* 函数描述  : 初始化单片机函数                                               */
  84. /* 输入参数  : 无                                                             */
  85. /* 参数描述  : 无                                                             */
  86. /* 返回值    : 无                                                             */
  87. /******************************************************************************/
  88. void Init_MCU(void)
  89. {
  90.         TMOD = 0x01;          //定时器2初始化,设置为16位自动重装模式
  91.          TL0 = 0x66;
  92.         TH0 = 0xfc;              //1ms
  93.     ET0 = 1;              //开定时器2
  94.         EA = 1;                      //总中断使能
  95. }
  96. /******************************************************************************/
  97. /* 函数名称  : Init_Parameter                                                 */
  98. /* 函数描述  : 初始化参数和IO口函数                                           */
  99. /* 输入参数  : 无                                                             */
  100. /* 参数描述  : 无                                                             */
  101. /* 返回值    : 无                                                             */
  102. /******************************************************************************/
  103. void Init_Parameter(void)
  104. {
  105.          OUTPUT =1;
  106.          INPUT = 1;
  107.          count = 0;
  108.          distance = 0;
  109. }
  110. /******************************************************************************/
  111. /* 函数名称  : display_char                                                   */
  112. /* 函数描述  : 显示字符串函数                                                 */
  113. /* 输入参数  : point,address                                                  */
  114. /* 参数描述  : 写入的字符串的地址指针 1602显示对应的地址                      */
  115. /* 返回值    : 无                                                             */
  116. /******************************************************************************/
  117. void display_char(uchar *point,uchar address)
  118. {
  119.         uchar i;
  120.         write_com(0x80 + address);
  121.         for(i = 0;i < 16; i++)
  122.         {
  123.                 write_date(*point);
  124.                 point++;
  125.         }
  126. }
  127. /******************************************************************************/
  128. /* 函数名称  : display                                                        */
  129. /* 函数描述  : 显示数字                                                       */
  130. /* 输入参数  : number,address                                                */
  131. /* 参数描述  : number写入的数据,address地址                                  */
  132. /* 返回值    : 无                                                             */
  133. /******************************************************************************/        
  134. void display(int number,uchar address)
  135. {
  136.         uchar b,c,d,e;
  137.         b= (number / 1000);
  138.         c= (number / 100) % 10;
  139.         d = (number / 10) % 10;
  140.         e = number % 10;

  141.         write_com(0x80 + address);
  142.     write_date(b + 48);
  143.         write_date(c + 48);
  144.         write_date(d + 48);
  145.         write_date(46);           //小数点的ASCII
  146.         write_date(e + 48);
  147.     write_date(99);           //"c"的ASCII
  148.         write_date(109);          //"m"的ASCII
  149. }
  150. /******************************************************************************/
  151. /* 函数名称  : Trig_SuperSonic                                                */
  152. /* 函数描述  : 发出声波函数                                                   */
  153. /* 输入参数  : 无                                                             */
  154. /* 参数描述  : 无                                                             */
  155. /* 返回值    : 无                                                             */
  156. /******************************************************************************/
  157. void Trig_SuperSonic(void)//出发声波
  158. {
  159.          OUTPUT = 1;
  160.          delayt(1);
  161.          OUTPUT = 0;
  162. }
  163. /******************************************************************************/
  164. /* 函数名称  : Measure_Distance                                               */
  165. /* 函数描述  : 计算距离函数                                                   */
  166. /* 输入参数  : 无                                                             */
  167. /* 参数描述  : 无                                                             */
  168. /* 返回值    : 无                                                             */
  169. /******************************************************************************/
  170. void Measure_Distance(void)
  171. {
  172.         uchar l;
  173.         uint h,y;
  174.         TR0 = 1;
  175.         while(INPUT)
  176.     {
  177.         ;
  178.     }        
  179.         TR0 = 0;
  180.         l = TL0;
  181.         h = TH0;
  182.         y = (h << 8) + l;
  183.         y = y - 0xfc66;//us部分
  184.         distance = y + 1000 * count;//计算总时间
  185.         TL0 = 0x66;
  186.         TH0 = 0xfc;
  187.         delayt(30);
  188.         distance = VELOCITY_30C * distance / 20000;
  189. }
  190. /******************************************************************************/
  191. /* 函数名称  : main                                                           */
  192. /* 函数描述  : 主函数                                                         */
  193. /* 输入参数  : 无                                                             */
  194. /* 参数描述  : 无                                                             */
  195. /* 返回值    : 无                                                             */
  196. /******************************************************************************/                                       
  197. void main(void)
  198. {        
  199.     rw = 0;
  200.         initLCD();
  201.         Init_MCU();
  202.         Init_Parameter();
  203.         Alarm(2);
  204.         display_char(table,0x00);
  205.         display_char(table0,0x40);
  206.         Delay_xMs(30000);
  207.         display_char(table2,0x00);
  208.         display_char(table1,0x40);

  209.         while(1)
  210.         {
  211.                  Trig_SuperSonic();         //触发超声波发射
  212.                  while(INPUT == 0)          //等待回声
  213.          {
  214.              ;
  215.          }
  216.                  Measure_Distance();        //计算脉宽并转换为距离
  217.                  display_char(table3,0x40);
  218.                  display(distance,0x49);    //显示距离
  219.                  Init_Parameter();          // 参数重新初始化
  220.                  delayt(100);               //延时,两次发射之间要至少有10ms间隔
  221.          }        
  222. }
  223. /******************************************************************************/
  224. /* 函数名称  : timer0                                                         */
  225. /* 函数描述  : T0中断处理函数                                                 */
  226. /* 输入参数  : 无                                                             */
  227. /* 参数描述  : 无                                                             */
  228. /* 返回值    : 无                                                             */
  229. /******************************************************************************/
  230. void timer0 (void) interrupt 1
  231. {
  232.         TF0 = 0;
  233.         TL0 = 0x66;
  234.         TH0 = 0xfc;
  235.         count++;
  236.         if(count == 18)//超声波回声脉宽最多18ms
  237.         {
  238.                 TR0 =0;
  239.                 TL0 = 0x66;
  240.                 TH0 = 0xfc;
  241.                 count = 0;
  242.         }
  243. }
  244. /******************************************************************************/
复制代码
Keil代码下载:
程序.7z (124.54 KB, 下载次数: 42)

评分

参与人数 1黑币 +30 收起 理由
admin + 30 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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