首先可能是你想實現的藍牙小車效果(點擊下面跳轉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;
}
}
