本人單片機小白一個,為了給兒子做智能玩具車,一周前開始自學51單片機。純屬小白,代碼不規(guī)范,思緒比較亂,請各位見諒,先說下本人的想法:該小車由兩部分組成,一個智能小車,一個遙控器。
智能小車:
stc89c52 單片機 + hc05 藍牙模塊 A + L298N驅動模塊 + 電機 * 2 + SG90舵機 +電源
遙控器組成:
stc89c52 單片機 + hc05 藍牙模塊 B + ps2 搖桿模塊 + PCF8591 AD/DA模塊 + 電源
思路: 兩個藍牙模塊主從綁定,B為主 A為從。當PCF8591 AD/DA模塊接受到 ps2 搖桿模塊 的操作信號時,通過hc05 藍牙模塊 B 發(fā)送給A,控制小車方向及前進后退。
問題:ps2 搖桿模塊 發(fā)出信號后,舵機無法控制轉向。(舵機單獨使用可以正常工作)
2022-07-01_214445.jpg (28.32 KB, 下載次數(shù): 25)
下載附件
2022-7-1 21:45 上傳
單片機代碼如下
#include <REGX51.H>
#include <I2C.H>
#include <LCD.H>
#include "stdio.h"
#include "delay.h"
unsigned int count=0,x=0,y=0; //次數(shù)標識
unsigned int angle=5; //角度標識
sbit pwm =P1^2 ;
void Timer0_Init(){
TMOD = 0x01;
TF0 = 0;
TR0 = 1;
TL0 = 0X33;
TH0 = 0XFE;
ET0 = 1;
EA = 1;
PT0 = 0;
}
int RD_OneByte2Pcf8591(unsigned char address,unsigned char cmd)
{
int num = 0;
I2CStart(); //address=0x41
I2CWriteByte(address);
I2CWriteByte(cmd);
I2CStart(); //address=0x41
I2CWriteByte(address|0x01);
//num = I2CRecvAck();
num = I2CReadByte();
SendAck(1);
I2CStop();
return (num);
}
void Delay200ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
i = 2;
j = 134;
k = 20;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay2000ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
i = 16;
j = 51;
k = 249;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void InitUART (void)
{
TH1 = 0xF3; // TH1: ??? 9600 ??? ?? 11.0592MHz
TL1 = TH1;
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit ?? // timer 0,16???
SCON = 0x50; // SCON: ?? 1, 8-bit UART, ????
ES = 1; //??????
TR1 = 1; // TR1: timer 1 ??
TI=1;
}
void closeSG90(){
pwm = 0;
TR0 = 0;
ET0 = 0;
}
void main(){
angle = 3;
pwm = 1;
Timer0_Init();
// angle = 3;
// pwm = 1;
// Timer0_Init();
InitUART();
//// LCD_Init(); //初始化1602
//// LCD_ShowString(1,1,"x:");
//// LCD_ShowString(1,9,"y:");
//
//
while(1){
x = RD_OneByte2Pcf8591(0x90,0x40);
y = RD_OneByte2Pcf8591(0x90,0x41);
// if(x > 210){
// //printf("左轉\n\r");
// }
// if(x < 180){
// //printf("右轉\n\r");
// }
if(y < 150){
printf("y的值:%d \n\r",y);
if(x > 240){
printf("x的值:%d \n\r",x);
angle = 1;
count = 0;
closeSG90();
}else if(x>210){
angle = 2;
count = 0;
closeSG90();
}
if(x < 180){
angle = 4;
count = 0;
closeSG90();
}else if(x < 50){
angle = 5;
count = 0;
closeSG90();
}
}
if(y > 200){
//printf("后退\n\r");
}
// LCD_ShowNum(2,1,x,3);
// LCD_ShowNum(2,9,y,3);
//Delay200ms();
}
}
void Timer0_Routine() interrupt 1{
TL0 = 0X33;
TH0 = 0XFE;
count ++;
if(count == 40){
count = 0;
}
if(count< angle)
pwm=1;
else
pwm=0;
}
|