测速器,通过外部中断测马达的速度,在数码管显示出来,代码写好了,不过好像还不能实现,希望各位大侠给小弟菜鸟一些建议,谢谢了
//马达转一圈(360度)产生1024个脉冲
因为刚学没多久,还没能清楚地看出是那里出了问题,希望各位可以帮帮忙
还有就是下面speed那些小数,整数因为还不会怎么表达出来,所以最后全写成非小数形势。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
float k,angle,a;//k为比值,a为0.01秒即10毫秒
uint i,speed;
uchar t,one,two,three;
uchar code dulama[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void init()
{
k=360/1024;
EA=1;
EX0=1;
IT0=1;
TMOD=0x01;
ET0=1;
a=0.01;
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar one,uchar two,uchar three)
{
wela=1;
P0=0xfe;
wela=0;
P0=0xff;
dula=1;
P0=dulama[one];
dula=0;
delay(1);
wela=1;
P0=0xfd;
wela=0;
P0=0xff;
dula=1;
P0=dulama[two];
dula=0;
delay(1);
wela=1;
P0=0xfb;
wela=0;
P0=0xff;
dula=1;
P0=dulama[three];
dula=0;
delay(1);
}
void main()
{
init();
while(1)
{
if(t==20)
{
EA=0;
angle=i*k;
speed=angle/(t*a);
i=0;
t=0;
one=speed/100;
two=speed%100/10;
three=speed%10;
display(one,two,three);
}
EA=1;
//display(one,two,three);
}
}
void int0() interrupt 0
{
i++;
TR0=1;
}
void timer0() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
t++;
}
[最优解释]
该回复于2012-11-19 12:56:08被版主删除
[其他解释]
建议很简单 自己慢慢仔细调试
[其他解释]
void int0() interrupt 0
{
i++;
TR0=1;
}
从外中断启动内中断。。。。这。。。。。。不合适吧。
而且你a为0.01秒也没有在程序中体现。
angle=i*k;
speed=angle/(t*a);
i是在启动外中断时候,i加一。
k为定值,i外中断后为1,angle也是定值了。在执行进入这2个行代码的程序时,t是20,a你说是0.01秒更加是定值了。那好了,speed也是定值了。不用测了。。无效了。
记着i=0,出个数,speed自动清零了。。。
自行检查把,这个程序问题还是很大了。
[其他解释]
“测马达的速度”有 M 法(一定时间内多少电机脉冲) 和 T(2个电机脉冲间多少个时钟) 法。
看看原理吧。
[其他解释]