源码在最后
前言
国庆假期的前一天中午自己翻到了一张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