找回密码
 立即注册

QQ登录

只需一步,快速开始

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

超声波测试距离程序,判断设置的范围值做一个抽水检测部分

[复制链接]
跳转到指定楼层
楼主
ID:389070 发表于 2019-7-29 15:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于AT89C52,和超声波模块编辑的抽水检测系统。LCD1602做显示部分,通过超声波数据判断是否符合条件要求 可以判断水面距离检测,通过判断识别1水位是否有水,有水就检测2水位,无就继续循环。判断识别2水位是否有水,如果有水则进行循环,无水则再执行上水命令。有效避免只能测试一个位而反复上水,本文有效的拉开了上水距离。避免反复不停抽水烧机器问题。

单片机源程序如下:
  1. /******************************************************************************/
  2. /* 项目名称  : 超声波测距并且判断条件距离                                     */
  3. /* 主控芯片  : STC89C52                                                       */
  4. /* 文件名称  : 超声波判断距离并报警                                           */
  5. /* 文件功能1 : 通过超声波数据判断是否符合条件要求 可以判断水面距离检测        */
  6. /* 文件功能2 : 通过判断识别1水位是否有水,有水就检测2水位,无就继续循环       */
  7. /* 文件功能  : 判断识别2水位是否有水,检测2水位是否有水。再执行上水命令       */
  8. /* 文件功能  : 有效避免只能测试一个位而反复上水,拉开上水距离避免烧机器       */
  9. /******************************************************************************/
  10. /**********************************包含头文件**********************************/
  11. #include <reg52.h>
  12. #include "1602.h"


  13. /************************************宏定义************************************/
  14. #define VELOCITY_30C        3495       //30摄氏度时的声速,声速V= 331.5 + 0.6*温度;
  15. #define VELOCITY_23C        3453       //23摄氏度时的声速,声速V= 331.5 + 0.6*温度;

  16. /************************************位定义************************************/
  17. sbit INPUT  = P1^6;                //回声接收端口
  18. sbit OUTPUT = P1^7;                //超声触发端口
  19. sbit Beep   = P2^3;                     // 蜂鸣器 
  20. sbit D1     = P1^0;                     //LED灯
  21. /********************************定义变量和数组********************************/
  22. long int distance=0;               //距离变量
  23. uchar table[]="    Welcome to use   ";        //开机显示1          "欢迎使用"
  24. uchar table0[]="  ZHANGHAO  ";                //开机显示2
  25. uchar table1[]="There's no echo.";
  26. uchar table2[]="  QQ:2638831886  ";          //固定在液晶显示屏上,一段字体
  27. uchar table3[]="Distance:";                 //固定在液晶显示屏上,"测试距离"
  28. uchar count;

  29. unsigned int dz,k,s,j,bgz,k,bian,bianb;

  30. /***********************************函数声明***********************************/
  31. extern void initLCD();
  32. extern void write_date(uchar date);
  33. extern void write_com(uchar com);
  34. extern void delay(uint x);

  35. /******************************************************************************/
  36. /* 函数名称  : Delay_xMs                                                      */
  37. /* 函数描述  : 延时函数                                                       */
  38. /* 输入参数  : x                                                              */
  39. /* 参数描述  : 延时时间                                                       */
  40. /* 返回值    : 无                                                             */
  41. /******************************************************************************/
  42. void Delay_xMs(unsigned int x)
  43. {
  44.     unsigned int i,j;
  45.     for(i = 0;i < x;i++ )
  46.     {
  47.         for(j = 0;j < 3;j++ )
  48.         {
  49.             ;
  50.         }
  51.     }
  52. }

  53. /******************************************************************************/
  54. /* 函数名称  : Alarm                                                          */
  55. /* 函数描述  : 蜂鸣器发声函数                                                 */
  56. /* 输入参数  : t                                                              */
  57. /* 参数描述  : 发声的次数                                                     */
  58. /* 返回值    : 无                                                             */
  59. /******************************************************************************/
  60. void Alarm(uchar t)
  61. {
  62.         uchar i;
  63.         for(i = 0;i < t;i++)
  64.         {
  65.                 Beep = 0;
  66.                 Delay_xMs(1000);
  67.                 Beep = 1;
  68.                 Delay_xMs(1000);
  69.         }
  70. }
  71.        
  72. /******************************************************************************/
  73. /* 函数名称  : delayt                                                         */
  74. /* 函数描述  : 延时函数                                                       */
  75. /* 输入参数  : x                                                              */
  76. /* 参数描述  : 延时时间数据                                                   */
  77. /* 返回值    : 无                                                             */
  78. /******************************************************************************/       
  79. void delayt(uint x)
  80. {
  81.     uchar j;
  82.     while(x-- > 0)
  83.     {
  84.               for(j = 0;j < 125;j++)
  85.         {
  86.             ;
  87.         }
  88.     }
  89. }

  90. /******************************************************************************/
  91. /* 函数名称  : Init_MCU                                                       */
  92. /* 函数描述  : 初始化单片机函数                                               */
  93. /* 输入参数  : 无                                                             */
  94. /* 参数描述  : 无                                                             */
  95. /* 返回值    : 无                                                             */
  96. /******************************************************************************/
  97. void Init_MCU(void)
  98. {
  99.         TMOD = 0x01;          //定时器2初始化,设置为16位自动重装模式
  100.         TL0 = 0x66;
  101.         TH0 = 0xfc;              //1ms
  102.     ET0 = 1;              //开定时器2
  103.         EA = 1;                //总中断使能
  104. }

  105. /******************************************************************************/
  106. /* 函数名称  : Init_Parameter                                                 */
  107. /* 函数描述  : 初始化参数和IO口函数                                           */
  108. /* 输入参数  : 无                                                             */
  109. /* 参数描述  : 无                                                             */
  110. /* 返回值    : 无                                                             */
  111. /******************************************************************************/
  112. void Init_Parameter(void)
  113. {
  114.          OUTPUT =1;
  115.          INPUT = 1;
  116.          count = 0;
  117.          distance = 0;
  118. }

  119. /******************************************************************************/
  120. /* 函数名称  : display_char                                                   */
  121. /* 函数描述  : 显示字符串函数                                                 */
  122. /* 输入参数  : point,address                                                  */
  123. /* 参数描述  : 写入的字符串的地址指针 1602显示对应的地址                      */
  124. /* 返回值    : 无                                                             */
  125. /******************************************************************************/
  126. void display_char(uchar *point,uchar address)
  127. {
  128.         uchar i;
  129.         write_com(0x80 + address);
  130.         for(i = 0;i < 16; i++)
  131.         {
  132.                 write_date(*point);
  133.                 point++;
  134.         }
  135. }

  136. /******************************************************************************/
  137. /* 函数名称  : display                                                        */
  138. /* 函数描述  : 显示数字                                                       */
  139. /* 输入参数  : number,address                                                */
  140. /* 参数描述  : number写入的数据,address地址                                  */
  141. /* 返回值    : 无                                                             */
  142. /******************************************************************************/       
  143. void display(int number,uchar address)
  144. {
  145.         uchar b,c,d,e;
  146.         b= (number / 1000);
  147.         c= (number / 100) % 10;
  148.         d = (number / 10) % 10;
  149.         e = number % 10;


  150.         write_com(0x80 + address);
  151.       write_date(b + 48);        //米
  152.         write_date(c + 48);        //分米
  153.         write_date(d + 48);        //厘米
  154.         write_date(46);            //小数点的ASCII
  155.         write_date(e + 48);        //毫米
  156.       write_date(99);            //"c"的ASCII
  157.         write_date(109);           //"m"的ASCII
  158.                
  159.         bianb=b;   //可以复制米的数据

  160. }

  161. /******************************************************************************/
  162. /* 函数名称  : Trig_SuperSonic                                                */
  163. /* 函数描述  : 发出声波函数                                                   */
  164. /* 输入参数  : 无                                                             */
  165. /* 参数描述  : 无                                                             */
  166. /* 返回值    : 无                                                             */
  167. /******************************************************************************/
  168. void Trig_SuperSonic(void)//出发声波
  169. {
  170.          OUTPUT = 1;
  171.          delayt(1);
  172.          OUTPUT = 0;
  173. }

  174. /******************************************************************************/
  175. /* 函数名称  : Measure_Distance                                               */
  176. /* 函数描述  : 计算距离函数                                                   */
  177. /* 输入参数  : 无                                                             */
  178. /* 参数描述  : 无                                                             */
  179. /* 返回值    : 无                                                             */
  180. /******************************************************************************/
  181. void Measure_Distance(void)
  182. {
  183.         uchar l;
  184.         uint h,y;
  185.         TR0 = 1;
  186.         while(INPUT)
  187.     {
  188.         ;
  189.     }       
  190.         TR0 = 0;
  191.         l = TL0;
  192.         h = TH0;
  193.         y = (h << 8) + l;
  194.         y = y - 0xfc66;//us部分
  195.         distance = y + 1000 * count;//计算总时间
  196.         TL0 = 0x66;
  197.         TH0 = 0xfc;
  198.         delayt(30);
  199.         distance = VELOCITY_30C * distance / 20000;
  200. //        distance =3000;                //这样写显示为300.0cm不变
  201. }

  202. /******************************************************************************/
  203. /* 函数名称  : Distance_panduan                                               */
  204. /* 函数描述  : 计算距离判断函数                                               */
  205. /* 输入参数  : 无                                                             */
  206. /* 参数描述  : 无                                                             */
  207. /* 返回值    : 无                                                             */
  208. /******************************************************************************/
  209. void Distance_panduan(void)
  210. {  
  211.      if(distance>=70)           //2000为m以此类推
  212.           {
  213.                   D1=0;
  214.           }
  215.   
  216.    else
  217.    D1=1;
  218. }

  219. /******************************************************************************/
  220. /* 函数名称  : main                                                           */
  221. /* 函数描述  : 主函数                                                         */
  222. /* 输入参数  : 无                                                             */
  223. /* 参数描述  : 无                                                             */
  224. /* 返回值    : 无                                                             */
  225. /******************************************************************************/                                       
  226. void main(void)
  227. {
  228.         initLCD();
  229.         Init_MCU();
  230.         Init_Parameter();
  231.         Alarm(2);
  232.         display_char(table,0x00);
  233.         display_char(table0,0x40);
  234.         Delay_xMs(30000);
  235.         display_char(table2,0x00);
  236.         display_char(table1,0x40);

  237.         while(1)
  238.         {
  239.                  Trig_SuperSonic();         //触发超声波发射
  240.                  while(INPUT == 0)          //等待回声
  241.          {
  242.              ;
  243.          }
  244.                  Measure_Distance();        //计算脉宽并转换为距离
  245.                  display_char(table3,0x40);
  246.                 display(distance,0x49);    //显示距离
  247.                  Distance_panduan();            //测试距离判断是否满足设置条件

  248.                  Init_Parameter();          // 参数重新初始化
  249.                  delayt(100);               //延时,两次发射之间要至少有10ms间隔
  250.          }       
  251. }

  252. /******************************************************************************/
  253. /* 函数名称  : timer0                                                         */
  254. /* 函数描述  : T0中断处理函数                                                 */
  255. /* 输入参数  : 无                                                             */
  256. /* 参数描述  : 无                                                             */
  257. /* 返回值    : 无                                                             */
  258. /******************************************************************************/
  259. void timer0 (void) interrupt 1
  260. {
  261.         TF0 = 0;
  262.         TL0 = 0x66;
  263.         TH0 = 0xfc;
  264.         count++;
  265.         if(count == 18)//超声波回声脉宽最多18ms
  266.         {
  267.                 TR0 =0;
  268.                 TL0 = 0x66;
  269.                 TH0 = 0xfc;
  270.                 count = 0;
  271.         }
  272. }
  273. /******************************************************************************/
复制代码

所有资料51hei提供下载:
超声波判断距离并报警.zip (8.81 KB, 下载次数: 21)

评分

参与人数 1黑币 +50 收起 理由
admin + 50

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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