IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 【51单片机】 -- 从硬件到软件的循迹小车 -> 正文阅读

[嵌入式]【51单片机】 -- 从硬件到软件的循迹小车

在这里插入图片描述

从硬件到软件的循迹小车

硬件模块

1、驱动:
在这里插入图片描述在这里插入图片描述驱动用法:参考此链接

2、循迹模块:
在这里插入图片描述
原理可参考:参考链接

3、电池盒

4、51单片机

5、小车板子:
在这里插入图片描述

软件代码

#include<AT89X52.H>		  //包含51单片机头文件,内部有各种寄存器定义
	#include<ZY-4WD_PWM.H>		  //包含HL-1蓝牙智能小车驱动IO口定义等函数
	
  sbit duoji=P1^0;
//延时函数	


//主函数
	void main(void)
{	

	      unsigned char i;
        P1=0X00;   //关电机	

				TMOD=0X01;
				TH0= 0XFc;		  //1ms定时
				TL0= 0X18;
			  TR0= 1;
				ET0= 1;
				EA = 1;			   //开总中断
	



	while(1)	//无限循环
	{ 
		
		
		  
  // 		duoji=1;
	//	   run();
		
			 //有信号为0  没有信号为1

        if(Left_1_led==0&&Right_1_led==0)

			    run();   //调用前进函数

			  else
			
 				{			  
						 if(Left_1_led==1&&Right_1_led==0)	    //左边检测到黑线
							{
								leftrun();		  //调用小车左转函数

							 }

							if(Right_1_led==1&&Left_1_led==0)		//右边检测到黑线
							{	  
									rightrun();		   //调用小车右转函数

							}
							if(Right_1_led==1&&Left_1_led==1)		//悬空状态  避悬崖
							{	  
									stop();		   //调用小车停止

							}

			 }	 
	 }
	
	 
}
#ifndef _LED_H_
  #define _LED_H_


	//定义小车驱动模块输入IO口 
	sbit L293D_IN1=P1^2; 
	sbit L293D_IN2=P1^3;
	sbit L293D_IN3=P1^4;
	sbit L293D_IN4=P1^5;
	sbit L293D_EN1=P1^6;
	sbit L293D_EN2=P1^7;
	

	/***蜂鸣器接线定义*****/
    sbit BUZZ=P2^3;
 
  #define Left_1_led        P3_7	 //左传感器  
	
  #define Right_1_led       P3_6	 //右传感器    
   
	#define Left_moto_pwm	  P1_6	 //PWM信号端

	#define Right_moto_pwm	  P1_7	 //PWM信号端
	
	#define Left_moto_go      {P1_2=1,P1_3=0;}  //左电机向前走
	#define Left_moto_back    {P1_2=0,P1_3=1;} 	//左边电机向后转
	#define Left_moto_Stop    {P1_2=0,P1_3=0;}         //左边电机停转                     
	#define Right_moto_go     {P1_4=1,P1_5=0;}	//右边电机向前走
	#define Right_moto_back   {P1_4=0,P1_5=1;}	//右边电机向后走
	#define Right_moto_Stop   {P1_4=0,P1_5=0;}      	//右边电机停转   

	unsigned char pwm_val_left  =0;//变量定义
	unsigned char push_val_left =0;// 左电机占空比N/20
	unsigned char pwm_val_right =0;
	unsigned char push_val_right=0;// 右电机占空比N/20
	bit Right_moto_stop=1;
	bit Left_moto_stop =1;
	unsigned  int  time=0;
   
/************************************************************************/	
//延时函数	
   void delay(unsigned int k)
{    
     unsigned int x,y;
	 for(x=0;x<k;x++) 
	   for(y=0;y<2000;y++);
}
/************************************************************************/
//前速前进
     void  run(void)
{
   push_val_left=18;	 //速度调节变量 0-20。。。0最小,20最大
	 push_val_right=18;
	 Left_moto_go ;   //左电机往前走
	 Right_moto_go ;  //右电机往前走
}
     void  run1(void)
{
   push_val_left=10;	 //速度调节变量 0-20。。。0最小,20最大
	 push_val_right=8;
	 Left_moto_go ;   //左电机往前走
	 Right_moto_back ;  //右电机往前走
}
//后退函数 
     void  backrun(void)
{
   push_val_left=5;	 //速度调节变量 0-20。。。0最小,20最大
	 push_val_right=5;
	 Left_moto_back;   //左电机往后走
	 Right_moto_back;  //右电机往后走
}

//左转
     void  leftrun(void)
{	 
   push_val_left=5;
	 push_val_right=9;
	 Right_moto_go ;  //右电机往前走
   Left_moto_back   ;  //左电机后走
}

//右转
     void  rightrun(void)
{ 
	 push_val_left=9;
	 push_val_right=5;
   Left_moto_go;   //左电机往前走
	 Right_moto_back;  //右电机往后走	
}

//停止
     void  stop(void)
{	 
     
	 Right_moto_Stop ;  //右电机停止
   Left_moto_Stop  ;  //左电机停止
}

/************************************************************************/
/*                    PWM调制电机转速                                   */
/************************************************************************/
/*                    左电机调速                                        */
/*调节push_val_left的值改变电机转速,占空比            */
		void pwm_out_left_moto(void)
   {  
			 if(Left_moto_stop)
			 {
					if(pwm_val_left<=push_val_left)
					{
							 Left_moto_pwm=1; 
						 //Left_moto_pwm1=1; 
					 }
					else 
					 {
							 Left_moto_pwm=0;
						 //Left_moto_pwm1=0; 
						}
					if(pwm_val_left>=20)
								 pwm_val_left=0;
			  }
			 else    
			 {
					 Left_moto_pwm=0;
				 //Left_moto_pwm1=0; 
			 }
}
/******************************************************************/
/*                    右电机调速                                  */  
   void pwm_out_right_moto(void)
  { 
			if(Right_moto_stop)
			 { 
					if(pwm_val_right<=push_val_right)
					{
							 Right_moto_pwm=1; 
							//Right_moto_pwm1=1; 
					}
					else 
					{
							Right_moto_pwm=0;
							//Right_moto_pwm1=0; 
					 }
					if(pwm_val_right>=20)
						 pwm_val_right=0;
			 }
			 else    
			{
					 Right_moto_pwm=0;
					//Right_moto_pwm1=0; 
			}
   }
       
/***************************************************/
///*TIMER0中断服务子函数产生PWM信号*/
 	void timer0()interrupt 1   using 2
{
   TH0=0XFc;	  //1Ms定时
	 TL0=0X18;
	 time++;
	 pwm_val_left++;
	 pwm_val_right++;
	 pwm_out_left_moto();
	 pwm_out_right_moto();
 }	

/*********************************************************************/	

#endif

注意事项:

1、代码当中可以通过这个数字调速度大小,这个在循迹过程中重要,太快容易冲出去;
在这里插入图片描述
2、循迹模块的灵敏度可以通过按钮调节
在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-04-29 12:18:17  更:2022-04-29 12:18:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:54:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码