光电码盘测速C程序

编程实验

72人已加入

描述

  光电码盘是由光学玻璃制成,在上面刻有许多同心码道,每个码道上都有按一定规律排列的透光和不透光部分。如下图所示。

  

  工作时,光投射在码盘上,码盘随运动物体一起旋转,透过亮区的光经过狭缝后由光敏元件接受,光敏元件的排列与码道一一对应,对于亮区和暗区的光敏元件输出的信号,前者为“1”,后者为“0”,当码盘旋转在不同位置时,光敏元件输出信号的组合反映出一定规律的数字量,代表了码盘轴的角位移。

  光电码盘角位移测量系统工作部分介绍。

  光电码盘按其编码方式分为二进制、十进制和循环码三种方式:

  增量式与绝对式编码器:

  按照工作原理编码器可分为增量式和绝对式两类。增量式编码器是将位移转换成周期性的电信号,再把这个电信号转变成计数脉冲,用脉冲的个数表示位移的大小。绝对式编码器的每一个位置对应一个确定的数字码,因此它的示值只与测量的起始和终止位置有关,而与测量的中间过程无关

  光电码盘测速C程序

  #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;

  }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分