电子产业一站式赋能平台

PCB联盟网

搜索
查看: 1669|回复: 0
收起左侧

单片机C语言实例-191-存储AT24C02

[复制链接]
发表于 2022-2-17 10:03:00 | 显示全部楼层 |阅读模式
单片机C语言实例-191-存储AT24C02

/********************************************************************
* 文件名  : EEPROM_24C02.c
* 描述    :  该文件实现对24C02的操作。
                     确认试验是否成功:电源上电后,数码管的值在递增,观察值。关闭电源,待几秒后上电,
                     数码管显示的值会从断电钱的那个值开始显示。
* 创建人  : 东流,2009年4月9日
***********************************************************************/
#include <reg52.h>
#include <intrins.h>

#define uchar unsigned char
#define uint  unsigned int

sbit scl=P1^5;  //24c08 SCL
sbit sda=P3^6;  //24c08 SDA

uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar sec;      //定义计数值,每过1秒,sec加1
uint write;                //写标志位

/********************************************************************
* 名称 : flash()
* 功能 : 延时,时间为2个NOP,大概为2US
* 输入 : 无
* 输出 : 无
***********************************************************************/
void flash(void)
{
        _nop_();
        _nop_();
}

/********************************************************************
* 名称 : x24c02_init()
* 功能 : 24c02初始化子程序
* 输入 : 无
* 输出 : 无
***********************************************************************/
void x24c02_init(void)
{
        scl = 1;
        flash();
        sda = 1;
        flash();
}

/********************************************************************
* 名称 : start(void)
* 功能 : 启动I2C总线
* 输入 : 无
* 输出 : 无
***********************************************************************/
void start(void)
{
        scl = 1;
        flash();
        sda = 1;
        flash();
        sda = 0;
        flash();
        scl = 0;
        flash();
}

/********************************************************************
* 名称 : stop()
* 功能 : 停止I2C总线
* 输入 : 无
* 输出 : 无
***********************************************************************/
void stop()
{
        scl = 0;
        flash();
        sda = 0;
        flash();
        scl = 1;
        flash();
        sda = 1;
        flash();
}

/********************************************************************
* 名称 : writex()
* 功能 : 写一个字节
* 输入 : j(需要写入的值)
* 输出 : 无
***********************************************************************/
void writex(uchar j)
{  
        uchar i,temp;
        temp = j;
        for(i=0; i<8; i++)
        {
                scl = 0;
                flash();
                sda = (bit)(temp & 0x80);
                flash();
                scl = 1;
                flash();
                temp = temp << 1;
        }
        scl = 0;
        flash();
}

/********************************************************************
* 名称 : readx()
* 功能 : 读一个字节
* 输入 : 无
* 输出 : 读出的值
***********************************************************************/
uchar readx(void)
{
        uchar i, j, k = 0;
        for(i=0; i<8; i++)
        {
                scl = 0;
                flash();               
                if(sda == 1)
                {
                        j = 1;
                }
                else j = 0;
                k = (k << 1) | j;
                scl = 1;
                flash();
        }
        return(k);
}

/********************************************************************
* 名称 : ack()
* 功能 : I2C总线时钟
* 输入 : 无
* 输出 : 无
***********************************************************************/
void ack(void)
{
        uchar i = 0;
        scl = 1;
        flash();
        while((sda == 1) && (i < 255))
        {
                i++;
        }
        scl = 0;
        flash();
}

/********************************************************************
* 名称 : x24c02_read()
* 功能 : 从24c02中读出值
* 输入 : address(要在这个地址读取值)
* 输出 : 从24c02中读出的值
***********************************************************************/
uchar x24c02_read(uchar address)
{
        uchar i;
        start();
        writex(0xa0);
        ack();
        writex(address);
        ack();
        start();
        writex(0xa1);
        ack();
        i = readx();
        stop();
        return(i);
}

/********************************************************************
* 名称 : x24c02_write()
* 功能 : 想24c02中写入数据
* 输入 : address(地址) , info(值)
* 输出 : 无
***********************************************************************/
void x24c02_write(uchar address, uchar info)
{
        start();
        writex(0xa0);
        ack();
        writex(address);
        ack();
        writex(info);
        ack();
        stop();
}

/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时,延时时间为 1ms * i
* 输入 : i(延时1ms的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)
{
        uchar x, j;
        for(j=0; j<i; j++)
        for(x=0; x<=148; x++)
        ;       
}

/********************************************************************
* 名称 : LED()
* 功能 : 显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void LED()                  //LED显示函数
{
        P2 = 6;
        P0 = table[sec / 10];
        Delay_1ms(5);
        P2 = 7;
        P0 = table[sec % 10];
        Delay_1ms(5);
}

/********************************************************************
* 名称 : time0()
* 功能 : 定时中断函数,每秒中sec加一,并且写标识write使能
* 输入 : del
* 输出 : 无
***********************************************************************/
void time0(void) interrupt 1 using 3  //定时中断服务函数
{
        static uchar Count = 0;
        TH0 = 0x4c; //对TH0 TL0赋值
        TL0 = 0x00; //重装计数初值
        Count++;        
        if(Count == 20)  //计满20次(1秒)时
        {
                Count = 0;   //重新再计
                sec++;
                write = 1;   //1秒写一次24C08
                if(sec == 100) //定时100秒,在从零开始计时
                {
                        sec = 0;
                }
        }
}

/********************************************************************
* 名称 : Time0_Init()
* 功能 : 定时器0的初始化
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Time0_Init(void)
{
        TMOD = 0x01;                          //定时器工作在方式1
        ET0 = 1;
        EA = 1;
        TH0 = 0x4c;         //对TH0 TL0赋值
        TL0 = 0x00;         //使定时器0.05秒中断一次
        TR0 = 1;                                           //开始计时
}

/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
        x24c02_init();                //初始化24C02
        sec = x24c02_read(2);        //读出保存的数据赋于sec       
        Time0_Init();
        while(1)
        {
                LED();
                if(write == 1)                            //判断计时器是否计时一秒
            {
                        write =0;              //清零
                        x24c02_write(2,sec);   //在24c08的地址2中写入数据sec
                }
        }
}


更多详情参考附件文档
+08:00C126联盟网3433.png
游客,如果您要查看本帖隐藏内容请回复

回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表