找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于c51的超声波雷达扫描程序

[复制链接]
跳转到指定楼层
楼主
ID:397329 发表于 2018-9-13 09:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
不懂的咨询我

单片机源程序如下:
  1. ///////////////////////////////////////////////////////////////
  2. //Project : 数字循环显示.c
  3. //版本    : V1.0
  4. //作者    : 源动力
  5. //说明    :本函数只适用于南阳理工学院电子系51开发板。
  6. //用法          : 直接下载到51单片机
  7. //功能    :和超声波模块HC-SR04相连,检测距离
  8. //接口说明:超声波接口 —51开发板
  9. //                Trig — P1^0
  10. //                Echo — P3^2
  11. ///////////////////////////////////////////////////////////////
  12. #include<reg52.h>
  13. #include<intrins.h>
  14. #define uint unsigned int
  15. #define uchar unsigned char
  16. sbit D1=P2^7;  //控制数码管亮灭,为低电平时灭                  
  17. sbit D2=P1^7;  //控制全体二极管的熄灭,        573LE使能端
  18. sbit send=P1^0;
  19. sbit receive=P3^2;

  20. uchar code table[]={0x81,0x42,0x23,0x14};


  21. uchar code table1[]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89};
  22. //二进制1000等于十六进制8,此时数码管只有第1位显
  23. uchar code table2[]={0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49};
  24. //二进制1000等于十六进制8,此时数码管只有第2位显
  25. uchar code table3[]={0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29};
  26. //二进制1000等于十六进制8,此时数码管只有第3位显
  27. uchar code table4[]={0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19};
  28. //二进制1000等于十六进制8,此时数码管只有第4位显

  29. uchar code table1234[]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9};
  30. //二进制1111等于十六进制f;此时数码管全显       

  31. uint num,a=0;
  32. uint outcomeH=0,outcomeL=0;
  33. unsigned long distance_data;
  34. uint temp_data[4];
  35. uint succeed_flag;

  36. void delay(uint z)
  37. {
  38.   uint x,y;
  39.   for(x=z;x>0;x--)
  40.     for(y=1141;y>0;y--);
  41. }
  42. void delay_20us()
  43. {  
  44.         uchar bt ;
  45.     for(bt=0;bt<100;bt++);
  46. }
  47. void ExternalInterrupt_Init()
  48. {
  49.        
  50.         //TCON=0x00; //设定外部中断触发方式为低电平触发方式         两种设置方式一样
  51.         IT0=0;                //设定外部中断触发方式为低电平触发方式       
  52. }
  53. void Timer0_Init()
  54. {
  55.         TMOD=0x11;//设置定时器0和1为工作方式1

  56.           TH0=0;//对定时器高八位清零
  57.           TL0=0;//对定时器低八位清零
  58.         TF0=0;//定时计数器溢出标志位清零
  59.           ET0=1;//开定时器0中断

  60.         TH1=0;//对定时器高八位清零
  61.           TL1=0;//对定时器低八位清零
  62.         TF1=0;//定时计数器溢出标志位清零
  63.           ET1=1;//开定时器0中断
  64.          
  65.        
  66. }
  67. void AllInterrupt_Init()
  68. {
  69.         IP=0x01;//外部中断0设置为高优先级,其他所有中断为低优先级
  70.        
  71. }
  72. void UT_Init()        //初始化超声波发射和接收引脚
  73. {
  74.         send=0;
  75.         receive=0;
  76. }
  77. void Send()
  78. {
  79.         send=1;
  80.         delay_20us();
  81.         send=0;
  82. }

  83. void conversion()
  84. {
  85.         uint ge_data,shi_data,bai_data,qian_data;

  86.         distance_data=outcomeH;
  87.         distance_data <<=8;
  88.         distance_data=(distance_data | outcomeL);

  89.         //distance_data*=(90*12);  //这是往返两个路程的时间
  90.         //distance_data现在单位为us
  91.     /*distance_data*=(170);    //(340/2=170) distance_data现在单位为微米
  92.         distance_data=distance_data/1000;           //distance_data现在单位为毫米 */

  93.         distance_data*=12;                  //因为定时器默认为12分频
  94.     distance_data/=58;                  //微秒的单位除以58等于厘米
  95.                                        
  96.        
  97.         qian_data=distance_data/1000;       
  98.         distance_data=distance_data%1000;   //取余运算                                                               
  99.         bai_data=distance_data/100 ;
  100.     distance_data=distance_data%100;   //取余运算
  101.     shi_data=distance_data/10 ;
  102.     distance_data=distance_data%10;    //取余运算
  103.     ge_data=distance_data;

  104.         temp_data[0]=qian_data;
  105.         temp_data[1]=bai_data;
  106.         temp_data[2]=shi_data;
  107.         temp_data[3]=ge_data;



  108. }
  109. void display()
  110. {
  111.        
  112.         conversion();
  113.         P0=table1[temp_data[0]];
  114.         delay(1);
  115.         P0=table2[temp_data[1]];
  116.         delay(1);
  117.         P0=table3[temp_data[2]];
  118.         delay(1);
  119.         P0=table4[temp_data[3]];
  120.         //delay(1);                       
  121. }
  122. void display1()
  123. {
  124.        
  125.         //conversion();
  126.         P0=table1[temp_data[0]];
  127.         delay(1);
  128.         P0=table2[temp_data[1]];
  129.         delay(1);
  130.         P0=table3[temp_data[2]];
  131.         delay(1);
  132.         P0=table4[temp_data[3]];
  133.         //delay(1);                       
  134. }

  135. void main()
  136. {
  137.         succeed_flag=0;       
  138.           D2=0;
  139.           D1=1;
  140.   
  141.            EA=0;                              //先关闭总中断
  142.           UT_Init();                              //初始化超声波发射和接收引脚
  143.           ExternalInterrupt_Init();          //外部中断初始化
  144.           Timer0_Init();                              //初始化定时器0
  145.           AllInterrupt_Init();
  146.   

  147.           while(1)
  148.           {
  149.                
  150.        
  151.                 TR0=1;//启动定时器0
  152.                 TR1=0;//关闭定时器1
  153.                 EX0=0;//关闭外部中断0       
  154.                   EA=1;//打开总中断

  155.                 if(a==2)
  156.                 {
  157.                        
  158.                         EA=0;              //先关闭总中断
  159.                         Send();            //发送脉冲信号
  160.                         _nop_();
  161.                         while(receive==0); //等待Echo回波引脚变高电平
  162.                        
  163.                         TH1=0;//对定时器高八位清零
  164.                           TL1=0;//对定时器低八位清零
  165.                         TF1=0;//定时计数器溢出标志位清零
  166.   
  167.                         TR1=1;//启动定时器1
  168.                         TR0=1;//启动定时器0
  169.                         EX0=1;//打开外部中断0       
  170.                       EA=1;//打开总中断

  171.                            //display1();
  172.                         while(TH1 < 30);//等待测量的结果(可用中断实现)        //当TH1=60时,则为5.733米        30则为2.913米
  173.                         a=0;

  174.                 }

  175.        
  176.           }
  177. }
  178. void exter0() interrupt 1   //1为定时器0中断
  179. {
  180.         //EA=0;
  181.         //P0=table1234[1];
  182.         TH0=0;          //定时器0清零
  183.     TL0=0;          //定时器0清零
  184.         TF0=0;          //定时计数器溢出标志位清零
  185.         display1();
  186.         a++;

  187.        
  188. }
  189. void dingshi1() interrupt 3   //3为定时器1中断
  190. {
  191.        
  192.         TH1=0;          //定时器0清零
  193.     TL1=0;          //定时器0清零
  194.         TF1=0;          //定时计数器溢出标志位清零       
  195. }
  196. void exter1() interrupt 0         //0为外部中断
  197. {
  198.         outcomeH =TH1;    //取出定时器的值
  199.     outcomeL =TL1;    //取出定时器的值
  200.         succeed_flag=1;   //至成功测量的标志
  201.         //TH0=0;
  202.         //TL0=0;
  203.         EX0=0;//关闭外部中断0
  204.         display();
  205. }
复制代码

所有资料51hei提供下载:
源动力超声波传感器程序.rar (18.89 KB, 下载次数: 11)



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

使用道具 举报

沙发
ID:1 发表于 2018-9-13 16:48 | 只看该作者
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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