找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1912|回复: 9
打印 上一主题 下一主题
收起左侧

51单片机,用到了I2C总线,AT24C02储存部分 程序错误

[复制链接]
跳转到指定楼层
楼主
ID:973696 发表于 2021-10-21 10:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
10黑币
跟着视频做的,感觉没有问题,找了好久也找出来错到哪,语法没有问题,麻烦大家帮我看一下,谢谢大家了

12-1 AT24C02数据存储.rar

45.6 KB, 下载次数: 11

keil程序

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:401564 发表于 2021-10-21 11:13 | 只看该作者
IIC要有延时的,你在所有的时钟和数据后面加上一个空操作或者延时
你的程序都是没有延时的
你参考一下
/*IIC读写函数*/
#include "IIC.H"
//=================================================================================================
void Delay()                 //用于IIC延时,CY有变化,根据不同单片机的时钟可以适当调整延时时长
{
unsigned char i;
for(i=0;i<1;i++);
}
//=================================================================================================
void Delay_ms(unsigned int a)                //@24.000MHz,1mS延时函数,这个代码从STC下载器复制来
{
        unsigned char i, j;
        for(a;a>0;a--)
            {
                i = 32;
                j = 40;
                do
                {
                        while (--j);
                }         while (--i);
          }
}
//=================================================================================================
void IIC_Start()           //IIC启动信号
{
        SCL=0;
        Delay();           //延时1mS
        SDA=1;
        Delay();
        SCL=1;
        Delay();
        SDA=0;
        Delay();
        SCL=0;
}
//=================================================================================================
void IIC_Stop()                         //IIC停止信号
{
        SCL=0;
        Delay();           //延时1mS
        SDA=0;
        Delay();
        SCL=1;
        Delay();
        SDA=1;
        Delay();
}
//=================================================================================================
void IIC_Ask()           //IIC应答信号
{
        SCL=0;
        Delay();           //延时
        SDA=0;
        Delay();
        SCL=1;
        Delay();
        SCL=0;
        Delay();
}
//=================================================================================================
void IIC_Nask()           //IIC不应答信号
{
        SCL=0;
        Delay();           //延时
        SDA=1;
        Delay();
        SCL=1;
        Delay();
        SCL=0;
        Delay();
}
//=================================================================================================
void Write_Byte(unsigned char byte)                        //写入器件的应答信号由从机给出
{
         unsigned char i,temp;
        unsigned int k;
         temp=byte;                
        SCL=0;
        Delay();
                 for(i=0;i<8;i++)
                         {
                        if(temp&0x80)SDA=1;
                        else SDA=0;
                        Delay();
                        SCL=1;
                        Delay();               
                        SCL=0;
                        Delay();
                        temp=temp<<1;
                        }
        SCL=1;                   //给出一个上升沿,用于产生应答信号
        Delay();
        SDA=1;
        while((SDA==1)&&(k<1000))
                {
                k++;
                Delay();
                } //等待SDA出现低电平,出现低电平就表示器件已经应答
        SCL=1;
        SDA=0;
        Delay();
}
//=================================================================================================
unsigned char Read_Byte()                                                  //读取的应答信号由单片机给出
{
        unsigned char i,k;
        SCL=0;
        Delay();
        SDA=1;                  //置位SDA等于释放SDA端口.让内部可以读取到这个端口的电平状态
        Delay();
        for(i=0;i<8;i++)
                {                 
                SCL=0;
                Delay();         
                SCL=1;
                k=(k<<1)|SDA;
                Delay();
                }
        return k;
}
//=================================================================================================*/
回复

使用道具 举报

板凳
ID:863432 发表于 2021-10-21 12:10 | 只看该作者
    1、 你好,你的问题还是建议自己查找下。不过可以给你一个现成的可用的例子。
    2、例子的单片机是基于STC8H3K64S4主芯片编写的,见下图。(板子是艾克姆的开发板)


    3、不知道你的硬件是怎样的,一定注意I2C总线是一定要加上拉的。
    4、如果单片机型号不完全一致,注意头文件修改下,提供的例子是模拟I2C的,更有利于你移植。一定注意延时函数要保证准确。(不同单片机运行速度不一样,延时函数是不一样的)






实验2-11-1:外部EEPROM存储器读写单字节实验(模拟I2C).rar

40.69 KB, 下载次数: 6

回复

使用道具 举报

地板
ID:956918 发表于 2021-10-21 15:48 | 只看该作者
24C02擦写数据时需要大概5ms的延时,
回复

使用道具 举报

5#
ID:973696 发表于 2021-10-21 19:02 | 只看该作者
Y_G_G 发表于 2021-10-21 11:13
IIC要有延时的,你在所有的时钟和数据后面加上一个空操作或者延时
你的程序都是没有延时的
你参考一下

我再看看,谢谢了
回复

使用道具 举报

6#
ID:973696 发表于 2021-10-21 19:03 | 只看该作者
正是河豚 发表于 2021-10-21 12:10
1、 你好,你的问题还是建议自己查找下。不过可以给你一个现成的可用的例子。
    2、例子的单片机是 ...

我板子上这两个是直接连好的
回复

使用道具 举报

7#
ID:973696 发表于 2021-10-21 19:05 | 只看该作者
378601462 发表于 2021-10-21 15:48
24C02擦写数据时需要大概5ms的延时,

好像不是延时的问题,就是读写函数可能哪里有错误,还没找到
回复

使用道具 举报

8#
ID:624769 发表于 2021-10-21 19:39 | 只看该作者
dll001 发表于 2021-10-21 19:05
好像不是延时的问题,就是读写函数可能哪里有错误,还没找到

I2C的速度都是很慢的,一般用8951+12M晶振的话,CLK可以不延时,但是速度更快的单片机CLK这里必须要若干个NOP来延时的。尤其是读的时候,延时不够,根本读不到东西。
回复

使用道具 举报

9#
ID:401564 发表于 2021-10-21 22:59 | 只看该作者
dll001 发表于 2021-10-21 19:05
好像不是延时的问题,就是读写函数可能哪里有错误,还没找到

有问题,但不限于延时
明白不,延时肯定是有问题的,可能其它地方也有问题,但延时问题不解决,你永远搞不定,除非你单片机能慢到IIC可以识别的速度
回复

使用道具 举报

10#
ID:971289 发表于 2021-10-22 21:46 | 只看该作者
时序是不是不对,延时错误?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表