源码在最后
前言国庆假期的前一天中午自己翻到了一张52单片机,想起自己之前只是使用普中科技做好的集成开发板玩,所以就自己找了原理图做最小系统搞。(源自某位老师的指点:“玩单片机只会用开发板是不行的。”,现在搞完了还是挺感激他的,确实认识到位了。)
第一轮打击但是第一步的打击没想到会这么快,我找到的原理图网图,居然是某位友友搞错的图,,,以至于我把排阻什么的都焊上去,然后费了好大精神把单片机插进母座,上电没反应。。。
因为洞洞板比较贵,又没有吸锡器,就只好在左边补焊了一个最小系统,后果就是又多花了两个小时。不过好在成功点亮小灯,所以才给了我国庆搞完的信心。
#原始烧录形态
增加两路驱动的母座,并去掉了之前搞坏的东西
焊接小车底座
注意前后轮子的线方向是相反的,要反过来接
驱动完美入座
装上电池改成DC插座供电
9伏电压采用DCDC模块降压,结果发现电池根本没电,一上电就降到6伏。买了放在实验室的充电电池不知道去哪了。后来就果断拿了电宝供电,,,
这是我最不喜欢用的供电方式
好大的屁股诶。
引出串口烧录插座和蓝牙插座
装上超声波
加上舵机
main.c
#include#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#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
#includesbit 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#include 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 =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



