找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机三路超声波测距源码

[复制链接]
ID:1024867 发表于 2022-5-8 19:18 | 显示全部楼层 |阅读模式
这三路超声波测距的源代码

单片机源程序如下:
  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #include "LCD1602.h"
  4. #include "STCEEPROM.h"
  5. sbit  RX1 = P3^4;
  6. sbit  RX2 = P3^5;
  7. sbit  RX3 = P3^6;
  8. sbit  TX = P3^7;

  9. sbit LED = P2^1;
  10. sbit SPEAK = P2^0;

  11. sbit KEY1 = P1^3;
  12. sbit KEY2 = P1^4;
  13. sbit KEY3 = P1^5;

  14. sbit RST=P2^5; /*1脚*/
  15. sbit CS=P2^7; /*11*/
  16. sbit SCL=P2^3; /*10*/
  17. sbit SDA=P2^6; /*12*/
  18. sbit VBUSY=P2^4;          //忙等待
  19. void display(void);
  20. unsigned char en_flag=0;
  21. void delay100us(void) //100US延时子程序
  22. {  
  23.         unsigned char j;  
  24.         for(j=50;j>0;j--);
  25. }
  26. void delay1ms(unsigned char count) //1MS延时子程序
  27. {  
  28.         unsigned char i,j,k;
  29.         for(k=count;k>0;k--)  
  30.         for(i=2;i>0;i--)
  31.         for(j=248;j>0;j--);
  32. }  
  33. void Send_threelines(unsigned char addr) //三线发码子程序  
  34. {
  35.         unsigned char i;  
  36.         RST=0;  
  37.         delay1ms(5);  
  38.         RST=1;  
  39.         delay1ms(17); /* 17ms*/

  40.         CS=0;  
  41.         delay1ms(2);  
  42.         for(i=0;i<8;i++)  
  43.         {SCL=0;  
  44.                 if(addr & 1)SDA=1;  
  45.                 else SDA=0;  
  46.                 addr>>=1;  
  47.                 delay100us(); /* 100us */  
  48.                 SCL=1;  
  49.                 delay100us();  
  50.         }  
  51.         CS=1;  
  52.         delay1ms(30);
  53.                 while(VBUSY == 0);          //忙等待
  54. }
  55. unsigned int  time=0;
  56. unsigned int  timer=0;
  57. unsigned int S=0,S1=0,S2=0,S3=0;
  58. unsigned int SET_H=100,SET_L=10;
  59. bit      flag =0;
  60. unsigned char Table[3]={0};
  61. unsigned char KEY_flag=0;
  62. //延时函数
  63. void Delay_ms(int jj)
  64. {
  65.         int ii;
  66.         while(jj--)
  67.                 for(ii=0;ii<116;ii++);
  68. }
  69. void Conut(void)
  70. {
  71.          time=TH0*256+TL0;
  72.          TH0=0;
  73.          TL0=0;
  74.         
  75.          S=(time*1.87)/100;     //算出来是CM
  76.          if((S>=700)||flag==1) //超出测量范围显示“-”
  77.          {         
  78.           flag=0;
  79.          }
  80. }
  81. void main(void)
  82. {
  83.     LCD1602_init();//液晶初始化
  84.         //////////////////////0123456789ABCDEF
  85.     LCD1602_Disp_ZF(0x80,"    :     :     ",16);
  86.                                                      //0123456789ABCDEF
  87.     LCD1602_Disp_ZF(0x80+0X40,"Set H:    L:    ",16);
  88.         TMOD=0x11;                   //设T0为方式1,GATE=1;
  89.         TH0=0;
  90.         TL0=0;         
  91.         TH1=0xf8;                   //2MS定时
  92.         TL1=0x30;
  93.         ET0=1;             //允许T0中断
  94.         ET1=1;                           //允许T1中断
  95.         TR1=1;                           //开启定时器
  96.         EA=1;                           //开启总中断
  97.         EA=0;
  98.         SET_H = ISP_READ(0x2c00)*256+ISP_READ(0x2c01);
  99.         SET_L = ISP_READ(0x2c02)*256+ISP_READ(0x2c03);
  100.         EA=1;

  101.         while(1)
  102.         {
  103.                 while(!RX1);                    //当RX为零时等待
  104.                 TR0=1;                            //开启计数
  105.                 while(RX1);                        //当RX为1计数并等待
  106.                 TR0=0;                                //关闭计数
  107.                 Conut();
  108.                 S1=S;
  109.                 Delay_ms(10);
  110.                 /////////////////////////////
  111.                 while(!RX2);                    //当RX为零时等待
  112.                 TR0=1;                            //开启计数
  113.                 while(RX2);                        //当RX为1计数并等待
  114.                 TR0=0;                                //关闭计数
  115.                 Conut();
  116.                 S2=S;
  117.                 Delay_ms(10);
  118.                 /////////////////////////////
  119.                 while(!RX3);                    //当RX为零时等待
  120.                 TR0=1;                            //开启计数
  121.                 while(RX3);                        //当RX为1计数并等待
  122.                 TR0=0;                                //关闭计数
  123.                 Conut();
  124.                 S3=S;
  125.                 Delay_ms(10);
  126.                 /////////////////////////////////////
  127.                 Table[0]= S1/100+0X30;
  128.                 Table[1]= S1%100/10+0X30;
  129.                 Table[2]= S1%10+0X30;
  130.                 LCD1602_Disp_ZF(0x80,Table,3);
  131.                 Table[0]= S2/100+0X30;
  132.                 Table[1]= S2%100/10+0X30;
  133.                 Table[2]= S2%10+0X30;
  134.                 LCD1602_Disp_ZF(0x86,Table,3);
  135.                 Table[0]= S3/100+0X30;
  136.                 Table[1]= S3%100/10+0X30;
  137.                 Table[2]= S3%10+0X30;
  138.                 LCD1602_Disp_ZF(0x8C,Table,3);
  139.                 /////////////////////////////////
  140.                 if((S1>SET_H||S1<SET_L)||(S2>SET_H||S2<SET_L)||(S3>SET_H||S3<SET_L))
  141.                 {
  142.                         P2 = 0X00;
  143.                
  144.                 }
  145.                 else
  146.                         P2 = 0XFF;        
  147.    if((S1<SET_L)||(S2<SET_L)||(S3<SET_L))
  148.                 {
  149.                         SPEAK=0;
  150.                 }
  151.                 else
  152.                         
  153.                         SPEAK=1;
  154. if((S1<SET_H&&S1>SET_L)||(S2<SET_H&&S2>SET_L)||(S3<SET_H&&S3>SET_L))
  155.                 {
  156.                                 Send_threelines(0);
  157.                
  158.                 }


  159.                
  160.                 if(!KEY1)
  161.                 {
  162.                         Delay_ms(10);
  163.                         if(!KEY1)
  164.                         {
  165.                                 KEY_flag++;        
  166.                                 ISP_ERASE(0x2c00);                //注意:字节编程时必须要先要擦除整个扇区        
  167.                                 ISP_PROGRAM(0x2c00, SET_H/256);
  168.                                 ISP_PROGRAM(0x2c01, SET_H);
  169.                                 ISP_PROGRAM(0x2c02, SET_L/256);
  170.                                 ISP_PROGRAM(0x2c03, SET_L);
  171.                         }
  172.                         while(!KEY1);
  173.                 }
  174.                 if(!KEY2)
  175.                 {
  176.                         Delay_ms(10);
  177.                         if(!KEY2)
  178.                         {
  179.                                 if(KEY_flag%2==0)SET_H++;
  180.                                 if(KEY_flag%2==1)SET_L++;
  181.                         }
  182.                 }
  183.                 if(!KEY3)
  184.                 {
  185.                         Delay_ms(10);
  186.                         if(!KEY3)
  187.                         {
  188.                                 if(KEY_flag%2==0)SET_H--;
  189.                                 if(KEY_flag%2==1)SET_L--;
  190.                         }
  191.                 }
  192.           Table[0]= SET_H/100+0X30;
  193.           Table[1]= SET_H%100/10+0X30;
  194.           Table[2]= SET_H%10+0X30;
  195.           LCD1602_Disp_ZF(0x86+0x40,Table,3);
  196.           Table[0]= SET_L/100+0X30;
  197.           Table[1]= SET_L%100/10+0X30;
  198.           Table[2]= SET_L%10+0X30;
  199.           LCD1602_Disp_ZF(0x8C+0x40,Table,3);
  200.         }
  201. }

  202. /********************************************************/
  203.      void zd0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围
  204.   {
  205.     flag=1;                                                         //中断溢出标志
  206.   }
  207. /********************************************************/
  208.    void  zd3()  interrupt 3         
  209.   {
  210.          TH1=0xf8;
  211.          TL1=0x30;
  212.          timer++;
  213.          if(timer>=100)
  214.          {
  215.           timer=0;
  216.           TX=1;                                        //200MS  启动一次模块
  217.           _nop_(); _nop_(); _nop_();
  218.           _nop_(); _nop_(); _nop_();
  219.           _nop_(); _nop_(); _nop_();
  220.           _nop_(); _nop_(); _nop_();
  221.           _nop_(); _nop_(); _nop_();
  222.           _nop_(); _nop_();_nop_();
  223.           _nop_(); _nop_(); _nop_();
  224.           TX=0;
  225.          }
  226.   }
复制代码


Keil代码下载: 3路超声波 语音.rar (65.59 KB, 下载次数: 22)

评分

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

查看全部评分

回复

使用道具 举报

ID:398219 发表于 2022-6-21 09:56 | 显示全部楼层
谢谢分享,正在做2路超声波项目,正好需要学习
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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