找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机通过编码器脉冲值控制小车行驶距离 源程序

[复制链接]
跳转到指定楼层
楼主
ID:596323 发表于 2019-8-6 20:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  大一时使用51单片机进行控制小车走过的距离,现整理一下发个帖子凑一下黑币,不喜轻喷。。
主要思路是利用单片机的外部中断来读出编码器脉冲值,进而通过获得的脉冲值来控制行驶距离。
首先利用外部中断测得车轮转一圈获得的脉冲,并测出车轮一圈长度。再利用以上思路便能得出距离从而控制。
在控制小车转过的角度时基本也是以上思路。

单片机源程序如下:
  1. #include "reg52.h"    //此文件中定义了单片机的一些特殊功能寄存器
  2. typedef unsigned int u16;
  3. typedef unsigned char u8;
  4. u16 Encodercout=0;//轮子转一圈大概产生270个脉冲,轮子周长为154mm,走过30度产生58个脉冲
  5. u16 wheelcount=0;
  6. u16 distance=1000;//定义变量为行驶距离,单位为mm
  7. u16 time=0;  // 定义占空比的变量
  8. sbit PWM1=P2^0;   //P2.0输出右轮pwm  
  9. sbit PWM2=P2^1;          //输出左轮pwm        右轮较快
  10. sbit motorl1=P2^2;
  11. sbit motorl2=P2^3;//右轮
  12. sbit motorr1=P2^4;
  13. sbit motorr2=P2^5;//左轮
  14. void motor();
  15. //void delay(u16 a)
  16. //{
  17. //        while(a--);
  18. //}
  19. void Int0Init()
  20. {
  21.         //设置INT0
  22.         IT0=1;//跳变沿出发方式(下降沿)
  23.         EX0=1;//打开INT0的中断允许。      
  24.         EA=1;//打开总中断      
  25. }
  26. void TimeInt()
  27. {
  28. TMOD=0x01;//定时器0工作方式1  

  29. TH0=0xfc;//(65536-10)/256;//赋初值定时  

  30. TL0=0x18;//(65536-10)%256;//1ms  

  31. EA=1;//开总中断  

  32. ET0=1;//开定时器0中断  

  33. TR0=1;//启动定时器0

  34. }
  35. //void UsartInit()
  36. //{
  37. //        SCON=0X50;                        //设置为工作方式1
  38. //        TMOD=0X20;                        //设置计数器工作方式2
  39. //        PCON=0X80;                        //波特率加倍
  40. //        TH1=0XF3;                                //计数器初始值设置,注意波特率是4800的
  41. //        TL1=0XF3;
  42. //        ES=1;                                                //打开接收中断
  43. //        EA=1;                                                //打开总中断
  44. //        TR1=1;                                        //打开计数器
  45. //}
  46. //void Usart() interrupt 4
  47. //{
  48. //   u8 receivedata;
  49. //  receivedata=SBUF;//接收寄存器
  50. //  RI=0;        //接受位清零
  51. //  SBUF = Encodercout;          //发送寄存器
  52. //  while(!TI); // 等待发送完成
  53. //  TI=0;        //发送位清零
  54. // receivedata = 0;
  55. //}

  56. void main()
  57. {
  58.    while(1)
  59.    {
  60.     Int0Init();
  61. //    UsartInit();
  62.         TimeInt();
  63.         if(wheelcount<=(distance/154))
  64.         {
  65.           motor();
  66.         }
  67.          else if(Encodercout<=(distance%154)/154*270)
  68.         {
  69.          motor();
  70.         }
  71.          else
  72.         {
  73.          motorl1=0;
  74.          motorr1=0;
  75.         }
  76.    }
  77. }
  78. void motor()
  79. {
  80. motorl1=1;
  81. motorl2=0;
  82. motorr1=1;
  83. motorr2=0;
  84.   }
  85. void tim0() interrupt 1  

  86. {  
  87. TH0=0xfc;//(65536-10)/256;//赋初值定时  

  88. TL0=0x18;//(65536-10)%256;1ms   

  89. time++;  
  90. if(time>=100)                                                                 
  91. time=0;     
  92. else if(time<=50) //轮占空比%30,可改 21:28
  93. {
  94.   PWM1=1;
  95.   PWM2=0;
  96. }

  97. else if(time>50&time<=99)
  98. {PWM1=0;
  99. PWM2=1;
  100. }//左轮占空比
  101. else if(time>99&time<100)
  102. {
  103. PWM1=0;
  104. PWM2=0;

  105. }
  106. }
  107. void Int0()        interrupt 0                //外部中断0的中断函数
  108. {
  109.         if(Encodercout>=270)
  110.         {
  111.           Encodercout=1;
  112.           Encodercout++;
  113.           wheelcount++;      
  114.         }
  115.         else
  116.     {
  117.      Encodercout++;
  118.     }
  119. }
复制代码


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:625206 发表于 2019-10-16 18:54 | 只看该作者
为什么程序里有一部分内容加//隐藏掉了?
回复

使用道具 举报

板凳
ID:399179 发表于 2023-8-30 22:06 来自手机 | 只看该作者
谢谢楼主分享!先收藏了有时间研究一下!
回复

使用道具 举报

地板
ID:98926 发表于 2023-8-31 07:44 | 只看该作者
a5a5a5ss 发表于 2019-10-16 18:54
为什么程序里有一部分内容加//隐藏掉了?

那是串口函数 因为用不到
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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