|
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
unsigned int time=0;
unsigned int timer=0;
unsigned char posit;
unsigned long S;
bit flag =0;
sbit RX=P1^1;
sbit TX=P1^0;
sbit DOUT=P3^7; //輸出
sbit CLK =P3^6; //時鐘
sbit DIN =P3^4; //輸入
sbit CS =P3^5; //片選
sbit led=P2^6;
uint temp;
void delayms(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
void delay(uint i)
{
while(i--);
}
void Conut()
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S= (long)(time*0.17); //算出來是CM
}
void zd0() interrupt 1 //T0中斷用來計(jì)數(shù)器溢出,超過測距范圍
{
flag=1; //中斷溢出標(biāo)志
}
void zd3() interrupt 3 //T1中斷用來掃描數(shù)碼管和計(jì)800MS啟動模塊
{
TH1=0xf8;
TL1=0x30;
timer++;
if(timer>=100)
{
timer=0;
TX=1;
//800MS 啟動一次模塊
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
}
void SPI_Start(void)
{
CLK = 0;
CS = 1;
DIN = 1;
CLK = 1;
CS = 0;
}
void SPI_Write(uchar dat)
{
uchar i;
CLK = 0;
for(i=0; i<8; i++)
{
DIN = dat >> 7; //放置最高位
dat <<= 1;
CLK = 0; //上升沿放置數(shù)據(jù)
CLK = 1;
}
}
uint SPI_Read(void)
{
uint i, dat=0;
CLK = 0;
for(i=0; i<12; i++) //接收12位數(shù)據(jù)
{
dat <<= 1;
CLK = 1;
CLK = 0;
dat |= DOUT;
}
return dat;
}
uint Read_AD_Data(uchar cmd)
{
uchar i;
uint AD_Value;
CLK = 0;
CS = 0;
SPI_Write(cmd);
for(i=6; i>0; i--); //延時等待轉(zhuǎn)換結(jié)果
CLK = 1; //發(fā)送一個時鐘周期,清除BUSY
_nop_();
_nop_();
CLK = 0;
_nop_();
_nop_();
AD_Value=SPI_Read();
CS = 1;
return AD_Value;
}
void datapros()
{
static uchar i;
SPI_Write(2);
Read_AD_Data(1);
if(i==2)
{
i=0;
temp = Read_AD_Data(0xA4);
}
i++;
}
void main()
{
SPI_Start();
TMOD=0x11;
TH0=0;
TL0=0;
TH1=0xf8; //2MS定時
TL1=0x30;
ET0=1; //允許T0中斷
ET1=1; //允許T1中斷
TR1=1; //開啟定時器
EA=1; //開啟總中斷
while(1)
{
datapros();
if(temp>3600)
{
delayms(10);
while(!RX); //當(dāng)RX為零時等待
TR0=1; //開啟計(jì)數(shù)
while(RX); //當(dāng)RX為1計(jì)數(shù)并等待
TR0=0;
Conut();
if((S>=4000)||flag==1)
{
flag=0;
led=1;
}
else
{
led=0;
delay(60000);
}
}
else
{
led=1;
}
}
}
|
|