关于82C54计数器的程序设计

在控制机器人程序中,需要对机器人的下一位置作出预估,这时就需要知道它目前的速度,然后根据程序周期
算出下一过程需要走过的路程:S=v*T。要测量速度,一般我们用增量型旋转编码器来测量。旋转编码器输出的为脉冲信号。我们这里使用NPN输出,分别为A相,B相和Z相。AB相相差90度的相位差,用来辨识转动方向;Z相每转动一圈产生一个脉冲。

本实例是用的PM511P多功能数据采集板

/*82C54计数器的初始化,为递减计数*/

void Begin_Encoder()
{
 outportb(ADAddr + 0x0f,0x34);   /*初始化clock0 :工作方式为2:比率发生器;CPU读/写方式为先读/写低8位,后读写高8位;数码形式为十六位二进制*/
 outportb(ADAddr + 0x0c,0x00);    /*初始值定为0x2000=8192*/
 outportb(ADAddr + 0x0c,0x20);
}


int In_LaserShaftPosition(void)   
{
 unsigned char dl,dh;
 int d;
 dl = 0;
 dh = 0;
 d  = 0;
 outportb(ADAddr + 0x0f,0x00);      /*锁住计数器,将计数值锁存到寄存器,供CPU读取,锁存操作时,其他四位无效,计数器按原来的方式工作*/
 dl = inportb(ADAddr + 0x0c);       /*读clock0低字节*/
 dh = inportb(ADAddr + 0x0c);       /*读clock0高字节*/
 d  = dh * 0x100 + dl;              /*组合成16位*/
 d  = 4096*2 -d;                    /*输出计数数*/
 return d;
}

你可能感兴趣的:(c,工作)