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 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 与国同庆--单片机小白自制蓝牙避障小车 -> 正文阅读

[嵌入式]与国同庆--单片机小白自制蓝牙避障小车

源码在最后

前言

国庆假期的前一天中午自己翻到了一张52单片机,想起自己之前只是使用普中科技做好的集成开发板玩,所以就自己找了原理图做最小系统搞。(源自某位老师的指点:“玩单片机只会用开发板是不行的。”,现在搞完了还是挺感激他的,确实认识到位了。)

第一轮打击

但是第一步的打击没想到会这么快,我找到的原理图网图,居然是某位友友搞错的图,,,以至于我把排阻什么的都焊上去,然后费了好大精神把单片机插进母座,上电没反应。。。
在这里插入图片描述在这里插入图片描述

因为洞洞板比较贵,又没有吸锡器,就只好在左边补焊了一个最小系统,后果就是又多花了两个小时。不过好在成功点亮小灯,所以才给了我国庆搞完的信心。
#原始烧录形态
在这里插入图片描述
增加两路驱动的母座,并去掉了之前搞坏的东西
在这里插入图片描述
在这里插入图片描述
焊接小车底座
注意前后轮子的线方向是相反的,要反过来接
在这里插入图片描述
驱动完美入座
在这里插入图片描述

电源电路

装上电池改成DC插座供电
在这里插入图片描述
9伏电压采用DCDC模块降压,结果发现电池根本没电,一上电就降到6伏。买了放在实验室的充电电池不知道去哪了。后来就果断拿了电宝供电,,,
这是我最不喜欢用的供电方式
在这里插入图片描述
好大的屁股诶。

蓝牙

引出串口烧录插座和蓝牙插座
在这里插入图片描述
装上超声波
在这里插入图片描述
加上舵机
在这里插入图片描述

焊锡走线

在这里插入图片描述

最终成品

在这里插入图片描述

源码

main.c

#include <reg52.h>
#include "Delay.h"	//包含Delay头文件
#include "uart.h"
#include "motor.h"
#include "chaoshenbo.h"

sbit led=P1^4;
sbit k3=P3^2;

extern unsigned char servorTime;
unsigned char lFlag=0;//左方向是否有障碍的标志
unsigned char rFlag=0;//右方向是否有障碍的标志
unsigned char CMD=0;
	
//主函数
void main()
{
	URATinit( );
	while(1)
	{
		delay(10);
		if(k3==0)
		{
			CMD=1;break;
		} 	
	}
	if(CMD==1)
		{	led=0;
 	EA=1;
	ET0=1;
	ET1=1;
	TMOD=0x11;
	TH1=0xff;
    TL1=0x9c;
	/**/
	servorTime=0;
	duozhong();	
	while(1)
	{	
		
		 openHc();
	     while(!Echo);		//当RX为零时等待
	     TR0=1;			    //开启计数
	     while(Echo);			//当RX为1计数并等待
	     TR0=0;				//关闭计数
         if(getDistance()==1)
		 {
		 	led=0;
		  	
			do{
			    Stop();delay(200);
				duozuo();delay(800);
				lFlag=getDistance();
		 		duoyou();delay(800);
				rFlag=getDistance();
				//Backward();delay(200);Stop();delay(200);
			
			if(lFlag==1&&rFlag==0)	//左侧没有障碍物
			 {	Backward();delay(200);Stop();delay(200);
				TurnL();delay(200);Stop();delay(200);
			 }
			 else if(lFlag==0&&rFlag==1)//右侧没有障碍物
			 {
				Backward();delay(200);Stop();delay(200);
				TurnR();delay(200);Stop();delay(200);
			 }
			 else if(lFlag==1&&rFlag==1)//两侧都没有障碍物,默认向左走
			  {	
				Backward();delay(200);Stop();delay(200);
				TurnL();delay(200);Stop();delay(200);/**/
			  }
			}while(lFlag==0&&rFlag==0);	
		 }
		 else
		 {
		 	duozhong();
		 	led=1;
		  	Forward();
		 }
		} 

	}
}		 

uart.c

#include <reg52.h>
#include "Delay.h"
#include "motor.h"

#define uint unsigned int
#define uchar unsigned char
typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

//定义接收 数组
uchar Buffer[10]={0};
uchar i=0;
 
//串口初始化函数
void URATinit()
{
 TMOD=0x20;
 SCON=0x50;
 EA=1;
 ES=1;
 TR1=1;
 TH1=0xfd;
 TL1=0xfd;
}

//中断函数
void receive() interrupt 4
{
 if(RI)
 { 
  	Buffer[i]=SBUF;
  	if(Buffer[i] == '1') 
	{
		Forward();delay(500);Stop();delay(100);	
	}
					   
	else if(Buffer[i] == '2') 
	{
		Backward();delay(500);Stop();delay(100);	
	}				
	
	else if(Buffer[i] == '3') 
	{
		 TurnL(); delay(500);Stop();delay(100);	
	}
	
	else if(Buffer[i] == '4') 
	{
		TurnR();delay(500);Stop();delay(100);		
	}
	
	else if(Buffer[i] == '5') 
	{
		Stop();delay(100);			
	}
  
  RI=0;
 }

 SBUF=Buffer[i]; 
 
 while(!TI)	;
 TI=0;
 i++;
 if(i>=10){
 	i=0;
 }
}		 

uart.h

#ifndef  __UART_H__
#define  __UART_H__

extern unsigned char RX_DAT[10],RX_OVER;
extern unsigned char i,direction;
//函数
void URATinit();
void receive();
#endif

motor.c

#include <reg52.h>

sbit p34=P2^3;
sbit p35=P2^2;
sbit p36=P2^1;
sbit p37=P2^0;

void Forward() //正转
{
	p34=1;
	p35=0;
	p36=1;
	p37=0;
}

void Backward()  //反转
{
	p34=0;
	p35=1;
	p36=0;
	p37=1;

}

void TurnL() //左转
{
	p34=1;
	p35=0;
	p36=0;
	p37=1;
}

void TurnR() //右转
{
	p34=0;
	p35=1;
	p36=1;
	p37=0;
}
 
void Stop()  //停转
{
 	p34=0;
	p35=0;
	p36=0;
	p37=0;
} 

motor.h

#ifndef   __MOTOR_H__
#define   __MOTOR_H__

//函数
void Backward();
void Forward();
void TurnR();
void TurnL();
void Stop();
#endif

chaoshenbo.h

#ifndef   __CHAOSHENBO_H__
#define   __CHAOSHENBO_H__
//函数
void openHc();
unsigned char getDistance();
void duozuo();
void delayms(unsigned char time);
void duoyou();
void duozhong();

sbit Trig=P1^0;
sbit Echo = P1^1;
#endif

chaoshenbo.c

#include <reg52.h>
#include<intrins.h>	
	
typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

#define barrierDis 15      //距离障碍物的距离 

sbit Trig=P1^0;
sbit Echo = P1^1;

sbit servorControl =P1^4;  //舵机的控制引脚

unsigned char control=5;
unsigned char servorTime=0;			  
unsigned int time=0;
unsigned long S=0;
bit  flag =0;

void delayms(unsigned char time){	 //延迟函数
	u8 i;
	for(;time>0;time--){
		for(i=0;i<255;i++);
	}
}

unsigned char getDistance()
{
	 time=TH0*256+TL0;
	 TH0=0;
	 TL0=0;
	
	 S=(time*1.78)/100;     //算出来是CM
	 if((S<barrierDis)||flag==1) //超出测量范围
	 {	 
	  flag=0;
	  return 1;
	 }
	 else
	 {
	  return 0;
	 }
}

void duozuo()
{
 	control=18;	   //使舵机向左摆动
	servorTime=0;
	TR1=1;
	delayms(500);
	TR1=0;	
}

void duoyou()
{
 	control=10;	   //使舵机向右摆动
	servorTime=0;
	TR1=1;
	delayms(500);
	TR1=0; 	
}

void duozhong()
{
 	control=15;//控制舵机使超声波模块正对前方
	servorTime=0;
    TR1=1;
    delayms(500);
    TR1=0; 	
}

void zd0() interrupt 1 		 //T0中断用来计数器溢出,超过测距范围
 {
    flag=1;							 //中断溢出标志
 }

void openHc(){
   Trig=1;
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   Trig=0;
}

void T1_int(void) interrupt 3{	  //产生舵机所需要的脉冲
 		TH1=0xff;
		TL1= 0x9c;
		servorTime++;
		if(servorTime<=control)
			servorControl=1;
		else
			servorControl=0;
		if(servorTime>=200)
			servorTime=0;
}

Delay.c

void delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}	   
}

Delay.h

#ifndef __DELAY_H__
 #define __DELAY_H__
 void delay(unsigned int xms);//函数放这里
 #endif
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-04 13:00:11  更:2021-10-04 13:01:21 
 
开发: 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 5:28:03-

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