找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12277|回复: 1
收起左侧

单片机驱动PCF8591模块功能实现详解

[复制链接]
ID:404797 发表于 2019-7-20 07:56 | 显示全部楼层 |阅读模式
    最近想练习数模模数转换,看普通的模数数模专换芯片,接口都太复杂,要制作电路板,不适合我这种只用最小系统板而且制作能力不强的新手。原以为没办法练习模数数模转换啦,没想到有人已为我这种制作能力弱的人考虑,制作了合适的设备“PCF8591模块”,该模块以IIC方式与单片机通信,只需要2根通信线,具备1路数模转换输出,4路电压输入采集(电压输入范围0-5v),集成光敏电阻,通过短路P5接入电路,采集环境光强精确数值,集成热敏电阻,通过短路P4接入电路,采集环境温度精确数值,集成1路0-5V电压输入,通过短路P6接入电路,采集(通过蓝色电位器调节输入电压)。设备如下:
8591.jpg
    看该模块的功能,不仅同时具备模数和数模转换功能,比单一的模数或数模转换功能强大,而且还能精确测光照强度和温度,可谓功能丰富,实在令人欣喜,怎么多功能怎么利用?我是从基本的模数和数模转换入手,然后再尝试光照和温度的测定。
    在完成基本的模数和数模转换程序后,将输出与输入通道0用杜邦线短接,然后输出一个数值的电压,再通过通道0测量电压值,与输出的电压值接近相等,证明模数数模转换功能正确实现,通过断开、连接P4、P5、P6再对四个输入通道的数据变化情况进行测试,发现P6对应通道0,P5对应通道1,P4对应通道2。同时发现,不需要用杜邦线把输出端与输入端短接,只要向输出端输出一个数值的电压,四个输入端都自行得到这个输出端的电压。
    下面是本人的实验单片机程序,
  1. #include <reg52.h>
  2. #include "codetab.h"
  3. #include "LQ12864.h"
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. sbit sda=P2^6;
  7. sbit scl=P2^7;
  8. void delayms(int z){int x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}
  9. //-------------------------------------------------------
  10. void start(){sda=1;scl=1;sda=0;}
  11. void stop(){sda=0;scl=1;sda=1;}
  12. void respons(){int i;scl=1;while((sda==1)&&(i<250))i++;scl=0;}
  13. void init(){sda=1;scl=1;}
  14. void write_byte(uchar dat)
  15. {uchar i,temp;
  16.   temp=dat;
  17.   for(i=0;i<8;i++){temp=temp<<1;scl=0;sda=CY;scl=1;}
  18.      scl=0;sda=1;
  19. }
  20. //--------------------------------------------------------------------------------
  21. uchar read_byte()
  22. {uchar i,k;
  23. scl=0;sda=1;
  24. for(i=0;i<8;i++){scl=1;k=(k<<1)|sda;scl=0;}
  25. return k;
  26. }
  27. //##################################################################
  28. void write_data(uchar chip,uchar address,uchar dat)
  29. {start();
  30. write_byte(chip);respons();write_byte(address);respons();
  31. write_byte(dat);respons();stop();
  32. }
  33. //----------------------------------------------
  34. void SetChanel(uchar chip,uchar ch)
  35. {start();
  36. write_byte(chip);respons();
  37. write_byte(ch);respons();
  38. stop();
  39. }
  40. //----------------------------------------------
  41. uchar read_data(uchar chip)
  42. {uchar dat;
  43.   start(); write_byte(chip+1);respons();dat=read_byte();stop();
  44.   return dat;
  45.   }
  46. //==================================================================
  47. Putint(int x,int y,unsigned char ci)
  48. {unsigned char str[3];
  49. if((ci/16)<10)str[0]=(ci/16)+0x30;else str[0]=(ci/16)+0x37;
  50. if((ci%16)<10)str[1]=(ci%16)+0x30;else str[1]=(ci%16)+0x37;
  51. OLED_P8x16Str(x,y,str);
  52. }
  53. Showchandata(char chan,char x,char y,char *str)
  54. {unsigned char c;
  55. SetChanel(0x90,chan);
  56. c=read_data(0x90);
  57. OLED_P8x16Str(x,y,str);
  58. Putint(x+32,y,c);
  59. }
  60. //######################################################################
  61. main()
  62. {int i,j;
  63. uchar c;
  64. char str0[]="Begin  ";;
  65. init();
  66. OLED_Init();write_data(0x90,0x40,0x99);
  67. for(i=0;i<50;i++)
  68. {str0[5]=i/10+0x30;str0[6]=i%10+0x30;OLED_P8x16Str(32,0,str0);
  69.   Showchandata(0x40,2,2,"0P6=   ");//通道0,0-5V可调电压接入电路,通过P6接入
  70.   Showchandata(0x41,64,2,"1P5=   ");//通道1,光敏电阻,通过P5接入
  71.   Showchandata(0x42,2,4,"2P4=   ");//通道2,热敏电阻,通过P4接入
  72.   Showchandata(0x43,64,4,"ch3=   ");//通道3,输入电压,反映输出端的电压高低。
  73.   delayms(500);
  74. }
  75. OLED_P8x16Str(32,0,"Test...");i=0;j=0;
  76. while(1)
  77. {write_data(0x90,0x40+i%4,i);
  78.   Showchandata(0x40,2,2,"0P6=   ");//通道0,0-5V可调电压接入电路,通过P6接入
  79.   Showchandata(0x41,64,2,"1P5=   ");//通道1,光敏电阻,通过P5接入
  80.   Showchandata(0x42,2,4,"2P4=   ");//通道2,热敏电阻,通过P4接入
  81.   Showchandata(0x43,64,4,"ch3=   ");//通道3,输入电压,反映输出端的电压高低。
  82.   i+=5;if(i>=255)i=0;j++;if(j>15)j=0;delayms(500);
  83.   };
  84. }
复制代码

    程序分两个过程,第一个过程先对四个输入端进行采样测量,然后数值显示出来,为了方便显示,本次实验用
OLED 128x64显示器,每隔1秒测试一遍,第二个过程,先向输出端口输出0,再测试四个通道的数值,然后将输出端口的输出电压递增5个整数值,然后再测量四个通道的数值。从实验中可看到,通道0反映电位器的状态,整个过程数值没变,通道1反映实验时的光照,数值随光照不同而改变,通道2数值始终是0xff,按设备说明应是反映环境温度,但不知是热敏电阻坏还是本人的程序有哪里出错,不管环境温度多少,通道2数值都不变,用手摸热敏电阻,通道2数值也不变,看来测温度的功能是没实现啦,不知原因在哪,希望懂的人指教。
    下面是程序运行实况:
    b6.jpg b12.jpg b28.jpg b35.jpg
    第一阶段,对四个通道采样测量50次,数值基本不变。
t2.jpg t3.jpg
    第二阶段,以5为间隔递增输出,通道3数值不断改变,其他通道基本不变。

b8.jpg
b20.jpg
b47.jpg

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:910766 发表于 2021-5-9 13:39 | 显示全部楼层
你好,可以分享下源码嘛“codetab.h" 和LQ12864.h文件我这里没有
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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