木槿呀 2024-05-11 16:52 采纳率: 72.2%
浏览 8

蓝桥杯单片机eeprom读数据的时候一直在变

我在用eeprom读取数据的时候一直在变,ch4的位置应该是5,但是实际上数码管在5,4,0之间跳变,这是为什么?


#include "iic.h"
#include "hardware.h"
#include <STC15F2K60S2.H>
unsigned char ch1,ch2,ch3,ch4=0;
unsigned long int old_sec=123456;
unsigned long int new_sec=654321;
void Delay5ms()        //@12.000MHz
{
    unsigned char i, j;

    i = 59;
    j = 90;
    do
    {
        while (--j);
    } while (--i);
}

void Write_eeprom(unsigned char addr,unsigned char dat)
{
    I2CStart();
    I2CSendByte(0xa0);
    I2CWaitAck();
    I2CSendByte(addr);
    I2CWaitAck();
    I2CSendByte(dat);
    I2CWaitAck();
    I2CStop();
    Delay5ms();    
}
//------------------------------------------------------------------------
unsigned char Read_eeprom(unsigned char addr)
{
    unsigned char tmp;
    I2CStart();
    I2CSendByte(0xa0);
    I2CWaitAck();
    I2CSendByte(addr);
    I2CWaitAck();
    
    I2CStart();
    I2CSendByte(0xa1);
    I2CWaitAck();
    tmp=I2CReceiveByte();
    I2CSendAck(1);
    I2CStop();
    return tmp;
}
void SMG_display()
{
        SMG_buf[0]=17;
        SMG_buf[1]=17;
        SMG_buf[2]=ch3;//new_sec/100000;
        SMG_buf[3]=ch4;//new_sec%100000/10000;
        SMG_buf[4]=new_sec%10000/1000;
        SMG_buf[5]=new_sec%1000/100;
        SMG_buf[6]=new_sec%100/10;
        SMG_buf[7]=new_sec%10;
}
void tt()
{
        ch3=Read_eeprom(0x00);
        ch4=Read_eeprom(0x01);
        //ch3=Read_eeprom(0x02);
        //ch4=Read_eeprom(0x03);
        //new_sec=(ch1<<24)|(ch2<<16)|(ch3<<8)|ch4;
}
void main()
{    
    Timer1Init();
        ch1=9;//old_sec/(256*3);
        ch2=5;//(old_sec<<8)/(256*2);
        //ch3=(old_sec<<16)/256;
        //ch4=old_sec<<24;
        Write_eeprom(0x00,ch1);
        Write_eeprom(0x01,ch2);
        //Write_eeprom(0x02,ch3);
        //Write_eeprom(0x03,ch4);

    while(1)
    {        
        SMG_display();
        if(timer200ms>=200)
        {
            timer200ms=0;
            tt();
        }
    }
}

  • 写回答

3条回答 默认 最新

  • 笑面虎 2024-05-11 16:52
    关注

    以下内容由CHATGPT及笑面虎共同生成、有用望采纳:


    【您想要解决的问题】:您提问的目的是解决在使用单片机读取EEPROM中存储的数据时,数码管显示的数值在5、4、0之间跳变的问题。您期望数码管稳定显示数值5,但实际显示不稳定。

    【问题出现原因】:根据您提供的代码和描述,可能的问题原因包括:

    1. I2C通信不稳定:可能I2C总线上存在通信问题,导致读取的数据不准确。
    2. EEPROM地址错误:您可能读取了错误的EEPROM地址,或者写入和读取的地址不一致。
    3. 定时器中断问题:如果timer200ms的更新不准确,可能导致读取操作在不同的时间点获取到不同的数据。
    4. 硬件连接问题:EEPROM硬件连接可能存在问题,如接触不良或线路干扰。

    【问题解决方案】:

    1. 检查I2C通信:确保I2C总线通信正常,没有干扰或连接问题。
    2. 确认EEPROM地址:检查写入和读取的EEPROM地址是否一致,并且是您期望的地址。
    3. 优化定时器中断:确保timer200ms的更新逻辑是正确的,并且定时器配置没有问题。
    4. 检查硬件连接:检查EEPROM的硬件连接,确保没有接触不良或线路干扰。

    【提供代码】:由于您提供的代码片段中没有显示timer200ms的定义和更新逻辑,我将提供一个修改后的代码示例,其中包含了一个简单的定时器逻辑:

    #include "iic.h"
    #include "hardware.h"
    #include <STC15F2K60S2.H>
    // ... (其他包含的头文件和定义)
    
    // 假设有一个定时器中断服务函数,用于更新timer200ms
    void Timer1_ISR() interrupt 1
    {
        TH1 = 0xFC; // 重新加载定时器初值
        TL1 = 0x18;
        timer200ms++; // 更新定时器变量
    }
    
    // ... (其他函数不变)
    
    void main()
    {
        // ... (其他初始化代码)
    
        ET1 = 1; // 开启定时器1中断
        TR1 = 1; // 启动定时器1
    
        while(1)
        {       
            SMG_display();
            if(timer200ms >= 200)
            {
                timer200ms = 0; // 重置定时器
                tt();
            }
        }
    }
    

    【代码运行方式】:您需要将上述代码在支持STC15F2K60S2单片机的集成开发环境(IDE)中编译,并烧录到单片机中。确保您的开发环境已经配置了正确的时钟频率和I2C通信协议。

    【代码预期运行结果】:在代码正确运行后,数码管应该稳定显示从EEPROM读取的数据,不再出现跳变。

    【推荐相关链接】:

    请注意,以上链接仅为示例,您可能需要根据实际情况查找更具体的技术支持文档或论坛帖子。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月11日

悬赏问题

  • ¥20 c语言写的8051单片机存储器mt29的模块程序
  • ¥60 求直线方程 使平面上n个点在直线同侧并且距离总和最小
  • ¥50 java算法,给定试题的难度数量(简单,普通,困难),和试题类型数量(单选,多选,判断),以及题库中各种类型的题有多少道,求能否随机抽题。
  • ¥50 rk3588板端推理
  • ¥250 opencv怎么去掉 数字0中间的斜杠。
  • ¥15 这种情况的伯德图和奈奎斯特曲线怎么分析?
  • ¥250 paddleocr带斜线的0很容易识别成9
  • ¥15 电子档案元素采集(tiff及PDF扫描图片)
  • ¥15 flink-sql-connector-rabbitmq使用
  • ¥15 zynq7015,PCIE读写延时偏大