#include <AT89X52.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit A_input1 = P1^4;
sbit A_input2 = P1^5;
sbit A_enable = P1^2;//控制驱动机
sbit B_input1 = P1^6;
sbit B_input2 = P1^7;
sbit B_enable = P1^3;//控制舵动机
//sbit endd = P2^0; //接后面的红外检测
sbit left =P0^7;
sbit midleft=P0^6;
sbit midrigh=P0^5;
sbit righ=P0^4;
sbit intrep1=P0^3;//接1中断
sbit K1=P2^0; //按键
sbit K2=P2^1;
sbit K3=P2^2;
sbit K4=P2^3;
sbit CLK=P0^0;
sbit DAT=P0^1;
sbit CS =P0^2;
sbit led =P1^1;
uint s,s1,c4,c5,c6;
uchar DATA_7SEG[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 };
unsigned int set,shu1,shu2,c8,c9,m,time1,time2,time3,time4,time5,time6,time7,t,t1;
int ph,ph1,we,wr,wt,wy,g1,f1,f2,f3,f4,f5,nn=8,mm,qq;
long c1,c2,c3;
long adc,w,wz,w1;
/*延时子函数*/
void delay(uint kk)
{
uint i1,j1;
for(i1=0;i1<kk;i1++)
{
for(j1=0;j1<248;j1++)
{;}
}
}
uchar TLC549ADC(void)
{
uchar i,x;
CLK=0;
DAT=1;
CS=0;
for(i=0;i<8;i++)
{
CLK=1;
;
;
x<<=1;
if(DAT==1) x++;
CLK=0;
;
;
}
CS=1;
return (x);
}
void xiansishij()
{P3=DATA_7SEG[time3];P2_4=0;delay(1);
P2_4=1;
P3=DATA_7SEG[time6];P2_7=0;delay(1);
P2_7=1;
P3=DATA_7SEG[time5];P2_6=0;delay(1);
P2_6=1;
P3=DATA_7SEG[time4]&0x7f;P2_5=0;delay(1);
P2_5=1;
}
void guiji()
{int z;
if((midleft==0)&&(midrigh==0)&&(left==0)&&(righ==0))
{
B_input1=0;
B_input2=0;
B_enable=0;
A_input1 = 1;
A_input2 = 0;
A_enable = 1;
}
if(midleft==1){
B_input1=1;
B_input2=0;
B_enable = 1;
for(z=0;z<40;z++);
B_input1=0;
B_input2=1;
B_enable = 1;
for(z=0;z<20;z++);
}
if(midrigh==1){
B_input1=0;
B_input2=1;
B_enable=1;
for(z=0;z<40;z++);
B_input1=1;
B_input2=0;
B_enable = 1;
for(z=0;z<20;z++);
}
if(left==1){ //c8=0x02;
//c9=0x00;
B_input1=1;
B_input2=0;
B_enable = 1;
for(z=0;z<40;z++);
B_input1=0;
B_input2=1;
B_enable = 1;
for(z=0;z<20;z++);
// B_input1=0;
// B_input2=0;
//B_enable=0;
}
if(righ==1){ //c8=0x02;
//c9=0x00;
B_input1=0;
B_input2=1;
B_enable=1;
for(z=0;z<40;z++);
B_input1=1;
B_input2=0;
B_enable = 1;
for(z=0;z<20;z++);
//B_input1=0;
//B_input2=0;
//B_enable=0;
}
}
void xiansi()
{P3=0xc0;P2_4=0;delay(2);
P2_4=1;
P3=DATA_7SEG[c1]&0x7f;P2_7=0;delay(2);
P2_7=1;
P3=DATA_7SEG[c2];P2_6=0;delay(2);
P2_6=1;
P3=DATA_7SEG[c3];P2_5=0;delay(2);
P2_5=1;
}
void xiansi1()
{P3=0xc0;P2_4=0;delay(2);
P2_4=1;
P3=DATA_7SEG[c4];P2_7=0;delay(2);
P2_7=1;
P3=DATA_7SEG[c5];P2_6=0;delay(2);
P2_6=1;
P3=DATA_7SEG[c6]&0x7f;P2_5=0;delay(2);
P2_5=1;
}
void dianya() //看平衡电压的函数
{ led=0;
adc=TLC549ADC();
w1=(adc*500)/255;
ph1++;
if(ph1>5)
{
w=w1;
ph1=0;
}
c1=w%10;
c2=(w/10)%10;
c3=(w/100)%10;
xiansi();
led=0;
}
void xiansishu()
{P3=0xc0;P2_4=0;delay(1);
P2_4=1;
P3=0xc0;P2_7=0;delay(1);
P2_7=1;
P3=DATA_7SEG[f3];P2_6=0;delay(1);
P2_6=1;
P3=DATA_7SEG[f4]&0x7f;P2_5=0;delay(1);
P2_5=1;
}
void xiangais()
{P3=0xc0;P2_4=0;delay(1);
P2_4=1;
P3=0xc0;P2_7=0;delay(1);
P2_7=1;
P3=DATA_7SEG[mm];P2_6=0;delay(1);
P2_6=1;
P3=DATA_7SEG[qq]&0x7f;P2_5=0;delay(1);
P2_5=1;
}
void timetiaozh(void)
{
TR1=0;
if(!K2) //k3按键处理
{
f1++; //值加1
while(!K2); //等待按键松开
for(m=0;m<250;m++); //松开按键去抖
}
f2=f1*10;
f3=f2/10;
f4=f2%10;
xiansishu();
}
void scan_key()
{TR1=0;
if(!K1) //k3按键处理
{
set++; //值加1
if(set>=5)set=0;
while(!K1); //等待按键松开
for(m=0;m<250;m++); //松开按键去抖
}
}
void gais()
{TR1=0;
if(!K2) //k3按键处理
{
nn++; //值加1
while(!K2); //等待按键松开
for(m=0;m<250;m++); //松开按键去抖
}
mm=nn/10;
qq=nn%10;
xiangais();
}
void time_adj()
{
TR0=0;
TR1=0;
time2=0;
time1=0;
A_input1 = 0;
A_input2 = 0;
A_enable = 0;
if(!K2) //k1按键处理
{
shu1++; //值减1
if(shu1>30)shu1=0;
while(!K2); //等待按键松开
for(m=0;m<250;m++); //松开按键去抖
}
if(!K3) //k3按键处理
{
shu2++; //值减1
if(shu2>9)shu1=0;
while(!K3); //等待按键松开
for(m=0;m<250;m++); //松开按键去抖
}
if(!K4) //k3按键处理
{
shu1--; //值减1
if(shu2<0)shu1=30;
while(!K4); //等待按键松开
for(m=0;m<250;m++); //松开按键去抖
}
wz=shu1*10+shu2;
c4=wz%10;
c5=(wz/10)%10;
c6=(wz/100)%10;
xiansi1();
led=0;
}
void timer0() interrupt 1 using 2 //定义定时器0
{
// TF0=0;
TH0=0x3c;
TL0=0xb0;
s++;
}
void timer1() interrupt 3 using 3 //定义定时器1
{TH1=0xb1;
TL1=0xdf;
t1++;}
void time()
{
TR0=1;
TR1=1;
if(s<9)
{ A_input1 = 1;
A_input2 = 0;
A_enable = 1;}
if(s>=9)
{A_input1 = 0;
A_input2 = 0;
A_enable = 0;
}
if(s==24) s=0;
adc=TLC549ADC();
w1=(adc*500)/255;
ph1++;
if(ph1>2)
{
w=w1;
ph1=0;
}
if(t1>60){time1++;//时间
time7++;
t1=0; }
if(time1>59)
{time2++;
time1=0;}
time3=time2/10;
time4=time2%10;
time5=time1/10;
time6=time1%10;
xiansishij(); //显示时间
guiji();
if((wz-w)<10)//||((wz-w)>-10)
{TR0=0;
s=10;
A_input1 = 0;
A_input2 = 0;
A_enable = 0;
}
if((w-wz)>10)
{A_input1 = 0;
A_input2 = 1;
A_enable = 1;
delay(8);
A_input1 = 0;
A_input2 = 0;
A_enable = 0;
}
if(time7==f2)
{led=1;}
if(time7==(f2+8))
{ TR0=1;
s=3;
}
if((left==1)&&(righ==1)&&(midrigh==1)&&(midleft==1))
{ A_input1 = 0;
A_input2 = 1;
A_enable = 1;
delay(500);
while(1);
A_input1 = 0;
A_input2 = 0;
A_enable = 0;
}
}
void main()
{
TMOD=0X11;
//IT1=0; //电平触发
//EX1=1;
//PT1=1;
TH0=0x3c;
TL0=0xb0;
TH1=0xb1;
TL1=0xdf;
ET1=1;
ET0=1;
EA=1;
TR0=1;
led=0;
while(1)
{
scan_key();
switch(set) /*根据set键值散转*/
{
case 0:time();break; /*转动程序*/
case 1:dianya();break; //电压调整
case 2:time_adj();break; /*转动调整*/
case 3:timetiaozh();break;
case 4:gais();break;
default:break; /*其它退出*/
}
}
}