做51单片机小车的硬件部分:一个开发板,带电机车轮的小车底盘,蓝牙模块,充电宝为小车供电
软件部分,串口助手,需要了解蓝牙AT指令用以改蓝牙名字,避免干扰,keli51开发环境
制作出来的实物图如下:
小车成品
单片机源程序如下:
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
//定义电机输入端口
sbit right_b=P1^3;
sbit right_a=P1^2;
sbit left_b=P1^1;
sbit left_a=P1^0;
sbit out3=P3^3; //定义红外输入端口
sbit out2=P3^2;
sbit out0=P0^2;
sbit out1=P0^4;
sbit fm=P0^7; //定义蜂鸣器输出端口
void delay(int n) //延时函数
{
int i;
while(n--)
{
for(i=0;i<113;i++);
}
}
/*void come(int n) //利用电机差速调速 本次全速,所以注释了。
{
int i=0;
left_a=1;
left_b=0;
right_b=0;
while(i++<5)
{
right_a=1;
delay(n);
right_a=0;
delay(10-n);
}
}*/
void go_up() //前进函数
{
left_a=1;
left_b=0;
right_b=0;
right_a=1;
}
void go_back() //后退函数
{
left_a=0;
left_b=1;
right_b=1;
right_a=0;
}
void left() //左转函数
{
fm=1;
delay(10);
fm=0;
left_a=1;
left_b=0;
right_b=0;
right_a=0;
}
void right() /右转函数
{
fm=1;
delay(10);
fm=0;
left_a=0;
left_b=0;
right_b=0;
right_a=1;
}
void stop() //停止函数
{
left_a=0;
left_b=0;
right_b=0;
right_a=0;
}
void ssz() //顺时针旋转
{
fm=1;
delay(3);
fm=0;
left_a=0;
left_b=1;
right_b=0;
right_a=1;
}
void nsz() //逆时针旋转
{
fm=1;
delay(3);
fm=0;
left_a=1;
left_b=0;
right_b=1;
right_a=0;
}
void UART_Init(void)
{
PCON &= 0x7F;
SCON = 0x50;
TMOD &= 0x0F;
TMOD |= 0x20;
TL1 = 0xFD;
TH1 = 0xFD;
ET1 = 0;
TR1 = 1;
EA=1;
ES=1;
}
void UART_Routine() interrupt 4 //蓝牙数据接收以及判断
{
unsigned char S;
if(RI==1)
{
stop();
S=SBUF;
switch(S)
{
case ('1'):
go_up();break;
case ('2'):
go_back();break;
case ('3'):
nsz();break;
case ('4'):
ssz();break;
case ('0'):
stop();break;
}
RI=0;
}
}
void main (void) //主函数
{
UART_Init(); // 串口通信初始化
while (1) //主循环 寻迹功能, 避障功能 在此部分改动
{
if(out0==0&out1==0)//&out2==0&out3==0
{
go_back();
}
else
stop();
// if(out0==0&out1==0&S=='1')//&out2==0&out3==0
// {
// go_back();
// }
// if(out0==1&out1==0)//&out2==1&out3==0
// {
// nsz();
// }
// else if(out0==0&out1==1)//&out2==0&out3==1
// {
// ssz();
// }
// else if(out0==1&out1==1)//&out2==1&out3==1
// {
// go_up();
// }
}
}
//——————————————————测试功能————————————————————
////单片机接收PC发出的数据 用于测试串口通信
//#include<reg51.h> //包含单片机寄存器的头文件
///*****************************************************
//函数功能:接收一个字节数据
//***************************************************/
//sbit KEY2=P3^4;
//void delay(int n)
//{
// int i;
// while(n--)
// {
// for(i=0;i<113;i++);
// }
//}
// unsigned char Receive(void)
//{
// unsigned char dat;
// while(RI==0) //只要接收中断标志位RI没有被置“1”
// ; //等待,直至接收完毕(RI=1)
// RI=0; //为了接收下一帧数据,需将RI清0
// dat=SBUF; //将接收缓冲器中的数据存于dat
// return dat;
//}
///*****************************************************
//函数功能:主函数
//***************************************************/
//void main(void)
//{
// TMOD=0x20; //定时器T1工作于方式2
// SCON=0x50; //SCON=0101 0000B,串口工作方式1,允许接收(REN=1)
// PCON=0x00; //PCON=0000 0000B,波特率9600
// TH1=0xfd; //根据规定给定时器T1赋初值
// TL1=0xfd; //根据规定给定时器T1赋初值
// TR1=1; //启动定时器T1
// REN=1; //允许接收
//
// while(1)
// {
// P1=0xFF;
// P1=Receive(); //将接收到的数据送P1口显示
// delay(1000);
// }
// }
//}
////单片机向PC发送数据 用于测试串口通信
//#include<reg51.h> //包含单片机寄存器的头文件
//unsigned char code Tab[ ]="hello word ";
///*****************************************************
//函数功能:向PC发送一个字节数据
//***************************************************/
//void Send(unsigned char dat)
//{
// SBUF=dat;
// while(TI==0)
// ;
// TI=0;
//}
///**************************************************************
//函数功能:延时约150ms
//**************************************************************/
// void delay(void)
//{
// unsigned char m,n;
// for(m=0;m<200;m++)
// for(n=0;n<250;n++)
// ;
// }
///*****************************************************
//函数功能:主函数
//***************************************************/
//void main(void)
//{
// unsigned char i;
// TMOD=0x20; //TMOD=0010 0000B,定时器T1工作于方式2
// SCON=0x40; //SCON=0100 0000B,串口工作方式1
// PCON=0x00; //PCON=0000 0000B,波特率9600
// TH1=0xfd; //根据规定给定时器T1赋初值
// TL1=0xfd; //根据规定给定时器T1赋初值
// TR1=1; //启动定时器T1
// while(1)
// {
// for(i=0;i<8;i++) //模拟检测数据
// {
// Send(Tab[ i]); //发送数据i
// delay(); //150ms发送一次数据
// }
// }
//}
|