c语言用光敏电阻调节led灯亮暗,求参考代码

用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++;
    }
}