51单片机PCF8591:同步实现AD与DA转换

5星 · 超过95%的资源 需积分: 46 89 下载量 102 浏览量 更新于2024-09-17 2 收藏 3KB TXT 举报
本资源主要介绍如何在51单片机上利用PCF8591芯片实现AD(模拟数字转换器)和DA(数字模拟转换器)的同步转换。PCF8591是一种集成了8位AD和8位DAC功能的通用接口芯片,它允许单片机同时进行模拟信号的采集和数字信号的输出。 首先,代码中定义了几个控制寄存器,如P2口的da、cl、rst、dula和wela,分别对应DAC和ADC的功能。其中,rst用于复位,da和dula用于控制数据输入/输出,cl用于启动AD转换,而wela则是DA转换的使能信号。 函数`init()`用于初始化PCF8591,可能包括设置工作模式、电源管理和配置接口。`delay_100()`和`delay()`函数用于延时,以确保转换过程的稳定性和准确性。 `start()`和`stop()`函数虽然未在给定代码中明确定义,但可能是用来开始和停止AD和DA转换的辅助函数。`response()`函数可能是处理AD转换后的响应或中断。 `write_byte()`和`read_byte()`函数用于与PCF8591的I/O端口交互,`DAC(ucharnum)`函数将数字数据写入DAC,`ADC(ucharch1)`则从AD转换器读取数据。值得注意的是,ADC转换后,数据会通过`ADCflag`标志进行处理,当转换完成时,会清除该标志并存储结果。 `ADC(ucharch1)`中的2和3可能是指ADC的多个通道,这里可能是对两个通道(通常AD转换器会有多个输入通道)进行交替采样,每采样一次AD,就会将结果转换成温度值并显示。 `display()`函数是关键部分,它根据`TempData`数组的内容,通过dula和wela的控制,将温度数据的十进制部分分别显示在LCD或其他显示器上。其中,`table[]`是一个数组,用于将ADC得到的二进制数据转换为对应的ASCII字符表示温度刻度。 `main()`函数是程序的核心,它在一个无限循环中,持续执行AD转换和DA输出。每次AD转换完成后,都会更新LCD显示当前的温度值,然后等待下一次转换。 这个程序设计巧妙地结合了51单片机和PCF8591芯片,实现了AD和DA转换的实时同步操作,适用于需要同时处理模拟和数字信号的场合,如简单的温度传感器应用。
1040 浏览量
基于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