📄 cheku.c
字号:
// 写命令子程序 //
// 写数据子程序 //
// 建立自定义字符库 //
#include <reg51.h>
#include<intrins.h>
#include<lcd1602.h>
#define uchar unsigned char
#define uint unsigned int
sbit IRON=P2^1;
sbit beep=P1^7;
sbit lgt=P1^6;
sbit XJL=P2^4;
sbit XJM=P2^3;
sbit XJR=P2^2;
sbit moto_en2 =P1^0;
sbit moto_2 =P1^1; //=1 move; =0 back
sbit moto_pwm2=P1^2;
sbit moto_en1 =P1^3;
sbit moto_1 =P1^4; //=1 move; =0 back
sbit moto_pwm1=P1^5;
sbit DI=P3^5;
sbit DO=P3^4;
sbit CS=P3^1;
sbit CLK=P3^0;
uint adout[2];
uint g,h;
uchar ironcounter=1;
uchar distance[3]={0,0,0};
uint juli=0;
uchar state=0,cstop=0;
uchar code run[]={"RUN:"};
uchar code limit[]={"LIMIT:"};
uchar code irondisplay1[]={"IRON:"};
uchar code irondisplay2[]={"JL:"};
uchar code table[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39} ;
uint lim=0,jj=0,min=0;
uchar dis=0;
timer0() interrupt 1
{
uchar ss, m=0,n=0,pp,qq;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
// cc=min;
lim++;
ss=lim%20;
if(ss==0)
{ dis++;
m=dis/10;
n=dis%10;
lcd_wrcmd(0x86);
lcd_wrdata(table[m]);
lcd_wrdata(table[n]);
if(moto_en1==1 && moto_en2==1)
{
pp=m;
qq=n;
lcd_wrcmd(0x8e);
lcd_wrdata(table[m]);
lcd_wrdata(table[n]);
}
else if(moto_en1==0 && moto_en2==0 && cstop==1)
{
lcd_wrcmd(0x8e);
lcd_wrdata(table[pp]);
lcd_wrdata(table[qq]);
}
}
if(lim==1800)
{
moto_en1=0;
moto_en2=0; //check stop()
lim=0;
TR0=0;
}
}
void ext0(void) interrupt 0
{
juli++;
}
measure()
{
uint mout;
uchar i;
mout=juli;
mout=mout*19/72;
distance[0]=mout/100;
mout=mout%100;
distance[1]=mout/10;
distance[2]=mout%10;
lcd_wrcmd(0xcb);
for(i=0;i<3;i++) lcd_wrdata(0x30+distance[i]);
}
ironcnt()
{ uchar a,b,c,j;
uint i;
// uint cc;
if(IRON==0)
{
measure();
beep=1;
lgt=1;
delay(65000);
beep=0;
lgt=0;
b=ironcounter/10;
c=ironcounter%10;
lcd_wrcmd(0xc5);
lcd_wrdata(table[b]);
lcd_wrdata(table[c]);
while(1)
{
a=IRON;
if((a & 0xff)==0x01) break;
}
ironcounter++;
if( XJL==0 && XJR==0 && XJM==0) //检测到c点铁片
{
moto_en1=0;
moto_en2=0;
for(i=0;i<10;i++)
{ beep=1;lgt=1;
for(j=0;j<10;j++)
delay(5000);
beep=0;lgt=0;
for(j=0;j<10;j++)
delay(5000);
}
moto_en1=1;
moto_en2=1;
state=1;
}
}
}
moveforward()
{ moto_1=1;
moto_2=1;
moto_en1=1;
moto_pwm1=0;
moto_en2=1;
moto_pwm2=0;
}
turn(uchar x,uchar y)
{ moto_1=1;
moto_2=1;
if(x==0) {moto_en1=0; delay(y);moto_en1=1;}
if(y==0) {moto_en2=0; delay(x);moto_en2=1;}
}
unsigned char adc_0838convert(uchar channel)
{
uchar i;
uchar T1,T2=1;
CS=1;
_nop_();_nop_();_nop_();_nop_();
CLK=0;
CS=0; //使AD通道打开
DI = 1; //Start bit=1
CLK = 1;
CLK=0;
CS=0;
DI = 1;
CLK = 1;
for(i=0;i<3;i++)
{
CLK = 0;
if(channel&1)DI=1;
else DI=0;
channel=channel>>1;
CLK = 1;
}
CLK=0;
CLK=1;
for(i=0;i<=6;i++)
{
CLK = 0; //时钟为低电平
DO=1;
if(DO)
{ //如果采集到的位为1
T1=T1+1; //给临时存储Temp1加1
T1=T1<<1;
} //临时存储器左移一位
else
T1=T1<<1; //如果采集到的数位为0,临时存储器左移一位
_nop_();
_nop_();
_nop_();
_nop_();
CLK = 1;
} //时钟为高电平,完成一个时钟周期数据采集
CLK = 0;
if(DO) T1=T1+1;
if(DO) T2=0x80;
CLK = 1;
//采集数据校验
for(i=0;i<=6;i++)
{
CLK=0;
if(DO){
T2=T2>>1;
T2=T2+0x80; }
else
T2=T2>>1;
CLK = 1;
}
CS = 1;
return T2;
}
garage(void)
{
signed char ii,jj;
adout[0]=adc_0838convert(0);
g=adout[0];
delay(5);
adout[1]=adc_0838convert(1);
h=adout[1];
ii=g-h;
jj=h-g;
if(ii>5 )
{ moto_en1=0;
moto_en2=1;
}
if(jj>5)
{ moto_en2=0;
moto_en1=1;
}
if(ii<5 && jj<5)
moveforward();
XJL=1;
XJM=1;
XJR=1;
if(XJL==1 && XJM==1 && XJR==1) {moto_en1=0;moto_en2=0;cstop=1;}
}
move()
{
XJL=1;
XJM=1;
XJR=1;
if(XJL==0 && XJM==1 && XJR==0 ) moveforward();
if(XJL==0 && XJM==1 && XJR==1 ) turn(0,500); //right
if(XJL==1 && XJM==0 && XJR==0 ) turn(65000,0);
if(XJL==0 && XJM==0 && XJR==1 ) turn(0,65000);
if(XJL==1 && XJM==1 && XJR==0 ) turn(500,0); //left
if(XJL==0 && XJM==0 && XJR==0 ) {moto_1=0;moto_2=0;delay(20000);}
ironcnt();
}
main()
{
uchar k;
moto_en1=1;
moto_en2=1;
moto_1=1;
moto_2=1; // check
moto_pwm1=0;
moto_pwm2=0;
lgt=0;
beep=0;
IRON=1;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
EX0=1;
IT0=1;
//display menu
lcd_ini();
lcd_wrcmd(1);
lcd_wrcmd(0x80);
for(k=0;k<6;k++) lcd_wrdata(limit[k]);
lcd_wrcmd(0x8a);
for(k=0;k<4;k++) lcd_wrdata(run[k]);
lcd_wrcmd(0xc0);
for(k=0;k<5;k++) lcd_wrdata(irondisplay1[k]);
lcd_wrcmd(0xc8);
for(k=0;k<3;k++) lcd_wrdata(irondisplay2[k]);
//cm
lcd_wrcmd(0xce);
lcd_wrdata('c');
lcd_wrdata('m');
lcd_wrcmd(0xc5);
lcd_wrdata(0x30);
lcd_wrdata(0x30);
lcd_wrcmd(0xcb);
for(k=0;k<3;k++) lcd_wrdata(0x30);
while(1)
{
// look for cute and iron
if(state==0) move();
// 找光源
if(state==1) garage();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -