PCF8591
2015-05-02 10:19
423 查看
pcf8591.h
pcf8591.c
#ifndef _PCF8591_H_ #define _PCF8591_H_ #include<reg51.h> #include<i2c.h> #ifndef uchar #define uchar unsigned char #endif #ifndef uint #define uint unsigned int #endif //参考电压 #define VREF 5.0 /******************************** _________________________________ |1 0 0 1 | A2 A1 A0 R/W| | | | | 固定部分 | 可编程部分 | | | | ---|-----------|---------------|-- *******************************/ #define WRITEADDR 0x90 #define READADDR 0x91 void pcf8591SetChannel(uchar channel); uchar pcf8591ReadByte(); float pcf8591Value(); void pcf8591DAConversion(uchar value); #endif
pcf8591.c
#include<pcf8591.h> #include<i2c.h> /******************************* D7 D6 D5 D4 D3 D2 D1 D0 ******************************* D0,D1,通道选择位 D2,自动增量允许位 D3,特征位,固定为0 D5,D4模拟量输入方式选择位 00:四路单端输入 01:3路差分输入 10:单端与差分输入 11:2路差分输入 D6,模拟量输出允许位 A/D转换时设置为0(地址选择字D0位此时为1) D/A转换时设置为1(地址选择字D0位此时为0) D7,特征位,固定为0。 ******************************/ void pcf8591SetChannel(uchar channel) { I2C_Start(); //设计ack的作用体现在这里 //就是决定是否下次继续发送数据 //当pcf8591的控制字发送完后, //不再发送了,就将ack设置为0; I2C_SendByte(WRITEADDR, 1); I2C_SendByte(0x40|channel, 0); I2C_Stop(); } uchar pcf8591ReadByte() { uchar dat; I2C_Start(); I2C_SendByte(READADDR, 1); dat = I2C_ReadByte(); I2C_Stop(); return dat; } float pcf8591Value() { uint temp = pcf8591ReadByte() * 2; float v = temp * VREF /(2 * 256); return v; } /* void pcf8591DAConversion(uchar value) { I2C_Start(); I2C_SendByte(WRITEADDR, 1); I2C_SendByte(0x40, 1); I2C_SendByte(value, 0); I2C_Stop(); } */
相关文章推荐
- PCF8591 AD/DA转换
- PCF8591组件(A/D和D/A转换)
- 109-PCF8591 4路AD数码管显示
- PCF8591 A/D转换实验-测量电位器的电平
- PCF8591 1602液晶显示
- PCF8591读写
- PCF8591 DA输出模拟
- ADDA数模转换——PCF8591
- PCF8591 1602液晶显示
- AD PCF8591芯片学习(未完待续)
- PCF8591 1602液晶显示
- 51单片机AD转换之PCF8591
- PCF8591 4路AD数码管显示
- PCF8591芯片以及AD学习(一)
- I2C通信时序讲解,代码编写,PCF8591芯片使用范例,AT24C02芯片使用范例
- PCF8591学习(二)-AD转换,算法,串口打印
- 51采集PCF8591数据通过ESP8266上传C#上位机
- 单片机笔记AD转换之PCF8591
- 51采集PCF8591数据通过ESP8266上传C#上位机