找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2466|回复: 6
收起左侧

51单片机使用ps2摇杆控制舵机转向,有操作数据但是舵机无法工作

[复制链接]
ID:1037975 发表于 2022-7-1 21:46 | 显示全部楼层 |阅读模式
本人单片机小白一个,为了给儿子做智能玩具车,一周前开始自学51单片机。纯属小白,代码不规范,思绪比较乱,请各位见谅,先说下本人的想法:该小车由两部分组成,一个智能小车,一个遥控器。
智能小车:
stc89c52 单片机 + hc05 蓝牙模块 A + L298N驱动模块 + 电机 * 2 + SG90舵机 +电源
遥控器组成:
stc89c52 单片机 + hc05 蓝牙模块 B + ps2 摇杆模块 + PCF8591 AD/DA模块 + 电源
思路: 两个蓝牙模块主从绑定,B为主 A为从。当PCF8591 AD/DA模块接受到 ps2 摇杆模块 的操作信号时,通过hc05 蓝牙模块 B 发送给A,控制小车方向及前进后退。
问题:ps2 摇杆模块 发出信号后,舵机无法控制转向。(舵机单独使用可以正常工作)
2022-07-01_214445.jpg

单片机代码如下

#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;  
}

回复

使用道具 举报

ID:161164 发表于 2022-7-5 09:06 | 显示全部楼层
你贴的代码是ps2摇杆直接控制舵机?
为啥要关定时器?
回复

使用道具 举报

ID:844772 发表于 2022-7-5 10:30 | 显示全部楼层
才做了一半啊,接收端怎么处理的呢?
回复

使用道具 举报

ID:1037975 发表于 2022-7-6 10:10 | 显示全部楼层
lkc8210 发表于 2022-7-5 09:06
你贴的代码是ps2摇杆直接控制舵机?
为啥要关定时器?

因为那个要控制舵机转向
回复

使用道具 举报

ID:1037975 发表于 2022-7-6 10:14 | 显示全部楼层
lkc8210 发表于 2022-7-5 09:06
你贴的代码是ps2摇杆直接控制舵机?
为啥要关定时器?

大佬有什么好的建议可以给提一下吗?本人纯小白。。
回复

使用道具 举报

ID:1037975 发表于 2022-7-6 10:15 | 显示全部楼层
等我回去整理下代码发一下。
回复

使用道具 举报

ID:1098747 发表于 2023-11-6 18:56 | 显示全部楼层
请叫我师哥 发表于 2022-7-6 10:15
等我回去整理下代码发一下。

请问整理出来了吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表