编程实验
光电码盘是由光学玻璃制成,在上面刻有许多同心码道,每个码道上都有按一定规律排列的透光和不透光部分。如下图所示。
工作时,光投射在码盘上,码盘随运动物体一起旋转,透过亮区的光经过狭缝后由光敏元件接受,光敏元件的排列与码道一一对应,对于亮区和暗区的光敏元件输出的信号,前者为“1”,后者为“0”,当码盘旋转在不同位置时,光敏元件输出信号的组合反映出一定规律的数字量,代表了码盘轴的角位移。
光电码盘角位移测量系统工作部分介绍。
光电码盘按其编码方式分为二进制、十进制和循环码三种方式:
增量式与绝对式编码器:
按照工作原理编码器可分为增量式和绝对式两类。增量式编码器是将位移转换成周期性的电信号,再把这个电信号转变成计数脉冲,用脉冲的个数表示位移的大小。绝对式编码器的每一个位置对应一个确定的数字码,因此它的示值只与测量的起始和终止位置有关,而与测量的中间过程无关
#include《reg51.h》
#include《intrins.h》
#define uint unsignedint
#define uchar unsigned char
float f=0;
uchar LED0_data,LED1_data,LED2_data,LED3_data;
uchari=0;
uchar code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void display();
void delay(uint v);
voidinit();
/*定时器初始化*/
voidinit()
{
TMOD=0x51; //T1计数器,T0定时器,方式1
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1; //开总中断
TL1=0;
TH1=0;
ET0=1;
//开定时器0中断
}
/*延时子函数*/
void delay(unsigned int c)
{
unsignedinti,j;
for(i=c;i》0;i--)
for(j=110;j》0;j--);
}
/*将十进制数拆成送数码管的显示码*/
voiddectobit(intdec)
{
LED3_data=dec/1000;
dec=dec % 1000;
LED2_data=dec/100;
dec=dec % 100;
LED1_data=dec/10;
dec=dec % 10;
LED0_data=dec;
}
/*显示程序*/
void display()
{
P0=table[LED3_data]; //个位
P2&=~0x01;
delay(10);
P2|=0x01;
P0=table[LED2_data]; //十位
P2&=~0x02;
delay(20);
P2|=0x02;
P0=table[LED1_data];
P2&=~0x04;
delay(20);
P2|=0x04; //百位
P0=table[LED0_data]; //千位
P2&=~0x08;
delay(20);
P2|=0x08;
}
void main(void)
{
init();
TR0=1;
//启动定时器0
TR1=1;
while(1)
{
dectobit(f);
display();
}
}
timer()interrupt 1 using 2
{
i=i+1; if(i==100)
{
i=0;
f=TH1*256+TL1;
TH1=0;
TL1=0;
}
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
}
全部0条评论
快来发表一下你的评论吧 !