使用PCF8591进行ADDA转换

发布者:SereneMeadow7最新更新时间:2015-09-28 来源: eefocus关键字:PCF8591  ADDA转换 手机看文章 扫描二维码
随时随地手机看文章
1.电路图

[转载]使用PCF8591进行ADDA转换
 

2.AD转换

 


//AD转换,P0口连接J12(数码管)
//功能:通过转动滑动变阻器改变模拟输入
//通过AD转换,把数值用数码管显示


#include 
#define uchar unsigned char
#define uint unsigned int
#define  PCF8591 0x90    //PCF8591 地址

bit write=0;  //写24c02的标志
sbit SCL=P2^1;         //串行时钟输入端
sbit SDA=P2^0;   //串行数据输入端
sbit LS138A=P2^2;//138译码器的3位 控制数码管的  
sbit LS138B=P2^3;
sbit LS138C=P2^4;

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};      //数显管字模


void delay()   //延时4-5个微秒
{;;}

void delay_1ms(uint z)
{
 uint x,y;
 for(x=z;x>0;x--)
           for(y=110;y>0;y--)
                 ;
}

void start()//开始信号
{
 SDA=1;
    delay();
  SCL=1;
    delay();
  SDA=0;
    delay();
}

void stop()      //停止信号
{
 SDA=0;
    delay();
  SCL=1;
    delay();
  SDA=1;
    delay();
}


void respons()//应答   相当于一个智能的延时函数
{
        uchar i;
  SCL=1;
    delay();
  while((SDA==1)&&(i<250))
           i++;
      SCL=0;
    delay();
}

void init()      //初始化
{
  SDA=1;
    delay();
  SCL=1;
    delay();    
}

uchar read_byte()
{
   uchar i,k;
        SCL=0;
    delay();
  SDA=1;
    delay();
  for(i=0;i<8;i++)
   {
         SCL=1;
            delay();
          k=(k<<1)|SDA;//先左移一位,再在最低位接受当前位
             SCL=0;
            delay();
  }
 return k;

}

void write_byte(uchar date)       //写一字节数据
{
       uchar i,temp;
     temp=date;
        for(i=0;i<8;i++)
   {
         temp=temp<<1; //左移一位 移出的一位在CY中
          SCL=0;                      //只有在scl=0时sda能变化值
                delay();
          SDA=CY;
           delay();
          SCL=1;
            delay();            
  }   
  SCL=0;
    delay();
  SDA=1;
    delay();
}



void write_add(uchar control,uchar date)
{
        start();
  write_byte(PCF8591);        //10010000  前四位固定 接下来三位全部被接地了 所以都是0 最后一位是写 所以为低电平
        respons();
        write_byte(control);
      respons();
        write_byte(date);
 respons();
        stop();

}

uchar read_add(uchar control)
{
  uchar date;
       start();
  write_byte(PCF8591);
      respons();
        write_byte(control);
      respons();
        start();
  write_byte(PCF8591+1);       //把最后一位变成1,读
     respons();
        date=read_byte();
 stop();
   return date;

}[page]


void display(uchar ge,uchar shi,uchar bai)
{
  P0=0xff;
  LS138A=1;   //第一位
     LS138B=1;
 LS138C=1;
 P0=table[ge];
     delay_1ms(5);
     P0=0xff;
  LS138A=0;   //第二位
     LS138B=1;
 LS138C=1;
 P0=table[shi];
    delay_1ms(5);
     P0=0xff;
  LS138A=1;   //第三位
     LS138B=0;
 LS138C=1;
 P0=table[bai];
    delay_1ms(5);
  
}



void main()
{      
  uchar num,ge,shi,bai;
     init();
   while(1)
  {
              
         display(ge,shi,bai);
              num=read_add(0x40);
               ge=num;
           num/=10;
          shi=num;
          num/=10;
          bai=num;
  }
}








3.DA转换

 

 


//I2C总线很强大
//程序功能:通过DA转换把输出电压逐渐增大,使加在上面的发光二级管慢慢变亮
//          到最亮后再变暗,如此循环

#include 

#define uchar unsigned char
#define uint unsigned int
#define  PCF8591 0x90    //PCF8591 地址


sbit SCL=P2^1;       //串行时钟输入端
sbit SDA=P2^0;   //串行数据输入端

void delay()       //延时4-5个微秒
{;;}

void delay_1ms(uint z)
{
 uint x,y;
 for(x=z;x>0;x--)
           for(y=110;y>0;y--)
                 ;
}

void start()//开始信号
{
 SDA=1;
    delay();
  SCL=1;
    delay();
  SDA=0;
    delay();
}

void stop()      //停止信号
{
 SDA=0;
    delay();
  SCL=1;
    delay();
  SDA=1;
    delay();
}


void respons()//应答   相当于一个智能的延时函数
{
        uchar i;
  SCL=1;
    delay();
  while((SDA==1)&&(i<250))
           i++;
      SCL=0;
    delay();
}

void init()      //初始化
{
  SDA=1;
    delay();
  SCL=1;
    delay();    
}

void write_byte(uchar date)      //写一字节数据
{
       uchar i,temp;
     temp=date;
        for(i=0;i<8;i++)
   {
         temp=temp<<1; //左移一位 移出的一位在CY中
          SCL=0;                      //只有在scl=0时sda能变化值
                delay();
          SDA=CY;
           delay();
          SCL=1;
            delay();            
  }   
  SCL=0;
    delay();
  SDA=1;
    delay();
}



void write_add(uchar control,uchar date)
{
        start();
  write_byte(PCF8591);        //10010000  前四位固定 接下来三位全部被接地了 所以都是0 最后一位是写 所以为低电平
        respons();
        write_byte(control);
      respons();
        write_byte(date);
 respons();
        stop();

}




void main()
{
       
 uchar a;
  init();
   while(1)
  {
         write_add(0x40,a);
                delay_1ms(5);
             a++;
              if(a>250)
                  a=0;                
  }
}





				   
关键字:PCF8591  ADDA转换 引用地址:使用PCF8591进行ADDA转换

上一篇:51单片机可编程芯片8255之LED灯控制
下一篇:在C51程序中嵌入汇编

推荐阅读最新更新时间:2024-03-16 14:33

PCF8591 应用程序
PCF8591 的通信接口是 I2C,那么编程肯定是要符合这个协议的。单片机对 PCF8591 进行初始化,一共发送三个字节即可。第一个字节,和 EEPROM 类似,是器件地址字节,其中7位代表地址,1位代表读写方向。地址高4位固定是 0b1001,低三位是 A2,A1,A0,这三位我们电路上都接了 GND,因此也就是 0b000,如图17-5所示。 图17-5 PCF8591 地址字节 发送到 PCF8591 的第二个字节将被存储在控制寄存器,用于控制 PCF8591 的功能。其中第3位和第7位是固定的0,另外6位各自有各自的作用,如图17-6所示,我逐一介绍。 图17-6 PCF8591 控制字节 控制字节的第6位是
[单片机]
<font color='red'>PCF8591</font> 应用程序
PCF8591 AD/DA转换MSP430程序
PCF8591用的也是IIC 总线,有了昨晚写的总线协议,倒不是很难,下一步可以考虑做一个不精确的信号发生器,睡觉去咯!iic.h文件的源码在这里:http://www.51hei.com/mcu/2319.html #ifndef __PCF8591_h #define __PCF8591_h #include basic.h #include IIC.H //------------------------------------------- //宏定义 #define AD_WRITE_MODE 0X90 #define AD_READ_MODE 0X91 #define EN_DA0 0X40//打开DA
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved