找回密码
 立即注册

QQ登录

只需一步,快速开始

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

超声波测距单片机源码

[复制链接]
跳转到指定楼层
楼主
ID:207004 发表于 2017-6-2 10:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
超声波测距源码
超声波测距源码.docx (12.91 KB, 下载次数: 4)

  1. /**************************************************************************/
  2. *********采用IO口TRIG触发测距,给至少10us的高电平信号; (2)模块自动发送8个40khz
  3. 的方波,自动检测是否有信号返回; (3)有信号返回,通过IO口ECHO输出一个高电平,
  4. 高电平持续的时间就是超声波从发射到返回的时间。*****************************/
  5. #include"reg52.h"
  6. #include"intrins.h"
  7. #define uchar unsigned char
  8. #define uint unsigned int
  9. uchar code table[]={'0','1','2','3','4','5','6','7','8','9'};// 显示段码值0123456789
  10. sbit lcden=P3^4; //定义LCD使能端
  11. sbit lcdrs=P3^5; //定义LCD读写端
  12. sbit dula=P2^6;  //数码管段先端
  13. sbit wela=P2^7;  //数码管位先端
  14. /***********************************************/
  15. /**********超声波检测引脚和变量定义*******************************/
  16. sbit Trig=P2^4;//  定义HC-SR04发送端
  17. sbit Echo=P2^5;//定义HC-SR04接收端
  18. uint gewei='0';  //测量距离的个位
  19. uint shiwei='0';  // 测量距离的十位
  20. uint baiwei='0';  //测量距离的百位
  21. uint s,time,flag;
  22. /***********************************************/
  23. /**********延时MS函数*******************************/
  24. void delay(uint z)
  25. {
  26. uint x,y;
  27. for(x=z;x>0;x--)
  28.   for(y=110;y>0;y--);
  29. }
  30. /***********************************************/
  31. /**********延时uS函数*******************************/
  32. void delay_uS(uint z)
  33. {
  34. while(z--);
  35. }
  36. /***********************************************/
  37. /**********写命令*******************************/
  38. void write_com(uchar com)
  39. {
  40. lcdrs=0;    //写命令信号
  41. P0=com;     //写命令字
  42. delay(5);    //延时
  43. lcden=1;    //开使能端
  44. delay(5);
  45. lcden=0;
  46. }
  47. /***********************************************/
  48. /**********写数据*******************************/
  49. void write_data(uchar date)
  50. {
  51. lcdrs=1;    //写数据信号
  52. P0=date;    //写数据
  53. delay(5);    //延时
  54. lcden=1;  //开使能端
  55. delay(5);
  56. lcden=0;
  57. }
  58. /**********************************************/
  59. /***********************************************/
  60. /**********LCD1602初始化函数*******************************/
  61. void init()
  62. {
  63. dula=0;
  64. wela=0;
  65. lcden=0;
  66. write_com(0x38); //设置16X2显示,5X7点阵显示
  67. write_com(0x0c);  //开显示,不显光标
  68. write_com(0x06);  //显示一个字符后,地址指针加1且光标加1
  69. write_com(0x01);  //清屏
  70. write_com(0x80+0x01); //从第一行0X10地址位开始显示
  71. }
  72. /***********************************************/
  73. /**********计算距离函数*******************************/
  74. void count(void)
  75. {
  76. time=TH0*256+TL0;   //检测所需时间
  77. TH0=0;
  78. TL0=0;
  79. s=time/58;//  计算距离,算出来的单位是CM
  80.   gewei=table[s%1000];
  81. shiwei=table[s%1000/100];
  82. baiwei=table[s%1000%100%10];
  83. }
  84. /***********************************************/
  85. /**********T0中断函数*******************************/
  86. void Time0() interrupt 1 //T0中断用作计数器溢出,超出测距范围
  87. {
  88. flag=1; //中断溢出标志
  89. }
  90. /***********************************************/
  91. /**********启动模块函数*******************************/
  92. void startmodle(void)  //启动检测模块
  93. {
  94. Trig=1;     //启动一次检测模块
  95. delay_uS(20);
  96. Trig=0; //停止向检测模块Trig端发送高电平
  97. }
  98. /***********************************************/
  99. /**********中断初始化函数*******************************/
  100. void InterruptInit(void)  //中断初始化
  101. {
  102. TMOD=0x01;  //高T0工作方式为方式1,GATE=1
  103. TH0=0;
  104. TL0=0;
  105. ET0=1;      //允许T0中断
  106. EA=1;       // 开启总中断
  107. }
  108. /***********************************************/
  109. /**********显示函数*******************************/
  110. void Display(void)
  111. {
  112.   write_com(0x80+0x02);
  113.   write_data(baiwei);
  114.   write_com(0x80+0x03);
  115.   write_data('.');
  116.   write_com(0x80+0x04);
  117.   write_data(shiwei);
  118.   write_com(0x80+0x05);
  119.   write_data(gewei);
  120.   write_com(0x80+0x06);
  121.   write_data('M');
  122. }
  123. /***********************************************/
  124. /**********主函数*******************************/
  125. void main(void)
  126. {
  127. init();     //初始化LCD1602
  128. while(1)
  129. {
  130.   InterruptInit();   //中断初始化
  131.   startmodle();      // 启动检测模块
  132.   while(!Echo);      //当接收为零时等待
  133.   TR0=1;             //开启计数
  134.   while(Echo);       //当接收为1计数并等待
  135.   TR0=0;             //关闭计数
  136.   count();           //计算距离
  137.   Display();         // 显示距离,以M为单位
  138.   delay(500);       //延时80MS
  139. }
  140. }
复制代码


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

使用道具 举报

沙发
ID:207004 发表于 2017-6-2 13:35 | 只看该作者
欢迎大家来讨论
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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