STC89C52+AT24C02实现设备开机次数记录

简介: 当前项目采用STC89C52作为主控芯片,AT24C02作为存储芯片,实现了设备的开机次数记录功能。每次设备上电启动时,程序会从AT24C02中读取之前的记录值并加1,然后再将新的记录值写入AT24C02中,从而完成一次开机次数的记录。通过这种方式,可以实时、准确地记录设备的使用次数,并且不受断电影响,数据可靠性高。

一、项目介绍

在一些设备的使用过程中,需要对设备的使用次数进行统计和记录。这可以用于评估设备的实际使用寿命、确定维护周期、预测故障风险等方面,对于提高设备的稳定性和可靠性具有重要意义。

当前项目采用STC89C52作为主控芯片,AT24C02作为存储芯片,实现了设备的开机次数记录功能。每次设备上电启动时,程序会从AT24C02中读取之前的记录值并加1,然后再将新的记录值写入AT24C02中,从而完成一次开机次数的记录。通过这种方式,可以实时、准确地记录设备的使用次数,并且不受断电影响,数据可靠性高。

image-20230525223043627

image-20230525223227038

二、AT24C02介绍

AT24C02是一款由Atmel公司生产的串行EEPROM存储器芯片,可以存储2K(2048bit)数据,支持I2C总线通信协议,被广泛应用于各种电子设备中。

AT24C02有8个地址引脚(A0~A2),可以通过这些引脚设置不同的设备地址,使得多个AT24C02芯片能够在同一I2C总线上同时使用而不会冲突。该芯片还具有擦写次数和保护功能,能够防止数据被误删或者未经授权的修改。

AT24C02的工作电压范围为1.8V~5.5V,主要分为三个模式:写入模式、读取模式、休眠模式。写入模式和读取模式都需要先发送设备地址和命令字,然后才能进行数据操作。AT24C02对于输入输出电平都有严格的要求,如输入电压范围应在VSS-0.3V ~ VCC+0.3V之间,输出电压高电平应在0.4VCC ~ VCC之间,低电平应在0V ~ 0.1VCC之间,以确保数据传输的准确性和可靠性。

由于AT24C02体积小巧,功耗低并且具有不易丢失数据的特点,被广泛应用于电子产品中,例如:数码相机、智能手表、智能家居、安全监控等领域。

三、代码实现

以下是STC89C52+AT24C02实现设备开机次数记录的代码:

#include <reg52.h>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char

sbit SCL = P1^0;   // I2C总线时钟线
sbit SDA = P1^1;   // I2C总线数据线

#define AT24C02_ADDR    0xA0    // AT24C02设备地址

/* 延时函数 */
void delay(uint i)
{
   
   
    while(i--);
}

/* I2C总线起始信号 */
void I2C_Start()
{
   
   
    SDA = 1;
    SCL = 1;
    delay(10);      // 延时,确保数据稳定
    SDA = 0;
    delay(10);
    SCL = 0;
}

/* I2C总线停止信号 */
void I2C_Stop()
{
   
   
    SDA = 0;
    SCL = 1;
    delay(10);
    SDA = 1;
    delay(10);
}

/* I2C总线发送应答信号 */
void I2C_Ack()
{
   
   
    SDA = 0;
    delay(5);
    SCL = 1;
    delay(5);
    SCL = 0;
    delay(5);
    SDA = 1;
    delay(5);
}

/* I2C总线发送非应答信号 */
void I2C_Nack()
{
   
   
    SDA = 1;
    delay(5);
    SCL = 1;
    delay(5);
    SCL = 0;
    delay(5);
}

/* I2C总线发送一个字节 */
void I2C_SendByte(uchar dat)
{
   
   
    uchar i;
    for(i=0; i<8; i++)
    {
   
   
        if(dat & 0x80)
            SDA = 1;
        else
            SDA = 0;
        delay(5);
        SCL = 1;
        delay(5);
        SCL = 0;
        dat <<= 1;
    }
    I2C_Ack();
}

/* I2C总线读取一个字节 */
uchar I2C_ReadByte()
{
   
   
    uchar i, dat = 0;
    SDA = 1;
    for(i=0; i<8; i++)
    {
   
   
        SCL = 1;
        delay(5);
        dat <<= 1;
        if(SDA)
            dat |= 0x01;
        SCL = 0;
        delay(5);
    }
    return dat;
}

/* AT24C02写入一个字节 */
void AT24C02_WriteByte(uint addr, uchar dat)
{
   
   
    I2C_Start();                // 总线起始信号
    I2C_SendByte(AT24C02_ADDR); // 发送设备地址和写模式命令
    I2C_SendByte(addr>>8);      // 发送待写入数据的高8位地址
    I2C_SendByte(addr&0xFF);    // 发送待写入数据的低8位地址
    I2C_SendByte(dat);          // 发送待写入的数据
    I2C_Stop();                 // 总线停止信号
    delay(500);                 // 等待至少5ms,确保数据被写入芯片中
}

/* AT24C02读取一个字节 */
uchar AT24C02_ReadByte(uint addr)
{
   
   
    uchar dat;
    I2C_Start();                // 总线起始信号
    I2C_SendByte(AT24C02_ADDR); // 发送设备地址和写模式命令
    I2C_SendByte(addr>>8);      // 发送待读数据的高8位地址
    I2C_SendByte(addr&0xFF);    // 发送待读数据的低8位地址
    I2C_Start();                // 再次启动总线,为了切换到读模式
    I2C_SendByte(AT24C02_ADDR | 0x01);   // 发送设备地址和读模式命令
    dat = I2C_ReadByte();        // 读取数据
    I2C_Nack();                 // 非应答信号
    I2C_Stop();                 // 总线停止信号
    return dat;
}

/* 获取存储在AT24C02中的开机次数 */
uint GetBootCount()
{
   
   
    uchar hi, lo;
    hi = AT24C02_ReadByte(0x00);
    lo = AT24C02_ReadByte(0x01);
    return (hi<<8) | lo;        // 将高8位和低8位组合成一个16位数字
}

/* 将开机次数写入AT24C02 */
void SetBootCount(uint count)
{
   
   
    uchar hi, lo;
    hi = count >> 8;            // 获取开机次数的高8位
    lo = count & 0xFF;          // 获取开机次数的低8位
    AT24C02_WriteByte(0x00, hi);    // 写入高8位
    AT24C02_WriteByte(0x01, lo);    // 写入低8位
}

/* 主函数 */
void main()
{
   
   
    uint boot_count = GetBootCount();
    boot_count++;               // 开机次数加1
    SetBootCount(boot_count);   // 将新的开机次数写入AT24C02

    while(1)
    {
   
   
        // 程序不断循环,实时记录设备的开机次数
    }
}

代码利用STC89C52控制芯片和AT24C02存储芯片,通过I2C总线通信协议实现了设备开机次数的记录功能。具体而言,程序读取AT24C02中存储的开机次数,将其加1并写入AT24C02中;每次开机时,程序执行该操作并将开机次数持续累加,从而实现了设备开机次数的精确、可靠记录。

目录
相关文章
|
消息中间件 前端开发 网络性能优化
基于RabbitMQ的MQTT实现
基于RabbitMQ的MQTT实现
1275 0
|
传感器 数据采集 数据处理
基于STM32的温湿度监测系统设计与实现
基于STM32的温湿度监测系统设计与实现
2077 1
|
12月前
|
人工智能 监控 安全
使用 Ollama + FastAPI 打造轻量级 AI 应用部署方案
本文介绍了一套基于 Ollama 和 FastAPI 的轻量级 AI 模型部署方案,解决云端部署成本高、本地部署复杂的问题。通过 200 行核心代码实现模型加载到 API 服务的全流程,适用于中小型应用。方案结合 Ollama 的本地化运行能力和 FastAPI 的高性能特性,支持模型量化、并发控制和资源监控,提供 Docker 容器化及 K8s 扩展配置,优化性能与安全性。开发者可在 2 小时内完成环境搭建与部署,满足日均百万级请求需求,为 AI 应用快速落地提供有效支持。
1219 0
|
机器学习/深度学习 传感器 算法
行人闯红灯检测:基于计算机视觉与深度学习的智能交通解决方案
随着智能交通系统的发展,传统的人工交通违法判断已难以满足需求。本文介绍了一种基于计算机视觉与深度学习的行人闯红灯自动检测系统,涵盖信号灯状态检测、行人检测与跟踪、行为分析及违规判定与报警四大模块,旨在提升交通管理效率与安全性。
|
安全 网络安全 数据安全/隐私保护
网络信息安全之基于时间的安全模型(PDR和PPDR模型)
基于时间的安全模型是基于"**任何安全防护措施都是基于时间的,超过该时间段,这种防护措施是可能被攻破的**"这样的前提。该模型主要给出了信息系统的攻防时间表。攻击时间指的是在系统采取某种防守措施,通过不同的攻击手段来计算攻破该防守措施所需要的时间。防守时间指的是,对于某种固定攻击手法,通过采取不同的安全防护措施,来计算该防护措施所能坚守的时间。
1982 0
网络信息安全之基于时间的安全模型(PDR和PPDR模型)
|
存储 供应链 监控
探索供应链的精髓:深度解析ERP系统的供应链管理模块
探索供应链的精髓:深度解析ERP系统的供应链管理模块
1886 0
|
存储 Android开发
详细解读Android获取已安装应用信息(图标,名称,版本号,包)
详细解读Android获取已安装应用信息(图标,名称,版本号,包)
911 0
|
传感器 物联网 调度
从0入门FreeRTOS之第一节 什么是FreeRTOS?
FreeRTOS(Free Real-Time Operating System)是一款开源的实时操作系统(RTOS),专为嵌入式系统设计。由Real Time Engineers Ltd.开发和维护,FreeRTOS以其小巧、高效、易于使用的特点广受欢迎。FreeRTOS支持多种微控制器和微处理器平台,提供丰富的实时操作系统功能,使开发者能够轻松构建高效、实时响应的应用程序。
1619 0
|
存储 Linux 虚拟化
VMware保姆级安装教程-VMware Workstation Pro 16(Windows10)
VMware保姆级安装教程-VMware Workstation Pro 16(Windows10)
|
机器学习/深度学习 人工智能 算法
一、单层感知器(MCP人工神经元模型)
一、单层感知器(MCP人工神经元模型)