用STC89C52单片机I2C通信无法读出寄存器里边的数据 是什么原因啊? 在线等 急急急~

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-07-02
stc89c52单片机 实现i2c的引脚固定吗?

stc89c52单片机 实现i2c的引脚固定吗?
第一种方式是固定的:如果使用stc89c52单片机I2C控制对EEPROM进行读写,读写访问寄存器就好了,不用编代码,这种情况下只能使用规定的两个引脚,否则实现不了读写;
第二种方式不是固定的:你可以任意使用stc89c52单片机两个引脚,作为数据和时钟,然后自己编写模块I2C代码,网上一大把,随便下载都可以用。

iic不直接支持的。 但是 时序不复杂,可以用 I o口仿真。 传感器的速度不快,IIc完全可以模拟的来做。我做过一个湿度的是这样模拟的,没有问题。例程网上也多

一、I2C 操作一定要注意时序,CPU在上升沿输出数据,下降沿读取数据
二、数据的 BIT 顺序也要注意,先高位,后低位
三、时钟的最大频率为 400KHz,也即时钟不能太高
四、读数据时,先输入地址,在输入最后一个地址 bit 位后的下一个下降沿就得读数据了

void ex_ee_start(void) //启动 I2C。SCK 为高电平时,SDA 由高变低,启动 I2C
{
pin_i2c_sda=1;
delay_us(0x05);
pin_i2c_sck=1;
delay_us(0x05);
pin_i2c_sda=0;
delay_us(0x05);
pin_i2c_sck=0;
}
void ex_ee_end(void) //结束 I2C。SCK 为高电平时,SDA 由低变高,结束 I2C
{
pin_i2c_sda=0;
delay_us(0x05);
pin_i2c_sck=1;
delay_us(0x05);
pin_i2c_sda=1;
delay_us(0x05);
pin_i2c_sck=0;
}
void ex_ee_wr_bits(unsigned char eerom_byte) //写单字节
{
unsigned char i=0x08;
while (i>0)
{
if (eerom_byte&0x80)
pin_i2c_sda=1;
else
pin_i2c_sda=0;
pin_i2c_sck=1;
delay_us(0x02);
pin_i2c_sck=0;
eerom_byte<<=1;
i--;
}
pin_i2c_sck=1; //时钟为高电平时,可以读反馈信号(低电平)
delay_us(0x05);
pin_i2c_sck=0;
}
void ex_ee_wr_byte(unsigned char ee_addr,unsigned char data_length,unsigned char *s) // E2ROM 数据块写
{
unsigned char i,j;
ex_ee_start(); //启动 I2C
ex_ee_wr_bits(c02_wr_base+addr_offset);
ex_ee_wr_bits(ee_addr);
i=0x00;
while (i<data_length)
{
j=s[i];
ex_ee_wr_bits(j);
i++;
}
ex_ee_end();
}
void ex_ee_rd_byte(unsigned char ee_addr,unsigned char data_length,unsigned char *t) // E2ROM 数据块读
{
unsigned char i,j;
ex_ee_start();
ex_ee_wr_bits(c02_wr_base+addr_offset);
ex_ee_wr_bits(ee_addr);
ex_ee_start();
ex_ee_wr_bits(c02_rd_base+addr_offset);
i=0x00;
while (i<data_length)
{
j=0x00;
while (j<8)
{
pin_i2c_sda=1;
ret_status=ret_status<<1;
pin_i2c_sck=1;
if (pin_i2c_sda==1)
ret_status|=0x01;
pin_i2c_sck=0;
j++;
}
t[i]=ret_status;
i++;
if (i==data_length)
pin_i2c_sda=1;
else
pin_i2c_sda=0;
pin_i2c_sck=1;
delay_us(0x05);
pin_i2c_sck=0;
}
ex_ee_end();
}

  • 怎样使用收音模块TEA5767,有具体的电路吗?
    答:‍‍TEA5767采用I2C或者三线接口控制,我是用的I2C,单片机用STC89C52,带1K EEPROM,可以掉电存台,1602LCD显示. TEA5767读写数据都是5个字节,其中PLL参数14位,具体数据格式请看datasheet.以下程序中的函数可以直接在主程序中调用.include "iic.c"define max_freq 108000 define min_freq 87500...
  • 基于STC89C52单片机的电子时钟系统的设计
    答: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(...
  • stc89c52 接一个红外传感器(E18-D80NK),怎么把信号输到单片机?
    答:没有问题,可以这么定义,单片机输入输出是双向的。另外后面还要加一个灰度传感器,输出是模拟信号,在0.6V~1.6V,暂时不会自己做模数转换,怎么能把这个信号输进单片机?C52没有模拟量输入接口,要加模拟量转换芯片,最好是串行通信的模块如I2C总线的,模块很多,不过编程比较复杂,初学者最好在找芯片...
  • 利用STC89C52单片机以及PCF8591的AD转换设计一个数字电压表,求大神给个...
    答:这是吴鉴鹰单片机开发板配套的例程。/*--- 名称:IIC协议 PCF8591 AD/DA转换 内容:使用4路AD中的4路检测外部模拟量输入 使用液晶显示 ---*/ include <reg52.h> include "i2c.h"include "delay.h"include "1602.h"include <stdio.h> define AddWr 0x90 //写数据地址 define AddRd 0x91...
  • STC89C52对eeprom 24C02进行读写时,只有1-7地址位行,后面的不行,自己感...
    答:你去看一下EEPROM的芯片资料,我印象里这种EEPROM的存储方式是分页的,就是说每一页的存储方式在程序上要有变化。我记不大清楚了,如果不是分页的,就看看你I2C的读写时序有问题没,不行就用示波器抓一下
  • STC89C52单片机可以掉电保存数据吗?
    答:可以,单片机中, 保存数据有两种。一种是,Volatile memory,断电後数据消失。一种是,Non-Volatile memory,断电後数据不消失。应该要确认,单晶片是否有提供"可供写入的Non-Volatile memory"。有的单片机,数据可以存放在程序储存的空间(FALSH),有的是额外提供数据储存空间如(EEPROM), 依照单片机的不同...
  • 如何用单片机STC89C52输出4到20MA电流?
    答:用PWM输出,然后经过滤波,就有模拟量信号了。
  • 单片机STC89C52如何保存生产累计时间
    答:你试试PCF8583,这是一个I2C(和AT24C02一样)接口的RTC芯片,其中有240字节的RAM。加上后备电池,只要电池有电,RAM的数据就不会丢失,并且是可以无限次读写的,这样就好多了吧?或者DS1302也可以,其中有31字节的RAM,并且有写保护,只要电池有电数据就不会丢失。
  • 单片机开发板怎么使用
    答:10. 1602液晶显示模块:每行显示16个字符,可以显示两行。这款单片机使用并行接口。11. 12864液晶显示模块:并行操作方式,可以在液晶的任意位置显示数字,符号,汉字,图像。12. E2PROM模块:使用I2C总线通信协议(51单片机模拟),主芯片为ATMEL公司的AT24C02N,可以进行数据存储实验。13. 定时器/...
  • 怎么用STC89C52单片机 输出4~20mA电流
    答:单片机输出不了这么精细的电流。单片机,只能输出数字量。输在的经过 DA 转换器,再经过“电压-电流”变换,才能输出4~20mA电流。