找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11697|回复: 3
收起左侧

使用PCF8591进行ADDA转换 电路图+程序

[复制链接]
ID:91350 发表于 2015-10-29 17:39 | 显示全部楼层 |阅读模式
本帖最后由 piaolin 于 2015-10-29 17:45 编辑

1.电路图


2.AD转换
  1. //AD转换,P0口连接J12(数码管)

  2. //功能:通过转动滑动变阻器改变模拟输入

  3. //通过AD转换,把数值用数码管显示



  4. #include <reg51.h>

  5. #define uchar unsigned char

  6. #define uint unsigned int

  7. #define  PCF8591 0x90    //PCF8591 地址


  8. bit write=0;  //写24c02的标志

  9. sbit SCL=P2^1;         //串行时钟输入端

  10. sbit SDA=P2^0;   //串行数据输入端

  11. sbit LS138A=P2^2;//138译码器的3位 控制数码管的  

  12. sbit LS138B=P2^3;

  13. sbit LS138C=P2^4;


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



  15. void delay()   //延时4-5个微秒

  16. {;;}


  17. void delay_1ms(uint z)

  18. {

  19. uint x,y;

  20. for(x=z;x>0;x--)

  21.            for(y=110;y>0;y--)

  22.                  ;

  23. }


  24. void start()//开始信号

  25. {

  26. SDA=1;

  27.     delay();

  28.   SCL=1;

  29.     delay();

  30.   SDA=0;

  31.     delay();

  32. }


  33. void stop()      //停止信号

  34. {

  35. SDA=0;

  36.     delay();

  37.   SCL=1;

  38.     delay();

  39.   SDA=1;

  40.     delay();

  41. }



  42. void respons()//应答  相当于一个智能的延时函数

  43. {

  44.         uchar i;

  45.   SCL=1;

  46.     delay();

  47.   while((SDA==1)&&(i<250))

  48.            i++;

  49.       SCL=0;

  50.     delay();

  51. }


  52. void init()      //初始化

  53. {

  54.   SDA=1;

  55.     delay();

  56.   SCL=1;

  57.     delay();   

  58. }


  59. uchar read_byte()

  60. {

  61.    uchar i,k;

  62.         SCL=0;

  63.     delay();

  64.   SDA=1;

  65.     delay();

  66.   for(i=0;i<8;i++)

  67.    {

  68.          SCL=1;

  69.             delay();

  70.           k=(k<<1)|SDA;//先左移一位,再在最低位接受当前位

  71.              SCL=0;

  72.             delay();

  73.   }

  74. return k;


  75. }


  76. void write_byte(uchar date)       //写一字节数据

  77. {

  78.        uchar i,temp;

  79.      temp=date;

  80.         for(i=0;i<8;i++)

  81.    {

  82.          temp=temp<<1; //左移一位 移出的一位在CY中

  83.           SCL=0;                      //只有在scl=0时sda能变化值

  84.                 delay();

  85.           SDA=CY;

  86.            delay();

  87.           SCL=1;

  88.             delay();            

  89.   }   

  90.   SCL=0;

  91.     delay();

  92.   SDA=1;

  93.     delay();

  94. }




  95. void write_add(uchar control,uchar date)

  96. {

  97.         start();

  98.   write_byte(PCF8591);        //10010000  前四位固定 接下来三位全部被接地了 所以都是0 最后一位是写 所以为低电平

  99.         respons();

  100.         write_byte(control);

  101.       respons();

  102.         write_byte(date);

  103. respons();

  104.         stop();


  105. }


  106. uchar read_add(uchar control)

  107. {

  108.   uchar date;

  109.        start();

  110.   write_byte(PCF8591);

  111.       respons();

  112.         write_byte(control);

  113.       respons();

  114.         start();

  115.   write_byte(PCF8591+1);      //把最后一位变成1,读

  116.      respons();

  117.         date=read_byte();

  118. stop();

  119.    return date;


  120. }



  121. void display(uchar ge,uchar shi,uchar bai)

  122. {

  123.   P0=0xff;

  124.   LS138A=1;   //第一位

  125.      LS138B=1;

  126. LS138C=1;

  127. P0=table[ge];

  128.      delay_1ms(5);

  129.      P0=0xff;

  130.   LS138A=0;   //第二位

  131.      LS138B=1;

  132. LS138C=1;

  133. P0=table[shi];

  134.     delay_1ms(5);

  135.      P0=0xff;

  136.   LS138A=1;   //第三位

  137.      LS138B=0;

  138. LS138C=1;

  139. P0=table[bai];

  140.     delay_1ms(5);

  141.   

  142. }




  143. void main()

  144. {      

  145.   uchar num,ge,shi,bai;

  146.      init();

  147.    while(1)

  148.   {

  149.               

  150.          display(ge,shi,bai);

  151.               num=read_add(0x40);

  152.                ge=num;

  153.            num/=10;

  154.           shi=num;

  155.           num/=10;

  156.           bai=num;

  157.   }

  158. }
复制代码






3.DA转换
  1. //I2C总线很强大

  2. //程序功能:通过DA转换把输出电压逐渐增大,使加在上面的发光二级管慢慢变亮

  3. //          到最亮后再变暗,如此循环


  4. #include <reg51.h>


  5. #define uchar unsigned char

  6. #define uint unsigned int

  7. #define  PCF8591 0x90    //PCF8591 地址



  8. sbit SCL=P2^1;       //串行时钟输入端

  9. sbit SDA=P2^0;   //串行数据输入端


  10. void delay()       //延时4-5个微秒

  11. {;;}


  12. void delay_1ms(uint z)

  13. {

  14. uint x,y;

  15. for(x=z;x>0;x--)

  16.            for(y=110;y>0;y--)

  17.                  ;

  18. }


  19. void start()//开始信号

  20. {

  21. SDA=1;

  22.     delay();

  23.   SCL=1;

  24.     delay();

  25.   SDA=0;

  26.     delay();

  27. }


  28. void stop()      //停止信号

  29. {

  30. SDA=0;

  31.     delay();

  32.   SCL=1;

  33.     delay();

  34.   SDA=1;

  35.     delay();

  36. }



  37. void respons()//应答  相当于一个智能的延时函数

  38. {

  39.         uchar i;

  40.   SCL=1;

  41.     delay();

  42.   while((SDA==1)&&(i<250))

  43.            i++;

  44.       SCL=0;

  45.     delay();

  46. }


  47. void init()      //初始化

  48. {

  49.   SDA=1;

  50.     delay();

  51.   SCL=1;

  52.     delay();   

  53. }


  54. void write_byte(uchar date)      //写一字节数据

  55. {

  56.        uchar i,temp;

  57.      temp=date;

  58.         for(i=0;i<8;i++)

  59.    {

  60.          temp=temp<<1; //左移一位 移出的一位在CY中

  61.           SCL=0;                      //只有在scl=0时sda能变化值

  62.                 delay();

  63.           SDA=CY;

  64.            delay();

  65.           SCL=1;

  66.             delay();            

  67.   }   

  68.   SCL=0;

  69.     delay();

  70.   SDA=1;

  71.     delay();

  72. }




  73. void write_add(uchar control,uchar date)

  74. {

  75.         start();

  76.   write_byte(PCF8591);        //10010000  前四位固定 接下来三位全部被接地了 所以都是0 最后一位是写 所以为低电平

  77.         respons();

  78.         write_byte(control);

  79.       respons();

  80.         write_byte(date);

  81. respons();

  82.         stop();


  83. }





  84. void main()

  85. {

  86.       

  87. uchar a;

  88.   init();

  89.    while(1)

  90.   {

  91.          write_add(0x40,a);

  92.                 delay_1ms(5);

  93.              a++;

  94.               if(a>250)

  95.                   a=0;               

  96.   }

  97. }

复制代码

I2C总线的用法请参阅我的前一篇文章:http://www.51hei.com/bbs/dpj-39852-1.html
回复

使用道具 举报

ID:192309 发表于 2017-4-22 13:34 | 显示全部楼层
很给力!!
回复

使用道具 举报

ID:362612 发表于 2018-11-20 02:04 | 显示全部楼层
赞一个!楼主大爱你
回复

使用道具 举报

ID:472756 发表于 2019-1-25 15:27 | 显示全部楼层
谢谢大佬
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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