舵机通电一下就向左转一下。按键无反应。
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次中断产生 */
}
首先,我没在你这程序里面看到前后左右四个按键的采集子程序呀。
再来,你主程序一个while(1), 然后,你前,后 的程序里面又有while(1), 如果真的进入到这子程序里面了,那程序还出得来吗? 所以很多地方要改的。
一周热门 更多>