找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8587|回复: 11
收起左侧

做了一个超声波测距报警器

  [复制链接]
ID:168149 发表于 2017-7-1 10:35 | 显示全部楼层 |阅读模式

Trig -------  P2^1;
Echo -------  P2^0;
VCC  -------- +5v
GND  -------- GND

请在上电之前,检查好接线是否正确。
QQ图片20170701103356.jpg
可以按键调节报警距离,LCD显示当前距离

单片机源程序如下:

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

  4. sbit Trig = P2^1;
  5. sbit Echo = P2^0;
  6. sbit LED5 = P2^7;
  7. sbit beep = P1^5;
  8. sbit jia_key=P3^2;
  9. sbit jian_key=P3^3;
  10. sbit Reset_key = P3^0;

  11. //全局变量 ,音符索引数
  12. unsigned char musicNum;
  13. //音符播放时定时寄存器处值TH0
  14. unsigned char code high_buff[] = {240,229,240, 229,240, 229};
  15. //音符播放时定时寄存器处值TL0
  16. unsigned char code low_buff[] = {6,13,6,13,6,13};


  17. unsigned char arm[]=" Alarm ";
  18. unsigned char arm1[]=" NowDis ";


  19. unsigned char num=0;


  20. unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};

  21. static unsigned char DisNum = 0;                                   
  22.        unsigned int  time=0;
  23.            unsigned long S=0;
  24.            unsigned long m=20;
  25.            bit      flag =0;
  26.            unsigned char disbuff[4]           ={0,0,0,0,};
  27.            unsigned char disbuff1[4]   ={0,0,0,0,} ;
  28. /*延时函数单位为毫秒*/
  29. void delayms(unsigned int ms)
  30. {
  31.         unsigned char i=100,j;
  32.         for(;ms;ms--)
  33.         {
  34.                 while(--i)
  35.                 {
  36.                         j=10;
  37.                         while(--j);
  38.                 }
  39.         }
  40. }
  41. //延时函数用于蜂鸣器的延时
  42. void delayfm(unsigned int x)
  43. {
  44.   unsigned char i;
  45. while(x--)
  46. {
  47.    for(i = 0;i < 120;i++);
  48. }
  49. }

  50. /*蜂鸣器主函数*/
  51. void fengmingqi(void)
  52. {
  53.         // TMOD = 0x00;    //定时器0工作在模式0
  54.          TH1 = (8192 - 700) / 32;  //定时器赋初值
  55.          TL1 = (8192 - 700) % 32;
  56.         // EA = 1;       //开总中断
  57.          ET1 = 1;      //开定时器0定时溢出中断
  58.          beep = 0;
  59.           for(musicNum = 1;musicNum < 6;musicNum++)
  60.           {
  61.             TR1 = 1;
  62.             delayfm(500);
  63.             TR1 = 0;
  64.             delayfm(50);
  65.           }
  66.          
  67. }

  68. //无源蜂鸣器中断采用t1定时器
  69. void Timer1(void) interrupt 3
  70. {
  71.   //蜂鸣器输出电平取反
  72.   beep = ~beep;   
  73.   TH1 = high_buff[musicNum];
  74.   TL1 = low_buff[musicNum];  
  75. }


  76. /*计数程序用于将超声波发出的信号时间与收到的作差通过计算公式从而求出距离*/
  77. void Conut(void)
  78.         {
  79.          time=TH0*256+TL0;
  80.          TH0=0;
  81.          TL0=0;
  82.        
  83.          S=(time*1.7)/100;     //算出来是CM
  84.          if((S>=700)||flag==1) //超出测量范围显示“-”
  85.          {         
  86.           flag=0;
  87.          
  88.           DisplayOneChar(0+9, 1, ASCII[11]);
  89.           DisplayOneChar(1+9, 1, ASCII[10]);        //显示点
  90.           DisplayOneChar(2+9, 1, ASCII[11]);
  91.           DisplayOneChar(3+9, 1, ASCII[11]);
  92.           DisplayOneChar(4+9, 1, ASCII[12]);        //显示M
  93.          }
  94.          else
  95.          {
  96.           disbuff[0]=S%1000/100;
  97.           disbuff[1]=S%1000%100/10;
  98.           disbuff[2]=S%1000%10 %10;
  99.           DisplayOneChar(0+9, 1, ASCII[disbuff[0]]);
  100.           DisplayOneChar(1+9, 1, ASCII[10]);        //显示点
  101.           DisplayOneChar(2+9, 1, ASCII[disbuff[1]]);
  102.           DisplayOneChar(3+9, 1, ASCII[disbuff[2]]);
  103.           DisplayOneChar(4+9, 1, ASCII[12]);        //显示M
  104.          
  105.          }
  106.          delayms(80);
  107. }
  108. /*报警距离显示函数*/
  109. void dispose()
  110. {       
  111.                           disbuff1[0]=m%1000/100;
  112.                           disbuff1[1]=m%1000%100/10;
  113.                           disbuff1[2]=m%1000%10 %10;
  114.                           DisplayOneChar(0+9, 0, ASCII[disbuff1[0]]);
  115.                           DisplayOneChar(1+9, 0, ASCII[10]);        //显示点
  116.                           DisplayOneChar(2+9, 0, ASCII[disbuff1[1]]);
  117.                           DisplayOneChar(3+9, 0, ASCII[disbuff1[2]]);
  118.                           DisplayOneChar(4+9, 0, ASCII[12]);        //显示M                       
  119. }
  120. /*按键处理函数*/
  121. void key()
  122. {
  123.         while(jia_key==0)
  124.         {
  125.                 delayms(10);
  126.                 if(jia_key==0)
  127.                 {
  128.                         m++;
  129.                         dispose();
  130.                         if(m==81)
  131.                         {
  132.                                 m=80;
  133.                                
  134.                         }
  135.                        
  136.                 }       
  137.         }
  138.         while(jian_key==0)
  139.         {
  140.                 delayms(10);
  141.                 if(jian_key==0)
  142.                 {
  143.                         m--;
  144.                         dispose();
  145.                         if(m==19)
  146.                         {
  147.                                 m=20;
  148.                        
  149.                         }
  150.                          
  151.                 }
  152.         }
  153.         while(Reset_key==0)
  154.         {
  155.                 delayms(10);
  156.                 if(Reset_key==0)
  157.                 {
  158.                         m=20;
  159.                         dispose();
  160.                 }               
  161.         }
  162.        
  163. }




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

  168. void  StartModule()                          //启动模块
  169.   {
  170.           Trig=1;                                             //启动一次模块
  171.           _nop_();
  172.           _nop_();
  173.           _nop_();
  174.           _nop_();
  175.           _nop_();
  176.           _nop_();
  177.           _nop_();
  178.           _nop_();
  179.           _nop_();
  180.           _nop_();
  181.           _nop_();
  182.           _nop_();
  183.           _nop_();
  184.           _nop_();
  185.           _nop_();
  186.           _nop_();
  187.           _nop_();
  188.           _nop_();
  189.           _nop_();
  190.           _nop_();
  191.           _nop_();
  192.           Trig=0;
  193.   }





  194. void main(void)
  195. {

  196.          TMOD=0x01;                   //设T0为方式1,GATE=1;
  197. ……………………

  198. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
超声波测距报警(LCD1602显示).zip (48.41 KB, 下载次数: 257)

评分

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

查看全部评分

回复

使用道具 举报

ID:89286 发表于 2017-7-2 08:23 | 显示全部楼层
thanks for sharing
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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