1. 程式人生 > >51單片機之藍牙遙控小車_完整代碼

51單片機之藍牙遙控小車_完整代碼

war 允許 def all 對數 rup oid 變量 如果

#include "reg52.h"			 //此文件中定義了單片機的一些特殊功能寄存器

typedef unsigned int u16;	  //對數據類型進行聲明定義
typedef unsigned char u8;

//是否是前進
bit isFoward = 0;
//是否後退
bit isBack = 0;

//控制行駛電機
sbit EN_A = P0^0;
sbit IN_A1 = P0^1;
sbit IN_A2 = P0^2;
sbit IN_B1 = P0^3;
sbit IN_B2 = P0^4;
sbit EN_B = P0^5;

//是否行使總開關
bit ALL_EN = 0;
u8 speedNum = 10;


//步進電機轉動
int harfMotoNum = 10;
int currentMotoNum = 15;
sbit r_pwm = P3^7;

void initFunc(){
	P0 = 0x00;
	//首先設置TMOD工作方式
	TMOD = 0x21;
	PCON = 0x00;
	SCON = 0x50;
	//計算初始值設定
	TH1 = 0xFD;
	TL1 = 0xFD;
	//打開
	TR1 = 1;
	//打開串口中斷
	ES = 1;

	TH0=0XFF;	//給定時器賦初值,定時1ms
	TL0=0XA3;	
	ET0=1;//打開定時器0中斷允許
	EA=1;//打開總中斷
	TR0=1;//打開定時器	

}

void checkRun(){
	if(isFoward){
	  	EN_A = ALL_EN;
		IN_A1 = 0;
		IN_A2 = 1;
	}  else if(isBack){
		EN_A = ALL_EN;
		IN_A1 = 1;
		IN_A2 = 0;
	}
	else{
		EN_A = ALL_EN;
		IN_A1 = 0;
		IN_A2 = 0;
	}
}

u8 motoDriveRecord = 0;
bit motoNeedRun = 0;

void main()
{	
	initFunc();
	while(1)
	{	
		checkRun();
	}		
}

u8 systemCount = 0;
u8 row = 0;
u8 colum = 0;
u8 judgeNum = 0;

bit leftOrRight = 0;  //旋轉方向,0左,1右


void Timer0() interrupt 1
{
	TH0=0XFF;	//給定時器賦初值,定時1ms
	TL0=0XA3;

/*********************** 定時器控制PWM調速 **************************/
	/* 		(/0)(/1)(/2)(/3)   	(/19)
	(%0)	0	5 	10	15	...	95		
	(%1)	1	6	11	16 	...	96	
	(%2)	2	7	12	17 	...	97	
	(%3)	3	8	13	18 	...	98
	(%4)	4+	9+	14+	19+	...	99
	*/
	if(systemCount >= 1000)
	 	systemCount = 0;
	row = ((systemCount/10) % 5);//這時候取值是0,1,2
	colum = (systemCount/10) / 5;//取值為0-19;
	judgeNum = row * 20 + colum;
	if(judgeNum < speedNum){
		ALL_EN = 1;
	}else{
		ALL_EN = 0;
	}
/*********************** 舵機控制 **************************/
	if((systemCount%200) == 0){
		r_pwm = 1;
	}
	if((systemCount%200) >= currentMotoNum){
		r_pwm = 0;
	}
	systemCount++;
}

//中斷事件
u8 receivedData;
u8 operation;
void Usart() interrupt 4
{
	if(RI == 1) {  //如果收到.  
     	//定義一個變量,接收數據
		receivedData = SBUF;
	
		if (receivedData == 101){
			//前進
			isFoward = 1;
			isBack = 0;
			ALL_EN = 1;
		}else if(receivedData == 102){
			//後退
			isFoward = 0;
			isBack = 1;
			ALL_EN = 1;
		}else if(receivedData == 103){
			//停止
			isFoward = 0;
			isBack = 0;
			ALL_EN = 0;
		}else if(receivedData == 104){
			//調整行駛速度
			operation = receivedData;
		}else if(receivedData == 105){
			//調整方向
			operation = receivedData;
		}else if(receivedData == 106){
			//校準方向
			currentMotoNum = harfMotoNum + 5;
		}else if(receivedData <= 100){
			if(operation == 104){
				if(receivedData >= 0 && receivedData <= 100){
					speedNum = receivedData;
				}
			}else if(operation == 105){
				if(receivedData >= 0 && receivedData <= harfMotoNum * 2){
					currentMotoNum = receivedData + 5;
				}
			}
		} 	
		RI = 0;
    }    
}

51單片機之藍牙遙控小車_完整代碼