做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發送一次數據
// }
// }
//}
|