绝对值旋转编码器程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);//延时
}
}