写了一段小程序,基本原理验证过了,现在LED的闪烁占空比跟着Vs1走,转动传感器可以看到LED亮度在变化。
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef unsigned long DWORD;
#define LEDON() (PORTB&=~0X10)
#define LEDOFF() (PORTB|=0X10)
#define VS1 1 //ADC1
#define VS2 3 //ADC3
/////////////////////////////////
//延时c个10ms
//如在延时期间有按键按下,则立刻返回1
//否则到时间返回0
void Delay10ms(WORD c)
{
while(c--)
{
BYTE i,j;
for(i=0;i<140;i++)
for(j=0;j<6;j++);
}
}
void Delay1ms(WORD c)
{
while(c--)
{
BYTE i,j;
for(i=0;i<14;i++)
for(j=0;j<6;j++);
}
}
void Delay(WORD c)
{
while(c--)
{
BYTE i,j;
for(i=0;i<10;i++);
}
}
int main(void)
{
WORD Vs1,Vs1N;
//关闭中断
cli();
//设置端口
DDRB=0x010; //端口B 管脚3输出,其他都是输入
//打开ADC
//ADMUX bit6=0->Vref=Vcc bit6=1->Vref=1.1
ADCSRA=(1<<ADEN)|0x06; //使能ADC,时钟64分频
ADMUX=VS1; //切换到通道1
ADCSRA|=(1<<ADSC); //启动第一次AD转换
while(1)
{
if(ADCSRA&(1<<ADIF)) //如果一次转换结束
{
ADCSRA|=(1<<ADIF); //写1清除标志位
Vs1=ADC; //读取结果
Vs1N=1024-Vs1;
ADCSRA|=(1<<ADSC); //启动下一次AD转换
}
LEDON();
Delay(Vs1>>4);
LEDOFF();
Delay(Vs1N>>4);
}
} |