找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51/52单片机的倒车雷达代码 (超声波+LCD1602)

[复制链接]
跳转到指定楼层
楼主
ID:560467 发表于 2020-3-5 23:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基本内容是利用超声波制作一个到场雷达,可设定两段距离分别产生两种报警声音

单片机源程序如下:

  1. #include<reg51.h>
  2. #include<intrins.h>       
  3. #include"lcd.h"

  4. sbit Trig = P2^1;        //超声波
  5. sbit Echo = P2^0;        //超声波
  6. sbit BUZZ=P1^5;                //蜂鸣器
  7. sbit K1=P3^1;                //选择调节high 或者 low
  8. sbit K2=P3^0;                //调节high/low ++
  9. sbit K3=P3^2;                //调节high/low --

  10. unsigned char PuZh[]="HIGH    LOW";
  11. unsigned char code ASCII[15] =    {'0','1','2','3','4','5','6','7','8','9','.','-','M'};

  12. static unsigned char DisNum = 0; //显示用指针                                  
  13. unsigned int  time=0;
  14. unsigned long S=0;
  15. unsigned long tj=0;
  16. unsigned int high=30,low=10;                //high:第一次报警位置   low:第二次报警位置   第二次报警的蜂鸣器响的时间较长
  17. bit  flag =0,flag2=0;
  18. unsigned char disbuff[4]={ 0,0,0,0,};
  19. unsigned char self[4]={ 0,0,0,0,};

  20. void delay(unsigned int jj)
  21. {
  22.         while(jj--);
  23. }
  24. /*******************************************************************************
  25. * 函 数 名         : main
  26. * 函数功能                   : 主函数
  27. * 输    入         : 无
  28. * 输    出         : 无
  29. *******************************************************************************/
  30. void Conut(void)
  31.         {
  32.          time=TH0*256+TL0;
  33.          TH0=0;
  34.          TL0=0;
  35.        
  36.          S=(time*1.7)/100;     //算出来是CM
  37.                 tj=S;
  38.          if((S>=700)||flag==1) //超出测量范围显示“-”
  39.          {         
  40.           flag=0;
  41.          
  42.           DisplayOneChar(0, 1, ASCII[11]);
  43.           DisplayOneChar(1, 1, ASCII[10]);        //显示点
  44.           DisplayOneChar(2, 1, ASCII[11]);
  45.           DisplayOneChar(3, 1, ASCII[11]);
  46.           DisplayOneChar(4, 1, ASCII[12]);        //显示M
  47.          }
  48.          else
  49.          {
  50.                         disbuff[0]=S%1000/100;
  51.                         disbuff[1]=S%1000%100/10;
  52.                         disbuff[2]=S%1000%10 %10;
  53.                         DisplayOneChar(0, 1, ASCII[disbuff[0]]);
  54.                         DisplayOneChar(1, 1, ASCII[10]);        //显示点
  55.                         DisplayOneChar(2, 1, ASCII[disbuff[1]]);
  56.                         DisplayOneChar(3, 1, ASCII[disbuff[2]]);
  57.                         DisplayOneChar(4, 1, ASCII[12]);        //显示M
  58.                  
  59.                         self[0]=high/10;
  60.                         self[1]=high%10;
  61.                         self[2]=low/10;
  62.                         self[3]=low%10;
  63.                         DisplayOneChar(5, 0, ASCII[self[0]]);
  64.                         DisplayOneChar(6, 0, ASCII[self[1]]);
  65.                   DisplayOneChar(12, 0, ASCII[self[2]]);
  66.                   DisplayOneChar(13, 0, ASCII[self[3]]);
  67.          }
  68.         }

  69. void zd0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围
  70.   {
  71.     flag=1;                                                         //中断溢出标志
  72.   }

  73. void  StartModule()                          //启动模块
  74.   {
  75.           Trig=1;                                             //启动一次模块
  76.           _nop_();
  77.           _nop_();
  78.           _nop_();
  79.           _nop_();
  80.           _nop_();
  81.           _nop_();
  82.           _nop_();
  83.           _nop_();
  84.           _nop_();
  85.           _nop_();
  86.           _nop_();
  87.           _nop_();
  88.           _nop_();
  89.           _nop_();
  90.           _nop_();
  91.           _nop_();
  92.           _nop_();
  93.           _nop_();
  94.           _nop_();
  95.           _nop_();
  96.           _nop_();
  97.           Trig=0;
  98.   }

  99. void button()
  100. {
  101.         if(K1==0)
  102.         {
  103.                 delay(30);
  104.                 if(K1==0)
  105.                 {
  106.                         flag2=~flag2;
  107.                 }
  108.         }
  109.         if(K2==0)
  110.         {
  111.                 delay(20);
  112.                 if(K2==0)
  113.                 {
  114.                         if(flag2==0)
  115.                         {
  116.                                 high++;
  117.                                 if(high>=100) high=20;
  118.                         }
  119.                         else
  120.                         {
  121.                                 low++;
  122.                                 if(low>=high) low=high;
  123.                         }
  124.                 }
  125.         }
  126.         if(K3==0)
  127.         {
  128.                 delay(20);
  129.                 if(K3==0)
  130.                 {
  131.                         if(flag2==0)
  132.                         {
  133.                                 high--;
  134.                                 if(high<=low) high=low;
  135.                         }
  136.                         else
  137.                         {
  138.                                 low--;
  139.                                 if(low<=5) low=5;
  140.                         }
  141.                 }
  142.         }
  143.         if(flag2==0)
  144.         {
  145.                 DisplayOneChar(4, 0, 42);
  146.                 DisplayOneChar(11, 0, 58);
  147.         }
  148.         else
  149.         {
  150.                 DisplayOneChar(4, 0, 58);
  151.                 DisplayOneChar(11, 0, 42);
  152.         }
  153. }

  154. void delayms(unsigned int ms)
  155. {
  156.         unsigned char i=100,j;
  157.         for(;ms;ms--)
  158.         {
  159.                 while(--i)
  160.                 {
  161.                         j=10;
  162.                         while(--j);
  163.                 }
  164.         }
  165. }

  166. void bibu()
  167. {
  168.         if(tj>=low&&tj<=high)
  169.         {
  170.                 long d=0;
  171.                 for(d=0;d<=300;d++)
  172.                 {
  173.                         BUZZ=1;
  174.                         delay(100);
  175.                         BUZZ=0;
  176.                 }
  177.         }
  178.         if(tj<low)
  179.         {
  180.                 long d=0;
  181.                 for(d=0;d<=800;d++)
  182.                 {
  183.                         BUZZ=1;
  184.                         delay(100);
  185.                         BUZZ=0;
  186.                 }
  187.         }
  188. }

  189. void main(void)
  190. {

  191.          TMOD=0x01;                   //设T0为方式1,GATE=1;
  192.          TH0=0;
  193.          TL0=0;         
  194.          ET0=1;             //允许T0中断
  195.          EA=1;                           //开启总中断       

  196.         InitLcd1602();
  197.         LcdShowStr(0,0,PuZh);
  198.         while(1)
  199.         {
  200.                  StartModule();
  201.              while(!Echo);                //当RX为零时等待
  202.              TR0=1;                            //开启计数
  203.              while(Echo);                        //当RX为1计数并等待
  204.              TR0=0;                                //关闭计数
  205.          Conut();                        //计算
  206.                  delayms(80);
  207.                 bibu();
  208.                 button();
  209.         }       
  210. }
复制代码

所有资料51hei提供下载:
倒车雷达.zip (46.96 KB, 下载次数: 87)


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

使用道具 举报

沙发
ID:632112 发表于 2020-4-7 17:04 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

板凳
ID:895873 发表于 2021-3-25 10:19 | 只看该作者
有没有电路仿真图图呀
回复

使用道具 举报

地板
ID:896273 发表于 2021-3-25 16:24 | 只看该作者
用的是超声波模块吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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