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. JAXB和XStream比较

    转自:https://www.cnblogs.com/tang9139/p/4825610.html http://www.cnblogs.com/wlsblog/p/7452882.html 这两东 ...

  2. 机器学习笔记—EM 算法

    EM 算法所面对的问题跟之前的不一样,要复杂一些. EM 算法所用的概率模型,既含有观测变量,又含有隐变量.如果概率模型的变量都是观测变量,那么给定数据,可以直接用极大似然估计法,或贝叶斯估计法来估计 ...

  3. 【Python】模块学习之(__call__)实现准确计算函数运行时间

    背景 博主在写自动化的过程中,有遇到有的用例运行缓慢的问题,想起在上一家公司的的“自动化工厂”有一个指标:两小时内运行完所有的用例才算合格.所以想计算每一个用例的运行时间. 思路 因为使用的POM模型 ...

  4. 初识HTML和CSS2

    上节作业问题: 1.css重用 <style> 如果整个页面的宽度 > 900px时: { .c{ 共有 } .c1{ 独有 } } .c2{ 独有 } </style> ...

  5. spring mvc: 生成RSS源

    spring mvc: 生成RSS源 准备: 从相同的maven存储库页面下载 Rome 库及其依赖项rome-utils,jdom和slf4j.和所需的依赖关系 <!-- rss源依赖 --& ...

  6. 明确出需求 然后开会评审 要什么接口 接口参数、返回json内容、格式 协定好 在做

     明确出需求 然后开会评审 要什么接口 接口参数.返回json内容.格式 协定好 在做 

  7. JS检查数组中是否存在某个值

    //三个参数,在array中查找needle,bool为布尔量,如果为true则返回needle在array中的位置function inArray2(needle,array,bool){      ...

  8. java 判断一个字符串中的数字:是否为数字、是否包含数字、截取数字

    题外话: JavaScript中判断一个字符是否为数字,用函数:isDigit(); 一.判断一个字符串是否都为数字 package com.cmc.util; import java.util.re ...

  9. 2-4-搭建DHCP服务实现动态分配IP地址-NTP网络时间同步

    本节所讲内容: •DHCP服务器工作原理 •使用DHCP为局域网中的机器分配IP地址 •使用DHCP为服务器分配固定IP地址 •ntpdate加计划任务同步服务器时间 ---------------- ...

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

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