EEPROM_IIC

来源:互联网 发布:小孩刘心悠原帖知乎 编辑:程序博客网 时间:2024/06/03 17:54
# include<reg52.h># define uchar unsigned char# define uint unsigned int sbit sda=P2^0;sbit scl=P2^1;sbit lsa=P2^2;sbit lsb=P2^3;sbit lsc=P2^4;uint code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,                    0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0到Fuint disp[3];void delay(uchar t);void delay_1(uchar x);void at24c02_start();void at24c02_stop();void at24c02_ack();void at24c02_init();void at24c02_write_onebyte(uchar byte);uchar at24c02_read_onebyte();void byte_write(uchar slave_add,                uchar byte_add,                uchar write_add);uchar random_read(uchar slave_add,                uchar byte_add);void  datepros(uchar w);void display();uchar k,n;int main(){    at24c02_init();    while(1)    {        random_read(0xa0,0);        k++;        if(k==50)  //延时一段时间        {            k=0;            n++;        }          if(n==250)        {            n=0;        }        datepros(n);  //数字处理        display();    //数码管显示        byte_write(0xa0,0,n);//字节写函数        delay(1);       }}/***************************************************************                        1、 IIC延时函数***************************************************************/void delay(uchar t){    uchar x,y;    for(x=t;x>0;x--)    {        for(y=10;y>0;y--)        {}    }}/***************************************************************                        数码管延时函数***************************************************************/void delay_1(uchar x){    uchar m,n;    for(n=x;n>0;n--)    {        for(m=120;m>0;m--)        {}    }}/***************************************************************                        2、 起始函数***************************************************************/void at24c02_start(){    scl=1;    delay(1);    sda=1;    delay(1);    sda=0;  //SDA下降沿    delay(1);       }/***************************************************************                        3、停止函数***************************************************************/void at24c02_stop(){    scl=1;    delay(1);    sda=0;    delay(1);    sda=1;//SDA上升沿    delay(1);   }/***************************************************************                         4、应答函数***************************************************************/void at24c02_ack(){    uchar i;    scl=1;    delay(1);    while((sda==1)&&(i<250))//判断是否响应    {        i++;    }    scl=0;    delay(1);}/***************************************************************                        5、初始化函数***************************************************************/void at24c02_init(){    sda=1;    scl=1;}/***************************************************************                     6、向at24c02里写入一个字节的函数***************************************************************/void at24c02_write_onebyte(uchar byte){    uchar i,temp;    temp=byte;    scl=0;    delay(1);    for(i=0;i<8;i++) //一位一位的写入字节    {        temp=temp<<1;  //左移        sda=CY;        //最高位移动到CY里面  再赋值给sda        delay(1);        scl=1;        //scl变化时 sda才允许变化        delay(1);        scl=0;        delay(1);    }    sda=1;    //释放sda    delay(1);}/***************************************************************                     7、从at24c02读取一个字节的函数***************************************************************/uchar at24c02_read_onebyte(){    uchar i,dat=0;    scl=0;    delay(1);    sda=1;    delay(1);    for(i=0;i<8;i++)    {        scl=1;        delay(1);        dat<<=1;        dat|=sda;        delay(1);        scl=0;        delay(1);    }    return dat;}/***************************************************************                     8、定义一个字节写函数***************************************************************/void byte_write(uchar slave_add,                uchar byte_add,                uchar write_add){    at24c02_start();    at24c02_write_onebyte(slave_add);    at24c02_ack();    at24c02_write_onebyte(byte_add);    at24c02_ack();    at24c02_write_onebyte(write_add);    at24c02_stop();}/***************************************************************                     9、选择地址函数***************************************************************/uchar random_read(uchar slave_add,                uchar byte_add){       uchar num;    at24c02_start();    at24c02_write_onebyte(slave_add);    at24c02_ack();    at24c02_write_onebyte(byte_add);    at24c02_ack();    at24c02_start();    at24c02_write_onebyte(slave_add+0x01);    at24c02_ack();    num = at24c02_read_onebyte();    return num;    at24c02_stop();}/***************************************************************                     10、处理函数 分离出百 十 个 位***************************************************************/void  datepros(uchar w){    uchar baiwei,shiwei,gewei;      baiwei=w/100;    shiwei=w%100/10;    gewei=w%10;    disp[0]=smgduan[baiwei];    disp[1]=smgduan[shiwei];    disp[2]=smgduan[gewei];}/***************************************************************                     11、显示函数***************************************************************/void display(){    uchar i;    for(i=0;i<3;i++)    {        switch(i)        {            case(0):lsa=0;lsb=0;lsc=0;break;            case(1):lsa=1;lsb=0;lsc=0;break;            case(2):lsa=0;lsb=1;lsc=0;break;                                                    }        P0=disp[i];        delay_1(10);        P0=0x00;//消隐        }}