標題: 51單片機使用ps2搖桿控制舵機轉(zhuǎn)向,有操作數(shù)據(jù)但是舵機無法工作 [打印本頁]

作者: 請叫我?guī)煾?nbsp;   時間: 2022-7-1 21:46
標題: 51單片機使用ps2搖桿控制舵機轉(zhuǎn)向,有操作數(shù)據(jù)但是舵機無法工作
本人單片機小白一個,為了給兒子做智能玩具車,一周前開始自學51單片機。純屬小白,代碼不規(guī)范,思緒比較亂,請各位見諒,先說下本人的想法:該小車由兩部分組成,一個智能小車,一個遙控器。
智能小車:
stc89c52 單片機 + hc05 藍牙模塊 A + L298N驅(qū)動模塊 + 電機 * 2 + SG90舵機 +電源
遙控器組成:
stc89c52 單片機 + hc05 藍牙模塊 B + ps2 搖桿模塊 + PCF8591 AD/DA模塊 + 電源
思路: 兩個藍牙模塊主從綁定,B為主 A為從。當PCF8591 AD/DA模塊接受到 ps2 搖桿模塊 的操作信號時,通過hc05 藍牙模塊 B 發(fā)送給A,控制小車方向及前進后退。
問題:ps2 搖桿模塊 發(fā)出信號后,舵機無法控制轉(zhuǎn)向。(舵機單獨使用可以正常工作)


單片機代碼如下

#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("左轉(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;  
}


作者: lkc8210    時間: 2022-7-5 09:06
你貼的代碼是ps2搖桿直接控制舵機?
為啥要關(guān)定時器?
作者: glinfei    時間: 2022-7-5 10:30
才做了一半啊,接收端怎么處理的呢?
作者: 請叫我?guī)煾?nbsp;   時間: 2022-7-6 10:10
lkc8210 發(fā)表于 2022-7-5 09:06
你貼的代碼是ps2搖桿直接控制舵機?
為啥要關(guān)定時器?

因為那個要控制舵機轉(zhuǎn)向
作者: 請叫我?guī)煾?nbsp;   時間: 2022-7-6 10:14
lkc8210 發(fā)表于 2022-7-5 09:06
你貼的代碼是ps2搖桿直接控制舵機?
為啥要關(guān)定時器?

大佬有什么好的建議可以給提一下嗎?本人純小白。。
作者: 請叫我?guī)煾?nbsp;   時間: 2022-7-6 10:15
等我回去整理下代碼發(fā)一下。
作者: IAIAI    時間: 2023-11-6 18:56
請叫我?guī)煾?發(fā)表于 2022-7-6 10:15
等我回去整理下代碼發(fā)一下。

請問整理出來了嗎





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1