51單片機之藍牙遙控小車_效果展示+單片機知識+完整藍牙電車代碼


首先可能是你想實現的藍牙小車效果(點擊下面跳轉B站)

藍牙履帶坦克

藍牙坦克上位機系統升級

藍牙四驅戰車-戰神前奏

藍牙四驅戰車-驅動程序調試

藍牙四驅戰車-野外

藍牙四驅戰車-舵機變更

關於51單片機基礎

keil uVersion4的安裝卸載+破解

51單片機和HC05藍牙模塊對接成功,但是數據收發時候發現數據很多時候對不上問題解決

51單片機的中斷系統(一)

51單片機的中斷系統(二)

51單片機的中斷系統(三)

51單片機的中斷系統(四)

51單片機的中斷系統(五)

51單片機的中斷系統(六)

晶振的抉擇:12M和11.0592M的選擇

51單片機的中斷系統(七)通信的一些概念

89c52 EEPROM使用

51單片機,計時器0,11.0592M晶振,工作方式1,幾個常用的定時器初始值

關於51單片機藍牙電車驅動程序

L298N電機驅動

步進電機驅動

舵機驅動

藍牙模塊串口通信

PWM調速

#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;
    }    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM