#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);//延时
}
}