找回密码
 立即注册

QQ登录

只需一步,快速开始

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

AT89S51单片机超声波测距系统Proteus仿真+注释详细的代码

[复制链接]
ID:567835 发表于 2019-6-20 14:02 | 显示全部楼层 |阅读模式
测距精度不是特别的准确。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png

单片机源程序如下:
  1. //    基于AT89C51/52单片机的超声波测距系统
  2. //    测量范围:40-690厘米
  3. //    晶振:12MH
  4. //    2015年5月
  5. #include <REGX51.H>                                //头文件
  6. #include <intrins.h>            //头文件
  7. #define uchar unsigned char     
  8. #define uint unsigned int      
  9. #define bjh P3_1                            //定值输出(继电器)
  10. #define sx P0_2                 //报警值输出(声音)
  11. #define csbout P2_7                         //超声波发送
  12. #define csbint P3_5                         //超声波接收

  13. uchar ec,cls,cs,mq,xm0,xm1,xm2,sec20,sec,sec1,buffer[3]; //程序中使用的变量   
  14. uchar convert[10]={0x81,0xED,0xA2,0xA8,0xCC,0x98,0x90,0xAD,0x80,0x88};//0~9段码
  15. uint zzz,dz,i,jsz,t;//程序中使用的变量  zzz:测量上限,dz:报警定值,i:延时变量,jsz:距离测量结果,t:时间
  16. static uchar bdata ke;         //可位寻址的状态寄存器
  17. float csbc;             //超声波速储存单元  

  18. sbit LED1 = P3^4;                        //数码管位驱动
  19. sbit LED2 = P3^2;                        //数码管位驱动
  20. sbit LED3 = P3^3;                        //数码管位驱动


  21. void delay(i);                                //延时函数
  22. void scanLED();                                //显示函数
  23. void timeToBuffer();                //显示转换函数
  24. void time();                                //计时处理                        
  25. void csbcj();                                //超声波测量处理
  26. void bgcl();                                //继电器报警处理
  27. void csbfs();                                //超声波发送

  28. void offmsd();              //百位为零时不显示处理

  29. void main()                                        //主程序
  30. {
  31.         EA=1;                                           //开中断
  32.           TMOD=0x11;                                 //设定时器1定时
  33.         csbout=1;                                //单片机超声波输出端口置高电平
  34.         TR1=0;                                        //定时器1停止工作
  35.         zzz=699;                                //测量上限值
  36.         mq=40;                                        //盲区值
  37.     dz=120;                                        //报警值初值
  38.         cls=1;                                        //每秒测量次数
  39.     csbc=0.034;            //20度时的超声波速度:厘米/uS
  40.         bjh=1;                                        //继电器停止工作
  41.         sx=0;                                        //蜂鸣器停止工作
  42.         ec=100;
  43.         while(1)               
  44.         {
  45.             ec++;
  46.                 if (ec>100)                        //超声波测量标志为100时进行测量
  47.                 {
  48.                     cls=~cls;
  49.                     ec=0;                        //超声波测量标志置0
  50.                         csbcj();         //调用超声波测量程序
  51.                     timeToBuffer();                //调用转换段码功能模块
  52.                         offmsd();           //调用显示转换程序
  53.                         bgcl();              //调用报警处理程序
  54.                 }
  55.                   scanLED();                             //调用显示函数
  56.                 if((jsz<dz)&(cls==1))                                //判断是否达到报警值
  57.                 {
  58.                    i=5;
  59.                    while(i--)
  60.                    {
  61.                                    sx=~sx;             //发出“滴”声响
  62.                         delay(70);
  63.                    }

  64.                 }
  65.                 else  {sx=0;}
  66.         }
  67. }

  68. void delay(i)                                //延时子程序                                       
  69. {
  70.     while(--i);
  71. }

  72. void scanLED()                             //显示功能模块
  73. {
  74.         P2=buffer[2];            //显百位段
  75.         LED1=0;                  //显百位位
  76.         delay(40);                                 //百位显示延时          程序要下载到实物中时改为delay(2);        下同
  77.         LED1=1;                  //关闭百位显示
  78.         delay(2);               //关闭百位显示延时        程序要下载到实物中时改为delay(50);        下同
  79.         P2=buffer[1];                         //显十位段
  80.         LED2=0;                  //显十位位
  81.         delay(40);                //百十位显示延时
  82.         LED2=1;                  //关闭十位显示
  83.         delay(2);               //关闭十位显示延时
  84.         P2=buffer[0];            //显个位段
  85.         LED3=0;                  //显个位位
  86.         delay(40);                //显个位段
  87.         LED3=1;                  //百关闭个位显示
  88.         delay(2);               //百关闭个位显示延时
  89. }

  90. void timeToBuffer()                                    //转换段码功能模块
  91. {
  92.         if (jsz>zzz)                //测量值大于测量上限时显示“CCC”
  93.         {
  94.                 buffer[0]=0x93;                //显示 C
  95.                 buffer[1]=0x93;                        //显示 C
  96.                 buffer[2]=0x93;                        //显示 C
  97.         }
  98.         else if (jsz<mq)           //测量值小于测量下限时显示“CCC"
  99.         {
  100.                 buffer[0]=0xFE;               //显示 -
  101.                 buffer[1]=0xFE;        //显示 -
  102.                 buffer[2]=0xFE;        //显示 -
  103.         }
  104.         else
  105.         {
  106.                 xm0=jsz/100;            //计算百位值              
  107.                 xm1=(jsz-xm0*100)/10;   //计算十位值
  108.                 xm2=jsz-xm0*100-xm1*10; //计算个位值
  109.                 buffer[0]=convert[xm2];        //进行个位显示段码转换
  110.                 buffer[1]=convert[xm1]; //进行十位显示段码转换
  111.                 buffer[2]=convert[xm0]; //进行百位显示段码转换
  112.                 if (buffer[2]==0x81)    //判断百位是否为零
  113.                 {
  114.                         buffer[2]=0xFF;     //百位为零时不显示                 
  115.                 }
  116.         }
  117. }


  118. void csbcj()                                        //超声波测距程序
  119. {
  120.         TR0=0;                  //停止定时器1工作
  121.         TH1=0x00;                                //计时器1清零
  122.         TL1=0x00;               //计时器1清零
  123.         csbint=1;               //置单片机超声波接收口高高电平
  124.         sx=0;                   //停止报警声响
  125.         delay(1700);            //进行延时
  126.         csbfs();                //调用超声波发送子程序:CSBFS.ASM
  127.         csbout=1;               //置单片机超声波输出端口P2.7为高电平
  128.         TR1=1;                                        //超声波发头发送完超声波后,启动定时器1进行计时                        
  129.         i=250;                            //盲区处理系数                        
  130.         while(i--)              //盲区延时处理
  131.         {
  132.         }
  133.         i=0;
  134.         while(csbint)                        //进行超声波回波判断,判断接收回路是否收到超声波的回波,接收到回波时,csbint=0
  135.         {
  136.                 i++;
  137.                 if(i>=3300)         //规定时间没收到回波时退出判断处理程序                        
  138.                 csbint=0;           //规定时间内接收到回波时,置csbint=0
  139.         }
  140.         TR1=0;                  //停止计时器1计时
  141.         t=TH1;                                        //提取计时器记录的高8位值
  142.         t=t*256+TL1;            //计算计时的总时间
  143.         TR0=1;                  //恢复定时器0工作
  144.         csbint=1;               //超声波接收端置高电平,这下次测量做准备
  145.         jsz=t*csbc;                                //计算测量结果
  146.         jsz=jsz/2;              //计算测量结果
  147. }
  148.         
  149. void bgcl()                 //报警处理继电器动作判断程序
  150. {
  151.         if (jsz<dz)             //测量值低于设定的报警值,继电器吸合
  152.         {
  153.                 bjh=0;              //继电器吸合
  154.         }
  155.         else
  156.         {
  157.                 bjh=1;                                //继电器断开
  158.         }                        
  159. }


  160. void offmsd()                                                            //百位为数0判断模块
  161. {
  162.     if (buffer[2]==0x81)                                      //如果值为零时百位不显示
  163.     buffer[2] = 0xff;
  164. }
复制代码

所有资料51hei提供下载:
超声波.7z (27.31 KB, 下载次数: 68)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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