#include<intrins.h>
#include<lcd.h>
#include"temp.h"
#define GPIO_MOTOR P1 //低四位motor1,高四位motor2
#define NULL 0
#define TRUE 1
#define FALSE 0
//配置的参数定义
#define TEST_RPMAX 0x00
#define TEST_RPMIN 0X3F
// Final Test Range
#define TEST_RP_MSB_MAX 0x12 /**< maximum value for proximity data */
#define TEST_RP_MSB_MIN 0x0A /**< minimum value for proximity data */
#define TEST_FC_MAX 0x0D5D /**< maximum value for frequency counter */
#define TEST_FC_MIN 0x0D39 /**< minimum value for frequency counter */
//LDC1000寄存器定义 详见芯片手册寄存器说明部分
// LDC COMMANDS
#define LDC1000_CMD_REVID 0x00
#define LDC1000_CMD_RPMAX 0x01
#define LDC1000_CMD_RPMIN 0x02
#define LDC1000_CMD_SENSORFREQ 0x03
#define LDC1000_CMD_LDCCONFIG 0x04
#define LDC1000_CMD_CLKCONFIG 0x05
#define LDC1000_CMD_THRESHILSB 0x06
#define LDC1000_CMD_THRESHIMSB 0x07
#define LDC1000_CMD_THRESLOLSB 0x08
#define LDC1000_CMD_THRESLOMSB 0x09
#define LDC1000_CMD_INTCONFIG 0x0A
#define LDC1000_CMD_PWRCONFIG 0x0B
#define LDC1000_CMD_STATUS 0x20
#define LDC1000_CMD_PROXLSB 0x21
#define LDC1000_CMD_PROXMSB 0x22
#define LDC1000_CMD_FREQCTRLSB 0x23
#define LDC1000_CMD_FREQCTRMID 0x24
#define LDC1000_CMD_FREQCTRMSB 0x25
#define uint8_t unsigned char
#define uint16_t unsigned int
#define uint32_t unsigned long
//引脚定义
sbit SDO =P2^3; //ldc1000的SDO
sbit SDI =P2^2; //ldc1000的SDI
sbit SCLK =P2^0; //ldc1000的SCLK
sbit CS =P2^1; //ldc1000的CS
sbit int0=P3^2; //ldc1000的INTB未用
sbit turn=P2^4;
sbit led =P3^0;
sbit beep=P3^1;
uchar codea,codeb,f=1,RPMAX=0X10,RPMIN=0X33,m,h;
int codem,fsen,delay=60000;
unsigned char code number[10]={'0','1','2','3','4','5','6','7','8','9'};
//变量
bit direct=0;
unsigned int cont=512,cont2=100,temp2; //时钟配置
uchar timer0=0,mm,ff;
void delay2us(void); //延时
uchar read_spi(uchar); //SPI读函数
void write_spi(uint8_t add,uint8_t w_data); //SPI写函数
void ldc1000_int(void);
void stop(void); //LDC1000初始化函数
void Com_Init(void)
{
IT0=1;
EX0=1;
EA=1;
}
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0x3C;
TL0 = 0xB0;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void delay20ms(void) //误差 0us
{
unsigned char a,b;
for(b=215;b>0;b--)
for(a=45;a>0;a--);
_nop_(); //if Keil,require use intrins.h
_nop_(); //if Keil,require use intrins.h
}
void stop(void) interrupt 0
{
void Motor(bit direct,unsigned motor,unsigned char speed);
uchar temp=100;
delay20ms();
if(int0==0)
{
while(delay--);
delay=60000;
while(delay--);
delay=60000;
while(delay--);
delay=60000;
while(delay--);
delay=60000;
while(delay--);
delay=60000;
while(delay--);
delay=60000;
codea=read_spi(LDC1000_CMD_PROXLSB);
codeb=read_spi(LDC1000_CMD_PROXMSB);
codem=codeb*256+codea;
if(codem<15000)
{
while(delay--);
delay=60000;
while(delay--);
delay=60000;
while(delay--);
delay=60000;
while(delay--);
delay=60000;
while(delay--);
delay=60000;
while(delay--);
delay=60000;
while(temp--)
Motor(0,1,2);
}
else
{
}
LcdWriteCom(0x01);
LcdWriteCom(0x01);
LcdWriteCom(0x80+0x01);
LcdWriteData('F');
LcdWriteData('I');
LcdWriteData('N');
LcdWriteData('D');
LcdWriteData(' ');
LcdWriteData('S');
LcdWriteData('U');
LcdWriteData('C');
LcdWriteData('C');
LcdWriteData('E');
LcdWriteData('S');
LcdWriteData('S');
led=1;
beep=0;
while(1);
/*
while(delay--);
delay=60000;
while(delay--);
delay=60000;
temp2=codem;
while(temp--)
Motor(direct,0,2);
temp=5;
while(delay--);
delay=60000;
while(delay--);
delay=60000;
codea=read_spi(LDC1000_CMD_PROXLSB);
codeb=read_spi(LDC1000_CMD_PROXMSB);
codem=codeb*256+codea;
if(codem>temp2)
{
LcdWriteCom(0x01);
LcdWriteCom(0x01);
LcdWriteCom(0x80+0x01);
LcdWriteData('F');
LcdWriteData('I');
LcdWriteData('N');
LcdWriteData('D');
LcdWriteData(' ');
LcdWriteData('S');
LcdWriteData('U');
LcdWriteData('C');
LcdWriteData('C');
LcdWriteData('E');
LcdWriteData('S');
LcdWriteData('S');
led=1;
beep=0;
while(1);
}
else
{ while(delay--);
delay=60000;
while(delay--);
delay=60000;
temp2=codem;
temp=5;
while(temp--)
Motor(0,1,2);
codea=read_spi(LDC1000_CMD_PROXLSB);
codeb=read_spi(LDC1000_CMD_PROXMSB);
codem=codeb*256+codea;
if(codem<temp2)
{
LcdWriteCom(0x01);
LcdWriteCom(0x01);
LcdWriteCom(0x80+0x01);
LcdWriteData('F');
LcdWriteData('I');
LcdWriteData('N');
LcdWriteData('D');
LcdWriteData(' ');
LcdWriteData('S');
LcdWriteData('U');
LcdWriteData('C');
LcdWriteData('C');
LcdWriteData('E');
LcdWriteData('S');
LcdWriteData('S');
led=1;
beep=0;
}
else
{
while(delay--);
delay=60000;
while(delay--);
delay=60000;
temp=3;
while(temp--)
Motor(1,1,2);
LcdWriteCom(0x01);
LcdWriteCom(0x01);
LcdWriteCom(0x80+0x01);
LcdWriteData('F');
LcdWriteData('I');
LcdWriteData('N');
LcdWriteData('D');
LcdWriteData(' ');
LcdWriteData('S');
LcdWriteData('U');
LcdWriteData('C');
LcdWriteData('C');
LcdWriteData('E');
LcdWriteData('S');
LcdWriteData('S');
led=1;
beep=0;
}
}
while(temp--)
Motor(direct,0,2);
//direct=~direct;
if(codem<18000)
{
while(temp--)
Motor(direct,0,2); }
} */
}
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0x3C;
TL0 = 0xB0;
timer0++;
if(timer0==20)
{
mm++;
if(mm==60)
{
ff++;
mm=0;
}
if(ff==2)
{
LcdWriteCom(0x01);
LcdWriteCom(0x80+0x01);
LcdWriteData('T');
LcdWriteData('I');
LcdWriteData('M');
LcdWriteData('E');
LcdWriteData(' ');
LcdWriteData('O');
LcdWriteData('V');
LcdWriteData('E');
LcdWriteData('R');
LcdWriteData('.');
LcdWriteData('.');
LcdWriteData('.');
while(1);
}
timer0=0;
LcdWriteCom(0x80+0x01);
LcdWriteCom(0x80+0x01);
LcdWriteCom(0x80+0x01);
LcdWriteData(number[ff]);
LcdWriteCom(0x80+0x02);
LcdWriteData(':');
LcdWriteCom(0x80+0x03);
LcdWriteData(number[mm/10]);
LcdWriteCom(0x80+0x04);
LcdWriteData(number[mm%10]);
LcdWriteData(' ');
LcdWriteData(' ');
LcdWriteData(' ');
if(mm%5==0)
LcdDisplay(Ds18b20ReadTemp());
}
}
void write_spi(uint8_t add,uint8_t w_data)
{
uint8_t ss;
uint8_t sss=0;
SCLK=0;
CS=0;
for(ss=0;ss<8;ss++)
{
SCLK=0;
delay2us();
SDI=add&0x80;
delay2us();
SCLK=1;
add=add<<1;
}
for(ss=0;ss<8;ss++)
{
SCLK=0;
delay2us();
SDI=w_data&0x80;
delay2us();
SCLK=1;
w_data=w_data<<1;
}
SCLK=0;
CS=1;
}
//LDC1000读数据
uchar read_spi(uchar add)
{
uint8_t ss ,t;
uint8_t sss=0;
SCLK=0; //SCLK=0;
CS=0; //CS=
add+=0x80; //地址高位置1为读
for(ss=0;ss<8;ss++)
{
SCLK=0;
delay2us();
SDI=add&0x80;
delay2us();
SCLK=1;
add=add<<1;
}
delay2us();
for(ss=0;ss<8;ss++)
{
sss=sss<<1;
SCLK=0;
delay2us();
t=SDO;
sss=sss+t;
SCLK=1;
delay2us();
}
SCLK=0; //SCLK=0;
CS=1; //CS=1
return sss;
}
//LDC1000初始化函数
void ldc1000_int(void)
{
write_spi(LDC1000_CMD_RPMAX, RPMAX); //配置RP最大值
write_spi(LDC1000_CMD_RPMIN, RPMIN); //配置RP最小值
write_spi(LDC1000_CMD_SENSORFREQ, 0x94); //配置传感器频率 待定
write_spi(LDC1000_CMD_LDCCONFIG, 0x07); //配置LDC