代码如下:
#include<reg52.h>
#include<intrins.h>
#include<stdio.h>
#include "ds18b20.h"
#include "adc0832.h"
#define uint unsigned int
#define uchar unsigned char
sbit fan_A=P1^0;
//sbit light=P1^1;
char jd;
char vo;
void Delay300ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 3;
j = 26;
k = 223;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Time0Init() //0.5ms
{
TMOD&=0XF0; //置位
TMOD|=0X01; //清零 配置寄存器模式:定时器T0,工作方式一
TH0=0xFE; //配置高八位
TL0=0X33; //配置低八位
TF0=0; //当爆表的时候,硬件会修改bit5(TF0)位上面的数据
TR0=1; //定时器T0开启标志
ET0=1; //开启定时器T0中断允许
EA=1;//开启总中断
}
void Time0Handle() interrupt 1
{
unsigned char cnt;
cnt++; // 统计爆表的次数
TH0=0xFE; //配置高八位
TL0=0X33; //配置低八位
if(cnt<jd) //0.5ms 以内
{
fan_A=0;
}
else
{
fan_A=1;
}
if(cnt==40) //20MS 内
{
cnt=0;
fan_A=0;
}
}
void UartInit(void) //9600bps@11.0592MHz
{
SCON=0x40; //配置串行口方式1, REN禁止
TMOD &=0X0F;
TMOD |=0X20; //配置定时器1为8位自动重载
TH1=0xfd; //波特率设置 253
TL1=0xfd;
TR1=1;//打开定时计数器1;
}
void sendByte(char data_msg)
{
SBUF=data_msg;
while(!TI);
TI=0;//发送中断请求标志位 来代替瞎延时
}
void sendString(char *str)
{
while(*str!='\0')
{
sendByte(*str);
str++;
}
}
char putchar (char c) //实现printf函数发送功能
{
SBUF=c;
while (!TI);
TI = 0;
return c;
}
void main ()
{
float tmp;
int j;
unsigned int dat,dat2;
UartInit();
Time0Init();
ds18b20_init();
while(1)
{
dat=(256-AD1(0));//ADC8032读取光照实时值
tmp=ds18b20_read_temperture();//23.458
j=(tmp*10+0.5)*10;//
Delay300ms();
Delay300ms();
Delay300ms();
Delay300ms();
Delay300ms();
if(dat<50)
{
jd=40;
}
else
{
jd=2;
}
// if(tmp>20)
// {
// jd=40;
// }
// if(tmp<20)
// {
// jd=2;
// }
printf("温度为:%.2f℃",tmp);
//printf("温度为%d%d.%d%d℃\r\n",j/1000,j%1000/100,j%100/10,j%10);
printf("光强: %d lx\r\n",dat);
}
}
#include "adc0832.h"
#include <reg52.h>
#include <intrins.h>
//ADC0832函数
sbit AD_cs = P0^0;//片选使能位
sbit AD_clk =P0^1;//时钟脉冲输入位
sbit AD_do =P0^2;//数据信号输入输出,并联使用
sbit AD_di =P0^2;
unsigned char AD1(bit Channel) //adc0832两个通道 0 1
{
unsigned char i;
unsigned char ad0,ad1;
ad0 = 0x00;
ad1 = 0x00;
AD_cs = 0;
_nop_();
AD_clk=0;
_nop_();
AD_di=1;
_nop_();
AD_clk=1;
AD_clk=0;
AD_di=1; //选择单通道
AD_clk=1;
_nop_();
AD_clk=0;
AD_di=Channel; //选择通道
//通道选择完毕
AD_clk=1;
_nop_();
AD_clk=0;
_nop_();
AD_di=1;
for(i=8;i>0;i--)
{
AD_clk=1;
ad0<<=1;
AD_clk=0;
if(AD_do)
ad0 |= 0x01;
else
ad0 |= 0x00;
}
for(i=8;i>0;i--)
{
ad1>>=1; //从低位向高位读取八位AD值
AD_clk=0;
if(AD_do)
ad1 |= 0x80;
else
ad1 |= 0x00;
AD_clk=1;
}
AD_cs = 1;
AD_do = 1;
AD_clk = 1;
if(ad0 == ad1) //判断是否采集正确
{
return ad0;
}
return -1;
}
最终实物效果: