找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3135|回復: 6
打印 上一主題 下一主題
收起左側

51單片機使用ps2搖桿控制舵機轉向,有操作數(shù)據(jù)但是舵機無法工作

[復制鏈接]
跳轉到指定樓層
樓主
ID:1037975 發(fā)表于 2022-7-1 21:46 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本人單片機小白一個,為了給兒子做智能玩具車,一周前開始自學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ā)出信號后,舵機無法控制轉向。(舵機單獨使用可以正常工作)


單片機代碼如下

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

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:161164 發(fā)表于 2022-7-5 09:06 | 只看該作者
你貼的代碼是ps2搖桿直接控制舵機?
為啥要關定時器?
回復

使用道具 舉報

板凳
ID:844772 發(fā)表于 2022-7-5 10:30 | 只看該作者
才做了一半啊,接收端怎么處理的呢?
回復

使用道具 舉報

地板
ID:1037975 發(fā)表于 2022-7-6 10:10 | 只看該作者
lkc8210 發(fā)表于 2022-7-5 09:06
你貼的代碼是ps2搖桿直接控制舵機?
為啥要關定時器?

因為那個要控制舵機轉向
回復

使用道具 舉報

5#
ID:1037975 發(fā)表于 2022-7-6 10:14 | 只看該作者
lkc8210 發(fā)表于 2022-7-5 09:06
你貼的代碼是ps2搖桿直接控制舵機?
為啥要關定時器?

大佬有什么好的建議可以給提一下嗎?本人純小白。。
回復

使用道具 舉報

6#
ID:1037975 發(fā)表于 2022-7-6 10:15 | 只看該作者
等我回去整理下代碼發(fā)一下。
回復

使用道具 舉報

7#
ID:1098747 發(fā)表于 2023-11-6 18:56 | 只看該作者
請叫我?guī)煾?發(fā)表于 2022-7-6 10:15
等我回去整理下代碼發(fā)一下。

請問整理出來了嗎
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表