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