1.实际电路

2.引脚图

3.地址

高四位为固定地址1001,A2A1A0可编程地址,通过观察实际电路,可知A2A1A0 为000。最低位为读写为,1为读,0为写。

4.控制字

控制寄存器的高半字节用于 允许模拟输出 将模拟输入编程为单端或差分输入

低半字节选择一个由高半字节定义的模拟输入通道。如果自动增量标志(AUTO-INCREMENT FLAG)置1,每次A/D转换后通道号将自动增加。

5.开始 停止信号

 void Start()
{
SDA = ;
delay();
SCL = ;
delay();
SDA = ;
delay();
} void Stop()
{
SDA = ;
delay();
SCL = ;
delay();
SDA = ;
delay();
}

6.应答 非应答信号

 void Respons()
{
SDA = ;
delay();
SCL = ;
delay();
SCL = ;
delay();
} void NoRespons()
{
SDA = ;
delay();
SCL = ;
delay();
SCL = ;
delay();
}

7.位传输

 void write_byte(unsigned char dat)
{
unsigned char i = ;
for(i = ; i < ; i++) {
dat = dat<<;
SCL = ;
delay();
SDA = CY; //类似于8086的PSW的CF位 即左移data溢出位进入CY
delay();
SCL = ;
delay();
}
SCL = ;
delay();
SDA = ;
delay();
} unsigned char read_byte()
{
unsigned char i = , dat;
SCL = ;
delay();
SDA = ;
for(i = ; i < ; i++) {
SCL = ;
delay();
dat = (dat<<) | SDA;
SCL = ;
delay();
}
return dat;
}

8.IIC总线协议 A/D

读模式总线协议

 unsigned char readAdc()
{
unsigned char dat;
Start();
write_byte(0x90); //前四位地址1001 后三位根据硬件000 最后一位R/W(上划线) 写信号
Respons();
write_byte(0x40); //控制字 通道0
Respons(); Start();
write_byte(0x91); //前四位地址1001 后三位根据硬件000 最后一位R/W(上划线) 读信号
Respons();
dat = read_byte();
NoRespons();
Stop();
return dat;
}

9.IIC总线协议 D/A

写模式总线协议

void writeDAC(unsigned char dat)
{
Start();
write_byte(0x90); //前四位地址1001 后三位根据硬件000 最后一位R/W(上划线) 写信号
Respons();
write_byte(0x40); //控制字
Respons();
write_byte(dat);
Respons();
Stop();
}

10.功能实现

 //IIC PCF8591 A/D D/A
#include <reg52.h>
#include <stdio.h>
#define uchar unsigned char
sbit SDA = P2^;
sbit SCL = P2^; void delay()
{;;} void delayms(unsigned int n) //误差 -0.651041666667us
{
unsigned char a,b;
unsigned int i;
for(i = ; i < n; i++) {
for(b=;b>;b--)
for(a=;a>;a--);
}
} void InitUART(void)
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
TR1 = ;
} void Init()
{
SCL = ;
delay();
SDA = ;
delay();
} void Start()
{
SDA = ;
delay();
SCL = ;
delay();
SDA = ;
delay();
} void Stop()
{
SDA = ;
delay();
SCL = ;
delay();
SDA = ;
delay();
} void Respons()
{
SDA = ;
delay();
SCL = ;
delay();
SCL = ;
delay();
} void NoRespons()
{
SDA = ;
delay();
SCL = ;
delay();
SCL = ;
delay();
} void write_byte(unsigned char dat)
{
unsigned char i = ;
for(i = ; i < ; i++) {
dat = dat<<;
SCL = ;
delay();
SDA = CY; //类似于8086的PSW的CF位 即左移data溢出位进入CY
delay();
SCL = ;
delay();
}
SCL = ;
delay();
SDA = ;
delay();
} unsigned char read_byte()
{
unsigned char i = , dat;
SCL = ;
delay();
SDA = ;
for(i = ; i < ; i++) {
SCL = ;
delay();
dat = (dat<<) | SDA;
SCL = ;
delay();
}
return dat;
} unsigned char readAdc()
{
unsigned char dat;
Start();
write_byte(0x90); //前四位地址1001 后三位根据硬件000 最后一位R/W(上划线) 写信号
Respons();
write_byte(0x40); //控制字 通道0
Respons(); Start();
write_byte(0x91); //前四位地址1001 后三位根据硬件000 最后一位R/W(上划线) 读信号
Respons();
dat = read_byte();
NoRespons();
Stop();
return dat;
} void writeDAC(unsigned char dat)
{
Start();
write_byte(0x90); //前四位地址1001 后三位根据硬件000 最后一位R/W(上划线) 写信号
Respons();
write_byte(0x40); //控制字
Respons();
write_byte(dat);
Respons();
Stop();
} void SendOneByte(unsigned char c)
{
SBUF = c;
while(!TI);
TI = ;
}
int main()
{
unsigned char dat;
unsigned char tmpDA = ;
Init();
InitUART(); while()
{
delayms();
dat = readAdc();
SendOneByte(dat); tmpDA++;
if(tmpDA == )
tmpDA = ;
writeDAC(tmpDA);
}
return ;
}

AD直接采集DA出来的电压串口发送 验证成功

十天学会单片机Day6 学会看数据手册 (IIC总线PCF859芯片( A/D D/A)应用)的更多相关文章

  1. 十天学会单片机Day5 IIC总线AT2402芯片(EEPROM)应用

    1.采用串行总线技术可以使系统的硬件设计大大简化.系统的体积减小.可靠性提高.同时,系统的更改和扩充极为容易. 常用的串行扩展总线有: IIC (Inter IC BUS)总线.单总线(1-WIRE ...

  2. 《十天学会单片机和C语言编程》

    <十天学会单片机和C语言编程> 大家注意了这个文件只有最新版迅雷可以下载,下面的lesson几就是第几课.点击右键使用迅雷下载. ed2k://|file|[十天学会单片机和C语言编程]. ...

  3. 十天学会单片机Day3 D/A与A/D转换器

    D/A转换器 1.二进制权电阻网络型D/A转换器 基准电压Vref 数据D(d3d2d1d0) 输出模拟电压V0 i0 = Vref/8R    i1 = Vref/4R     i2 = Vref/ ...

  4. 十天学会单片机Day1点亮数码管(数码管、外部中断、定时器中断)

    1.引脚定义 P3口各引脚第二功能定义 标号 引脚 第二功能 说明 P3.0 10 RXD 串行输入口 P3.1 11 TXD 串行输出口 P3.2 12 INT0(上划线) 外部中断0 P3.3 1 ...

  5. 十天学会单片机Day4串行口通信

    并行与串行基本通信方式 1.并行通信方式 通常是将数据字节的各位用多条数据线同时进行传送. 并行通信控制简单.传输速度快:由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难. 2.串行通 ...

  6. 十天学会单片机Day2键盘检测(独立键盘、矩阵键盘)

    1.键盘的分类 编码键盘:键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘 非编码键盘:靠软件编程来识别的称为非编码键盘.独立键盘.矩阵键盘 2.按键消抖   ...

  7. 十天学会单片机Day0点亮LED (锁存器、三极管、继电器)

    C51常用的数据类型 数据类型 关键字 所占位数 表示数范围 无符号字符型 unsigned char 8 0~255 有符号字符型 char 8 -128~127 无符号整型 unsigned in ...

  8. UWP开发入门(十九)——10分钟学会在VS2015中使用Git

    写程序必然需要版本控制,哪怕是个人项目也是必须的.我们在开发UWP APP的时候,VS2015默认提供了对微软TFS和Git的支持.考虑到现在Git很火,作为微软系的程序员也不得不学一点防身,以免被开 ...

  9. 十句话教你学会Linux数据流重定向

    1.看到重定向一下子就想起了web里面的redirect,没错,但是Linux数据流重定向的作用不是跳到另一个网页,而是用来存储重要的屏幕信息.将不必要的屏幕信息输出到文件里或者“黑洞”里.将错误信息 ...

随机推荐

  1. Vim练级攻略(转)

    转自平凡的世界:http://www.ccvita.com/ 前言今天看到这篇文章,共鸣点非常多.它把Vim使用分为4个级别,目前我自己是熟练运用前面三级的命令,在培养习惯使用第四级.完全就是我这一年 ...

  2. Android -- 多线程下载, 断点下载

    1. 原理图 2. 示例代码 需要权限 <uses-permission android:name="android.permission.INTERNET"/> &l ...

  3. 修改input的placeholder颜色

    1.CSS选择器 因为每个浏览器的CSS选择器有所差异,所以需要针对每个浏览器做单独的设定. ::-webkit-input-placeholder { /* WebKit browsers */ c ...

  4. PHP对象的使用,什么时候可以用中括号[], 什么时候可以用箭头->

    $orderTPLMessage = (object)array( 'touser' => '这里填open id', 'template_id' => 'oQDOldy7q6CdaYw2 ...

  5. oracle 11g安装过程中问题:移动bin\oralbac11.dll 到bin\oralbac11.dll.dbl出错

    解决方法: 直接找到oralbac11.dll.dbl这个文件,将其删除即可.   http://blog.sina.com.cn/s/blog_51beaf0e0101000v.html

  6. bzoj3673可持久化并查集

    n个集合 m个操作操作:1 a b 合并a,b所在集合2 k 回到第k次操作之后的状态(查询算作操作)3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0<n,m<=2*10^ ...

  7. torch7框架 深度学习(1)

    前面已经安装好了torch,下面就来看看如何在torch框架上搭建深度学习模型,我一直觉得源码结合原理是机器学习最好的学习途径.所以我们从分析一个简单的案例开始吧. 参考Supervised Lear ...

  8. NVML查询显卡信息

    前段时间做英伟达硬解得时候,显卡总是莫名挂掉,后来发现是因为显卡温度过高掉了.这几天找到CUDA中有NVML工具可以查看显卡信息,nvidia-smi也是基于这个工具包. 使用的CUDA版本为CUDA ...

  9. mysqldb 安装

    MySQLdb是python的一个标准的连接和操纵mysql的模块. ubuntu下安装: sudo apt-get install python-mysqldb sudo apt-get insta ...

  10. ssh自动分发密匙脚本样板

    #!/bin/bash rom=/media/cdrom dir=/etc/yum.repos.d Use=$ mima=$ function yumj(){ [ -d "$rom" ...