问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

ADDA芯片pcf8591到底怎么接AD输出和DA输入呢?

发布网友 发布时间:2022-04-20 06:04

我来回答

1个回答

热心网友 时间:2023-09-02 18:02

PCF8591是4路A/D、1路D/A精度为8-bit转换芯片,刚好开发板上用这个。能实现四路数码管显示
这是这芯片的程序,可以直接调用
/*-----------------------------------------------
名称:IIC协议
论坛:www.doflye.net
编写:shifang
修改:无
内容:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 一定的修改....(本例是1us机器
周期,即晶振频率要小于12MHZ)
------------------------------------------------*/

#include "i2c.h"
#include "delay.h"

#define _Nop() _nop_() //定义空指令

bit ack; //应答标志位

sbit SDA=P2^1;
sbit SCL=P2^0;

/*------------------------------------------------
启动总线
------------------------------------------------*/
void Start_I2c()
{
SDA=1; //发送起始条件的数据信号
_Nop();
SCL=1;
_Nop(); //起始条件建立时间大于4.7us,延时
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0; //发送起始信号
_Nop(); //起始条件锁定时间大于4μ
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0; //钳住I2C总线,准备发送或接收数据
_Nop();
_Nop();
}
/*------------------------------------------------
结束总线
------------------------------------------------*/
void Stop_I2c()
{
SDA=0; //发送结束条件的数据信号
_Nop(); //发送结束条件的时钟信号
SCL=1; //结束条件建立时间大于4μ
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1; //发送I2C总线结束信号
_Nop();
_Nop();
_Nop();
_Nop();
}

/*----------------------------------------------------------------
字节数据传送函数
函数原型: void SendByte(unsigned char c);
功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
此状态位进行操作.(不应答或非应答都使ack=0 假)
发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
------------------------------------------------------------------*/
void SendByte(unsigned char c)
{
unsigned char BitCnt;

for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位
{
if((c<<BitCnt)&0x80)SDA=1; //判断发送位
else SDA=0;
_Nop();
SCL=1; //置时钟线为高,通知被控器开始接收数据位
_Nop();
_Nop(); //保证时钟高电平周期大于4μ
_Nop();
_Nop();
_Nop();
SCL=0;
}

_Nop();
_Nop();
SDA=1; //8位发送完后释放数据线,准备接收应答位
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
if(SDA==1)ack=0;
else ack=1; //判断是否接收到应答信号
SCL=0;
_Nop();
_Nop();
}

/*----------------------------------------------------------------
字节数据传送函数
函数原型: unsigned char RcvByte();
功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
发完后请用应答函数。
------------------------------------------------------------------*/
unsigned char RcvByte()
{
unsigned char retc;
unsigned char BitCnt;

retc=0;
SDA=1; //置数据线为输入方式
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_Nop();
SCL=0; //置时钟线为低,准备接收数据位
_Nop();
_Nop(); //时钟低电平周期大于4.7us
_Nop();
_Nop();
_Nop();
SCL=1; //置时钟线为高使数据线上数据有效
_Nop();
_Nop();
retc=retc<<1;
if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入retc中
_Nop();
_Nop();
}
SCL=0;
_Nop();
_Nop();
return(retc);
}

/*----------------------------------------------------------------
应答子函数
原型: void Ack_I2c(void);

----------------------------------------------------------------*/
/*void Ack_I2c(void)
{

SDA=0;
_Nop();
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop(); //时钟低电平周期大于4μ
_Nop();
_Nop();
_Nop();
SCL=0; //清时钟线,钳住I2C总线以便继续接收
_Nop();
_Nop();
}*/
/*----------------------------------------------------------------
非应答子函数
原型: void NoAck_I2c(void);

----------------------------------------------------------------*/
void NoAck_I2c(void)
{

SDA=1;
_Nop();
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop(); //时钟低电平周期大于4μ
_Nop();
_Nop();
_Nop();
SCL=0; //清时钟线,钳住I2C总线以便继续接收
_Nop();
_Nop();
}

/*----------------------------------------------------------------
向无子地址器件发送字节数据函数
函数原型: bit ISendByte(unsigned char sla,ucahr c);
功能: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
如果返回1表示操作成功,否则操作有误。
注意: 使用前必须已结束总线。
----------------------------------------------------------------*/
/*bit ISendByte(unsigned char sla,unsigned char c)
{
Start_I2c(); //启动总线
SendByte(sla); //发送器件地址
if(ack==0)return(0);
SendByte(c); //发送数据
if(ack==0)return(0);
Stop_I2c(); //结束总线
return(1);
}
*/

/*----------------------------------------------------------------
向有子地址器件发送多字节数据函数
函数原型: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);
功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
如果返回1表示操作成功,否则操作有误。
注意: 使用前必须已结束总线。
----------------------------------------------------------------*/
/*bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
{
unsigned char i;
for(i=0;i<no;i++)
{
Start_I2c(); //启动总线
SendByte(sla); //发送器件地址
if(ack==0)return(0);
SendByte(suba); //发送器件子地址
if(ack==0)return(0);

SendByte(*s); //发送数据
if(ack==0)return(0);
Stop_I2c(); //结束总线
DelayMs(1); //必须延时等待芯片内部自动处理数据完毕
s++;
suba++;
}
return(1);
}
*/
/*----------------------------------------------------------------
向无子地址器件读字节数据函数
函数原型: bit IRcvByte(unsigned char sla,ucahr *c);
功能: 从启动总线到发送地址,读数据,结束总线的全过程,从器件地
址sla,返回值在c.
如果返回1表示操作成功,否则操作有误。
注意: 使用前必须已结束总线。
----------------------------------------------------------------*/
/*bit IRcvByte(unsigned char sla,unsigned char *c)
{
Start_I2c(); //启动总线
SendByte(sla+1); //发送器件地址
if(ack==0)return(0);
*c=RcvByte(); //读取数据
NoAck_I2c(); //发送非就答位
Stop_I2c(); //结束总线
return(1);
}

*/
/*----------------------------------------------------------------
向有子地址器件读取多字节数据函数
函数原型: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);
功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
如果返回1表示操作成功,否则操作有误。
注意: 使用前必须已结束总线。
----------------------------------------------------------------*/
/*bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
{
unsigned char i;

Start_I2c(); //启动总线
SendByte(sla); //发送器件地址
if(ack==0)return(0);
SendByte(suba); //发送器件子地址
if(ack==0)return(0);

Start_I2c();
SendByte(sla+1);
if(ack==0)return(0);

for(i=0;i<no-1;i++)
{
*s=RcvByte(); //发送数据
Ack_I2c(); //发送就答位
s++;
}
*s=RcvByte();
NoAck_I2c(); //发送非应位
Stop_I2c(); //结束总线
return(1);
}
*/
上面程序可以分成一个c文件
/*------------------------------------------------
读AD转值程序
输入参数 Chl 表示需要转换的通道,范围从0-3
返回值范围0-255
------------------------------------------------*/
unsigned char ReadADC(unsigned char Chl)
{
unsigned char Val;
Start_I2c(); //启动总线
SendByte(AddWr); //发送器件地址
if(ack==0)return(0);
SendByte(0x40|Chl); //发送器件子地址
if(ack==0)return(0);
Start_I2c();
SendByte(AddWr+1);
if(ack==0)return(0);
Val=RcvByte();
NoAck_I2c(); //发送非应位
Stop_I2c(); //结束总线
return(Val);
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
鞋底是空心格子怎么办 鞋里有格子硌脚怎么办 买的鞋子里面是空心格子底硌脚怎么办 鞋子底是空心格子的怎样办 浅谈NY5196—2002有机茶 有机食品茶叶标准 茶叶的储藏运销:茶叶贮藏期的化学变化 东方美人茶要怎么储存?东方美人茶储存方法 乌龙茶贮运方法 有机乌龙茶是什么贮藏与运输的? 大家用过什么AD/DA芯片 求推荐adda芯片 国内HUB芯片原厂有哪些 TI公司12位的高速ADDA芯片有哪些? 哪位亲简单描述一下华为的5G独立组网其它5G的非独立组网的意思 请认真回答 一定采纳&#128591;&#127995; 干拌砂浆1吨等于多少立方 m5水泥砂浆1方含多少吨 三方砂浆大约是多少吨 6方砂浆等于多少吨 水泥砂浆一吨等于多少方 50万方的建筑工地砂浆需要多少吨 一立方抹灰砂浆等于几吨 1立方水泥砂浆重量为多少公斤? 1立方米砂浆是多重? 一立方米预拌砂浆等于多少吨??? 1立方的砂浆等于多少吨? 一立方水泥砂浆等于多少吨 一方地面砂浆是多少吨 一立方砂浆大概多少吨 独立组网和非独立组网有区别吗 adda是什么有什么用 51单片机控制PCF8591 ADDA芯片问题 设计一个简易数字电压表,单片机上有ADDA 模块,是... 深圳市哪家生产的散热风扇好? 上adda的5750是什么牌子的显卡啊 想买块显卡 950-1050之间的价格 华为荣耀手机业务一年能帮华为赚多少钱? A/D芯片一定要用采样保持电路吗? 散热风扇那个品牌比较好? ADC0809芯片启动模拟量采集转换后,请说明可以采用... 求告知散热风扇有哪些牌子 好多FPGA只支持2.5V的LVDS 但是好多高速的AD DA芯... 电脑蓝屏代码是 0X0000008E(0XEEB6ODD4.0XF000001... 中煤能源业绩报表?中煤能源股价 牛叉?中煤能源跌... aoc的显示器e960s怎么样?现在价位如何? AOC E960SN 显示器问题. 显示器设置亮度调到DCR模... AOC的e960Sn显示器可以和任意组装机连接吗?会不会... aoc显示器e960snosd解锁 AOC e960Sn显示器刺眼 求设置? 麻烦详细点 这玩地下城需要什么硬件?