【基于51的多功能智能小车】

本文档详述了一位大学生如何为校内智能车大赛改造基于51单片机的多功能智能小车,包括循迹、超声波避障、红外遥控和蓝牙控制等功能。作者通过分模块编程提高了代码的可移植性,并分享了代码实现和关键程序。同时,提供了硬件清单和中断处理函数的示例,以及工程链接供参考。
摘要由CSDN通过智能技术生成

基于51的多功能智能小车


前言

》 又到了一学期一度的校内智能车大赛,想起上一次参加真的好拉跨直接把商家的代码烧进去就直接上了,可以而知最终结果也是…(因为商家给的事例代码只是按照他自己的需求调整好的,在学校给出的赛道上有些区别,还是需要自己慢慢修改的)
》 马上就大四的我也懂得了珍惜每一次比赛,不管结果是什么都要尽自己最大努力好好面对,所以这次比赛也是自己基于商家已有部分认真进行修改并添加其他功能,在代码编写过程中实现分模块编程更好的提高代码的可移植性。
》 还是那句话,虽然这些功能的大部分代码商家都提供了,但只能自己去实践将其全部综合起来并实现想要的功能,才会发现其实并没有那么简单。
》分享代码中对于循迹加避障没有实现 其他的功能都可以,然后没有加入调速大家可以自己加入用定时器来改变占空比


一、多功能智能小车介绍

智能小车主要有以下几个功能:
》 循迹功能 (按照规定的黑线赛道进行循迹)
》超声波避障
》红外遥控控制
》蓝牙控制

二、软件部分

2.1 开发平台 keil5
在这里插入图片描述

2.2 下载软件
使用的是usb转ttl下载方式(下载是需要与这个软件进行配合使用)
在这里插入图片描述

2.3 Notepad++代码查看工具
在这里插入图片描述

二、硬件部分

蓝牙模块1
USB下载器1
智能小车套件一套(撒装)1

因为学校购买的智能小车套件把所有用到的硬件都包含了就不全部列举出来了。

三、 程序编写

主程序

/*******************************************************
*	多功能智能小车
*	Author:小殷同学
*	Date:2022-04-4
********************************************************/

#include "reg52.h"
#include "motor.h"
#include "uart.h"	 
#include "csb.h"
#include "delay.h"
#include "key.h"
#include "smg.h"
#include "track.h"		
//#include "time.h"


sbit IRIN=P3^3;                           //定义红外接收端口
extern unsigned char cmd; 						 //蓝牙接收命令变量
extern unsigned char keyvalue;				 //键值
unsigned char cnt = 0;								 //计时
extern unsigned char speed;							//速度
unsigned char code  RecvData[]={0x19,0x46,0x15,0x43,0x44,0x40,0x0D,0x0E,0x00,0x0F};//红外数据
unsigned char IRCOM[7];



/********************************主函数***********************************/
void main(void)
{
	Init_Uart();	 //串口初始化
	Time0Init();   //定时器初始化
	Init_Key();		 //按键初始化
 	while(1)
	{
		 
		SMG_Display(keyvalue);	 //获取按键键值
		switch(keyvalue)
		{
		  case 0:ControlCar(8);break;		 //停止
		 	case 1:CSB_Tackle();EX1 = 0;break;	 //超声波避障
			case 2:Car_Traction();EX1 = 0;break;	//循迹
			case 3:Cmd_Tackle();EX1 = 0;break;	//蓝牙
			case 4:EX1 = 1;break;								//红外
		}
	}
}



/******************************串口中断处理函数***************************/
void Server_Uart() interrupt 4
{
 	if(RI == 1) //接收完成
	{
		RI = 0; //清除标志
		cmd = SBUF;
	}
}



/*******************************外部中断0**********************************/
void Server_Exit() interrupt 0
{
 	keyvalue++; 
	if(keyvalue > 4)
	{
	 	keyvalue = 0;
	}
}


/*
//中断处理函数
void Server_Timer1() interrupt 3
{
	//重装初值
 TL0 = 0x33;
 TH0 = 0xFE;
 cnt++;
 if(cnt < speed)
 {
		//前进
		GoForward();
 }
 else
 {
		//停止
		Stop();
 }

 if(cnt == 40) //20ms
 {
		cnt = 0;
 }
}
*/

//----------红外遥控-------------------------------------------------------------
void IR_IN() interrupt 2                     //定义INT2外部中断函数
{
  unsigned char j,k,N=0;                              //定义临时接收变量
   
  EX1 = 0;                                            //关闭外部中断,防止再有信号到达   
  delayms(15);                                        //延时时间,进行红外消抖
  if (IRIN==1)                                        //判断红外信号是否消失
  {  
     EX1 =1;                                          //外部中断开
	 return;                                          //返回
  } 
                           
  while (!IRIN)                                       //等IR变为高电平,跳过9ms的前导低电平信号。
  {
      delayms(1);                                     //延时等待
  }

  for (j=0;j<4;j++)                                   //采集红外遥控器数据
  { 
    for (k=0;k<8;k++)                                 //分次采集8位数据
    {
       while (IRIN)                                   //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
       {
         delayms(1);                                  //延时等待
       }
       
       while (!IRIN)                                  //等 IR 变为高电平
       {
         delayms(1);                                  //延时等待
       }
   
       while (IRIN)                                   //计算IR高电平时长
       {
         delayms(1);                                  //延时等待
         N++;                                         //计数器加加
         if (N>=30)                                   //判断计数器累加值
	     { 
           EX1=1;                                     //打开外部中断功能
	       return;                                    //返回
         }                   
       }
                                       
      IRCOM[j]=IRCOM[j] >> 1;                         //进行数据位移操作并自动补零
     
      if (N>=8)                                       //判断数据长度 
      {
         IRCOM[j] = IRCOM[j] | 0x80;                  //数据最高位补1
      } 
      N=0;                                            //清零位数计录器
    }
  }
   
  if (IRCOM[2]!=~IRCOM[3])                            //判断地址码是否相同
  { 
     EX1=1;                                           //打开外部中断
     return;                                          //返回
  }

  for(j=0;j<10;j++)                                   //循环进行键码解析
   {
      if(IRCOM[2]==RecvData[j])                       //进行键位对应
      {
       // ControlCar(j);
		ControlCar_yaokong(j);                               //数码管显示相应数码
      }
   } 
   EX1 = 1;                                           //外部中断开 
} 

工程链接:
https://pan.baidu.com/s/1JlimBOELy1eYHz0p1veeSg
提取码:f3ka
–来自百度网盘超级会员V4的分享

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小殷学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值