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. [转]常见HTTP状态(如200,304,404,503)

    在网站建设的实际应用中,容易出现很多小小的失误,就像mysql当初优化不到位,影响整体网站的浏览效果一样,其实,网站的常规http状态码的表现也是一样,Google无法验证网站几种解决办法,提及到由于 ...

  2. ADO.net笔记

    1.DbConnectionConnection对象也称为数据库连接对象,Connection对象的功能是负责对数据源的连接.所有Connection对象的基类都是DbConnection类.Conn ...

  3. NoSQL&&Redis介绍

    再说Redis之前,想先说一下NoSQL.在最早的单机时代,随着数据的增加一台机器可能放不下了.同时索引占用的内存空间也会越来越大.对请求的读写操作影响很大.于是就在数据库之前增加了一层保护层 — 缓 ...

  4. 设计模式--访问者模式C++实现

    访问者模式C++实现 1定义Visitor Pattern 封装一些作用于某种数据结构中各元素的操作,他可以在不改变数据结构的前提下定义作用于这些元素新的操作 2类图 角色分析 Visitor抽象访问 ...

  5. 1-16-1 LVM管理和ssm存储管理器使用&磁盘配额

    大纲: 1-1- LVM逻辑卷的管理 1-2- SSM管理工具的使用 1-3- 磁盘配额技巧 ====================================== 问题描述: 当我们需要在一个 ...

  6. HDU-4123-树形dp+rmq+尺取

    Bob’s Race Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  7. iOS-如何写好一个UITableView

    如何写好一个UITableView 字数5787 阅读3745 评论25 喜欢69 本文是直播分享的简单文字整理,直播共分为上.下两部分.第一部分:优酷 Or YouTube,第二部分:优酷 Demo ...

  8. 【WebGL】4.光源

    光的类型:所有的光都是从THREE.Light继承,分为环境光THREE.AmbientLight,点光源PointLight,聚光灯THREE.SpotLight和方向光THREE.Directio ...

  9. Falsk项目cookie中的 csrf_token 和表单中的 csrf_token实现

    Flask中请求体的请求开启CSRF保护可以按以下配置 from flask_wtf.csrf import CSRFProtect app.config.from_object(Config) CS ...

  10. Guid.NewGuid() 和 new Guid()的区别

    Guid.NewGuid().ToString() + "||" + (new Guid()).ToString() b8efacbb-7d43-4da5-9f48-9a75d8c ...