这是我写的船模程序。编译没错,但运行无效果。

2019-07-15 14:52发布

舵机通电一下就向左转一下。按键无反应。
L298N通直流电机(L298N指示灯常亮),按键直流电机无反应。L298N的12V口与GND连接一个9V电池。
无线模块用的是2272,这个测试无问题。
单片机是AT89S52.

求大神帮我看下问题出在哪儿。

#include<reg52.h>
#include<math.h>
#define uchar unsigned char    //遥控器
sbit w=P1^1;     //上
sbit s=P1^2;  //下
sbit a=P1^3;  //左
sbit d=P1^4;  //右            //船身
sbit en1=P0^0; /* L298的Enable A */
sbit en2=P0^1; /* L298的Enable B */
sbit s1=P0^2; /* L298的Input 1 */
sbit s2=P0^3; /* L298的Input 2 */
sbit s3=P0^4; /* L298的Input 3 */
sbit s4=P0^5; /* L298的Input 4 */
sbit pwm =P0^6;/* 舵机PWM信号输出 */
uchar t=0; /* 中断计数器 */
uchar m1=0; /* 电机速度值 */
uchar tmp1; /* 电机当前速度值 */
char speed;
uchar jd;   /*角度标识*/
uchar count;  /*0.5ms次数标识*/
/*差点又忘了的函数声明QWQ*/
void delay(uchar);
void zuo(uchar x);
void you(uchar x);
void qian(uchar x);
void hou(uchar x);
/*提莫的再也不敢忘了声明函数了*/
void main()  
{      //定时器初始化
TMOD=0x01;           //定时器0工作在方式1   
TH0=0xfe;
TH1=0xfe;
TL0=0x33;     //11.0592MZ晶振,0.5ms
TL1=0X33;
EA=1;        //总中断
ET0=1;
ET1=1;
TR0=1;                 //定时器开始
TR1=1;     
jd=3;      
count=0;
speed=0;
while(1)
{
  qian(w);
  zuo(a);
  you(d);
  hou(s);
}
}
void delay(uchar i)/*延时*/
{
uchar j,k;
for(j=i;j>0;j--)
   for(k=125;k>0;k--);
}
void zuo(uchar x)
{
bit left;
while(1)
{ left=x;
    if(left==1)                //角度减小按键是否按下
      {
      delay(10);
      if(left==1)
        {
        jd--;                 //角度标识减1
        count=0;
        if(jd==0)
        jd=1;               //已经是0度,则保持
        }
      }
        
}
}
void you(uchar x)
{
bit right;
while(1)
{right=x;
  if(right==1)               //角度增加按键是否按下
      {
      delay(10);              //按下延时,消抖
      if(right==1)              //确实按下
        {
        jd++;                 //角度标识加1
        count=0;              //按键按下 则20ms周期从新开始
        if(jd==6)
        jd=5;               //已经是180度,则保持
        }
      }
  }
}
void T0_time() interrupt 1 /*舵机中断程序*/
{
TH0=0xfe;             //重新赋值
TL0=0x33;
if(count< jd)              //判断0.5ms次数是否小于角度标识
pwm=1;                  //确实小于,PWM输出高电平
else
pwm=0;                  //大于则输出低电平
count=(count+1);          //0.5ms次数加1
count=count%40;     //保持周期为20ms
}
void qian(uchar x)
{bit temp;
temp=x;
if(temp==1)
  {
   if(speed>=-10 && speed<=10)
    {speed++;           
     m1=abs(speed); /* 取速度的绝对值 */
     if(speed<0) /* 速度值为负则反转 */
      {
       s1=0;
       s2=1;
       s3=0;
       s4=1;
      }
     else /* 不为负数则正转 */
      {
       s1=1;
       s2=0;
       s3=1;
       s4=0;  
      }
    }
  }
}
void hou(uchar x)
{bit temp;
temp=x;
if(temp==1)
  {
   if(speed>=-10 && speed<=10)
    {speed--;           
     m1=abs(speed);
     if(speed<0)
      {
       s1=0;
       s2=1;
       s3=0;
       s4=1;
      }
     else
      {
       s1=1;
       s2=0;
       s3=1;
       s4=0;  
      }
    }
  }
}
void T1_time() interrupt 3 /*直流电机中断程序*/
{
TH1=0xfe;         
TL1=0x33;
if(t==0) /* 1个PWM周期完成后才会接受新数值 */
  {
   tmp1=m1;
  }
if(t<tmp1)
  {
  en1=1;
  en2=1;
  }
   else
  {
  en1=0;
  en2=0;
  } /* 产生电机的PWM信号 */
t++;
if(t>=10) t=0; /* 1个PWM信号由10次中断产生 */  
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
8电子爱好者8
1楼-- · 2019-07-15 19:31
虽然我不懂编程,但是我想要积分呀,枪个楼加加人气吧,呵呵
8电子爱好者8
2楼-- · 2019-07-16 00:00
我说怎么没人呢,原来需要审核呀!那我的积分泡汤了      !呵呵呵
lucbunny
3楼-- · 2019-07-16 01:32
8电子爱好者8 发表于 2016-3-4 08:22
我说怎么没人呢,原来需要审核呀!那我的积分泡汤了      !呵呵呵

...............................................
horsewater
4楼-- · 2019-07-16 07:12
粗略的看了一下:
首先,我没在你这程序里面看到前后左右四个按键的采集子程序呀。
再来,你主程序一个while(1), 然后,你前,后 的程序里面又有while(1), 如果真的进入到这子程序里面了,那程序还出得来吗? 所以很多地方要改的。
wr12306
5楼-- · 2019-07-16 13:02
 精彩回答 2  元偷偷看……

一周热门 更多>