本帖最后由 laslison 于 2009-12-17 23:22 编辑
前言:关于运算放大器的比较器的应用知识先看看(大学里学了,再温习一遍吧,自己找资料)。关于mega8的模拟比较器我们可以这样理解,在单片机里有个运放就行了,很简单的,20分钟搞的定。
第六章:模拟比较器功能
主要的控制寄存器就两个,SFIOR 和ACSR。其中SFIOR 可以看成个选择开关,按照书上说的赋值就是了(有必要设置的时候才设置)。仔细研究一下ACSR。
看完了,OK,开始实践吧,编一个比较AIN0 和 AIN1 大小的程序,若AIN0
AIN1之间的大小关系发生变化 ,则小led灯(串联330欧的电阻,正极接+5V,负极接PORTB.0---------如没有特殊说明,在本笔记中led小灯都是这种接法,即低电平点亮)亮2S。
#i nclude <mega8.h>
#i nclude <delay.h>
interrupt [ANA_COMP] void anacomp_isr(void)
{
PORTB.0=0;
delay_ms(2000);
}
void init(void)
{
PORTB=0x01;
DDRB=0x01;
ACSR|=1<<3;
#asm("sei")
}
void main(void)
{
init();
while(1)
{
PORTB.0=1 ;
}
}
/*小记:一开始我在中断利用
if( ACSR&(1<<5)==0x00 ) 这个语句,但调试结果不对,我就查原因,最中发现我在中断里 不管是用
if( ACSR&(1<<5)==0x00 )还是
if( ACSR&(1<<5)!=0x00 )都不执行if里的语句,真是无奈了,查看资料说ACSR的第5为是只读,对啊,我这个句子就是读它啊,但就是读不出来,不是1也不是0,我就纳闷了,难道它是 0.5------狂晕!我到现在还是没查出来原因,若有谁知道,就帮我一下,告诉我其中的原因。用了一上午调试这个,被这个句子绊了--------非1非0(数字量---瞬时也是非1非0)的现象还是头一次遇到!!!
转 |