用发光二极管和光敏电阻怎样组成一组光电开关啊,能在什么环境下使用啊?急求使用avr电路与程序,谢谢
来源:学生作业帮助网 编辑:六六作业网 时间:2024/11/15 01:55:50
用发光二极管和光敏电阻怎样组成一组光电开关啊,能在什么环境下使用啊?急求使用avr电路与程序,谢谢
用发光二极管和光敏电阻怎样组成一组光电开关啊,能在什么环境下使用啊?急求使用avr电路与程序,谢谢
用发光二极管和光敏电阻怎样组成一组光电开关啊,能在什么环境下使用啊?急求使用avr电路与程序,谢谢
常用的是将光敏电阻放在三极管基极,和另一上拉电阻分压,根据光线的强弱不同可导通和接至.如果用AVR单片机的话感觉有点点浪费,不过还是给你设计下下,用的mega8:
#include <iom8v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
//
uchar adc_time = 0 ; //定义累加时间
uchar adc_num = 0 ; //用于AD通道选择的计数
uchar vlo_eer = 0 ; //用于检测光敏电阻的电灯点
unsigned int voltage;
unsigned int voltage1;
//端口初始化
void port_init(void)
{
PORTB = 0x00;
DDRB = 0xFF;
PORTC = 0xFE;
DDRC = 0xFE;
PORTD = 0x00;
DDRD = 0xFF;
}
// 定时器0分频: 8
// 定时初值 : 100uSec
// 真实定时值 : 100.000uSec (0.0%)
void timer0_init(void)
{
TCCR0 = 0x00;//停止定时器
TCNT0 = 0x9C;//初始值
//OCR0 = 0x9B;//匹配值
TIMSK |= 0x01;//中断允许
TCCR0 = 0x02;//启动定时器
}
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
TCNT0 = 0x9C; //重装100us定时初值
adc_time++;
if(adc_time==10) //控制AD转换的速度
{
adc_time=0; //清零AD计数时间
ADCSRA=0xEE; //打开AD使能
ADMUX = ADC0 ; //选择ADC0通道
else
{
ADCSRA= 0x00; //关闭AD转换,这样做的目的是防止
} //AD转换过频而导致系统堵塞
}
// ADC初始化
// 转换时间 : 52uS
void adc_init(void)
{
//adc转换初始化
ADCSRA= 0x00;//禁止AD转换
SFIOR |= 0x00;
ACSR= 0x80; //禁止模拟比较器
}
unsigned int adc_calc(void)
{
//计算实际电压
unsigned long value=0;
unsigned int voltage1=0; //电压单位为(mV)
value=ADCL; //首先读低位
value|=(int)ADCH << 8; //然后读高位
voltage1=(value*5000)/1023;
return voltage1;
}
#pragma interrupt_handler adc_isr:12
void adc_isr(void)
{
//转换完成后中断处理,对电压值进行区间划分
voltage=adc_calc();voltage=adc_calc();
if(voltage<XXX){vol_eer=0;} //欠压
if(vol_eer>XXX){vol_eer=1;} //过压
//其中XXX是你自己测试的电压值,什么时候亮LED就看他了.
if(vlo_eer==1) LED1_ON;
else LED1_OF;
}
//初始化服务函数
void init_devices(void)
{
CLI(); //禁止中断
port_init();
timer0_init();
adc_init();
MCUCR = 0x00;
MCUCSR = 0x80;//禁止JTAG
GICR = 0x00;
SEI(); //开中断
}
void main(void)
{
init_devices();
while(1)
{
;
}
}