找回密码
 立即注册

QQ登录

只需一步,快速开始

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

写一个简单的单片机超声波测距程序,数码管显示距离,单位厘米

[复制链接]
跳转到指定楼层
楼主
ID:743179 发表于 2020-5-3 20:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
写一个简单地超声波测距程序,数码管显示距离,单位厘米

单片机源程序如下:
  1. #include "reg51.h"

  2. unsigned char table[]=
  3.                         {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  4.                        
  5. #define uint  unsigned int
  6. #define uchar unsigned char

  7. sbit D1= P2^7;
  8. sbit Trig = P2^2;
  9. sbit Echo = P3^2;                               
  10. sbit SMG_q = P1^0;       
  11. sbit SMG_b = P1^1;       
  12. sbit SMG_s = P1^2;       
  13. sbit SMG_g = P1^3;       

  14. uint time = 0;
  15. uint timeH = 0;
  16. uint timeL = 0;
  17. uint succeed_flag;
  18.                        
  19. void display(uint da);
  20. void delay(uint z);
  21. void delay_20us();
  22.        
  23. void main(void)  
  24. {               
  25.           uint distance;

  26.     Trig=0;       //首先拉低脉冲输入引脚
  27.     EA=1;         //打开总中断0
  28.     TMOD=0x10;    //定时器1,16位工作方式
  29.     while(1)        
  30.     {
  31.         EA=0;           //关总中断
  32.         Trig=1;         //超声波输入端
  33.         delay_20us();   //延时20us
  34.         Trig=0;         //产生一个20us的脉冲
  35.         while(Echo==0); //等待Echo回波引脚变高电平
  36.         succeed_flag=0; //清测量成功标志
  37.         EA=1;
  38.         EX0=1;          //打开外部中断0
  39.         TH1=0;          //定时器1清零
  40.         TL1=0;          //定时器1清零
  41.         TF1=0;          //计数溢出标志
  42.         TR1=1;          //启动定时器1
  43.         delay(20);      //等待测量的结果
  44.         TR1=0;          //关闭定时器1
  45.         EX0=0;          //关闭外部中断0
  46.        if(succeed_flag==1)
  47.        {   
  48.                                         time=timeH*256+timeL;
  49.           distance=time*0.0172;  //厘米

  50.                                   display(distance );
  51.                                        
  52.                                         if(distance<=150 && distance>=80)
  53.           {
  54.                                                 D1=0;
  55.                                         }
  56.                                         else D1=1;
  57.                          }
  58.                          
  59.        if(succeed_flag==0)
  60.        {
  61.                                         distance=9999;               
  62.                                         D1=1;
  63.                                         delay(24);
  64.         }               
  65.     }
  66. }

  67. void display(uint da)
  68. {
  69.         SMG_q=0;                       
  70.         P0=table[da/1000];       
  71.         delay(1);                       
  72.         P0=0XFF;                       
  73.         SMG_q=1;       
  74.        
  75.         SMG_b=0;                       
  76.         P0=table[da/100%10];       
  77.         delay(1);                       
  78.         P0=0XFF;                       
  79.         SMG_b=1;       
  80.        
  81.         SMG_s=0;                       
  82.         P0=table[da%100/10];       
  83.         delay(1);                       
  84.         P0=0XFF;                       
  85.         SMG_s=1;                       

  86.         SMG_g=0;                       
  87.         P0=table[da%10];       
  88.         delay(1);                       
  89.         P0=0XFF;                       
  90.         SMG_g=1;                       
  91. }

  92. void exter()  interrupt 0   // 外部中断0是0号
  93. {   
  94.      timeH =TH1;    //取出定时器的值
  95.      timeL =TL1;    //取出定时器的值
  96.      succeed_flag=1;//至成功测量的标志
  97.      EX0=0;         //关闭外部中断
  98. }
  99. //****************************************************************
  100. //定时器1中断,用做超声波测距计时
  101. void timer1() interrupt 3  //
  102. {
  103.     TH1=0;
  104.     TL1=0;
  105. }

  106. void delay(uint z)
  107. {
  108.         uint x,y;
  109.         for(x=z;x>0;x--)
  110.         for(y=125;y>0;y--);
  111. }

  112. void delay_20us()
  113. {
  114.     uchar a ;
  115.     for(a=0;a<100;a++);
  116. }
复制代码

所有程序51hei提供下载:
超声波测距—数码管显示距离(单位厘米)程序.rar (28.34 KB, 下载次数: 31)


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

使用道具 举报

沙发
ID:1 发表于 2020-5-5 14:27 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

板凳
ID:756037 发表于 2020-5-24 15:16 | 只看该作者
你好,请问数码管怎么连接的,我在仿真上没有结果
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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