0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2023-05-26 09:14 次阅读

一、项目介绍

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

当前项目采用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 
 #include #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);   // 将新的开机次数写入AT24C02while(1)
     {
         // 程序不断循环,实时记录设备的开机次数
     }
 }

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


审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6032

    文章

    44513

    浏览量

    632694
  • 存储器
    +关注

    关注

    38

    文章

    7447

    浏览量

    163582
  • STC89C52
    +关注

    关注

    41

    文章

    330

    浏览量

    81996
  • 存储芯片
    +关注

    关注

    11

    文章

    886

    浏览量

    43082
  • AT24C02
    +关注

    关注

    0

    文章

    79

    浏览量

    24248
收藏 人收藏

    评论

    相关推荐

    STC89C52芯片的编程

    编程STC89C51或52芯片,如下图放置STC89C52芯片,插好串口线和USB线,这里我们用了USB取电,先不要按下右下角的电源开关。
    发表于 08-05 14:08 371次下载

    STC单片机内部EEPROM记录开机次数(c语言)

    STC单片机内部EEPROM记录开机次数,可以记录开机次数
    发表于 11-23 11:04 30次下载

    单片机STC89C52程序

    单片机STC89C52源程序。
    发表于 01-11 18:16 112次下载

    STC89C52RC

    STC89C52RC,PCB学习好资料,欢迎下载学习。
    发表于 03-23 09:39 0次下载

    HL配套C实验例程24c02记录按键次数

    HL配套C实验例程24c02记录按键次数,配合开发板学习效果更好。
    发表于 04-11 17:04 18次下载

    STC89C52单片机介绍

    STC89C52单片机介绍。
    发表于 05-20 13:55 257次下载

    HL开发板配套的24C02记录按键次数C语言资料

    HL开发板配套C实验例程100例之24c02记录按键次数,很好的单片机C语言资料。
    发表于 09-01 10:19 8次下载
    HL开发板配套的<b class='flag-5'>24C02</b><b class='flag-5'>记录</b>按键<b class='flag-5'>次数</b><b class='flag-5'>C</b>语言资料

    使用单片机进行24C02记忆开机次数代码的详细资料说明

    本文档的主要内容详细介绍的是使用单片机进行24C02记忆开机次数代码的详细资料说明。
    发表于 05-21 17:11 7次下载
    使用单片机进行<b class='flag-5'>24C02</b>记忆<b class='flag-5'>开机</b><b class='flag-5'>次数</b>代码的详细资料说明

    使用EEPROM存储器24C02记忆开机次数的代码免费下载

    本文档的主要内容详细介绍的是使用EEPROM存储器24C02记忆开机次数的代码免费下载。
    发表于 08-26 17:31 25次下载
    使用EEPROM存储器<b class='flag-5'>24C02</b>记忆<b class='flag-5'>开机</b><b class='flag-5'>次数</b>的代码免费下载

    使用单片机实现24C02记忆开机次数C语言实例免费下载

    本文档的主要内容详细介绍的是使用单片机实现24C02记忆开机次数C语言实例免费下载。
    发表于 03-24 13:51 24次下载

    STC89C52单片机

    STC89C52单片机,STC89C52STC89C52看到涛哥这篇文章了,纪念一下还在搞嵌入式的我们!硬件实物图实物抽象化的图为:这个STC89C52名字是什么意思呢?STC89C52
    发表于 11-23 17:06 111次下载
    <b class='flag-5'>STC89C52</b>单片机

    STC89C52实现红外遥控(C语言)

    STC89C52实现红外遥控(C语言) STC89C52RC实现
    发表于 11-25 15:36 28次下载
    <b class='flag-5'>STC89C52</b><b class='flag-5'>实现</b>红外遥控(<b class='flag-5'>C</b>语言)

    STC89C52

    STC89C52
    发表于 11-25 15:51 161次下载
    <b class='flag-5'>STC89C52</b>

    STC89C52芯片手册

    STC89C52芯片手册_.pdf
    发表于 02-10 14:30 518次下载

    基于89C51单片机的24c02记忆开机次数源代码

    基于89C51单片机的24c02记忆开机次数源程序
    发表于 05-12 16:47 4次下载