请选择 进入手机版 | 继续访问电脑版

普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 1965|回复: 0

I2C总线通信实现EEPROM数据读写

[复制链接]

22

主题

24

帖子

136

积分

注册会员

Rank: 2

积分
136
发表于 2021-1-13 10:45:30 | 显示全部楼层 |阅读模式
EEPROM.H :
#ifndef _EEPROM_H_
#define _EEPROM_H_

#define uchar unsigned char
#define uint unsigned int

sbit SDA=P2^0;
sbit SCL=P2^1;

void delay_10us();
void i2c_start();
void i2c_stop();
uchar i2c_sendbyte(uchar dat);
uchar i2c_readbyte();
void write_to_at24c02(uchar addr, uchar dat);
uchar read_from_at24c02(uchar addr);

#endif

EEPROM.C :
#include <reg52.h>
#include "eeprom.h"

void delay10us(void)   //误差 0us
{
    unsigned char a,b;
    for(b=1;b>0;b--)
        for(a=2;a>0;a--);
}


void i2c_start()
{
        SDA=1;
        delay10us();
        SCL=1;
        delay10us();
        SDA=0;
        delay10us();
        SCL=0;
        delay10us();
       
}

void i2c_stop()
{
        SDA=0;
        delay10us();
        SCL=1;
        delay10us();
        SDA=1;
        delay10us();
}

uchar i2c_sendbyte(uchar dat)
{
        uchar i,t;
        for(i=0;i<8;i++)
        {
       
                dat=dat<<1;
                SDA=CY;
                delay10us();
                SCL=1;
                delay10us();
                SCL=0;
                delay10us();
        }
        SCL=1;
        delay10us();
        SDA=1;
        delay10us();
        while(SDA)
        {
                t++;
                if(t>200)
                {
                        SCL=0;
                        delay10us();
                        return 0;
                }
        }
        SCL=0;
        delay10us();
        SDA=1;
        delay10us();
        return 1;
       
}

uchar i2c_readbyte()
{
       
        uchar dat,i;
        SCL=0;
        delay10us();
        for(i=0;i<8;i++)
        {
                SCL=1;
                delay10us();
                dat=dat<<1;
               
                dat|=SDA;
                delay10us();

                SCL=0;
                delay10us();
               
        }
        return dat;
}

void write_to_at24c02(uchar addr, uchar dat)
{
        i2c_start();
        i2c_sendbyte(0xa0);

        i2c_sendbyte(addr);
        i2c_sendbyte(dat);
        i2c_stop();

       
}

uchar read_from_at24c02(uchar addr)
{
        uchar dat;
        i2c_start();
        i2c_sendbyte(0xa0);
       
        i2c_sendbyte(addr);
        i2c_start();
        i2c_sendbyte(0xa1);
        dat=i2c_readbyte();
        i2c_stop();
        return dat;

}

main 主程序:
/*****************
功能:通过独立键盘控制EEPROM AT24C02的写入、读出以及数据在数码管显示

K1:数据写入AT24C02
K2:数据从AT24C02读出到单片机
K3:数据加1
K4:数据清零

受传送字节限制,只能试验0~255的数据
欢迎交流单片机编程思路,共同提高进步  QQ30777103
*****************/

#include<reg52.h>
#include "eeprom.h"

sbit s1=P1^0;   //74HC138 译码器管脚定义  
sbit s2=P1^1;
sbit s3=P1^2;

#define DUAN P0  //数码管管脚定义

sbit key1=P2^4;  
sbit key2=P2^5;
sbit key3=P2^6;
sbit key4=P2^7;

uint srdata;
uchar smg_duan[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
uchar smg_wei[]={0x00,0x01,0x02,0x03,0x04,0x05};



void delay10ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}

void delay(uint t)
{
        while(t--);
}

void smg_display(uint srdata)
{
        uchar i;
        for(i=0;i<6;i++)
        {
                P1=smg_wei[i];
                switch(i)
                {
                        case 0: DUAN=~smg_duan[srdata/1000/100]; break;
                        case 1: DUAN=~smg_duan[srdata/1000/10];  break;
                        case 2: DUAN=~smg_duan[srdata%10000/1000]; break;
                        case 3: DUAN=~smg_duan[srdata%1000/100];   break;
                        case 4: DUAN=~smg_duan[srdata%100/10];  break;
                        case 5: DUAN=~smg_duan[srdata%10];  break;
                }

        delay(300);
        DUAN=0x00;
        }
       
}


void main()
{
/*   LED按照I2C回传的数据显示
        write_to_at24c02(11,0xaa);
        delay10ms();
        P1=read_from_at24c02(11);      
       
        while(1);

*/
        uchar t;
        while(1)
        {
                key1=1;
                key2=1;
                key3=1;
                key4=1;
                t=0;
                if(key1==0)
                {
                        delay10ms();
                        if(key1==0)
                        {
                                write_to_at24c02(10,srdata);
                                delay10ms();
                                while(key1==0&&t<1000)
                                t++;
                        }
                }
                if(key2==0)
                {
                        delay10ms();
                        if(key2==0)
                        {
                                srdata=read_from_at24c02(10);
                                delay10ms();
                                while(key2==0&&t<1000)
                                t++;
                        }
                }
                if(key3==0)
                {
                        delay10ms();
                        if(key3==0)
                        {
                                srdata++;
                                if(srdata>65535)
                                srdata=0;
                                delay10ms();
                                while(key3==0&&t<1000)
                                t++;
                        }
                }
                if(key4==0)
                {
                        delay10ms();
                        if(key4==0)
                        {
                                srdata=0;
                                delay10ms();
                                while(key4==0&&t<1000)
                                t++;
                        }
                }
                smg_display(srdata);
       
        }

}
回复

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-3-29 09:47 , Processed in 0.085794 second(s), 30 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表