请会51单片机的高手帮我看看程序哪不对。
voidmain(){init();TMOD=0x12;TH0=156;TL0=156;TH1=(65536-50000)/256;TL1=(65536-50000)%2...
void main()
{
init();
TMOD=0x12;
TH0=156;
TL0=156;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
ET0=1;
ET1=1;
EA=1;
while(1)
{
display();
keys();
if(s>99999999)
{
sorry1();
}
dj=1;
if(key==13)
{
zj=10;
sd=5;
key=0;
TR1=1;
TR0=1;
}
}
}
void shi0() interrupt 1
{
dj=~dj;
}
void shi1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
t++;
if(t>=20)
{
t=0;
sk++;
switch(flag)
{
case 0:
if(sk>=(shu1-1)){sk=0;flag=1;TR0=1;} //停shu1时间
break;
case 1:
if(shu2==0){TR1=0;TR0=0;break;}
else shu2--;
if(sk>=(zj-1)){sk=0;TR0=0;flag=0;} //走zj时间
break;
}
}
}
我写程序本来希望电机按照按键→停shu1→转zj→停shu1.......直到shu2--为0时结束。可是不知为何当我按下按键后电机总是先转,然后才进入正确的循环,而且循环的最后还比自己输入的数值多了一次,但是时间很短。请问各位高手,我该怎么改才对呢?
display();
keys();
if(s>99999999)
{
sorry1();
}
这部分是对应自己输入数值的,所以若大于99999999才会出现sorry1。自己觉得这部分没问题。 展开
{
init();
TMOD=0x12;
TH0=156;
TL0=156;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
ET0=1;
ET1=1;
EA=1;
while(1)
{
display();
keys();
if(s>99999999)
{
sorry1();
}
dj=1;
if(key==13)
{
zj=10;
sd=5;
key=0;
TR1=1;
TR0=1;
}
}
}
void shi0() interrupt 1
{
dj=~dj;
}
void shi1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
t++;
if(t>=20)
{
t=0;
sk++;
switch(flag)
{
case 0:
if(sk>=(shu1-1)){sk=0;flag=1;TR0=1;} //停shu1时间
break;
case 1:
if(shu2==0){TR1=0;TR0=0;break;}
else shu2--;
if(sk>=(zj-1)){sk=0;TR0=0;flag=0;} //走zj时间
break;
}
}
}
我写程序本来希望电机按照按键→停shu1→转zj→停shu1.......直到shu2--为0时结束。可是不知为何当我按下按键后电机总是先转,然后才进入正确的循环,而且循环的最后还比自己输入的数值多了一次,但是时间很短。请问各位高手,我该怎么改才对呢?
display();
keys();
if(s>99999999)
{
sorry1();
}
这部分是对应自己输入数值的,所以若大于99999999才会出现sorry1。自己觉得这部分没问题。 展开
5个回答
展开全部
按照按键→停shu1→转zj→停shu1.......直到shu2--为0时结束。可是不知为何当我按下按键后电机总是先转,
--------
决定《转》、《停》的变量flag,好像没有初始化。
另外,《转》和《停》,只有两个值,用 CASE 结构,明显是跑偏。
用 if...else...,才对路。
稍稍改了改,供参考:
void shi1() interrupt 3
{
TH1 = (65536 - 50000) / 256;
TL1 = (65536 - 50000) % 256;
t++;
if(t >= 20) {
t = 0;
sk++; //sk初始化时是多少?
if(flag) { //flag初始化时是0,还是1?
if(sk >= (zj - 1)) {sk = 0; flag = 0; TR0 = 0;} //走zj时间
shu2--;
if(shu2 == 0) {TR1 = 0; TR0 = 0;}
}
else
if(sk >= (shu1 - 1)) {sk = 0; flag = 1; TR0 = 1;} //停shu1时间
}
====================
而且循环的最后还比自己输入的数值多了一次
----
你输入的数字,竟然能有 99999999 !
很显然,你输入数字的函数,难免有错。
--------
决定《转》、《停》的变量flag,好像没有初始化。
另外,《转》和《停》,只有两个值,用 CASE 结构,明显是跑偏。
用 if...else...,才对路。
稍稍改了改,供参考:
void shi1() interrupt 3
{
TH1 = (65536 - 50000) / 256;
TL1 = (65536 - 50000) % 256;
t++;
if(t >= 20) {
t = 0;
sk++; //sk初始化时是多少?
if(flag) { //flag初始化时是0,还是1?
if(sk >= (zj - 1)) {sk = 0; flag = 0; TR0 = 0;} //走zj时间
shu2--;
if(shu2 == 0) {TR1 = 0; TR0 = 0;}
}
else
if(sk >= (shu1 - 1)) {sk = 0; flag = 1; TR0 = 1;} //停shu1时间
}
====================
而且循环的最后还比自己输入的数值多了一次
----
你输入的数字,竟然能有 99999999 !
很显然,你输入数字的函数,难免有错。
更多追问追答
追问
不行,跟原来的一样。还是电机先走了十几秒。
我的flag初始化时是0,sk就在那了。
追答
不行,跟原来的一样。还是电机先走了十几秒。
--那就检查你输入的数字吧。
我的flag初始化时是0
--如果是零,那就不会转:
if(flag) { //flag初始化时是0,还是1
if(sk >= (zj - 1)) {sk = 0; flag = 0; TR0 = 0;} //走zj时间
sk就在那了。
--难以理解。
展开全部
if(s>99999999) S是什么?他的值能用这么大吗?什么样的数据类型能有这么大
只是对应没有意义,要知道C语言中有没有这么大的值,99999999可是个天文数字。
只是对应没有意义,要知道C语言中有没有这么大的值,99999999可是个天文数字。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
看起来按键程序有点问题。
s是什么类型的变量? 有没有溢出的可能?
s是什么类型的变量? 有没有溢出的可能?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
99999999
是不是溢出了,算算。
是不是溢出了,算算。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
S>99999999? 啥情况?S能有这么大的数值么?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询