找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3135|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本人單片機(jī)小白一個(gè),為了給兒子做智能玩具車(chē),一周前開(kāi)始自學(xué)51單片機(jī)。純屬小白,代碼不規(guī)范,思緒比較亂,請(qǐng)各位見(jiàn)諒,先說(shuō)下本人的想法:該小車(chē)由兩部分組成,一個(gè)智能小車(chē),一個(gè)遙控器。
智能小車(chē):
stc89c52 單片機(jī) + hc05 藍(lán)牙模塊 A + L298N驅(qū)動(dòng)模塊 + 電機(jī) * 2 + SG90舵機(jī) +電源
遙控器組成:
stc89c52 單片機(jī) + hc05 藍(lán)牙模塊 B + ps2 搖桿模塊 + PCF8591 AD/DA模塊 + 電源
思路: 兩個(gè)藍(lán)牙模塊主從綁定,B為主 A為從。當(dāng)PCF8591 AD/DA模塊接受到 ps2 搖桿模塊 的操作信號(hào)時(shí),通過(guò)hc05 藍(lán)牙模塊 B 發(fā)送給A,控制小車(chē)方向及前進(jìn)后退。
問(wèn)題:ps2 搖桿模塊 發(fā)出信號(hào)后,舵機(jī)無(wú)法控制轉(zhuǎn)向。(舵機(jī)單獨(dú)使用可以正常工作)


單片機(jī)代碼如下

#include <REGX51.H>
#include <I2C.H>
#include <LCD.H>
#include "stdio.h"
#include "delay.h"


unsigned int count=0,x=0,y=0;      //次數(shù)標(biāo)識(shí)
unsigned int angle=5;         //角度標(biāo)識(shí)
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("左轉(zhuǎn)\n\r");
//                }
//                if(x < 180){
//                        //printf("右轉(zhuǎn)\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ù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

因?yàn)槟莻(gè)要控制舵機(jī)轉(zhuǎn)向
回復(fù)

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

請(qǐng)問(wèn)整理出來(lái)了嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表