|
本帖最后由 孤独将一 于 2013-7-5 18:05 编辑
1:- //TWI通用操作
- #define Wait() while(!(TWCR & _BV(TWINT)))
- #define START() {TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN);Wait();}
- #define STOP() {TWCR = _BV(TWINT) | _BV(TWSTO) | _BV(TWEN);}
- #define WriteByte(x) {TWDR =(x);TWCR = _BV(TWINT) | _BV(TWEN);Wait();}
- #define ACK() (TWCR |= _BV(TWEA))
- #define NACK() (TWCR &= ~_BV(TWEA))
- #define TWI() {TWCR = _BV(TWINT) | _BV(TWEN) ;Wait();}
- #define TWI1() {TWCR = _BV(TWINT) | _BV(TWEN) ;TWCR |= _BV(TWEA);_delay_us(1);Wait();}
- #define TWI2() {TWCR = _BV(TWINT) | _BV(TWEN) ;TWCR &= ~_BV(TWEA);_delay_us(1);Wait();}
- extern unsigned char DA_pcf8591(unsigned char); //DA转换
- extern unsigned int AD_pcf8591(unsigned char ); //AD转换
复制代码- unsigned int AD_pcf8591(unsigned char channel)
- {
- unsigned int AD_value;
- init_twi_pcf8591();
- START(); if(TW_STATUS != TW_START) return 1;
- WriteByte(0x94); if(TW_STATUS !=TW_MT_SLA_ACK) return 2;
- WriteByte(channel & 0x03); if(TW_STATUS != TW_MT_DATA_ACK) return 3;
-
- START() if(TW_STATUS != TW_REP_START) return 4;
- WriteByte(0x95); if(TW_STATUS != TW_MR_SLA_ACK) return 5;
- //======这里的53是因为接的参考电压实测4.771V,255/4.771大致是53,如果是5V,改为除以255/5=51.
- TWI1(); if( (TW_STATUS != TW_MR_DATA_ACK) ) return 7;
- AD_value = TWDR * 100.0 /53.45;
- STOP();
- return AD_value;
- }
复制代码 ======================================================
1:如代码所示,我随便选择一个通道测电压,能测,还挺准,但是给这个通道测电断开的时候,就单片机死机了,为何啊啊。。。。。。。。。。。。
2: 我测量GND的时候也是死机
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|