找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机小车测距避障并调速的源码

  [复制链接]
跳转到指定楼层
楼主
ID:321034 发表于 2018-5-22 21:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  简单的编程  ,使用51单片机STC89C52进行编程,  期间用到1个超声波HC-SR04, 1个电机驱动模块L298N    实现了  简单的避障和 调速的功能,

源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit ENA_pwm = P2^6;    //PWM信号端
  6. sbit ENB_pwm = P2^7;    //PWM信号端
  7.    
  8. sbit L298N_INA = P1^0;        
  9. sbit L298N_INB = P1^1;        
  10. sbit L298N_INC = P1^2;        
  11. sbit L298N_IND = P1^3;

  12. sbit Trlg1 = P2^0;
  13. sbit Echo1 = P2^1;


  14. unsigned char pwm_val_left  =0;    //变量定义
  15. unsigned char pwm_val_right =0;

  16. unsigned char push_val_left =0;// 左电机占空比N/10
  17. unsigned char push_val_right=0;// 右电机占空比N/10

  18. unsigned int  time = 0;        //传输时间
  19. unsigned long S = 0;           //距离
  20. bit flag = 0;                  //超出测量范围标志位

  21. void delay(uint z)        //毫秒级延时
  22. {
  23.         uint x,y;
  24.         for(x = z; x > 0; x--)
  25.           {
  26.                 for(y = 114; y > 0 ; y--);
  27.           }
  28. }
  29. void Delay10us_CSB(uchar i)   //10us延时函数 超声波模块使用
  30. {
  31.         uchar j;
  32.         do
  33.           {
  34.              j = 10;
  35.              do
  36.                  {
  37.                 _nop_();
  38.                     _nop_();
  39.              }
  40.                     while(--j);
  41.         }
  42.                while(--i);
  43. }

  44. void Go_forward()
  45. {
  46.     push_val_left=4;
  47.     push_val_right=4;
  48.     L298N_INA = 0;
  49.     L298N_INB = 1;
  50.     L298N_INC = 1;
  51.     L298N_IND = 0;

  52. }

  53. void Go_back()
  54. {
  55.     push_val_left=4;
  56.     push_val_right=4;
  57.     L298N_INA = 1;
  58.     L298N_INB = 0;
  59.     L298N_INC = 0;
  60.     L298N_IND = 1;        
  61. }

  62. void Go_left()
  63. {
  64.     push_val_left=3;
  65.     push_val_right=3;
  66.     L298N_INA = 0;
  67.     L298N_INB = 1;
  68.     L298N_INC = 1;
  69.     L298N_IND = 1;
  70. }
  71. /*
  72. void Go_right()
  73. {
  74.     push_val_left=3;
  75.     push_val_right=3;
  76.     L298N_INA = 1;
  77.     L298N_INB = 0;
  78.     L298N_INC = 0;
  79.     L298N_IND = 0;
  80. }
  81. */
  82. void Stop()
  83. {
  84.     L298N_INA = 0;
  85.     L298N_INB = 0;
  86.     L298N_INC = 0;
  87.     L298N_IND = 0;
  88. }              
  89. void pwm_out_left_moto(void)
  90. {  
  91.                 if(pwm_val_left<=push_val_left)
  92.                         ENA_pwm=1;
  93.                 else
  94.                         ENA_pwm=0;
  95.                 if(pwm_val_left==10)            //  0~10  ,  0最小,10最大
  96.                         pwm_val_left=0;
  97. }
  98. void pwm_out_right_moto(void)
  99. {
  100.                 if(pwm_val_right<=push_val_right)                          
  101.                         ENB_pwm=1;
  102.                 else
  103.                         ENB_pwm=0;
  104.                 if(pwm_val_right==10)           //  0~10  ,  0最小,10最大
  105.                         pwm_val_right=0;
  106. }
  107.                             /*定时器1中断输出PWM信号*/
  108. void timer1() interrupt 3
  109. {
  110.           TH1=(65536-10)/256;
  111.         TL1=(65536-10)%256;
  112.         pwm_val_left++;
  113.         pwm_val_right++;

  114.          pwm_out_left_moto();
  115.          pwm_out_right_moto();                        
  116. }
  117.                                        
  118. void timer0() interrupt 1        //T0中断用来计数器溢出,超过测距范围
  119. {
  120.         flag=1;                 //中断溢出标志                        
  121. }
  122. void  CSB_module()                          
  123. {
  124.         Trlg1=1;                                             
  125.         Delay10us_CSB(10);
  126.         Trlg1=0;
  127. }
  128.                              /*计算超声波所测距离并显示*/
  129. void Conut()
  130. {
  131.         time=TH0*256+TL0;
  132.         TH0=0;
  133.         TL0=0;
  134.         S=(float)(time*1.085)*0.17;     //算出来是MM
  135.         if((S>=7000)||flag==1)          //超出测量范围
  136.         {         
  137.                 flag=0;
  138.         }
  139. }
  140.                                     
  141. void  bizhang()
  142. {
  143.         if(S > 100)//设置避障距离(单位毫米)
  144.         {
  145.                 Go_forward();
  146.                     
  147.         }
  148.         else
  149.         {   
  150.                         Stop();
  151.                      delay(20);           
  152.                      Go_back();
  153.                      delay(30);
  154.                      Go_left();                                                                                                  
  155.         }
  156. }

  157.         
  158. void main()
  159. {
  160.         Stop();     
  161.         delay(1000);//延时1秒

  162.         TMOD |= 0x20;//定时器1工作模式2,8位自动重装。用于产生PWM
  163.         TMOD |= 0x01;//定时器0工作模块1,16位定时模式。T0用测ECH0脉冲长度
  164.         TH1 = 220; //
  165.         TL1 = 220; //100HZ T1
  166.         TH0 = 0;
  167.         TL0 = 0;//T0,16位定时计数用于记录ECHO高电平时间         
  168.         ET1 = 1;//允许T1中断
  169.         ET0 = 1;//允许T0中断
  170.         TR1 = 1;//启动定时器1
  171.         EA  = 1;//启动总中断          
  172.         while(1)
  173.         {               
  174.                  CSB_module();        //启动超声波测距
  175.                  while(!Echo1);        //当(ECHO信号回响)为零时等待
  176.                  TR0=1;               //开启计数
  177.                  while(Echo1);        
  178.                  TR0=0;               //关闭计数
  179.                  Conut();             //计算距离
  180.                  bizhang();           //避障
  181.                  delay(30);                             
  182.           }
  183. }
复制代码


全部资料51hei下载地址:
pwm调速小车避障.rar (24.86 KB, 下载次数: 148)


评分

参与人数 3黑币 +60 收起 理由
忘语 + 5 赞一个!
﹌信念。 + 5 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:358191 发表于 2018-6-25 15:50 | 只看该作者
能测速吗
回复

使用道具 举报

板凳
ID:501297 发表于 2019-4-13 12:32 | 只看该作者
终于靠谱了
回复

使用道具 举报

地板
ID:547956 发表于 2019-5-26 23:16 | 只看该作者
有没有使用51单片机STC89C51进行编程的
回复

使用道具 举报

5#
ID:547956 发表于 2019-5-26 23:29 | 只看该作者
哥,能不能仔细解释下,许多地方看不懂
回复

使用道具 举报

6#
ID:541246 发表于 2019-7-16 11:26 | 只看该作者
这个可读性不错
回复

使用道具 举报

7#
ID:580104 发表于 2019-7-17 13:46 | 只看该作者
备注很详细,资料不错,学习一下。
回复

使用道具 举报

8#
ID:734122 发表于 2020-4-27 22:36 | 只看该作者
本帖最后由 质壁分离 于 2020-4-27 23:06 编辑

很详细,对于学习很有帮助,谢谢。
回复

使用道具 举报

9#
ID:825654 发表于 2021-1-30 16:12 | 只看该作者
这个资料不错奥,谢谢楼主
回复

使用道具 举报

10#
ID:825654 发表于 2021-1-30 16:13 | 只看该作者
Leslieyang 发表于 2019-5-26 23:16
有没有使用51单片机STC89C51进行编程的

这个也可以用
回复

使用道具 举报

11#
ID:871292 发表于 2021-2-9 11:28 | 只看该作者
收下研究了,谢谢!
回复

使用道具 举报

12#
ID:973226 发表于 2021-10-20 10:50 | 只看该作者
有红外的吗楼主
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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