找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2972|回复: 1
收起左侧

基于单片机最小系统板的超声波测距程序与PCB原理图

[复制链接]
ID:686011 发表于 2020-10-3 22:26 | 显示全部楼层 |阅读模式
之前写的超声波波测距,超声波模块是HC-SR04,LCD1602显示。
超声波模块HC-SR04简介以及编程附带PCB板,
程序有一点点小bug,测距时数据变化太快,不能稳定,如果有高手的话希望能给改改!!

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
51hei.png 51hei.png

单片机源程序如下:
main.c
  1. #include "reg52.h"
  2. #include "lcd1602.h"
  3. #include "lcd1602.c"
  4. #include "intrins.h"
  5. #define uchar unsigned char
  6. #define uint unsigned int

  7. sbit trig=P2^0;
  8. sbit echo=P2^1;

  9. uint number,dist,numbtime,ii;
  10. uchar shia,fen,miao;
  11. uchar code lcd[]="0123456789";
  12. uchar code cm[]="cm";

  13. void init()                //定时器0初始化
  14. {
  15.         TMOD=0x01;        //定时器0,工作方式1
  16.         TH0=0;
  17.         TL0=0;
  18.         TF1=0;
  19.         EA=1;
  20.         ET0=1;
  21. }

  22. void time()
  23. {
  24.         trig=1;
  25.         delay(1);
  26.         trig=0;
  27.         while(!echo);        //接收到返回波
  28.         TR0=1;                //开定时器0
  29.         while(echo);
  30.         TR0=0;                //关定时器0

  31.         number=TH0*256+TL0;
  32.         for(ii=number;ii<=40000;ii++);
  33.         TH0=0;
  34.         TL0=0;
  35.         number=number*12/11.0592;        //us
  36.         dist=number*0.17;        // mm         0.017(cm)
  37. }

  38. void main()
  39. {
  40.         uchar i;
  41.         lcd_init();
  42.         init();
  43.         while(1)
  44.         {
  45.                 time();
  46.                 lcd_com(0x80);
  47.                 lcd_dat(lcd[dist/1000]);
  48.                 lcd_dat(lcd[dist%1000/100]);
  49.                 lcd_dat(lcd[dist%100/10]);
  50.                 lcd_dat('.');
  51.                 lcd_dat(lcd[dist%10]);
  52.                 for(i=0;i<2;i++)
  53.                 {
  54.                         lcd_dat(cm[i]);
  55.                 }
  56.         }
  57. }
复制代码




lcd1602.c
  1. #include "reg52.h"
  2. #define uchar unsigned char

  3. sbit lcden=P2^7;        //定义lcd1602使能端口
  4. sbit lcdrs=P2^6;        //定义lcd1602数据/命令选择端口(H/L)
  5. sbit lcdrw=P2^5;        //定义lcd1602读/写端口(H/L)

  6. //sbit lcden=P1^7;        //定义lcd1602使能端口
  7. //sbit lcdrs=P1^5;        //定义lcd1602数据/命令选择端口(H/L)
  8. //sbit lcdrw=P1^6;        //定义lcd1602读/写端口(H/L)

  9. void delay(uchar z)
  10. {
  11.         uchar x,y;
  12.         for(x=z;x>0;x--)
  13.                 for(y=110;y>0;y--);
  14. }

  15. void lcd_com(uchar com)                //lcd1602命令发送函数(位)
  16. {
  17.         lcdrs=0;
  18.         lcdrw=0;
  19.         P0=com;
  20.         delay(5);
  21.         lcden=1;
  22.         delay(5);
  23.         lcden=0;
  24. }

  25. void lcd_dat(uchar dat)                //lcd1602数据发送函数
  26. {
  27.         lcdrs=1;
  28.         lcdrw=0;
  29.         P0=dat;
  30.         delay(5);
  31.         lcden=1;
  32.         delay(5);
  33.         lcden=0;
  34. }

  35. void lcd_init()                //lcd1602初始化
  36. {
  37.         lcden=0;
  38.         lcd_com(0x38);
  39.         lcd_com(0x0c);
  40.         lcd_com(0x06);
  41.         lcd_com(0x01);
  42. }
复制代码


lcd1602.h
  1. #ifndef __LCD1602_H_
  2. #define __LCD1602_H_
  3. #define uchar unsigned char

  4. void delay(uchar z);
  5. void lcd_init();                //lcd1602初始化
  6. void lcd_com(uchar com);                //lcd1602命令发送函数(位)
  7. void lcd_dat(uchar dat);                //lcd1602数据发送函数

  8. #endif
复制代码


全部资料51hei下载地址:
超声波电路板.7z (573.81 KB, 下载次数: 33)

评分

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

查看全部评分

回复

使用道具 举报

ID:851949 发表于 2020-11-30 19:49 | 显示全部楼层

正好要做这个,谢谢大神
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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