标题:
51单片机+PCF8591仿真不正确,但是烧录到单片机中是可以的,I2C有问题?
[打印本页]
作者:
chuangyu1897
时间:
2022-5-22 01:09
标题:
51单片机+PCF8591仿真不正确,但是烧录到单片机中是可以的,I2C有问题?
如题,使用PCF8591的AD模式时,仿真结果是正确的,能够读到正确的输出,但是使用DA功能时就不对了,使用DA时,设置输出2.5V以上能够正常输出,设置输出2.5V以下就不能正常输出。
另外在使用AD模式时,控制字不能设置为0x00,讲道理我用AD的时候模拟输出端口使能我应该是可以置零的啊,但是置零就不对。。。
贴出原理图和部分代码,文件在附件中,求各位大佬解惑
PS.同样的问题也出现在EEPROM ATC02中,也是仿真不正确烧录到单片机中正确。。。
这两个芯片都是I2C通信,难道是I2C的问题?
PCF8591.zip
2022-5-22 01:06 上传
点击文件名下载附件
84.92 KB, 下载次数: 9
代码及仿真文件
作者:
chuangyu1897
时间:
2022-5-22 01:13
帖子长度有限制,现将部分单片机代码贴上
#include <REGX52.H>
#include "delay.h"
//这里的延时都可以去掉,是用来调试代码的时候方便分析的
/*********************
/*@brief 该文件定义了I2C的6个时序,可以直接调用,
/*@param 6个时序分别为起始、发送字节、接收应答、接收字节、发送应答、终止
/*@retval
*********************/
//单片机实际连接引脚
sbit scl = P3^4;
sbit sda = P3^5;
/*********************
/*@brief I2C起始条件,SCL高电平期间,SDA从高电平切换到低电平
/*@param 无
/*@retval 无
*********************/
void I2C_start() {
sda =1;
scl = 1;
delay10us();
sda =0;
delay10us();
scl =0;
}
/*********************
/*@brief I2C终止条件,SCL高电平期间,SDA从低电平切换到高电平
/*@param 无
/*@retval 无
*********************/
void I2C_stop() {
sda = 0;
scl = 1;
delay10us();
sda = 1;
}
/*********************
/*@brief I2C发送一个字节,SCL低电平期间,主机将数据位依次放到SDA线上(高位在前),然后拉高SCL,
从机将在SCL高电平期间读取数据位,SCL高电平期间SDA不允许数据变化,
/*@param 要发送的字节
/*@retval 无
*********************/
void I2C_sendByte(unsigned char Byte) {
int i;
for(i=0; i<8; i++) {
sda = Byte&(0x80>>i);
delay10us();
scl = 1;
delay10us();//这里可能比较重要?
scl = 0;
}
}
/*********************
/*@brief I2C接收一个字节,主机在接收之前需要释放SDA
SCL低电平期间,从机将数据位依次放到SDA线上(高位在前),然后拉高SCL,
主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许数据变化
/*@param 无
/*@retval 接收到的数据
*********************/
unsigned char I2C_receiveByte() {
unsigned char Byte=0x00;
int i;
sda =1;
for(i=0; i<8; i++) {
scl=1;
if(sda)(Byte|=(0x80>>i));
delay10us();
scl=0;
delay10us();
}
return Byte;
}
/*********************
/*@brief I2C发送应答
/*@param 数据0表示应答,数据1表示非应答
/*@retval 无
*********************/
void I2C_sendACK(bit ack) {
sda = ack;
delay10us();
scl = 1;
scl =0;
}
/*********************
/*@brief I2C接收应答,主机在接收之前,需要释放SDA
/*@param 数据0表示应答,数据1表示非应答
/*@retval 接收到的应答标志
*********************/
bit I2C_receiveACK() {
bit ack;
sda =1;
delay10us();
scl =1;
ack = sda;
delay10us();
scl =0;
return ack;
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1