功能: 先向單片機發送01,單片機回AD is working,然后利用PCF8591上的熱敏電阻,一秒鐘測溫一百次,取平均值,一秒發送一次到PC,想單片機發送00,單片機回AD is stop,測溫停止
#include<reg52.h>
#include<intrins.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P2^6;
sbit SDA=P2^7;
uchar flag1,a,b,c;
float m,S;
void delay()
{ ; ; ;}
void init()
{ SCL=1;
delay();
SDA=1;
delay();
}
void start()
{ init();
SDA=0;
delay();
}
void stop()
{
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
}
void write(uchar date)
{ uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{ temp=temp<<1;
SCL=0;
delay();
SDA=CY;
delay();
SCL=1;
delay();
}
SCL=0;
delay();
SDA=1;
delay();
}
void respons()
{ uchar i;
SCL=1;
delay();
while((SDA==1)&&(i<250))
i++;
SCL=0;
delay();
}
uchar read()
{ uchar i,k;
SCL=0;
delay();
SDA=1;
delay();
for(i=0;i<8;i++)
{
SCL=1;
delay();
k=(k<<1)|SDA;
SCL=0;
delay();
}
return k;
}
/*
void writeadd(uchar add,uchar date)
{ start();
write(0x90);
respons();
write(add);
respons();
write(date);
respons();
stop();
} */
uchar readadd(uchar add)
{ uchar date;
start();
write(0x90);
respons();
write(0x40|add);
respons();
start();
write(0x91);
respons();
date=read();
respons();
stop();
return date;
}
void inits()
{
TMOD=0x21;
SCON=0x50;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=0xfd;
TL1=0xfd;
TR1=1;
ET0=1;
EA=1;
ES=1;
}
void main()
{
while(1)
{
inits();
if(flag1==1)
{
flag1=0;
ES=0;
TI=1;
if(c==1)
{printf("AD is working\n");TR0=1;}
else
{ printf("AD is stop\n"); TR0=0;}
while(!TI);
TI=0;
ES=1;
}
if(a>=100)
{
a=0;
S=S/100.0;
ES=0;
TI=1;
printf("T= %f ℃",S);
while(!TI);
TI=0;
ES=1;
}
}
}
void T0_time() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
b=readadd(0);
m=(float)b*30.0/256.0;
S=S+m;
a++;
}
void ser() interrupt 4
{
RI=0;
c=SBUF;
flag1=1;
}
|