#include <reg51.h>
#include<INTRINS.H>
sbit SpiRxd=P1^5;
sbit SpiTxd=P1^7;
sbit SpiClk=P1^6;
sbit SpiCs=P1^1;
unsigned int volt;
unsigned char volth;
unsigned char voltl;
unsigned char voltchar;
unsigned char commd;
void delay(void) //误差 0us
{
unsigned char a,b,c;
for(c=167;c>0;c--)
for(b=171;b>0;b--)
for(a=16;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
void delayms(unsigned char i) //delay function
{
while(i--);
}
void SpiWrite(unsigned char adr,unsigned char dat)
{
unsigned char j;
SpiCs=0;
SpiClk=0;
SpiTxd=0;
//send adress code
for(j=0;j<8;j++)
{
SpiClk=1;
if (adr&0x80)
SpiTxd=1;
else
SpiTxd=0;
adr=adr<<1;
_nop_();
SpiClk=0;
}
_nop_();
//send data code
for(j=0;j<8;j++)
{
SpiClk=1;
if(dat&0x80)
SpiTxd=1;
else
SpiTxd=0;
dat=dat<<1;
_nop_();
SpiClk=0;
}
_nop_();
SpiCs=1;
_nop_();
SpiTxd=0;
}
unsigned char SpiRead(unsigned char adr)
{
unsigned char i;
unsigned char Spidata;
SpiCs=0;
SpiClk=0;
SpiTxd=0;
//send adress code
for(i=0;i<8;i++)
{
SpiClk=1;
if (adr&0x80)
SpiTxd=1;
else
SpiTxd=0;
adr=adr<<1;
_nop_();
SpiClk=0;
}
_nop_();
//receive data code
for(i=0;i<16;i++)
{
SpiClk=1;
_nop_();
if(SpiRxd)
Spidata=(Spidata<<1)|0x01;
else
Spidata=Spidata<<1;
SpiClk=0;
while(SpiRxd)
break;
}
_nop_();
SpiCs=1;
SpiRxd=1;
return Spidata;
}
void InitUART(void) //start serial port
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xF3;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
}
void main()
{
unsigned char i;
while(1)
{
SpiWrite(0x10,0x82);
delayms(500);
SpiRead(0x38);
volt=SpiRead;
for(i=0;i<8;i++)//translate volt into two unsigned char numbers
{
if(volt&0x1000)
{
volt=volt<<1;
volth++;
volth=volth<<1;
}
else
{
volt=volt<<1;
volth=volth<<1;
}
}
for(i=0;i<8;i++)
{
if(volt&0x1000)
{
volt=volt<<1;
voltl++;
voltl=voltl<<1;
}
else
{
volt=volt<<1;
voltl=voltl<<1;
}
}
voltchar=volth;
RI=1;
InitUART(); //send volt high byte
delayms(5);
voltchar=voltl;
RI=1;
InitUART(); //send volt low byte
delay();
}
}
void SendOneByte(unsigned char c)
{
SBUF = c;
while(!TI);
TI = 0;
}
void UARTInterrupt(void) interrupt 4
{
RI=0;
SendOneByte(voltchar);//send 1 byte
TI = 0;
}