找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4654|回复: 0
打印 上一主题 下一主题
收起左侧

YL-40 PCF8591 AD转换模块单片机程序+电路资料下载

[复制链接]
跳转到指定楼层
楼主


PCF8591电路原理图如下:


PCF8591 AD/DA芯片介绍

    PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591 具有 4 个模拟输入、1 个模拟输出和 1个串行I2C总线接口。PCF8591的 3个地址引脚A0, A1和A2 可用于硬件地址编程,允许在同个I2C 总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向 I2C 总线以串行的方式进行传输。


单片机源程序如下:
  1. #include<reg52.h>    //包含单片机寄存器的头文件
  2. #include <I2C.H>

  3. #define uchar unsigned char
  4. #define  PCF8591 0x90    //PCF8591 地址



  5. // 变量定义
  6. unsigned char AD_CHANNEL;
  7. unsigned long xdata  LedOut[8];
  8. unsigned int  D[32];
  9. sbit P2_0 = P2^0;
  10. sbit P2_1 = P2^1;
  11. sbit P2_2 = P2^2;
  12. sbit P2_3 = P2^3;

  13. unsigned char date;

  14. uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
  15.                         0xf8,0x80,0x90};


  16.   // 函数申明

  17. void display();
  18. void delay(uchar i);
  19. bit DACconversion(unsigned char sla,unsigned char c,  unsigned char Val);
  20. bit ISendByte(unsigned char sla,unsigned char c);
  21. unsigned char IRcvByte(unsigned char sla);
  22. void Initial_com(void);
  23. //******************************************************************/
  24. main()
  25. {  

  26.         Initial_com();
  27.         while(1)
  28.         {

  29.         /********以下AD-DA处理*************/  
  30.         
  31.             switch(AD_CHANNEL)
  32.                 {
  33.                         case 0: ISendByte(PCF8591,0x41);
  34.                              D[0]=IRcvByte(PCF8591);  //ADC0 模数转换1      光敏电阻
  35.                                  break;  
  36.                         
  37.                         case 1: ISendByte(PCF8591,0x42);
  38.                              D[1]=IRcvByte(PCF8591);  //ADC1  模数转换2          热敏电阻
  39.                                  break;  
  40.                         
  41.                         case 2: ISendByte(PCF8591,0x43);
  42.                              D[2]=IRcvByte(PCF8591);  //ADC2        模数转换3           悬空
  43.                                  break;  
  44.                         
  45.                         case 3: ISendByte(PCF8591,0x40);
  46.                              D[3]=IRcvByte(PCF8591);  //ADC3   模数转换4           可调0-5v
  47.                                  break;  
  48.                         
  49.                         case 4: DACconversion(PCF8591,0x40, D[4]); //DAC          数模转换
  50.                              break;
  51.                  
  52.                 }

  53.             D[4]=D[3];  //把模拟输入采样的信号 通过数模转换输出
  54.                         
  55.            if(++AD_CHANNEL>4) AD_CHANNEL=0;
  56.         
  57.            /********以下将AD的值通过串口发送出去*************/
  58.          delay(200);        
  59.          SBUF=D[0];                              
  60.          delay(200);                  
  61.          SBUF=D[1];                           
  62.          delay(200);        
  63.          SBUF=D[2];
  64.          delay(200);
  65.          SBUF=D[3];
  66.          delay(200);
  67.          if(RI)
  68.         {
  69.                 date=SBUF;    //单片机接受
  70.                 SBUF=date;    //单片机发送
  71.                 RI=0;
  72.         }         
  73.    }
  74. }


  75. void delay(uchar i)
  76. {
  77.   uchar j,k;
  78.   for(j=i;j>0;j--)
  79.     for(k=125;k>0;k--);
  80. }

  81. /*******************************************************************
  82. DAC 变换, 转化函数               
  83. *******************************************************************/
  84. bit DACconversion(unsigned char sla,unsigned char c,  unsigned char Val)
  85. {
  86.    Start_I2c();              //启动总线
  87.    SendByte(sla);            //发送器件地址
  88.    if(ack==0)return(0);
  89.    SendByte(c);              //发送控制字节
  90.    if(ack==0)return(0);
  91.    SendByte(Val);            //发送DAC的数值  
  92.    if(ack==0)return(0);
  93.    Stop_I2c();               //结束总线
  94.    return(1);
  95. }

  96. /*******************************************************************
  97. ADC发送字节[命令]数据函数               
  98. *******************************************************************/
  99. bit ISendByte(unsigned char sla,unsigned char c)
  100. {
  101.    Start_I2c();              //启动总线
  102.    SendByte(sla);            //发送器件地址
  103.    if(ack==0)return(0);
  104.    SendByte(c);              //发送数据
  105.    if(ack==0)return(0);
  106.    Stop_I2c();               //结束总线
  107.    return(1);
  108. }

  109. /*******************************************************************
  110. ADC读字节数据函数               
  111. *******************************************************************/
  112. unsigned char IRcvByte(unsigned char sla)
  113. {  unsigned char c;

  114.    Start_I2c();          //启动总线
  115.    SendByte(sla+1);      //发送器件地址
  116.    if(ack==0)return(0);
  117.    c=RcvByte();          //读取数据0

  118.    Ack_I2c(1);           //发送非就答位
  119.    Stop_I2c();           //结束总线
  120.    return(c);
  121. }


  122. //*****串口初始化函数***********

  123. //******************************
  124. void Initial_com(void)
  125. {
  126. EA=1;        //开总中断
  127. ES=1;        //允许串口中断
  128. ET1=1;        //允许定时器T1的中断
  129. TMOD=0x20;   //定时器T1,在方式2中断产生波特率
  130. PCON=0x00;   //SMOD=0
  131. SCON=0x50;   // 方式1 由定时器控制
  132. TH1=0xfd;    //波特率设置为9600
  133. TL1=0xfd;
  134. TR1=1;       //开定时器T1运行控制位

  135. }
复制代码

所有资料51hei提供下载:
【Realplay】 PCF8591模块 ADDA转换模块 模数数模转换送杜邦线.zip (625.18 KB, 下载次数: 67)


评分

参与人数 2黑币 +65 收起 理由
zhengchong60 + 15 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶3 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表