欢迎来到天天文库
浏览记录
ID:39249362
大小:25.51 KB
页数:4页
时间:2019-06-28
《绝对值旋转编码器程序》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、#include//寄存器头文件包含#include<1602.h>//寄存器头文件包含#include//空操作函数,移位函数头文件包含#defineucharunsignedchar#defineuintunsignedint/*sbitSH_CP=P1^1;//移位时钟脉冲端口sbitDS=P1^2;//串行数据输入端口sbitST_CP=P3^7;//锁存端口*/intinc_data=0;//每刷新一次的增量值intjms=0;//累计增量intm_iPrvSSI=0;in
2、tm_bIsSPI=0;ucharuPrvState=0;sbitAA=P3^3;//sbitBB=P3^4;//这个是时钟sbitZZ=P3^5;//这个是数据sbitBEEP=P1^5;//正反判断bitt_bFang=1;inta;intiSSI=0;inttemp,num,j;ucharled_buf[12];/*定义LED显示缓冲区*/ucharcodetable[]="0123456789";voiddelay(intt){inti,j;for(i=1;i3、;}voidGetSSI(void){ucharix=0;//ucharuState=0;//状态位数据intiSSI=0;//当前的角度数据(0-1023)bitbCrc=0;//奇数或偶数标志位intire=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;//CLKiSSI<<=4、1;//前10位的数据1024if(ZZ)//DO数据{bCrc=!bCrc;//标置位取反,数位中“1”的个数是奇数或偶数来进行校验(初值=0)iSSI5、=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”6、的个数是奇数或偶数来进行校验uState7、=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)8、9、(uState==19));//&&(uState==uPrvState));//16=10000;1910、=10011表示状态位(5位uState)都可以理解为数据正常{if((iSSI<256)&&(m_iPrvSSI>768))//iSSI(0-1023)是这次读出的数据m_iPrvSSI(0-1023)上一次读出的数据{ire=iSSI-m_iPrvSSI+1024;//第一种情况}elseif((m_iPrvSSI<256)&&(iSSI>768)){ire=iSSI-m_iPrvSSI-1024;//第二种情况}else{ire=iSSI-m_iPrvSSI;//第三种情况新数据减去老数据}//------m_iPr11、vSSI=iSSI;//刷新数据,新数据替换老数据,为下一次做好准备inc_data=ire;a=jms+=inc_data;//显示累计长度}}AA=1;//使能CSN置高,为下次准备if(a>=500)BEEP=0;elseBEEP=1;}voidmain(){init();while(1){GetSSI();//读编码器数值//a=m_iPrvSSI;//显示0-1023值位置值//a=-a;Display(0x80+0x00,table[a/10000]);//1602显示子程序Display(0x80+0x01,12、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(0
3、;}voidGetSSI(void){ucharix=0;//ucharuState=0;//状态位数据intiSSI=0;//当前的角度数据(0-1023)bitbCrc=0;//奇数或偶数标志位intire=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;//CLKiSSI<<=
4、1;//前10位的数据1024if(ZZ)//DO数据{bCrc=!bCrc;//标置位取反,数位中“1”的个数是奇数或偶数来进行校验(初值=0)iSSI
5、=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”
6、的个数是奇数或偶数来进行校验uState
7、=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)
8、
9、(uState==19));//&&(uState==uPrvState));//16=10000;19
10、=10011表示状态位(5位uState)都可以理解为数据正常{if((iSSI<256)&&(m_iPrvSSI>768))//iSSI(0-1023)是这次读出的数据m_iPrvSSI(0-1023)上一次读出的数据{ire=iSSI-m_iPrvSSI+1024;//第一种情况}elseif((m_iPrvSSI<256)&&(iSSI>768)){ire=iSSI-m_iPrvSSI-1024;//第二种情况}else{ire=iSSI-m_iPrvSSI;//第三种情况新数据减去老数据}//------m_iPr
11、vSSI=iSSI;//刷新数据,新数据替换老数据,为下一次做好准备inc_data=ire;a=jms+=inc_data;//显示累计长度}}AA=1;//使能CSN置高,为下次准备if(a>=500)BEEP=0;elseBEEP=1;}voidmain(){init();while(1){GetSSI();//读编码器数值//a=m_iPrvSSI;//显示0-1023值位置值//a=-a;Display(0x80+0x00,table[a/10000]);//1602显示子程序Display(0x80+0x01,
12、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(0
此文档下载收益归作者所有