#include "reg51.h"
#include <intrins.h>
#include <math.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
uint num=0,sum=0,i=0,weigth=0,m=0;
float k=0;
unsigned int weigth1=0,weigth2=0,key=0,signal=1070;
sbit IN1=P1^0; //???????о????
sbit IN2=P1^1;
sbit EN1=P1^2;
sbit ADC_DI=P1^3; //?????CH0,CH1
sbit ADC_DO=P1^3; //?????
sbit ADC_CLK=P1^5; //????
sbit ADC_CS=P1^4; //????
//???n??12MHz??
void delay_s(unsigned int n)
{
unsigned int i=0,j=0;
for(i=0;i<n;i++)
for(j=0;j<21738;j++);
}
//???n????
void delay_ms(unsigned int n)
{
unsigned int i=0,j=0;
for(i=0;i<n;i++)
for(j=0;j<123;j++);
}
void ADC_init() //ADC0832?????
{
ADC_CS=1; //?????????????Ч
ADC_CLK=1; //????
ADC_DI=1; //?????
_nop_();_nop_();
}
void ADC_start() //ADC0832???
{
ADC_CS=0; //????
_nop_();_nop_();
ADC_CLK=0; //???????????????
_nop_();_nop_();
ADC_DI=1; //?????????
_nop_();_nop_();
ADC_CLK=1; //?????????????????????????????
_nop_();_nop_();
}
void ADC_select_channel() //ADC0832??????????????CH0
{
ADC_CLK=0; //???????????????
_nop_();_nop_();
ADC_DI=0; //DI?1?????????????????????DI?
_nop_();_nop_();
ADC_CLK=1; //?????????????????????????????
_nop_();_nop_();
ADC_CLK=0; //????????????????
_nop_();_nop_();
ADC_DI=0; //???????????DI?0???CH0????DI?1?????
_nop_();_nop_();
ADC_CLK=1; //???????????????????????????????
_nop_();_nop_();
}
uchar ADC0832()
{
uchar dat1,dat2,i; //???????????dat1?????8λdat2?????8λ
ADC_CLK=0; //?????????????????
_nop_();_nop_();
ADC_DI=0; //???????
_nop_();_nop_();
ADC_DO=1; //??????
_nop_();_nop_();
ADC_CLK=1; //???????????????????????????????壩
_nop_();_nop_();
for(i=0;i<8;i++) //???8????????????ε???????
{
ADC_CLK=0; //???????????????
_nop_();_nop_();
dat1=dat1<<1; //????dat1???????????λ??dat1???λ?????λ7λ??0λ
if(ADC_DO==1) //?ж????????????
{
dat1=dat1|0x01; //???????????????????dat1???λ???1
}
ADC_CLK=1; //?????????????????????????????
_nop_();_nop_();
}
for(i=0;i<8;i++) //???8?????????????ε???????
{
dat2=dat2>>1; //????dat2???????????λ?????dat2???λ????λ0λ????7λ??
if(ADC_DO==1) //?ж????????????
{
dat2=dat2|0x80; //???????????????????dat2???λ??1
}
ADC_CLK=0; //????????????????
_nop_();_nop_();
ADC_CLK=1; //???????????????????????????????
_nop_();_nop_();
}
ADC_CS=1; //??????
_nop_();_nop_();
if(dat1==dat2) //?ж????????????
{
return dat1; //???????????uchar ADC0832()=dat1
}
else
{
return 0; //?????????????0
}
}
//??????涨???????
void exter() interrupt 0
{
i++;
if(i==key)
{
EN1=1;
IN1=1;
IN2=1;
i=0;
}
}
void main()
{
ADC_init();
ADC_start();
IT0=1;
EA=1;
EX0=1;
while(1)
{
ADC_select_channel();
while(1) //?
{
weigth1=ADC0832();
delay_s(20);
weigth2=ADC0832();
if(weigth1>=60)
{
if(abs(weigth2-weigth1)/weigth2<=0.1)
break;
}
}
if(weigth2<=90) //60-90kg???????
{
k=(weigth2/5-12)*signal/1.5;
key=ceil(k);
IN1=1;
IN2=0;
EN1=1;
delay_ms(4000);
}
else //????
{
key=signal*4;
IN1=1;
IN2=0;
EN1=1;
delay_ms(4000);
}
while(1) //????????????С??5kg??
{
ADC_init ();
ADC_start ();
weigth1=ADC0832();
// weigth1=10,weigth2=10; //test
if(weigth1<=20)
{
delay_ms(1500);
ADC_init ();
ADC_start ();
weigth2=ADC0832();
if(weigth2<=20)
{
IN1=0;
IN2=1;
EN1=1;
i=0;
delay_ms(4000);
// weigth1=90,weigth2=90; //test
break;
}
}
}
}
}