找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单个超声波测距模块控制小车前进/后退程序—(有最详细的注释)

  [复制链接]
跳转到指定楼层
楼主
ID:76556 发表于 2015-4-10 01:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式



  1. //晶振=11.0592M
  2. //MCU=STC516RD+
  3. //************************************
  4. #include<reg51.h>        //包括一个52标准内核的头文件
  5. #define uchar unsigned char        //定义一下方便使用
  6. #define uint unsigned int        //定义一下方便使用
  7. uchar Distance;        //定义Distance(距离)变量
  8. sbit Tr1=P1^4;        //定义超声波模块的控制端(Tr)
  9. sbit Ec1=P1^5;        //定义超声波模块的接收端(Ec)
  10. sbit IN1=P2^1;        //定义L298n步进电机驱动芯片的IN1管脚由51MCU的P2^1管脚控制IN1对应控制OUT1电机驱动脚
  11. sbit IN2=P2^0;        //定义L298n步进电机驱动芯片的IN2管脚由51MCU的P2^0管脚控制IN2对应控制OUT2电机驱动脚
  12. sbit IN3=P2^2;        //定义L298n步进电机驱动芯片的IN3管脚由51MCU的P2^2管脚控制IN3对应控制OUT3电机驱动脚
  13. sbit IN4=P2^3;        //定义L298n步进电机驱动芯片的IN4管脚由51MCU的P2^3管脚控制IN4对应控制OUT4电机驱动脚
  14. sbit ENA=P2^5;        //定义L298n步进电机驱动芯片的ENA管脚由51MCU的P2^5管脚控制ENA脚是使能脚控制IN1,2脚输入的高低电平是否有效
  15. sbit ENB=P2^4;        //定义L298n步进电机驱动芯片的ENB管脚由51MCU的P2^4管脚控制ENA脚是使能脚控制IN3,4脚输入的高低电平是否有效
  16. void Delays(uint x)        //延时函数Delays..定义形参x为unsigned int 型
  17. {
  18. uint q,w;        //定义实际参数q,w为unsigned int 型
  19. for(q=x;q>0;q--)        //q=x,q小于0,q减一。如果q小于零则退出此语句
  20. for(w=110;w>0;w--);        //w=110,w小于0,w减一。如果w小于零则退出此语句
  21. }
  22. void init()           //初始化函数init
  23. {           //初始化Ec1=0;
  24. Ec1=0;           //初始化Tr1=0;
  25. Tr1=0;
  26. }
  27. void Ranging()           //Ranging(测距)函数用于检测出距离并控制电机做出相应的动作
  28. {
  29. static uchar Num3=0;           //定义unsigned char型局部变量Num3,并且只第一次执行时Num3=0,以后执行时不会再次初始,主要用于超声波模块的使能信号过后用来检测接收端Ec1是否有高电平,或用于进入和退出while循环,,
  30. bit Bit_Num2;           //定义bit型变量(51特有变量)Bit_Num2。。主要用于关闭定时器并进入下一个函数(检测Ec1的脉宽长度)
  31. Tr1=1;           //Tr1给高电平
  32. Delays(10);           //至少延时10微秒
  33. Tr1=0;           //Tr1给低电平
  34. Num3=1;           //Num3给1
  35. Bit_Num2=0;           //Bit_Num2给0用于进入下一步while循环
  36. while(Num3==1)           //当Num3检测到定于1时进入本循环
  37. {
  38. while(Ec1==1)           //当Ec1检测等于1是进入本循环,当Ec1(接收信号的高电平脉宽结束后退出此循环)
  39. {           //Bit_Num2给以用来键入笑一个if语句
  40. Bit_Num2=1;           //打开定时器TR0进入定时器0中断
  41. TR0=1;
  42. }
  43. if(Ec1==0&Bit_Num2==1)           //如果Ec1等于0(超声波测距模块的接收端发送到高电平脉宽传送完后)而且Bit_Num2等于1进入此语句
  44. {          
  45. uchar Move;           //定义unsigned char变量Move(用来进入switch语句并选择那种工作方式)
  46. TR0=0;           //关闭定时器
  47. if(Distance<50)           //如果脉宽小于50微秒
  48. {
  49. Move=1;           //Move等于1
  50. }
  51. else if(Distance>50)           //如果上一语句不成立则检测此语句,如果脉宽的时间长度大于50微秒
  52. {
  53. Move=2;           //Move等于2
  54. }
  55. switch(Move)           //检测Move的值并进入相应的语句
  56. {
  57. case 1:P3=0x00;IN1=0;IN2=1;IN3=0;IN4=1;ENA=1;ENB=1;Num3=0;Distance=0;break;         //如果Move等于1,则电机正转,并P3口所有IO口低电平,并给Distance清零,然后退出此语句
  58. case 2:P3=0xff;IN1=1;IN2=0;IN3=1;IN4=0;ENA=1;ENB=1;Num3=0;Distance=0;break;         //如果Move等于0,则电机反转,并P3口所有IO口高电平,并给Distance清零,然后退出此语句
  59. default:break;         //如果以上都不符合,则退出此语句,准备下一循环
  60. }
  61. Move=0;
  62. }           //Move清零;
  63. }       

  64. }
  65. void open_time()           //定时器初始函数
  66. {
  67. TMOD=0x01;           //确定工作方式位01,(内容自己上网查啊,大概是16位手动重装计数器,,记不清了)
  68. TH0=(65536-1)/256;           //确定一微秒记一次
  69. TL0=(65536-1)%256;           //确定一微秒记一次
  70. EA=1;           //打开总中断
  71. ET0=1;           //打开定时器0中断
  72. TR0=0;           //关闭定时器0
  73. }
  74. void main()           //main函数(主函数),,所有函数都从这个函数开始执行
  75. {          
  76. init();           //执行init函数
  77. open_time();           //执行open_time函数
  78. while(1)           //进入大循环(除非执行中断函数否则永不退出)
  79. {
  80. Ranging();           //执行Ranging函数
  81. }
  82. }
  83. void time() interrupt 1           //定时器0中断语句
  84. {
  85. TH0=(65536-1)/256;           //重装初值TH0=(65536-1)/256;
  86. TL0=(65536-1)%256;           //重装初值TL0=(65536-1)%256;
  87. Distance++;           //每次走一步Distance加一
  88. if(Distance==6553)           //如果Distance等于65535就进入此语句
  89. {
  90. Distance=0;           //Distance的值清零
  91. }
  92. }
复制代码





评分

参与人数 2威望 +5 黑币 +6 收起 理由
赵京辉 + 1 很给力!
absflash + 5 + 5 这注释是够详细的

查看全部评分

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

使用道具 举报

沙发
ID:83494 发表于 2015-6-20 11:47 | 只看该作者
大神在不?
回复

使用道具 举报

板凳
ID:84495 发表于 2015-7-3 21:18 | 只看该作者
这注释是够详细的
回复

使用道具 举报

地板
ID:85948 发表于 2015-7-27 21:56 | 只看该作者
哈哈 这个详细,谢谢楼主了
回复

使用道具 举报

5#
ID:79544 发表于 2015-8-3 19:34 | 只看该作者
用12M晶振单片机是STC12C5608AD下载进去不好用?
回复

使用道具 举报

6#
ID:114460 发表于 2016-4-16 23:55 | 只看该作者
终于找到了
回复

使用道具 举报

7#
ID:219197 发表于 2017-7-12 18:43 | 只看该作者
楼主大佬
回复

使用道具 举报

8#
ID:257144 发表于 2017-12-4 13:19 | 只看该作者
感谢楼主分享找了好久
回复

使用道具 举报

9#
ID:327876 发表于 2018-5-11 20:54 | 只看该作者
大神我的驱动上没有ENA和ENB管脚怎么办
回复

使用道具 举报

10#
ID:449368 发表于 2018-12-21 21:53 | 只看该作者
大神 怎么在你这个程序上添加舵机和pwm程序呢 可以指点一下么
回复

使用道具 举报

11#
ID:512052 发表于 2019-4-30 16:06 | 只看该作者
very nice!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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