编码器对应代码.docx
《编码器对应代码.docx》由会员分享,可在线阅读,更多相关《编码器对应代码.docx(15页珍藏版)》请在冰豆网上搜索。
![编码器对应代码.docx](https://file1.bdocx.com/fileroot1/2023-7/3/03bb3b01-81e6-4e55-822e-4f2a7c499aea/03bb3b01-81e6-4e55-822e-4f2a7c499aea1.gif)
编码器对应代码
#include
#include
typedefunsignedcharuchar;
typedefunsignedintuint;
typedefunsignedlongulong;
//数码管显示定义
#defineled_portP1
sbitdm=P2^0;//断码
sbitwm=P2^1;//位码
sbitpb=P3^3;//b相脉冲
sbitgn=P2^2;//功能
sbitqr=P2^3;//确认
sbitjia=P2^4;//加
sbitjian=P2^5;//减
sbitbdqr=P2^6;//标定确认
sbitamc=P3^7;//b相
sbitbmc=P3^6;//a相
bitmcbz,mcbz1;
ulonga,b,f;//a,b显示8位数码管,f脉冲个数
uinte;//e标定数值
ulongj;//j标定后的参数
ucharc,g,d;//c功能键对应数值,g确认按键第几次按下,d发出脉冲宽度调节
ucharbcd[8];
ucharcodewxian[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
ucharcodedxian[]={
0x3f,//0
0x06,//1
0x5b,//2
0x4f,//3
0x66,//4
0x6d,//5显示s
0x7d,//6
0x07,//7
0x7f,//8
0x6f,//9
0x79,//E10
0x31,//T11
0x77,//R12
0x00,//不显示13
0x37,//n14
0x7c,//b15
0x5e//d16
};
voidbin_bcd(ulongf);//脉冲分离函数
voidbinjl(ulonga);//距离数分离函数
voidgnsd(void);//功能键
voidpjiajian(void);//加减
voidxset(void);//显示set
voidreset(void);//显示reset
voidxbd(void);//显示bd
voidbdjiajian(void);//标定按键设置
voidqrhs(void);//确认按键
voidsmxs();
voiddelay(uintt);
bitbz,bz1,bz2,bz3,bz4,bz5,qrbz,qrsd;
bitbz6;//确认跑完
bitqr2,qr3;//按下确认键标志
bitqrpw1;
ucharmcs;
voidmain()
{
a=0;//显示的路程
c=g=0;//设定标志位为1,2,3
d=0;//设定多少输出一个方波
bz=0;//功能键设定加1标志位
bz1=0;//功能键读出的状态
bz2=0;//功能1标志位
bz3=0;//设定2标志位
bz4=0;//标志3标志位
qrbz=0;//确认清零标志位
qrsd=0;//确认设定标志位
qr2=0;
qr3=0;
amc=bmc=0;
TMOD=0x09;
EA=1;
TH0=0;
TL0=0;
EX0=1;
TR0=1;
IT0=1;
while
(1)
{
gnsd();
qrhs();
smxs();
if(bz5==1)
{
bin_bcd(f);
bz2=0;
bz3=0;
bz4=0;
qr2=0;
}
if(bz6==1)
{
g=0;
bz5=0;
j=e*10000000/f;
a=j*b/100000;
binjl(a);
}
}
}
voidto(void)interrupt0
{
if(pb==0)
{
if(bz6==0)
f++;
if(bz6==1)
b++;
mcbz=~mcbz;
if(mcbz==0)
amc=~amc;
if(mcbz==1)
bmc=~bmc;
}
if(pb==1)
{
if(bz6==0)
f--;
if(bz6==1)
b--;
mcbz1=~mcbz1;
if(mcbz1==0)
bmc=~bmc;
if(mcbz1==1)
amc=~amc;
}
if(b==0xffffffff)
b=0;
if(f==0xffffffff)
f=0;
TH0=0;
TL0=0;
}
voidsmxs()
{
uchari;
for(i=0;i<8;i++)
{
led_port=0;
dm=0;
dm=1;
led_port=wxian[i];
wm=0;
wm=1;
led_port=dxian[bcd[i]];
if(i==2&&bz6==1)
led_port=led_port|0x80;
dm=0;
dm=1;
delay(100);
}
}
voiddelay(uintt)
{
while(--t);
}
voidbin_bcd(ulongf)
{
bcd[7]=f/10000000;
bcd[6]=f/1000000;
bcd[5]=f/100000;
bcd[4]=(f%100000)/10000;
bcd[3]=(f%10000)/1000;
bcd[2]=(f%1000)/100;
bcd[1]=(f%100)/10;
bcd[0]=(f%100)%10;
}
voidbinjl(ulonga)
{
bcd[7]=a/10000000;
bcd[6]=a/1000000;
bcd[5]=a/100000;
bcd[4]=(a%100000)/10000;
bcd[3]=(a%10000)/1000;
bcd[2]=(a%1000)/100;
bcd[1]=(a%100)/10;
bcd[0]=(a%100)%10;
}
voidgnsd(void)
{
gn=1;//置1
bz1=gn;//读状态
if(bz1!
=1)
if(bz!
=1)
{
bz=1;
c++;
}
if(bz1==1)
bz=0;
if(c==1)
{
bz2=1;
bz5=0;
}
if(bz2==1)
{
if(qr2==0)
{
xset();
pjiajian();
}
if(qr2==1)
bz5=1;
}
if(c==2)
{
bz2=0;
bz3=1;
}
if(bz3==1)
{
reset();
if(qr2==1)
{
b=0;
a=0;
bz5=1;
}
}
if(c==3)
{
bz3=0;
bz4=1;
}
if(bz4==1)
{
if(qr2==0)
{
xbd();
bdjiajian();
}
if(qr2==1)
{
bz5=1;
}
}
if(c==4)
{
bz4=0;
bz5=1;
c=0;
}
}
voidpjiajian(void)
{
bitbzjia,bzjian,djia,djian;
jia=1;
jian=1;//置1
djia=jia;//读状态
djian=jian;
if(djia!
=1)
if(bzjia!
=1)
{
bzjia=1;
d=d+5;
}
if(djia==1)
bzjia=0;
if(djian!
=1)
if(bzjian!
=1)
{
bzjian=1;
d=d-5;
}
if(djian==1)
bzjian=0;
if(d==0xfffb)
d=0;
}
voidbdjiajian(void)
{
bitbzjia,bzjian,djia,djian;
jia=1;
jian=1;//置1
djia=jia;//读状态
djian=jian;
if(djia!
=1)
if(bzjia!
=1)
{
bzjia=1;
e=e+10;
}
if(djia==1)
bzjia=0;
if(djian!
=1)
if(bzjian!
=1)
{
bzjian=1;
e=e-10;
}
if(djian==1)
bzjian=0;
if(d==0xfffb)
d=0;
}
voidxset(void)
{
bcd[7]=5;//s
bcd[6]=10;//e
bcd[5]=11;//t
bcd[4]=13;
bcd[3]=(d%10000)/1000;
bcd[2]=(d%1000)/100;
bcd[1]=(d%100)/10;
bcd[0]=(d%100)%10;
}
voidxbd(void)
{
bcd[7]=15;//b
bcd[6]=16;//d
bcd[5]=13;
bcd[4]=13;
bcd[3]=(e%10000)/1000;
bcd[2]=(e%1000)/100;
bcd[1]=(e%100)/10;
bcd[0]=(e%100)%10;
}
voidreset(void)
{
bcd[7]=12;//r
bcd[6]=5;//s
bcd[5]=10;//e
bcd[4]=11;//t
bcd[3]=13;
bcd[2]=13;
bcd[1]=13;
bcd[0]=13;
}
voidqrhs(void)
{
qr=1;
qr3=qr;
if(qr3!
=1)
if(qrbz!
=1)
{
qrbz=1;
g++;
}
if(qr3==1)
qrbz=0;
if(g==1)
{
qr2=1;
c=0;
}
if(g==2)
{
g=0;
bz5=0;
bz6=1;
}
}