第十五届蓝桥杯单片机组——PCF8591

第十五届蓝桥杯单片机组——PCF8591介绍 PCF8591 使用手册实现 PCF8591 的 AD 和 DA 功能 结尾有示例代码可直接粘贴复制使用

大家好,欢迎来到IT知识分享网。

一、PCF8591介绍

  1. 模拟-数字转换器(ADC):PCF8591包括一个4通道、8位分辨率的模拟-数字转换器。这意味着它可以将4个独立的模拟输入信号转换为8位的数字输出信号。
  2. 数字-模拟转换器(DAC):PCF8591还包含一个8位的数字-模拟转换器。这意味着它可以将一个8位的数字输入信号转换为一个模拟输出信号。
  3. I2C接口:PCF8591通过使用I2C接口(Inter-Integrated Circuit interface),一种字节级的双向串行协议,可以连续不断的与微控制器进行交流,无需任何中间数据传输设备。

二、根据手册写代码

2.1 IIC设备地址

在这里插入图片描述
在这里插入图片描述
可以发现开发板上A2、A1、A0都接地了,也就是设备地址为 1001000R/W

2.2 实现DA功能

在这里插入图片描述

void PCF8591_DA(u8 output){ 
    IIC_Start(); IIC_SendByte(0x90); IIC_WaitAck(); IIC_SendByte(0x40); // 发送让PCF8591实现DA功能指令 IIC_WaitAck(); IIC_SendByte(output); // 发送要产生多大的电压0~0V,255~5V IIC_WaitAck(); IIC_Stop(); } 

2.3 实现AD功能

u8 PCF8591_AD(){ 
    u8 AD; IIC_Start(); IIC_SendByte(0x90); IIC_WaitAck(); IIC_SendByte(0x03); IIC_WaitAck(); IIC_Start(); IIC_SendByte(0x91); //器件地址 IIC_WaitAck(); AD=IIC_RecByte(); IIC_SendAck(1); IIC_Stop(); AD=Median_Avereage(AD); return AD; } 

三、示例代码

#include <stc15f2k60s2.h> #include <iic.h> unsigned char code dat[]={ 
   0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88,0x80,0xc6,0xc0,0x86,0x8e, 0xbf,0x7f}; void Delay(unsigned int t) { 
    while(t--); } void selectHC573(unsigned char num) { 
    switch(num) { 
    case 4: P2=(P2 & 0x1f) | 0x80; break; case 5: P2=(P2 & 0x1f) | 0xa0; break; case 6: P2=(P2 & 0x1f) | 0xc0; break; case 7: P2=(P2 & 0x1f) | 0xe0; break; case 0: P2=(P2 & 0x1f) | 0x00; break; } } void system_Init() { 
    selectHC573(5); P0=0x00; selectHC573(0); } void display_SMG_Bit(unsigned char dat, unsigned pos) { 
    /*消影法2*/ P0=0xff; selectHC573(7); selectHC573(0); P0=0x01<<(pos-1); selectHC573(6); selectHC573(0); P0=dat; selectHC573(7); selectHC573(0); } void display_D_SMG(int dat1) { 
    display_SMG_Bit(dat[2],1); Delay(300); display_SMG_Bit(dat[0],2); Delay(300); display_SMG_Bit(dat[2],3); Delay(300); display_SMG_Bit(dat[3],4); Delay(300); display_SMG_Bit(dat[16],5); Delay(300); display_SMG_Bit(dat[dat1 / 100],6); Delay(300); display_SMG_Bit(dat[((dat1 / 10) % 10)],7); Delay(300); display_SMG_Bit(dat[dat1 % 10],8); Delay(300); } void PCF8591_WRITE(unsigned char date) { 
    IIC_Start(); IIC_SendByte(0x90); //器件地址 IIC_WaitAck(); IIC_SendByte(0x40); //控制字节 IIC_WaitAck(); IIC_SendByte(date); //D\A的D IIC_WaitAck(); IIC_Stop(); } unsigned char PCF8591_READ(unsigned char read_addr) { 
    unsigned char dat; IIC_Start(); IIC_SendByte(0x90); //器件地址 IIC_WaitAck(); IIC_SendByte(read_addr); //控制字节 IIC_WaitAck(); IIC_Start(); IIC_SendByte(0x91); //器件地址 IIC_WaitAck(); dat=IIC_RecByte(); IIC_SendAck(1); IIC_Stop(); return dat; } void main() { 
    unsigned char dat,i; system_Init(); PCF8591_WRITE(0xf0); dat=PCF8591_READ(0x00); while(1) { 
    i++; PCF8591_WRITE(0x00); if(i==200){ 
    dat=PCF8591_READ(0x01); // 0x01是光敏电阻,0X03是电位器 i=0; } display_D_SMG(dat); } } 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/119053.html

(0)
上一篇 2025-11-08 12:33
下一篇 2025-11-08 13:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信