2024-09-01
售卖作品
00

引脚

AIN0~AIN3:模拟信号输入端

A0~A3:引脚地址端

VDD、VSS:电源端

SDA、SCL

²C总线的数据线、时钟线

OSC:外部时钟输入端,内部时钟输出端

EXT:内部、外部时钟选择线,使用内部时钟时该脚接地

AGND:模拟信号地

AOUT

/A转换输出端VREF:基准电源端

在这里插入图片描述

地址字节

依靠A0 A1 A2可以在同一总线搭载不同器件。

在这里插入图片描述

控制字节。

如果自增标志位( BIT2 )置为1,则每A/D转换一次,通道编号自动加1,可以切换通道。 如果使用内部振荡器时,需要使用通道自增模式,那么控制字节的BIT6(模拟输出标志位)需要置为1,从而保证内部振荡器连续运行,预防振荡器启动延时造成转换错误。在其他的时候模拟输出使能位可以复位为0以降低静态功耗。 如果选了一个不存在的输入通道,那么将会定位到编号最高的那个通道。所以,如果设置成了通道自增方式,那么下一个被选中的将是通道0. 每次上电复位后,控制寄存器所有的位将被复位成0。D/A转换器和振荡器将被禁止以省电。模拟输出口将转为高阻状态。

在这里插入图片描述

在这里插入图片描述

同时多通道ADC总是有BUG,有空阅读手册才行。

c
#include "reg52.h" /* 定义51单片机特殊功能寄存器 */ #include "intrins.h" #include "lcd1602.h" //PCF8591初始化 void init_pcf8591(void) { i2c_start(); i2c_sendbyte(0x90); i2c_waitack(); i2c_sendbyte(0x40|0x00); //选通道0 i2c_waitack(); i2c_stop(); operate_delay(10); } //通过I2C总线读取ADC结果 unsigned char adc_pcf8591(void) { unsigned char temp; i2c_start(); i2c_sendbyte(0x91); i2c_waitack(); temp = i2c_receivebyte(); i2c_sendack(1); i2c_stop(); return temp; } void dac_pcf8591(unsigned char dat) { i2c_start(); i2c_sendbyte(0x90); i2c_waitack(); i2c_sendbyte(0x40); //DAC输出模式 i2c_waitack(); i2c_sendbyte(dat); i2c_waitack(); i2c_stop(); } /* 主函数 */ void main(void) { unsigned char adc_value; /* ADC转换数据 */ unsigned char disp[16]; LCD_init(); LCD_write_str(0, 0, "PCF8591:"); dac_pcf8591(100); init_pcf8591(); while (1) { adc_value = adc_pcf8591(); //读取A/D采样值 disp[0] = '0' + adc_value / 100; disp[1] = '0' + adc_value % 100 / 10; disp[2] = '0' + adc_value % 10; disp[3] = ' '; LCD_write_str(0, 1, disp); } }
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!