找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8207|回复: 1
收起左侧

单片机多功能智能小车源程序

[复制链接]
ID:633081 发表于 2020-2-22 11:54 | 显示全部楼层 |阅读模式
智能小车设计
1.硬件设计
1.1单片机
单片机是循迹避障小车的核心部件,一方面它要接收传感器送来的路线信息和障碍物信号;另一方面要对两种信号进行处理控制发光二极管的亮灭,以显示其信息,同时控制电机进行相应动作。并且查询模式选择开关的状态。在单片机实现的功能中使用查询方式获取传感器返回的信息,即读取传感器返回信号,需要单片机有较快的处理速度,使小车对信息的获取及处理是实时准确的,实现小车的准确循迹与及时避障。因此我们的芯片选用stc15f2k系列芯片。
STC15F2K60S2系列单片机是STC生产的单时钟/机器周期(1T)的单片机,是高速/高可靠/低功耗/超强抗干扰的新一代8051单片机,采用第八代加密技术,加密性超强,兼容传统8051,但速度快8-12倍。内部集成高精度R/C时钟(±0.3%),±1%温飘(-40℃~+85℃),常温下温飘±0.6%(-20℃~+65℃),5MHz~35MHz宽范围可设置,可彻底省掉外部昂贵的晶振和外部复位电路(内部已集成高可靠复位电路,ISP编程时8级复位门槛电压可选)。3路CCP/PWM/PCA,8路高速10位A/D转换(30万次/秒),内置2K字节大容量SRAM,2组高速异步串行通信端口(UART1/UART2,可在5组管脚之间进行切换,分时复用可作5组串口使用),1组高速同步串行通信端口SPI,针对多串行口通信/电机控制/强干扰场合。
1.2电机驱动
电机驱动是小车最重要的模块之一,在我们的系统中使用的是L298N驱动芯片,L298N是ST公司生产的一种高电压、大电流电机驱动芯片。该芯片采用15脚封装
L298N芯片的主要特点是:
  a、工作电压高,最高电压可达46V;
  b、输出电流大,瞬间峰值电流可达3A,持续工作电流为2A;
c、额定功率25W,内含两个H桥的高电压大电流全桥式驱动器可以驱动直流电动机和步进电机。
  d、该芯片可以驱动一台两相步进电机或四相步进电机,也可驱动两台直流电机。
  e、适合应用于机器人设计及智能小车的设计
    H8IG0Z7Q`SC4BGT9UN(Y1GL.png
G7EEU)$NT(8$~AFM7A6GG(H.png

单片机源程序如下:
  1. #include <stc15.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int    //宏定义

  4.        
  5. uchar zkb_left1,zkb_right1,zkb_left2,zkb_right2,i1,j1,i2,j2; //占空比标志

  6. sbit IN1=P3^5;        //电机控制端口
  7. sbit IN2=P3^6;
  8. sbit IN3=P3^7;
  9. sbit IN4=P1^6;

  10. sbit xj_left=P0^1;           //循迹端口
  11. sbit xj_right=P0^2;         



  12. sbit zkba=P1^0;          //占空比控制端
  13. sbit zkbb=P1^1;
  14. sbit zkbc=P1^2;          //占空比控制端
  15. sbit zkbd=P1^3;

  16. //sbit fm=P2^5;

  17. void delay_ms(uint z)         //延时函数
  18. {
  19.         uchar x,y;
  20.         for(x=z;x>0;x--)
  21.                 for(y=110;y>0;y--);
  22. }

  23. void init()          //初始化函数
  24. {
  25.         TMOD=0x01;
  26.         TH0=(65536-100)/256;
  27.         TL0=(65536-100)%256        ;
  28.         EA=1;
  29.         ET0=1;
  30.         TR0=1;
  31.         zkba=1;
  32.         zkbb=1;
  33.         zkbc=1;
  34.         zkbd=1;
  35. }

  36. void time0() interrupt 1   //中断服务函数
  37. {
  38.         i1++;j1++;i2++;j2++;                  //进入中断i,j自加1
  39.         if(i1<zkb_right1)        {zkbb=1;}        //如果i小于设定值,使能端置1,否则置0
  40.         else zkbb=0;
  41.         if(i1==40)        {zkbb=~zkbb;i1=0;}  //如果i加到40;使能端取反,i置0

  42.         if(j1<zkb_left1)        {zkba=1;}
  43.         else zkba=0;
  44.         if(j1==40)        {zkba=~zkba;j1=0;}
  45.        
  46.         if(i2<zkb_right2)        {zkbd=1;}        //如果i小于设定值,使能端置1,否则置0
  47.         else zkbd=0;
  48.         if(i2==40)        {zkbd=~zkbd;i2=0;}  //如果i加到40;使能端取反,i置0

  49.         if(j2<zkb_left2)        {zkbc=1;}
  50.         else zkbc=0;
  51.         if(j2==40)        {zkbc=~zkbc;j2=0;}       
  52.        
  53.        
  54.         TH0=(65536-100)/256;          //定时器0重装初值
  55.         TL0=(65536-100)%256;
  56. }

  57. void go()         //前进函数
  58. {
  59.         zkb_left1=8;
  60.         zkb_right1=8;
  61.         zkb_left2=8;
  62.         zkb_right2=8;
  63.        
  64.         IN1=1;        IN2=0;                  
  65.         IN3=1;        IN4=0;
  66. }
  67. void back()         //后退函数
  68. {
  69.         zkb_left1=8;
  70.         zkb_right1=8;
  71.         zkb_left2=8;
  72.         zkb_right2=8;
  73.        
  74.         IN1=0;        IN2=1;
  75.         IN3=0;        IN4=1;
  76. }
  77. void left()                //左转弯函数,
  78. {
  79.         zkb_left1=14;   //设置一个速度
  80.         zkb_right1=14;
  81.         zkb_left2=14;   
  82.         zkb_right2=14;
  83.        
  84.         IN1=0;        IN2=1;        //
  85.         IN3=1;        IN4=0;
  86. }
  87. void right()                //右转弯函数
  88. {
  89.         zkb_left1=14;                //设置一个速度
  90.         zkb_right1=14;
  91.         zkb_left2=14;               
  92.         zkb_right2=14;
  93.        
  94.         IN1=1;        IN2=0;         //
  95.         IN3=0;        IN4=1;
  96. }
  97. void stop()                //停止函数
  98. {
  99.         IN1=0;        IN2=0;
  100.         IN3=0;        IN4=0;       
  101. }

  102. /*void bee()         //蜂鸣器发声函数
  103. {
  104.          fm=1;
  105.          delay_ms(50);
  106.          fm=0;
  107.          delay_ms(50);
  108. }*/

  109. void xunji()         //循迹函数
  110. {
  111.         uchar flag;           //定义一个标志位,用于状态判断
  112.         if(xj_left==0  & xj_right==0)         //未检测到黑线
  113.         {flag=0;}
  114.          else if(xj_left==1  & xj_right==0)        //左边检测到黑线
  115.         {flag=1;}
  116.          else if(xj_left==0& xj_right==1)        //右边检测到黑线
  117.         {flag=2;}
  118.          else if(xj_left==1  & xj_right==1)        //全部检测到黑线
  119.         {flag=3;}
  120.                 else flag=4;   //其他情况标志位置0
  121.         switch (flag)
  122.         {
  123.                 case 0: stop(); break;        //情况0,停止
  124.                 case 1: left(); break;        //情况1,左转
  125.                 case 2: right(); break;        //情况2,右转
  126.                 case 3: go(); break;        //情况3,前进
  127.                 case 4: stop(); break;        //情况4,停止
  128.                 default: stop(); break;        //其他情况,停止
  129.         }
  130. }

  131. void main()
  132. {
  133.         init();
  134.         delay_ms(1);
  135.         while(1)
  136.         {
  137.                 xunji();
  138.         }
  139. }
复制代码

所有资料51hei提供下载:
智能小车.rar (96.38 KB, 下载次数: 58)

评分

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

查看全部评分

回复

使用道具 举报

ID:813537 发表于 2021-4-28 21:25 | 显示全部楼层
很不错的资料学习了,51智能小车代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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