光照传感器与USB小夜灯综合

本文介绍了一个嵌入式系统的C代码,包括DS18B20温度传感器读取、ADC0832光照强度测量、定时器中断控制风扇及UART通信。程序实现实时温度和光强监测,并通过定时器调整风扇转速。
摘要由CSDN通过智能技术生成

代码如下:

#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;
}



最终实物效果:

在这里插入图片描述
在这里插入图片描述

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值