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中;每次开机时,程序执行该操作并将开机次数持续累加,从而实现了设备开机次数的精确、可靠记录。


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

相关文章

    下载方式,而C51、C52与STC都是串口下载方式;其他方面基本大同小异 2.STC烧录步骤 (1)STC单片机烧录方式采用串口进行烧录程序,连接的方式如下图: (2)所以需要先确保USB转串......
    完以后图标如下: 2.准备单片机烧录器(USB转串口线)和STC单片机的主板: 3.将串口烧录工具插到电脑上,另外一端连接设备,设备断电。 接线方式是: 电路板的Txd接串口烧录......
    如何给单片机烧录程序 单机片烧录不进去怎么办;如何给单片机烧录程序? 以51单机片为例 1、首先准备好51单片机最小系统板和烧录器。 2、打开stc-isp烧录软件选择好单片机型号,这里的所选的单片机......
    非常缺少人手(开发工程师兼顾生产)。 通过【编程工具】下载程序 通过编程工具(大家所说的烧录软件,比如:STM32prog、STC-ICP等)直接下载程序,是很多公司都在用的一种比较常见的方法。 一般单片机厂家都配套有对应的烧录......
    单片机烧录程序怎么分类;说起给单片机烧录程序,大家应该都不陌生,我最早接触单片机是从51单片机开始的,型号是STC89C52RC,当时烧录程序就是用的下面这种烧录软件——STC-ISP。 这种......
    单片机烧录程序的几种常见方法;最近看到一个小伙伴问了一个比较基础的问题,大概就是问:单片机烧录程序常见方法有哪些? 下面就来说下常见的三种烧录程序的方法:ISP、IAP和ICP,以及......
    程序烧录方式你了解多少?;说起给单片机烧录程序,大家应该都不陌生,我最早接触单片机是从51单片机开始的,型号是STC89C52RC,当时烧录程序就是用的下面这种烧录软件——STC-ISP。 这种......
    51单片机烧写程序的方法;STC89C51是应用广泛的51单片机,很多人都是通过该单片机入门学习的,单片机的学习需要勤动手。单片机需要烧写程序,要用到相关的软件和硬件。下面介绍一下51单片机烧......
    (P2,1); } 问题解答: Q 定时器计算如何快速得到?(无需计算) 打开51单片机烧录软件STC-ISP,找到“定时器计算器”,根据红色方框中的进行设置,可以快速得到定时器初始化代码,可直......
    )编译好后,keil软件便自动生成可烧录单片机的HEX文件;然后便可使用STC-ISP软件将代码烧录到单片机中。 ......

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

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

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

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

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

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

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