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

发布时间:2023-08-31  

一、项目介绍

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


当前项目采用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);   // 将新的开机次数写入AT24C02

 

     while(1)

     {

         // 程序不断循环,实时记录设备的开机次数

     }

 }

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


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。
服务
平台入驻

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

原厂代理商合作

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

闲置物料合作

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

生态合作

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

加工与定制类服务商合作

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

线上代理合作

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

邮件营销及广告服务

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>