PCF8591 51单片机 仿真 程序

本文介绍了PCF8591芯片的引脚功能,包括模拟输入端、地址端、电源端以及I²C总线。通过设置地址字节和控制字节,实现多通道A/D转换,并讨论了通道自增模式和内部振荡器的使用。特别指出,上电复位后,控制寄存器默认关闭D/A转换和振荡器以节省电力。在实际应用中,需要注意多通道ADC可能存在的问题,建议详细阅读数据手册。
摘要由CSDN通过智能技术生成

引脚
AIN0~AIN3:模拟信号输入端
A0~A3:引脚地址端
VDD、VSS:电源端
SDA、SCL:I²C总线的数据线、时钟线
OSC:外部时钟输入端,内部时钟输出端
EXT:内部、外部时钟选择线,使用内部时钟时该脚接地
AGND:模拟信号地
AOUT:D/A转换输出端VREF:基准电源端
在这里插入图片描述
地址字节
依靠A0 A1 A2可以在同一总线搭载不同器件。
在这里插入图片描述

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

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


#include "reg52.h"                      /* 定义51单片机特殊功能寄存器 */
#include "intrins.h"
#include "lcd1602.h"



//PCF8591初始化
void init_pcf8591(void)
{
   
	i2c_start();
	
基于PCF8591芯片AD DA实验例程C51单片机KEIL源码工程文件5个合集: PCF8591 1602液晶显示 PCF8591 1路AD数码管显示 PCF8591 4路AD数码管显示 PCF8591 DA输出模拟 PCF8591 输出锯齿波 main() { unsigned char num=0,i; unsigned char temp[7];//定义显示区域临时存储数组 float Voltage; //定义浮点变量 LCD_Init(); //初始化液晶 DelayMs(20); //延时有助于稳定 LCD_Clear(); //清屏 while (1) //主循环 { for(i=0;i<5;i++)//连续读5次,取最后一次,以便读取稳定值 num=ReadADC(0); //读取第1路电压值,范围是0-255 Voltage=(float)num*5/256; //根据参考电源VREF算出时间电压,float是强制转换符号,用于将结果转换成浮点型 sprintf(temp,"V0 %3.2f ",Voltage);//格式输出电压值,%3.2f 表示浮点输出,共3位数,小数点后2位 LCD_Write_String(0,0,temp); for(i=0;i<5;i++) num=ReadADC(1); Voltage=(float)num*5/256; sprintf(temp,"V1 %3.2f ",Voltage); LCD_Write_String(8,0,temp); for(i=0;i<5;i++) num=ReadADC(2); Voltage=(float)num*5/256; sprintf(temp,"V2 %3.2f ",Voltage); LCD_Write_String(0,1,temp); for(i=0;i<5;i++) num=ReadADC(3); Voltage=(float)num*5/256; sprintf(temp,"V3 %3.2f ",Voltage); LCD_Write_String(8,1,temp); //主循环中添加其他需要一直工作的程序 DelayMs(200); } } /*------------------------------------------------ 读AD转值程序 输入参数 Chl 表示需要转换的通道,范围从0-3 返回值范围0-255 ------------------------------------------------*/ unsigned char ReadADC(unsigned char Chl) { unsigned char Val; Start_I2c(); //启动总线 SendByte(AddWr); //发送器件地址 if(ack==0)return(0); SendByte(0x40|Chl); //发送器件子地址 if(ack==0)return(0); Start_I2c(); SendByte(AddWr+1); if(ack==0)return(0); Val=RcvByte(); NoAck_I2c(); //发送非应位 Stop_I2c(); //结束总线 return(Val); } /*------------------------------------------------ 写入DA转换数值 输入参数:dat 表示需要转换的DA数值,范围是0-255 ------------------------------------------------*/ /*bit WriteDAC(unsigned char dat) { Start_I2c(); //启动总线 SendByte(AddWr); //发送器件地址 if(ack==0)return(0); SendByte(0x40); //发送器件子地址 if(ack==0)return
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值