标题: 51单片机使用ps2摇杆控制舵机转向,有操作数据但是舵机无法工作 [打印本页]

作者: 请叫我师哥    时间: 2022-7-1 21:46
标题: 51单片机使用ps2摇杆控制舵机转向,有操作数据但是舵机无法工作
本人单片机小白一个,为了给儿子做智能玩具车,一周前开始自学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;  
}


作者: lkc8210    时间: 2022-7-5 09:06
你贴的代码是ps2摇杆直接控制舵机?
为啥要关定时器?
作者: glinfei    时间: 2022-7-5 10:30
才做了一半啊,接收端怎么处理的呢?
作者: 请叫我师哥    时间: 2022-7-6 10:10
lkc8210 发表于 2022-7-5 09:06
你贴的代码是ps2摇杆直接控制舵机?
为啥要关定时器?

因为那个要控制舵机转向
作者: 请叫我师哥    时间: 2022-7-6 10:14
lkc8210 发表于 2022-7-5 09:06
你贴的代码是ps2摇杆直接控制舵机?
为啥要关定时器?

大佬有什么好的建议可以给提一下吗?本人纯小白。。
作者: 请叫我师哥    时间: 2022-7-6 10:15
等我回去整理下代码发一下。
作者: IAIAI    时间: 2023-11-6 18:56
请叫我师哥 发表于 2022-7-6 10:15
等我回去整理下代码发一下。

请问整理出来了吗





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1