本例程序运行时,模拟比较器的正极AN0与负极AN1所输入法的模拟电压将进行比较,如果AN0上的电压高于AN1上的电压,LED0点亮。
主程序将特殊功能I/O寄存器SFIOR中的ACME位清零,使AIN1连接比较器的负极输入端,在ADCSRA中的ADEN为0时,如果将ACME置位,模拟比较器将ADC的多路输入作为负极输入端。将SFIOR中的PUD置位,彬内部上拉电阻。将ACSR中的ACIE位置位,以允许模拟比较器中断。
Proteus运行截图:
Studio 编译通过载图:
程序清单:
/*
* GccApplication12.c
*
* Created: 2014-11-7 21:12:17
* Author: Administrator
*/
#include <avr/interrupt.h>
#include <avr/io.h>
#include <stdint.h>
#define LED0_ON() (PORTC&=0xFE)
#define LED0_OFF()(PORTC |= 0x01)
#define LED1_ON() (PORTC &= 0xEF)
#define LED1_OFF() (PORTC |=0x10)
int main(void)
{
DDRB = 0x00;
DDRC = 0xFF;
SFIOR &= ~_BV(ACME);
SFIOR |= _BV(PUD);
ACSR = _BV(ACIE);
sei();
while(1);
}
ISR(ANA_COMP_vect)
{
if(ACSR &_BV(ACO))
{
LED0_ON();LED1_OFF();
}
else
{
LED0_OFF();LED1_ON();
}
}
|