本人单片机小白一个,为了给儿子做智能玩具车,一周前开始自学51单片机。纯属小白,代码不规范,思绪比较乱,请各位见谅,先说下本人的想法:该小车由两部分组成,一个智能小车,一个遥控器。
智能小车:
stc89c52 单片机 + hc05 蓝牙模块 A + L298N驱动模块 + 电机 * 2 + SG90舵机 +电源
遥控器组成:
stc89c52 单片机 + hc05 蓝牙模块 B + ps2 摇杆模块 + PCF8591 AD/DA模块 + 电源
思路: 两个蓝牙模块主从绑定,B为主 A为从。当PCF8591 AD/DA模块接受到 ps2 摇杆模块 的操作信号时,通过hc05 蓝牙模块 B 发送给A,控制小车方向及前进后退。
问题:ps2 摇杆模块 发出信号后,舵机无法控制转向。(舵机单独使用可以正常工作)
单片机代码如下
#include <REGX51.H>
#include <I2C.H>
#include <LCD.H>
#include "stdio.h"
#include "delay.h"
unsigned int count=0,x=0,y=0; //次数标识
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;
}
|