PCF8591驱动程序
PCF8591中文手册讲义
PCF8591中文手册讲义一、PCF8591概述1. 内置一个模拟电压比较器;2. 提供4个模拟输入通道;3. 具有1个模拟输出通道;4. 适用于I2C总线通信;5. 工作电压范围宽,可达2.5V至6V。
二、PCF8591内部结构及功能1. 内部结构(1)模拟输入多路选择器:可以选择4个模拟输入通道之一;(2)A/D转换器:将模拟信号转换为数字信号;(3)D/A转换器:将数字信号转换为模拟信号;(4)模拟电压比较器:对输入的模拟电压进行比较;(5)I2C总线接口:实现与外部设备的通信。
2. 功能介绍(1)模拟输入多路选择器:通过I2C总线接口发送控制字,可以选择4个模拟输入通道之一;(2)A/D转换器:将选定的模拟输入信号转换为8位数字信号;(3)D/A转换器:将8位数字信号转换为模拟信号,输出至模拟输出通道;(4)模拟电压比较器:对输入的模拟电压进行比较,可应用于阈值检测等场景;(5)I2C总线接口:实现与单片机、微处理器等设备的通信,便于数据传输和控制。
三、PCF8591应用电路及编程方法1. 应用电路(1)电源电路:确保电源稳定,满足PCF8591的工作电压范围;(2)模拟输入电路:根据实际需求选择合适的传感器或信号源,并进行滤波、放大等处理;(3)模拟输出电路:可根据实际应用场景,对输出信号进行放大、滤波等处理;(4)I2C总线接口电路:连接单片机或其他设备的I2C接口,实现数据传输和控制。
2. 编程方法(1)初始化I2C总线接口:设置I2C总线的时钟频率、设备地址等参数;(2)发送控制字:选择模拟输入通道、启动A/D转换等;(3)读取A/D转换结果:通过I2C总线读取转换后的数字信号;(4)写入D/A转换数据:通过I2C总线发送8位数字信号,实现模拟信号输出;(5)模拟电压比较器应用:设置比较阈值,实现阈值检测等功能。
四、PCF8591编程实例及注意事项1. 编程实例include <Wire.h> // 引入I2C库define PCF8591_ADDR 0x48 // 设置PCF8591的I2C地址void setup() {Wire.begin(); // 初始化I2C总线}void loop() {// 读取模拟输入通道0的值Wire.beginTransmission(PCF8591_ADDR);Wire.write(0x04); // 控制字:选择通道0,启动A/D转换 Wire.endTransmission();Wire.requestFrom(PCF8591_ADDR, 2); // 请求2个字节的数据if (Wire.available() >= 2) {te high = Wire.read(); // 读取高8位te low = Wire.read(); // 读取低8位int value = (high << 8) | low; // 合并高低8位// value即为模拟输入通道0的数字值}// 通过模拟输出通道输出固定电压值(例如1.25V)Wire.beginTransmission(PCF8591_ADDR);Wire.write(0x40); // 控制字:选择D/A转换Wire.write(outputValue); // 写入D/A转换数据Wire.endTransmission();}2. 注意事项(1)确保I2C总线的电源和地线连接正确,避免信号干扰;(2)在读取A/D转换结果时,注意数据的字节顺序,避免数据解析错误;(3)模拟输入信号的幅值应在PCF8591的输入范围内,以免损坏芯片;(4)模拟输出通道的负载应适当,避免影响输出电压的精度;(5)在使用模拟电压比较器时,注意设置合适的比较阈值,以提高检测准确性。
pcf8591驱动代码
#define __PCF8591_H_
#include <intrins.h>
#define somenop Delay5us()
//总线引脚定义
sbit SDA = P2^1; /*数据线*/
sbit SCL = P2^0; /*时钟线*/
void Delay5us()//@11.0592MHz
{
unsigned char i;
_nop_();
i = 11;
while (--i);
}
void Delay10ms()//@11.0592MHz
{
unsigned char i, j;
i = 108;
j = 145;
do
{
while (--j);
} while (--i);
}
//总线启动条件
void IIC_Start(void)
temp=IIC_RecByte();
IIC_Ack(0);
IIC_Stop();
return temp;
}
//ADC初始化
void ADC_Init(unsigned channel)
{
IIC_Start();
IIC_SendByte(0x90);//激活写操作
IIC_WaitAck();
IIC_SendByte(channel);//选择通道
{
SCL = 0;
IIC_Stop();
return 0;
}
else
{
SCL = 0;
return 1;
}
}
//通过I2C总线发送数据
《传感器应用技术》-智能洗衣机温度监测系统
时间常数 到最终值的63.2%时所需的时间 指允许热敏电阻正常工作的温度范围。
温度范围 一般的工作温度范围为-55-315℃ 指在规定环境温度下,热敏电阻正常工
最大电压
热敏电阻的种类、特性、结构和参数
1
2
3
4
热敏电阻的 定义
判断温度变量是否超过阈值, 当温度低于阈值时,继电器闭合; 当温度超过阈值时,继电器断开。
解决办法
任务一 智能洗衣机温度监测系统
01 职业能力目标 02 任务描述与要求 03 任务分析与计划 04 知识储备
05 任务实施 06 任务检查与评价 07 任务小结 08 任务拓展
任务实施前必须先准备 好以下设备和资源。
需求
通过2个按键的选择来切换衣 服材质和温度阈值,当选择按键1 时,代表材质1,温度为阈值30°; 当选择按键2时,代表材质2,温 度为阈值50°。
判断独立按键的键值,当选 择按键1时,衣服为材质1,温度 为阈值30°;当选择按键2,衣服 为材质2温度为阈值50°。
解决办法
需求
当智能洗衣机的温度高于设定 的阈值时,指示灯灭,洗衣机停 止加热;当智能洗衣机的温度低 于设定的阈值时,指示灯亮,洗 衣机开始加热。
01 职业能力目标 02 任务描述与要求 03 任务分析与计划 04 知识储备
05 任务实施 06 任务检查与评价 07 任务小结 08 任务拓展
1
2
3
4
温度传感器的 基础知识
热敏电阻的种类、 智能洗衣机温度 温度传感器系统 特性、结构和参数 监测系统结构分析 功能代码分析
温度:温度是表征物体冷热程度的物理量,是物体内部分子无规则剧烈运动 程度的标志,分子运动越剧烈,温度就越高。
基于51单片机-PCF8591数字电压表课程设计
课程名称:微机原理课程设计题目:数字电压表ﻬ摘要单片微型计算机简称单片机,是典型的嵌入式微控制器,常用英文字母的缩写MCU表示单片机,单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。
单片机由运算器,控制器,存储器,输入输出设备构成,相当于一个微型的计算机(最小系统),和计算机相比,单片机缺少了外围设备等。
概括的讲:一块芯片就成了一台计算机。
它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。
同时,学习使用单片机是了解计算机原理与结构的最佳选择。
它最早是被用在工业控制领域。
其中我们用于学习用的最多的是STC89C52单片机,STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
STC89C52使用经典的MCS-51内核,但也做了很多改进使得芯片具有传统51单片机不具备的功能。
STC89C52具有8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KB EE PROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构,全双工串行口。
本设计就是以单片机STC89C52为核心,附以外围电路,实现数字电压表的功能,并运用软件Proteus进行仿真来得到实验结果。
关键词:STC89C52单片机、仿真、中断、数字电压表、数码管显示ﻬ目录一、任务要求ﻩ错误!未定义书签。
1.1 设计任务ﻩ错误!未定义书签。
1.2设计要求ﻩ错误!未定义书签。
1.3发挥部分 ...................................................................................... 错误!未定义书签。
1.4 创新部分 ........................................................................................... 错误!未定义书签。
pcf8591采样和显示
观察DA亮度的变化!
3、DAC只需写pcf地址0x90+控制字节0x40(使能analog输出)+databyte0+……。
4、ADC过程:pcf地址0x90+控制字节0x40(通道AIN0)+(pcf地址0x91)+采样字节z;
case 7:LS138A=1; LS138B=1; LS138C=1; break;
}
for (j = 0 ; j<55;j++) { ;} //扫描间隔时间
}
}
void dacc(uchar cl)
{
start();
write_byte(0x90); // 数字转模拟输出地址0x90,因为是写w=0;所以pcf地址位+传送方向位=0x90;
scl=1;
delay();
while((sda==1)&&(i<255))i++; // sda是从机向主机发送的
scl=0; // 应答sda=0
delay(); // 非应答 sda=1或者是超时
case 3:LS138A=1; LS138B=1; LS138C=0; break;
case 4:LS138A=0; LS138B=0; LS138C=1; break;
case 5:LS138A=1; LS138B=0; LS138C=1; break;
case 6:LS138A=0; LS138B=1; LS138C=1; break;
红外遥控智能小车设计
红外遥控智能小车设计袁铭【摘要】设计了基于红外无线控制的智能小车,本文主要针对智能小车的系统结构和原理进行探讨和研究.重点研究了以80C51单片机为控制芯片,运用红外控制小车的运动方向,可以自动躲避障碍物.同时还研究了光电传感器的使用方法,使得智能小车具有自动头灯的功能,增加了液晶显示功能,可以显示环境和运动状态参数.【期刊名称】《电子世界》【年(卷),期】2018(000)003【总页数】2页(P124-125)【关键词】红外;单片机;液晶显示【作者】袁铭【作者单位】苏州工业园区工业技术学校【正文语种】中文1 引言物质生活水平的提高,一些比较有危险系数的工作人们越来越不想参与,随着智能设备的发展,这些设备完全可以代替人类去完成一些危险的或者难以到达的位置的工作任务。
当然,设备必须具有一定的智能性,能够独立的判断所处环境的所有有用信息,并加以判断,予以归类,捕捉实时性的信息,然后进行实时反馈,让我们可以更加客观地采取判断,不至于因环境的变化或者不适应等各种外界因素影响我们的主观意识。
这类智能设备很大程度解放了劳动力,并且提高了安全生产方面的安全系数。
智能小车就属于这类智能设备,人们可以通过无线遥控控制小车完成各种前进转弯等动作,同时小车具有环境感知能力,自行作出判断进行下一步动作,完成实时环境数据采集。
目前市面上有各种技术来控制小车,而本小车采用红外线遥控控制,结构简单,成本较低。
本文重点研究了基于单片机控制,红外遥控的小车系统及其硬件系统的设计和软件流程的设计。
2 系统整体结构方案本系统是通过红外线进行远距离控制,当小车的红外接收模块接收到远端发射的红外控制信号后进行信息处理解析,驱动直流电机完成前进、后退、加速和转弯等运行动作;小车安装液晶显示模块,可以显示小车所处的环境、时间和运行状态等参数;同时,当小车具有红外避障模块,当遇到前方的障碍物时可以自动倒退,躲避障碍物。
本系统采用80C51单片机作为小车的控制核心,电路由红外接收模块,红外避障模块,电机驱动模块,液晶显示模块,时钟模块等几部分构成,系统整体框图如图1所示。
pcf859芯片的使用
PCF8591芯片的使用基于PCF8591的AD—DA的程序设计。
本设计是通过PCF8591芯片选择通道1将滑动变阻器的电压记过A/D转换,有单片机读回,并在数码管显示,比且有这个数据再经过D/A转换成模拟电压驱动发光二极管。
发光二极管的亮度与数码管显示的电压值相对。
1. PCF8591芯片PCF8591是单片、单电源低功耗8位CMOS数据采集器件,具有4个模拟输入、一个输出和一个串行I2C总线接口。
3个地址引脚A0、A1和A2用于编程硬件地址,允许将最多8个器件连接至I2C总线而不需要额外硬件。
器件地址、控制和数据通道通过两线双向I2C总线传输。
器件功能包括多路复用模拟量输入、片上跟踪和保持功能、8位模数转换和8位数模转换。
最大转换速率取决于I2C总线的最高速率。
我实现的AD转换是使用通道0将滑动变阻器两端的电压AIN0~AIN3:模拟信号输入端。
A0~A2:引脚地址端。
VDD、VSS:电源端。
(2.5~6V)SDA、SCL:I2C 总线的数据线、时钟线。
OSC:外部时钟输入端,内部时钟输出端。
EXT:内部、外部时钟选择线,使用内部时钟时 EXT 接地。
AGND:模拟信号地。
AOUT:D/A 转换输出端。
VREF:基准电源端。
地址:I2C总线系统中的每一片PCF8591通过发送有效地址到该器件来激活。
该地址包括固定部分和可编程部分。
可编程部分必须根据地址引脚A0、A1和A2来设置。
在I2C 总线协议中地址必须是起始条件后作为第一个字节发送。
地址字节的最后一位是用于设置以后数据传输方向的读/写位。
(见下图)控制字:发送到PCF8591的第二个字节将被存储在控制寄存器,用于控制器件功能。
控制寄存器的高板字节用于允许模拟输出,和将模拟输入编程为单端过查分输入。
低半字节选择一个有高板字节定义的模拟输入通道。
如果自动增量标志置1,每次A/D转换后通道号将自动增加。
如果自动增量模式是使用内部振荡器的应用中所需要的,那么控制字中模拟输出允许标志应置1。
《单片机原理与应用》AD和DA转换实验
《单片机原理与应用》AD和DA转换实验一、实验目的1、学习AD转换芯片PCF8591的基本共组原理。
2、掌握PCF8591的编程方法二、实验说明PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。
PCF8591具有4个模拟输入、1个模拟输出和1个串行I2C总线接口。
PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。
在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。
1、地址寄存器I2C总线系统中的每一片PCF8591通过发送有效地址到该器件来激活,该地址包括固定部分和可编程部分。
可编程部分必须根据地址引脚A0. A1和A2来设置。
在I2C总线协议中地址必须是起始条件作为第一个字节发送。
地址字节的最后一位是用于设置以后数据传输方向的读写位。
如图8-1所示。
图8-1 地址寄存器2 控制字寄存器发送到PCF8591的第二个字节将被存储在控制寄存器,用于控制器件功能,控制寄存器的高半字节用于容许模拟输出,和将模拟输入编程为单端或差分输入。
低半字节选择一个由高半字节定义的模拟输入通道。
如果自动增量(auto-increment)标志置1,每次AD转换后通道号将自动增加。
如果自动增量(auto-increment)模式是使用内部振荡器的应用中所需要的,那么控制字节中模拟输出容许标志应置1.这要求内部振荡器持续运行,因此要防止振荡器启动延时的转换错误结果。
模拟输出容许标志可以在其他时候复位以减少静态功耗。
选择一个不存在的输入通道将导致分配最高可用的通道号。
所以,如果自动增量(auto-increment)被置1,下一个被选择的通道将总是通道0.两个半字节的最高有效位(即第7位和第3位)是留给未来的功能,必须设置为逻辑0.控制寄存器的所有位在上电复位后被复位为逻辑0.DA转换器和振荡器在节能时被禁止。
PCF8591中文数据手册
PCF8591中文数据手册PCF8591是一款广泛应用于电子设备中的集成电路芯片,其功能包括模拟输入、模拟输出、数字输入和数字输出。
本文将详细介绍PCF8591的中文数据手册,包括芯片的功能特点、引脚定义、工作原理、电气特性和应用示例等内容。
1. 功能特点:PCF8591具有以下主要功能特点:- 四个模拟输入通道,可以接收模拟信号输入;- 一个模拟输出通道,可以输出模拟信号;- 一个数字输入通道,可以接收数字信号输入;- 一个数字输出通道,可以输出数字信号;- 内部集成了一个8位A/D转换器,可以将模拟输入信号转换为数字信号;- 内部集成了一个8位D/A转换器,可以将数字信号转换为模拟输出信号;- 通信接口为I2C总线。
2. 引脚定义:PCF8591芯片共有8个引脚,其功能如下:- AIN0-AIN3:模拟输入通道,可以接收模拟信号输入;- AOUT:模拟输出通道,可以输出模拟信号;- VREF:参考电压输入,用于设置A/D和D/A转换的参考电压;- AGND:模拟地,与模拟信号的地连接;- VCC:供电电源,通常为+5V;- SDA:I2C总线数据线;- SCL:I2C总线时钟线。
3. 工作原理:PCF8591通过内部的A/D和D/A转换器实现模拟信号和数字信号之间的转换。
在模拟输入模式下,PCF8591将模拟输入信号转换为数字信号,并通过I2C总线输出给主控设备。
在模拟输出模式下,PCF8591将数字信号转换为模拟输出信号,并输出给外部设备。
同时,PCF8591还可以通过数字输入通道接收外部设备的数字信号,并通过I2C总线输出给主控设备。
4. 电气特性:PCF8591的电气特性包括供电电压、工作温度范围、输入输出电压范围等方面。
以供电电压为例,PCF8591的供电电压范围为2.5V至6V,通常为+5V。
在不同的工作温度范围内,PCF8591的电气特性可能会有所变化,具体请参考数据手册中的详细参数表。
PCF8591应用程序实例
1、引言I2C总线是Philips公司推出的串行总线,整个系统仅靠数据线(SDA)和时钟线(SCL)实现完善的全双工数据传输,即CPU与各个外围器件仅靠这两条线实现信息交换。
I2C总线系统与传统的并行总线系统相比具有结构简单、可维护性好、易实现系统扩展、易实现模块化标准化设计、可靠性高等优点。
在一个完整的单片机系统中,A/D转换芯片往往是必不可少的。
PCF8591是一种具有I2C总线接口的A/D转换芯片。
在与CPU的信息传输过程中仅靠时钟线SCL和数据线SDA就可以实现。
2、芯片介绍PCF8591是具有I2C总线接口的8位A/D及D/A转换器。
有4路A/D转换输入,1路D/A模拟输出。
这就是说,它既可以作A/D转换也可以作D/A转换。
A/D转换为逐次比较型。
引脚图如图1所示。
结构图如图2所示。
电源电压典型值为5V。
AIN0~AIN3:模拟信号输入端。
A0~A3:引脚地址端。
VDD、VSS:电源端。
(2.5~6V)SDA、SCL:I2C总线的数据线、时钟线。
OSC:外部时钟输入端,部时钟输出端。
EXT:部、外部时钟选择线,使用部时钟时EXT接地。
AGND:模拟信号地。
AOUT:D/A转换输出端。
VREF:基准电源端。
3 应用3.1 器件总地址PCF8591采用典型的I2C总线接口器件寻址方法,即总线地址由器件地址、引脚地址和方向位组成。
飞利蒲公司规定A/D器件地址为1001。
引脚地址为A2A1A0,其值由用户选择,因此I2C系统中最多可接23=8个具有I2C总线接口的A/D器件。
地址的最后一位为方向位R/ ,当主控器对A/D器件进行读操作时为1,进行写操作时为0。
总线操作时,由器件地址、引脚地址和方向位组成的从地址为主控器发送的第一字节。
3.2 控制字节控制字节用于实现器件的各种功能,如模拟信号由哪几个通道输入等。
控制字节存放在控制寄存器中。
总线操作时为主控器发送的第二字节。
其格式如下所示:其中:D1、D0两位是A/D通道编号:00通道0,01通道1,10通道2,11通道3D2 自动增益选择(有效位为1)D5、D4模拟量输入选择:00为四路单数入、01为三路差分输入、10为单端与差分配合输入、11为模拟输出允许有效。
AD(DA)芯片PCF8591使用介绍
AD (DA )芯片PCF8591使用介绍AD (DA )芯片PCF8591简介PCF8591是具有I2C 总线接口的8 位A/D 及D/A 转换器。
PCF8591有4个模拟输入、1个模拟输出和1个I²C 总线接口。
PCF8591有3个地址引脚A0, A1和A2,用于硬件地址设定,这允许在一条I 2C 总线上接入8个PCF8591器件。
PCF8591实物如下图所示:AD (DA )芯片PCF8591引脚1、AIN0、AIN1、AIN2、AIN3:模拟信号输入管脚。
2、A0、A1、A2:硬件地址设定管脚。
3、VDD:接电源(2.5V~6V)正极。
4、VSS:接电源(2.5V~6V)负极,即GND。
5、SDA:I2C 总线的数据线。
6、SCL:I2C 总线的时钟线。
7、OSC:外部时钟输入端,内部时钟输出端。
8、EXT:内部、外部时钟选择线,使用内部时钟时EXT 接地。
9、AGND:模拟信号地。
10、AOUT:D/A 转换输出端。
11、VREF:基准电源端。
AD(DA)芯片PCF8591内部结构框图AD(DA)芯片PCF8591特性1、PCF8591为单独供电,电压范围2.5V~6V。
2、PCF8591待机电流低。
3、PCF8591通过I2C总线串行输入/输出,其采样率由I2C总线速率决定。
4、PCF8591通过3个地址引脚设定硬件地址。
5、4个模拟输入可编程为单端型或差分输入。
6、自动增量频道选择。
7、PCF8591的模拟电压范围:VSS~VDD。
9、PCF8591内置跟踪保持电路。
10、8位逐次逼近A/D转换器。
11、带1路模拟输出DAC。
AD(DA)芯片PCF8591应用PCF8591器件总地址PCF8591采用I2C总线接口器件寻址。
地址由固定部分、可编程部分和方向位组成。
固定部分为1001。
可编程部分必须根据地址引脚AO、A1和A2进行设置,其值由用户选择,因此I2C系统中最多可接23=8个具有I2C 总线接口的PCF8591。
单片机应用技术智慧树知到答案章节测试2023年仙桃职业学院
项目一测试1.MCS-51单片机的CPU主要的组成部分为_______ 。
A:运算器、译码器B:运算器、控制器C:加法器、寄存器D:运算器、加法器答案:B2.MCS-51单片机若晶振频率为 =12MHz,则一个机器周期等于 ______µS。
A:1B:1/12C:2D:1/2答案:A3.MCS-51单片机的VSS(20)引脚是_______引脚。
A:接地B:访问片外存贮器C:备用电源D:主电源+5V答案:A4.MCS-51单片机中,输入/输出引脚中用于专门的第二功能的引脚是_______A:P3B:P0C:P1D:P2答案:A5.单片机就是指集成在一个芯片上的微型计算机。
A:错B:对答案:B项目二测试1.单片机并行I/O口线P1.0和P1.1连接了两个开关,此时它是什么接口功能?A:输出接口B:输入接口答案:B2.C语言对嵌套if语句的规定是:else语句总是与()配对。
A:其之前最近的且尚未配对的ifB:其之前最近的ifC:第一个ifD:缩进位置相同的if答案:A3.以下哪些设备是输出设备?A:显示器B:LEDC:扫描仪D:打印机答案:ABD4.以下哪些设备是外部输入设备?A:LEDB:键盘C:鼠标D:开关答案:BCD5.I/O接口是下面哪两个部件之间的交换信息的媒介和桥梁。
A:CPUB:最小系统C:存储器D:I/O设备答案:AD项目三测试1.关于中断优先级,下面说法不正确的是哪一个?A:自然优先级中INT0优先级最高,任何时候它都可以中断其他4个中断源正在执行的服务B:高优先级不能被低优先级中断C:低优先级可被高优先级中断D:任何一种中断一旦得到响应,不会再被它的同级中断源所中断答案:A2.当T1在下列哪种情况下, T1中断请求标志位TF1自动置1,向CPU申请中断。
A:启动时B:设置工作方式时C:计数溢出D:赋初值时答案:C3.编写定时器T1的中断服务程序,按如下编写: void timer1() interrupt n 其中n应为哪一个?A:2B:3C:4答案:B4.MCS-51系列单片机CPU开总中断语句是下面哪一个?A:EA=1;B:EX0=1;C:EA=0;D:ES=1;答案:A5.单片机中断系统有几个中断优先级别?A:2B:1C:4D:5答案:A项目四测试1.定时器的工作方式1是16位计数器,THx和TLx都参与计数过程。
PCF8591程序
PCF8591程序/************************************头文件:PCF8591.h**文件名: PCF8591.c**创建人: 动车组**日期: 2012-8-8**功能描述:PCF8591_Write(uchar DAC_Date);DAC转换输出(8位的)** PCF8591_Read(uchar a[4]);四个单端输入ADC数据(8位的)**占用资源:IIC的两个IO口IIc_Scl、IIc_Sad***********************************/#include"PCF8591.h"#include <intrins.h>#define _NOP_() _nop_();_nop_();_nop_();_nop_();_nop_()/*短暂延时4.7us*//*停止I2C总线*/void IIc_stop(){IIc_Sad = 0;_NOP_();IIc_Scl = 1;_NOP_();IIc_Sad = 1; //总线置于空闲状态}/*IIC初始化子程序*/void IIc_init(){IIc_stop(); //结束之前IIC的操作IIc_Scl = 1; //总线置于空闲状态IIc_Sad = 1;}/* 启动I2C总线*/void IIc_start(){IIc_Sad = 1;IIc_Scl = 1;_NOP_();IIc_Sad = 0;_NOP_();IIc_Scl = 0;}/*IIC写一个字节返回应答信号返回1设备正常*/bit IIc_write_byte(uchar date){uchar i;bit ack;for(i=8;i>0;i--){date <<= 1;IIc_Scl = 0;IIc_Sad = CY;_NOP_();IIc_Scl = 1;_NOP_();}IIc_Scl = 0;_NOP_();IIc_Sad = 1;/*8位发送完后释放数据线,准备接收应答位*/_NOP_();IIc_Scl = 1;if(IIc_Sad==0)//从机设备应答ack=1ack = 1;elseack = 0;IIc_Scl = 0;_NOP_();return(ack);}/*IIC读一个字节主机应答信号Master_ack为1是应答0时非应答*/ uchar IIc_read_byte(bit Master_ack){uchar i,vaule;IIc_Sad=1;for(i = 8;i > 0;i--){vaule <<= 1;IIc_Scl = 1;_NOP_();if(IIc_Sad)vaule++;IIc_Scl = 0;_NOP_();}IIc_Sad = !Master_ack;//主机应答信号_NOP_();IIc_Scl = 1;_NOP_();IIc_Scl = 0;_NOP_();return vaule;}/******************以下是PCF8591的应用函数*********************************************************//*PCF8591的控制字Con和DAC数据这个函数已经写好器件地址了/*函数返回值1写入为正常*/bit PCF8591_Write(uchar DAC_Date){bit ack;// EA=0;IIc_init();IIc_start();ack=IIc_write_byte(Address_PCF8591);//写器件地址if(ack==0) //写入失败从机设备没有相应return(0);ack=IIc_write_byte(Model_PCF8591);//写第二个字节控制字if(ack==0) //写入失败从机设备没有相应return(0);ack=IIc_write_byte(DAC_Date);//写第三个字节DAC数据if(ack==0) //写入失败从机设备没有相应return(0);IIc_stop();/*后面是读一个字节数据用来开始ADC转换的*/IIc_start();ack=IIc_write_byte(Address_PCF8591+1);//写器件地址读数据if(ack==0) //写入失败从机设备没有相应return(0);IIc_read_byte(0); //读一个数据开始ADC转换这个数据没用哦IIc_stop();return(1);// EA=1;}/*从PCF8591中读出四个ADC通道的数据返回1从机设备正常*/bit PCF8591_Read(uchar a[]){bit ack;IIc_init();IIc_start();ack= IIc_write_byte(Address_PCF8591+1);if(ack==0) //写入失败从机设备没有相应return(0);a[0] = IIc_read_byte(1);a[1] = IIc_read_byte(1);a[2] = IIc_read_byte(1);a[3] = IIc_read_byte(0);IIc_stop();return (1);}/************************************//************************************文件名: PCF8591.h**创建人: 动车组**日期: 2012-8-8**功能描述:PCF8591_Write(uchar DAC_Date);DAC转换输出(8位的)** PCF8591_Read(uchar a[4]);四个单端输入ADC数据(8位的)**占用资源:IIC的两个IO口IIc_Scl、IIc_Sad***********************************/#ifndef __PCF8591_H__#define __PCF8591_H__#include <REG52.H>#define uchar unsigned char#define uint unsigned intsbit IIc_Scl=P1^5; //IIC的时钟sbit IIc_Sad=P3^6; //IIC的数据线#define Address_PCF8591 0x90 //PCF8591的硬件地址#define Model_PCF8591 0x44 //模式是四个ADC单端输入允许DAC输出允许自动增量/*PCF8591的DAC数据;函数返回值1写入为正常*/bit PCF8591_Write(uchar DAC_Date);/*从PCF8591中读出四通道的数据返回1从机设备正常*/bit PCF8591_Read(uchar a[4]);//a[]的长度必须大于等于4#endif/******************************/#include <REG52.H>#include"PCF8591.h"#include"LCD1602.h"void main(){uchar i;uchar temp[4];L1602_init();PCF8591_Write(127);PCF8591_Write(200);while(1){PCF8591_Write(i++);if(1){PCF8591_Read(temp);L1602_Uint(1,2,temp[0]);L1602_Uint(1,7,temp[1]);L1602_Uint(2,1,temp[2]);L1602_Uint(2,7,temp[3]);}elseL1602_Uint(2,2,1);}}。
PCF8591DA和AD转换器读写程序
PCF8591读写程序(一)、PCF85911、引脚说明ANI0~ANI3 为模拟信号输入端,不使用的输入端应接地A0~A2 地址输入端GND、VCC 地和电源端(+5V)SDA 为I2C数据输入与输出端SCL 为I2C时钟输入端EXT 内外部时钟选择端,使用内部时钟时接地,使用外部时钟时接+5VOSC 外部时钟输入、内部时钟输出端,不使用时应悬空AGND 模拟信号地VREF 基准电压输入端AOUT D/A转换后的电压输出端2、功能说明PCF8591是具有I2C总线接口的8位A/D及D/A转换器,具有4路A/D输入,1路D/A输出。
PCF8591采用典型的I2C总线接口器件寻址方法,即总线地址由器件地址(1001)、引脚地址(由A0~A2接地或+5V来确定,接地代表0;接+5V代表1)、方向位(即R/W)组成。
因此,在I2C总线系统中最多可接8个这样的器件。
D7 D6 D5 D4 D3 D2 D1 D01 0 0 1 A2 A1 A0 R/WR/W=1表示读操作,R/W=0表示写操作。
本例将A0~A2接地,则读地址为91H;写地址为90H。
控制字节:用于控制PCF8951的输入方式、输入通道、D/A转换等,是通信时主机发送的第二字节数据,D7 D6 D5 D4 D3 D2 D1 D0未用(写0)D/A输出允许位 0为禁止1为允许A/D输入方式选择位00:4路单端输入 01:3路差分输入 10:单端与差分 11:2路差分输入未用(写0)自动增益选择位 0为禁用1为启用AD通道选择位00:选择通道001:选择通道110:选择通道211:选择通道3 A/D输入方式选择说明:3第一字节第二字节第三字节写入器件地址(90H)写入控制字节要写入的数据向PCF8591写入格式(高位在前)(二)、I2C总线1、I2C总线数据位的传输它通过2根线:串行数据线(SDA)和串行时钟线(SCL)组成。
连接到总线上的每一个器件都有一个唯一的地址,而且都可以作为一个发生器或接收器,SDA和SCL都是双向线路,分别通过一个电阻连接到电源(+5V)端。
基于PCF8591的I_2C总线A_D_D_A转换
2009年5月企业技术开发引脚序号引脚名称功能描述1~4AIN0~AIN3模拟信号输入端0~5V5~7A 0~A 2器件硬件地址输入端,由硬件电路决定16、8VDD 、VSS 电源、地9、10SDA 、SCL I 2C 总线的数据线、时钟线11OSC 外部时钟输入端,内部时钟输出端12EXT 时钟选择线,EXT =0,使用内部时钟;EXT =1,使用外部时钟13AGND 模拟信号地15AOUT D/A 转换输出端,V AOUT =V AGND +V REF -V AGND2567i=0ΣD i2i基准电源端(0.6~5V ),取值大小影响D/A 转换输出电压。
当取值等于为VDD 时,输出电压为0~5V 。
14V REF表1PCF8591引脚功能描述基于PCF8591的I 2C 总线A/D 、D/A 转换陈柱峰,沈治国摘要:I 2C 总线是Philips(飞利浦)公司推出的串行总线,整个系统仅靠数据线(SDA )和时钟线(SCL )实现完善的全双工数据传输,文章介绍了具有I 2C 总线的A/D 、D/A 转换芯片PCF8591的内部结构图,引脚功能,A/D 、D/A 转换的控制方法,给出了A/D 、D/A 转换的软件编程的流程图和实例。
关键词:I 2C 总线;PCF8591;A/D 、D/A 转换中图分类号:TN792文献标识码:A文章编号:1006-8937(2009)09-0018-04Abstract:I 2C bus is the serial bus that Philips has introduced,the whole system of relying on the data line (SDA)and clock line (SCL)to achieve a comprehensive,full-duplex data transmission,introduced in this paper with I 2C Bus A/D 、D/A conversion chip PCF8591internal structure diagram,pin functions,A/D 、D/A conversion control methods,gave the A/D 、D/A conversion software programming flow chart and examples.Keywords :I 2C bus ;PCF8591;A/D 、D/A conversion (湖南现代物流职业技术学院物流工程系,湖南长沙410131)The I 2C bus A /D 、D /A conversion based on PCF8591CHEN Zhu-feng ,SHEN Zhi-guo(DepartmentofLogisticsEngineering,HunanVocationalandTechnicalCollegeofModernLogisticsEngineering,Changsha,Hunan410131,China)收稿日期:2009-01-30作者简介:陈柱峰(1973—),男,湖南长沙人,大学本科,助理试验师,主要从事电力电子技术方面的教学和科研工作。
基于AT89C51的boost升压电路的设计(更改ok打印版) - 副本
电气与电子信息工程学院《单片机》课程设计报告题目:基于AT89C51单片机的Boost电路开环控制系统专业班级:学号:姓名:同组人:指导教师:胡蔷黄磊设计时间:2014年12月22日—2014年12月26日设计地点:K2-407单片机、微机原理实验室2014年10月课程设计任务书2014 ~2015 学年第1学期一、课程设计题目:(基于AT89C51单片机的Boost电路开环控制统)二、课程设计要求1. 根据具体设计课题的技术指标和给定条件,以单片机为核心器件,能独立而正确地进行方案论证和电路设计,完成仿真操作。
要求概念清楚、方案合理、方法正确、步骤完整;2. 熟悉、掌握各种外围接口电路芯片的工作原理和控制方法;3. 熟练使用单片机汇编语言或C51进行软件设计;4. 熟练使用Proteus、Keil软件进行仿真电路测试;5. 熟练使用Protel软件设计印刷电路板;6. 学会查阅有关参考资料和手册,并能正确选择有关元器件和参数;7. 编写设计报告,参考毕业设计论文格式。
(1)根据课题要求确定系统设计方案;(2)绘制系统框图、系统仿真原理图(印刷电路板图),列出元器件明细表;(3)计算电路参数和选择元器件,画出软件流程图(列出程序清单);(4)打印仿真结果,根据测试结果进行误差分析与修改调整;(5)对设计进行全面总结。
三、课程设计内容(含技术指标)本次课程设计是基于AT89C51单片机为控制核心,boost升压电路为主电路的拓扑结构,实现能量的转换;PCF8591芯片作为AD采集芯片,通过CI2总线来采集输出电压;IR2106芯片作为驱动芯片,用于驱动主电路中的开关管;差分电路用于采集输出的电压值;LCD1602液晶显示,用于显示输出电压值。
技术指标:1、能采集输出电压的大小。
2、能显示输出电压的大小。
3、电路拓扑结构正常工作。
4、用单片机控制主电路的工作状态。
目录摘要 (I)1总体系统框图 (1)2硬件电路 (1)2.1方案论证 (1)2.1.1显示模块 (1)2.1.2 AD采集模块 (1)2.2电路模块设计 (2)2.2.1 IR2106驱动电路 (2)2.2.2 Boost升压主电路 (2)2.2.3差分采样电路 (3)3理论分析与计算 (4)3.1 Boost升压电路理论分析与计算 (4)4 PCF8591芯片 (4)4.1 PCF8591功能描述 (4)4.2 PCF8591外围电路 (5)4.3 片内可编程功能设置 (5)4.4 PCF8591的A/D转换 (6)5程序设计流程图 (8)6实物图 (9)7总结 (11)8参考文献 (11)基于AT89C51单片机的Boost电路开环控制系统摘要:本设计是以AT89C51为控制核心,以PCF8591A/D转换芯片采样输出电压值的大小、LCD1602作为人机交换界面、IR2106电路作为MOSFET开关管的驱动电路,实现了对Boost升压电路的开环控制。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
AD-DA转换PCF8591T芯片控制程序并用74HC595和74HC164显示出来。
#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit SCL=P2^0;sbit SDA=P2^1;bit ack;uchar a[3];uchar b[3];sbit SCK=P1^0;sbit DAT=P1^3;sbit G=P1^2;sbit RCK=P1^1;//把unsigned char宏定义为ucharuchar Led_code[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, //数码管的0~F的所对应的段码0x7F,0x6F};//uchar Led_enbit[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //共阳数码管uchar Led_enbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //数码管第0~7位所对应位选的代码/********************************************************函数:void delay(void) **功能:延时2ms *********************************************************/void delay1(uchar x){unsigned char a,b;for(b=80;b>0;b--)for(a=x;a>0;a--);}/********************************************************函数:void send_data(unchar Data) **功能:发送一字节数据**说明:数据的高位在前,低位在后。
SCK上升沿写入一位*********************************************************/void send_data(uchar Data){uchar i;for(i=0;i<8;i++){SCK=0;DAT=Data&0x80; //取数据的最高位SCK=1;Data=Data<<1; //数据左移一位}}/********************************************************函数:void display(uchar num,uchar site) **功能:在指定的位置显示对的数字其中164控制段,595控制位**说明:num为要显示的数字,site为要显示在哪一位数码管在*先发送段码后发送位码*********************************************************/void display(uchar num,uchar site){G=1; //禁止位选数据输出(高阻态)send_data(Led_code[num]); //发送一位段码数据send_data(Led_enbit[site]); //发送一位位码数据G=0; //允许位选数据输出RCK=0; //位选数据写入数据存储器_nop_();RCK=1;delay1(10); //延时2ms}/******************************************************************* I2c专用延时函数函数原型: void Delay_I2c();功能: 延时7US左右********************************************************************/ void Delay_I2c(){uchar a,b;for(a=1;a>0;a--)for(b=1;b>0;b--);}/******************************************************************* 总线函数初始化函数原型: void Init_I2c();功能: 启动I2C总线,即发送I2C起始条件.********************************************************************/ void Init_I2c(){SCL=1; //I2C 时钟SDA=1; //I2C 数据}/******************************************************************* 起动总线函数函数原型: void Start_I2c();功能: 启动I2C总线,即发送I2C起始条件.********************************************************************/ void Start_I2c(){SDA=0; /*发送起始条件的数据信号*/SCL=1;SDA=1;Delay_I2c(); /*起始条件建立时间大于4.7us,延时*/SDA=0;Delay_I2c(); /*发送起始信号*//* 起始条件锁定时间大于4μs*/SCL=0; /*钳住I2C总线,准备发送或接收数据*/}/*******************************************************************结束总线函数函数原型: void Stop_I2c();功能: 结束I2C总线,即发送I2C结束条件.********************************************************************/ void Stop_I2c(){SDA=0; /*发送结束条件的数据信号*/SCL=0; /*发送结束条件的时钟信号*/SCL=1; /*结束条件建立时间大于4μs*/Delay_I2c();SDA=1; /*发送I2C总线结束信号*/Delay_I2c();SDA=0;}/********************************************************************应答子函数函数原型: void Ack_I2c();功能: 主控器进行应答信号(可以是应答或非应答信号,由位参数a决定) ********************************************************************/void Ack_I2c(){uchar i;SCL=0;SDA=1;SCL=1;SDA=0;Delay_I2c();//*时钟低电平周期大于4μswhile((SDA==1) && (i<255))i++;SCL=0;SDA=1; //*清时钟线,钳住I2C总线以便继续接收}/********************************************************************应答子函数函数原型: void N_Ack_I2c();功能: 主控器进行应答信号(可以是应答或非应答信号,由位参数a决定) ********************************************************************/ void N_Ack_I2c(){SCL=0;SDA=0;SCL=1;SDA=1;Delay_I2c();SCL=0;SDA=0;}/*******************************************************************字节数据发送函数函数原型: void SendByte(UCHAR c);功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对此状态位进行操作.(不应答或非应答都使ack=0)发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
********************************************************************/ void Send_Byte(unsigned char c){unsigned char BitCnt;SCL=0; //时钟线为低电平数据会变for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/{if(c&0x80)SDA=1; /*判断发送位*/else SDA=0;c=c<<1;Delay_I2c();SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/ Delay_I2c(); /*保证时钟高电平周期大于4μs*/SCL=0;Delay_I2c();}SDA=1; /*8位发送完后释放数据线,准备接收应答位*/ Delay_I2c();if(SDA==1)ack=0;else ack=1; //*判断是否接收到应答信号SCL=0;Delay_I2c();}/*******************************************************************读一字节数据接收函数函数原型: UCHAR RcvByte();功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),发完后请用应答函数应答从机。
********************************************************************/ unsigned char Rcv_Byte(){unsigned char dat;unsigned char BitCnt;dat=0;//SCL=0;//Nop();SDA=1;Delay_I2c();/*置数据线为输入方式*/for(BitCnt=0;BitCnt<8;BitCnt++){SCL=0; /*置时钟线为低,准备接收数据位*/Delay_I2c();/*时钟低电平周期大于4.7μs*/SCL=1; /*置时钟线为高使数据线上数据有效*/Delay_I2c();dat=dat<<1; // dat=(dat<<1)|SDA;//if(SDA==1)dat=dat+1; /*读数据位,接收的数据位放入dat中*///强制加一,防止上卷,*/SCL=0;Delay_I2c();}return(dat);}/*******************************************************************函数原型: AD_chli()//功能:********************************************************************/ uchar AD_culi(char con){uint date;Start_I2c();Send_Byte(0x90);//发送器件地址Ack_I2c();Send_Byte(con);//控制方式为输出,通道0Ack_I2c();Start_I2c();Send_Byte(0x91);Ack_I2c();date=Rcv_Byte();N_Ack_I2c();Stop_I2c();return date;}/*******************************************************************函数原型: DA_chli()//功能:********************************************************************/ void DA_culi(uchar con,uchar dat){Start_I2c();Send_Byte(0x90);Ack_I2c();Send_Byte(con);Ack_I2c();Send_Byte(dat);Ack_I2c();Stop_I2c();}void main(){uchar shu=0;uint x,y;uchar we;Init_I2c();while(1){x=AD_culi(0x01);a[2]=x/100;a[1]=x%100/10;a[0]=x%10;for(we=0;we<3;we++){display(a[we],we);}DA_culi(0x40,shu);shu++;}}。