绝对值旋转编码器程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

绝对值旋转编码器程序 #include // 寄存器头文件包含

#include // 寄存器头文件包含

#include // 空操作函数,移位函数头文件包含

#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

for (j=1;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

{

BB = 0;//CLK

iSSI

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

{

BB = 0;

uState

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 768)) // iSSI(0-1023)是这次读出的数据 m_iPrvSSI(0-1023)上一次读出的数据

{

ire = iSSI - m_iPrvSSI + 1024; // 第一种情况

}else

if((m_iPrvSSI 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);//延时

}

}

相关文档
最新文档