用c语言用光敏电阻调节一个led灯亮暗,,led灯随光敏电阻变化而变化,而不是亮灭,求参考代码
你要有AD,不同芯片AD控制不一样,没法直接给出。根据AD结果,你可以用PWM或者AD去控制LED
你要用光敏电阻就没有必要用程序,但是,我想你应该用程序就给你一个51单品机的参考程序。
/*
* DA output music test
* 耳机中将会听到一段音乐,旋转电位器可以改变音量大小
*
* 晶振:11.0592M
*/
#include <reg52.h>
#include <intrins.h>
#define nops(); do{_nop_();_nop_();_nop_();_nop_();_nop_();} while(0) //定义空指令
#define PCF8591 0x90 //PCF8591 地址
sbit ADDA_SCL = P3^7; //I2C 时钟
sbit ADDA_SDA = P3^6; //I2C 数据
unsigned char code tune[8]={0,120,90,63,50,25,4,0};
unsigned char code song[]={
1,1,5,5,6,6,5,0,4,4,3,3,2,2,1,0,
5,5,4,4,3,3,2,0,5,5,4,4,3,3,2,0,
1,1,5,5,6,6,5,0,4,4,3,3,2,2,1,0,0,0,0,
0xFF
};
bit ack; /*应答标志位*/
void delay(unsigned int n)
{
while (n--);
}
/**
* 发送I2C起始条件
*/
void Start_I2c()
{
ADDA_SDA=1;
nops();
ADDA_SCL=1;
nops();
ADDA_SDA=0;
nops();
ADDA_SCL=0;
nops();
}
/**
* 发送I2C结束条件.
*/
void Stop_I2c()
{
ADDA_SCL=0;
nops();
ADDA_SDA=0;
nops();
ADDA_SCL=1;
nops();
ADDA_SDA=1;
nops();
}
/**
* I2C数据发送函数
*/
void SendByte(unsigned char c)
{
unsigned char i;
for (i=0; i<8; i++)
{
if ((c<<i) & 0x80)
ADDA_SDA=1;
else
ADDA_SDA=0;
nops();
ADDA_SCL=1;
nops();
ADDA_SCL=0;
}
ADDA_SDA=1;
nops();
ADDA_SCL=1;
nops();
if (ADDA_SDA==1)
ack=0;
else
ack=1; /*判断是否接收到应答信号*/
ADDA_SCL=0;
}
/**
* I2C数据接收函数
**/
unsigned char RcvByte(void)
{
unsigned char retc=0, i;
for (i=0; i<8; i++)
{
ADDA_SCL=0;
nops();
ADDA_SCL=1;
nops();
retc <<= 1;
if (ADDA_SDA==1)
retc = retc + 1;
}
ADDA_SCL=0;
nops();
return(retc);
}
/**
* 握手函数
* a为1时发送应答信号ACK,a为0时不发送ACK
*/
void Ack_I2c(bit a)
{
if(a==0)
ADDA_SDA=0;
else
ADDA_SDA=1;
nops();
ADDA_SCL=1;
nops();
ADDA_SCL=0;
nops();
}
/**
* DAC 变换, 转化函数
*
* sla--I2C从机地址
* c--控制字节
* val--发送数据
*/
bit DACconversion(unsigned char sla, unsigned char c, unsigned char val)
{
Start_I2c(); //启动总线
SendByte(sla); //发送器件地址
if (ack==0)
return(0);
SendByte(c); //发送控制字节
if (ack==0)
return(0);
SendByte(val); //发送DAC的数值
if (ack==0)
return(0);
Stop_I2c(); //结束总线
return(1);
}
/**
* ADC发送字节(命令)数据函数
*
* sla--I2C从机地址
* c--控制字节或数据
*/
bit ADC_Sendbyte(unsigned char sla,unsigned char c)
{
Start_I2c(); //启动总线
SendByte(sla); //发送器件地址
if (ack==0)
return(0);
SendByte(c); //发送数据
if (ack==0)
return(0);
Stop_I2c(); //结束总线
return(1);
}
/**
* ADC读字节数据函数
*/
unsigned char ADC_Recbyte(unsigned char sla)
{
unsigned char c;
Start_I2c(); //启动总线
SendByte(sla+1); //发送器件地址
if(ack==0)
return(0);
c = RcvByte(); //读取数据0
Ack_I2c(1); //发送非就答位
Stop_I2c(); //结束总线
return(c);
}
void main(void)
{
char i,vol=0,n=0;
while(1)
{
if (song[n] == 0)
vol = 0;
else if (song[n] == 0xFF)
n = 0;
else
{
ADC_Sendbyte(PCF8591,0x40);
vol = ADC_Recbyte(PCF8591)/10; //ADC0 模数转换0
}
for (i=0; i<100; i++)
{
DACconversion(PCF8591,0x40, vol);
delay(tune[song[n]]);
DACconversion(PCF8591,0x40, 0);
delay(tune[song[n]]);
}
for (i=0; i<3; i++)
{
delay(0xFF);
}
n++;
}
}