藍牙小車

實物圖:
在這裏插入圖片描述
藍牙小車代碼:

#include<reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;

sbit IN1 = P2^1;
sbit IN2 = P2^2;
sbit IN3 = P2^3;
sbit IN4 = P2^4;
sbit ENA = P2^0;  
sbit ENB = P2^5;

sbit RUN = P1^3;  //前進燈

sbit SF1 = P1^6;  //左轉向燈
sbit SF2 = P1^5;
sbit SF3 = P1^4;

sbit SR1 = P1^0;  //右轉向燈
sbit SR2 = P1^1; 
sbit SR3 = P1^2; 

u8 bluetooth;
u16 PWMCnt1 = 0;
u16 PWMCnt2 = 0;
u16 cntPWM1 = 0;
u16 cntPWM2 = 0;
bit forward_way=0,backward_way=0,left_way=0,right_way=0,stop_way=0;

void Timer0Init()
{
	TH0 = 0xFF;//定時0.1ms
	TL0 = 0xA3;
	TMOD &= 0xF0;
	TMOD |= 0X01;
	EA = 1;
	ET0 = 1;
	TR0 = 1;	
}

void UartInit()
{	
	TH1 = 0XFA;	 		
	TL1 = 0XFA;
	SCON = 0X50;
	PCON = 0x80;
	TMOD &= 0x0F;
	TMOD |= 0X20;				
	ES = 1;					
	EA = 1;					
	TR1 = 1;						
}

void Forward()                                          //前進
{
	IN1 = 1;   //左輪正傳
	IN2 = 0;
	IN3 = 1;   //右輪正傳
	IN4 = 0;
	cntPWM2 = 50;
	cntPWM1 = 50;

	RUN = 1;   //前進燈亮
	SF1 = 0; SF2 = 0; SF3 = 0;	//左轉向燈不亮
	SR1 = 0; SR2 = 0; SR3 = 0;  //右轉向燈不亮
}
void Backward()	                                        //後退
{
	IN1 = 0;  //左輪反轉
	IN2 = 1;
	IN3 = 0;  //右輪反傳
	IN4 = 1;
	cntPWM1 = 50;
	cntPWM2 = 50;

	RUN = 1;  //前進燈亮
	SF1 = 0; SF2 = 0; SF3 = 0;	 //左轉向燈不亮
	SR1 = 0; SR2 = 0; SR3 = 0;	 //右轉向燈不亮
}
void Turnleft()	                                        //左轉
{
	SF1 = ~SF1; SF2 = ~SF2; SF3 = ~SF3;//左轉向燈閃爍

	IN1 = 0;  //左輪不轉
	IN2 = 0;
	IN3 = 1;  //右輪正傳
	IN4 = 0;
	cntPWM1 = 10;
	cntPWM2 = 50;

	RUN = 0;   //前進燈滅
	SR1 = 0; SR2 = 0; SR3 = 0;	  //右轉向燈滅
}
void Turnright()                                        //右轉
{
	SR1 = ~SR1; SR2 = ~SR2; SR3 = ~SR3;	//右轉向燈閃爍

	IN1 = 1; //左輪正轉
	IN2 = 0;
	IN3 = 0; //右輪不傳
	IN4 = 0;
	cntPWM1 = 50;
	cntPWM2 = 10;

	RUN = 0;  //前進燈滅
	SF1 = 0; SF2 = 0; SF3 = 0;	  //左轉向燈滅
}
void Stop()	                                           //停止
{
	IN1 = 0;  //左輪不轉
	IN2 = 0;
	IN3 = 0;  //右輪不轉
	IN4 = 0;
	cntPWM1=0;
	cntPWM2=0;

	RUN = 0;
	SF1 = 0; SF2 = 0; SF3 = 0;
	SR1 = 0; SR2 = 0; SR3 = 0;	  //所有燈滅
}
void Display()
{
	if(forward_way==1)
	{
		Forward();
	}
	else if(backward_way==1)
	{
		Backward();
	}
	else if(left_way==1)
	{
		Turnleft();
	}
	else if(right_way==1)
	{
		Turnright();
	}
	else if(stop_way==1)
	{
		Stop();
	}	
	
}
void main()
{
	Timer0Init();
	UartInit();
	while(1)
	{
  		Display();
	}
}
void Link()
{
	if(bluetooth=='a')
	{
		forward_way = 1;
		backward_way = 0;
		left_way = 0;
		right_way = 0;
		stop_way = 0;
	}
	else if(bluetooth=='b')
	{
		forward_way = 0;
		backward_way = 1;
		left_way = 0;
		right_way = 0;
		stop_way = 0;
		
	}
	else if(bluetooth=='c')
	{
		forward_way = 0;
		backward_way = 0;
		left_way = 1;
		right_way = 0;
		stop_way = 0;
	}
	else if(bluetooth=='d')
	{
		forward_way = 0;
		backward_way = 0;
		left_way = 0;
		right_way = 1;
		stop_way = 0;
	}
	else if(bluetooth=='e')
	{
		forward_way = 0;
		backward_way = 0;
		left_way = 0;
		right_way = 0;
		stop_way = 1;
	}
}
void InterruptTime0() interrupt 1
{
	PWMCnt1++;
	PWMCnt2++;
	if(PWMCnt1  == 200)
	{
		PWMCnt1 = 0;
	}
	if(PWMCnt1 <= cntPWM1)
	{
		ENA = 1;
	}
	else
	{
		ENA = 0;
	}

	if(PWMCnt2 == 200)
	{
		PWMCnt2 = 0;
	}
	if(PWMCnt2 <= cntPWM2)
	{
		ENB = 1;
	}
	else
	{
		ENB = 0;
	}

	TH0 = (65536 - 50)/256;
	TL0 = (65536 - 50)%256;
}

void InterruptUart() interrupt 4
{
	bluetooth = SBUF;
	RI = 0;
	SBUF = bluetooth;
	while(!TI);			 
	TI = 0;	

	Link();
}

鍵盤遙控器代碼:

#include<reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;

sbit KEY1 = P1^3;	    //上
sbit KEY2 = P1^1;	    //下
sbit KEY3 = P1^0;		//左
sbit KEY4 = P1^4;		//右
sbit KEY5 = P1^2;		//停
bit flag = 0;

u8 T0RH = 0;
u8 T0RL = 0;
u8 KeySta[] = {1, 1, 1, 1, 1, 1};
u8 KeyCodeMap[] = {'1', '2', '3', '4', '5'};

void KeyDriver();
void ConfigTimer0(u16 ms);
void UartInit();

void main()
{
	EA = 1;
	ConfigTimer0(2);
	UartInit();

	while(1)
	{
	
		KeyDriver();	
	}
}
void ConfigTimer0(u16 ms)  //配置定時器0
{
	u32 tmp;

	tmp = 11059200/12;
	tmp = (tmp * ms)/1000;
	tmp = 65536 - tmp;
	T0RH = (u8)(tmp >> 8);
	T0RL = (u8)tmp;
	TH0 = T0RH;
	TL0 = T0RL;
	TMOD &= 0xF0;
	TMOD |= 0x01;
	ET0 = 1;
	TR0 = 1;
}
void KeyScan()	//按鍵掃描函數
{
	u8 i;
	static u8 KeyBuff[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

	KeyBuff[0] = (KeyBuff[0] << 1) | KEY1;
	KeyBuff[1] = (KeyBuff[1] << 1) | KEY2;
	KeyBuff[2] = (KeyBuff[2] << 1) | KEY3;
	KeyBuff[3] = (KeyBuff[3] << 1) | KEY4;
	KeyBuff[4] = (KeyBuff[4] << 1) | KEY5;

	for(i=0; i<5; i++)
	{
		if((KeyBuff[i]&0x0F) == 0x0F)
		{
			KeySta[i] = 1;
		}
		else if((KeyBuff[i]&0x0F) == 0x00)
		{
			KeySta[i] = 0;
		}
		else
		{}
	}
}
void KeyAction(u8 keycode)	//按鍵功能函數
{
	if(keycode == '1')
	{
		SBUF = 'a';
		while(!TI);
		TI = 0;	
	}	
	else if(keycode == '2')
	{
		SBUF = 'b';
		while(!TI);
		TI = 0;
	}
	else if(keycode == '3')
	{
		SBUF = 'c';
		while(!TI)
		TI = 0;
	}
	else if(keycode == '4')
	{
		SBUF = 'd';
		while(!TI);
		TI = 0;
	}
	else
	{
		SBUF = 'e';
		while(!TI);
		TI = 0;
	}
}
void KeyDriver()
{
	u8 i;
	static u8 backup[] = {1, 1, 1, 1, 1};

	for(i=0; i<5; i++)
	{
		if(KeySta[i] != backup[i])
		{
			if(backup[i] != 0)
			{
				KeyAction(KeyCodeMap[i]);
			}
			backup[i] = KeySta[i];
		}
	}
}
//void UartInit()
//{	
//  TH1 = 0xFD;
//	TL1 = 0xFD;
//	TMOD &= 0x0F;
//	TMOD |= 0x20;
//	SCON = 0x50;
//	PCON &= 0x7F;
//	ET1 = 0;
//	TR1 = 1;
//}

void UartInit()//[email protected]
{
PCON &= 0x7F;
SCON = 0x50;
TMOD &= 0x0F;
TMOD |= 0x20;
TL1 = 0xFD;
TH1 = 0xFD;
ET1 = 0;
TR1 = 1;
}

void InterruptTimer0() interrupt 1
{
	TH0 = T0RH;
	TL0 = T0RL;

	KeyScan();
}


		


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章