找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9037|回复: 2
收起左侧

51单片机智能小车设计(电路原理图+源程序)

[复制链接]
ID:343799 发表于 2018-12-29 13:30 | 显示全部楼层 |阅读模式
  前段时间电子实训用89C52单片机做了个智能车,只做了最基础的部分,可以继续添加其他外设。
  硬件设备:单片机最小系统(89C52RC)、电源(9V)、稳压(7805)、驱动模块(L9110)、测速模块(LM393+GK152)、直流电机+小车支架。
  要实现的功能:在程序里面通过测速闭环调节输出的PWM占空比使小车直行。(目前就只写了直行的程序,转弯程序还没写,其他外设也没写)
  单片机配置:定时器0:左轮pwm波;定时器1:右轮pwm波;外部中断0:左轮测速;外部中断1:右轮测速。
  要让小车直行最简单的办法是对左右轮输出pwm波,手动调节占空比来使左右轮转速相同。由于各电机差异当占空比相同时电机转速不一样,所以就要不断调试,调节占空比来使左右轮转速相同,这个过程很麻烦。而通过测速模块就可以自动调节占空比来使转速达到一致。

制作出来的实物图如下:

实物图2

实物图2

实物图1

实物图1

PCB

PCB


电路原理图如下:

原理图

原理图


下面是单片机程序:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit djl2=P0^3;
  5. sbit djl1=P0^2;
  6. sbit djr1=P0^1;
  7. sbit djr2=P0^0;

  8. uchar time1,time2,pwm1=80,pwm2=80;
  9. uint tmp1,tmp2;

  10. void init()
  11. {
  12.         EA=1;
  13.         EX0=1;
  14.         ET0=1;
  15.         IT0=1;
  16.         EX1=1;
  17.         ET1=1;
  18.         IT1=1;
  19.         TMOD=0X11;
  20.         TH0=(65536-100)/256;
  21.         TL0=(65536-100)/256;
  22.         TH1=(65536-100)/256;
  23.         TL1=(65536-100)/256;
  24.         TR1=1;
  25.         TR0=1;
  26. }
  27. void external0() interrupt 0
  28. {
  29.         EX0=0;
  30.         tmp1++;
  31.         EX0=1;
  32. }
  33. void inter1() interrupt 1
  34. {
  35.         TR0=0;
  36.   TH0=(65536-100)/256;
  37.   TL0=(65536-100)%256;
  38.   TR0=1;
  39.          
  40.   time1++;
  41.         if(time1==100)
  42.         time1=0;
  43. }
  44. void cesu2() interrupt 2
  45. {
  46.         EX1=0;
  47.         tmp2++;
  48.         EX1=1;
  49. }
  50. void inter2() interrupt 3
  51. {
  52.         TR1=0;
  53.         TH1=(65536-100)/256;
  54.         TL1=(65536-100)%256;
  55.         TR1=1;
  56.          
  57.         time2++;
  58.         if(time2==100)
  59.         time2=0;
  60. }

  61. void pwm()
  62. {
  63.                 if(time1<=pwm2)
  64.                 djr1=1;
  65.         else djr1=0;
  66.         if(time2<=pwm1)
  67.                 djl1=1;
  68.         else djl1=0;

  69. }
  70. void tiaosu()
  71. {
  72.         if(time1==100)
  73.         {
  74.                 while(1)
  75.                 {
  76.                         if(tmp1>tmp2)
  77.                                 pwm1-=1;
  78.                         if(tmp1<tmp2)
  79.                                 pwm2+=1;
  80.                         if(tmp1=tmp2)
  81.                          break;
  82.                 }
  83.                 tmp1=tmp2=0;
  84.         }
  85. }

  86. void main()
  87. {
  88.         djl2=djr2=0;
  89.         init();
  90.         while(1)
  91.         {
  92.                 pwm();
  93.                 tiaosu();
  94.         }
  95. }
复制代码







评分

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

查看全部评分

回复

使用道具 举报

ID:29972 发表于 2019-2-9 22:12 | 显示全部楼层
    我的遥控车刚刚制作完成,目前问题是无法直行,请问楼主用的是自带编码器的电机吗?是PID控制吗?
程序能否加注释?愿与楼主同行,共同完成制作!
回复

使用道具 举报

ID:544737 发表于 2020-2-8 16:30 | 显示全部楼层
求原理图和代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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