绝对值旋转编码器程序

#include <reg52.h>  //  寄存器头文件包含
#include <1602.h>  //  寄存器头文件包含
#include <intrins.h>  //  空操作函数,移位函数头文件包含
#define uchar unsigned char
#define  uint unsigned int
  /*
sbit SH_CP = P1^1;  //移位时钟脉冲端口
sbit    DS = P1^2;    // 串行数据输入端口
sbit ST_CP = P3^7;  //锁存端口
  */
int inc_data=0;      //每刷新一次的增量值
int jms=0;            //累计增量
int m_iPrvSSI = 0;
int m_bIsSPI = 0;           
uchar uPrvState = 0;
sbit AA = P3^3;//
sbit BB = P3^4;//这个是时钟
sbit ZZ = P3^5;//这个是数据
sbit BEEP=P1^5;
//正反判断
bit t_bFang = 1;
  int a;
int iSSI = 0;
int temp,num,j;
uchar led_buf[12];      /*定义LED显示缓冲区*/
uchar code table[]="0123456789";
void delay (int t)
{
  int i,j;
  for(i=1;i<t;i++);管串
  for (j=1;j<25000;j++);
 
}
void GetSSI(void)
{
    uchar ix = 0;      //
    uchar uState = 0; //状态位数据
    int iSSI = 0;//当前的角度数据(0-1023)
      bit bCrc = 0; // 奇数偶数标志位
    int ire = 0; //增量数据,表示上次正确读的数据,和这次正确读的位置差
观测值
    AA = 0;  //CSN
    _nop_();_nop_();
    BB = 0;//CLK
    _nop_();_nop_();
    BB = 1;//CLK
    _nop_();_nop_();
    for(ix = 0; ix < 10;ix++)//读10次 前10位数据
    {
        BB = 0;//CLK
        iSSI <<= 1;//前10位的数据1024
医疗废物焚烧
        if(ZZ)//DO数据
        {
            bCrc = !bCrc;//标置位取反,数位中“1”的个数是奇数或偶数来进行校验 (初值=0)
            iSSI |= 1;//最后位置1
        }
        BB = 1;//CLK
        _nop_();_nop_();
    }
    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
    for(ix = 0; ix < 5;ix++)//读5次状态位标志!
    {
        BB = 0;
        uState <<= 1; //后五位的数据状态位
        if(ZZ)
        {
            bCrc = !bCrc;//数位中“1”的个数是奇数或偶数来进行校验
            uState |= 1;//数据等于1置1
        }
        BB = 1;
        _nop_();_nop_();_nop_();
    }
   
    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
       
    if(ZZ == bCrc)//最后一位校验一下,要是奇偶通不过,就认为CRC错误 ,就当这次无效               
    {   
        AA = 1;//使能CSN置高,为下次准备
        if((uState == 16)||(uState == 19));//&&(uState == uPrvState));    //16=10000;19=10011  表示状态位(5位uState) 都可以理解为数据正常
        {
            if((iSSI < 256)&&(m_iPrvSSI > 768))    //                                        iSSI(0-1023)是这次读出的数据      m_iPrvSSI(0-1023)上一次读出的数据
            {
                ire = iSSI - m_iPrvSSI + 1024;    // 第一种情况
            }else
            if((m_iPrvSSI < 256)&&(iSSI > 768))
            {
压模混凝土                ire = iSSI - m_iPrvSSI - 1024;    //    第二种情况
            }else
            {
                ire = iSSI - m_iPrvSSI;//              第三种情况      新数据减去老数据
            }
            //------
            m_iPrvSSI = iSSI;//    刷新数据,新数据替换老数据 ,为下一次做好准备
            inc_data=ire;
            a=jms+=inc_data;//显示累计长度
        }
      }软硬共挤
    AA = 1;//使能CSN置高,为下次准备
    if(a>=500)      BEEP=0;
    else  BEEP=1;
}   
活动装置       
void main()
{        init();
  while(1)
  {
  GetSSI();//读编码器数值
  //a=m_iPrvSSI;//显示0-1023值位置值
//  a=-a;
  Display(0x80+0x00,table[a/10000]);          //1602显示子程序
  Display(0x80+0x01,table[a%10000/1000]);          //1602显示子程序
  Display(0x80+0x02,table[a%10000%1000/100]);          //1602显示子程序
  Display(0x80+0x03,table[a%10000%1000%100/10]);          //1602显示子程序
  Display(0x80+0x04,table[a%10000%1000%100%10]);          //1602显示子程序
  //display();//显示a的值
  delay(30);//延时
  }
}

本文发布于:2024-09-22 12:26:42,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/198546.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   显示   偶数   函数   奇数
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议