新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機—AT24C1024(帶程序解析!)—07

        51單片機—AT24C1024(帶程序解析!)—07

        作者: 時間:2016-11-25 來源:網絡 收藏

        //------------------------------------------------------------------------------
        //主控器件向被控器件發送應答函數
        void IIC_ack_send(bit a)
        {
        if(a==0) //發應答信號
        sda=0;
        else
        sda=1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        scl=1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        scl=0;
        _nop_();
        _nop_();
        }
        //------------------------------------------------------------------------------
        //寫一個字節函數
        void send_byte(uchar c)
        {
        uchar bit_cnt;
        for(bit_cnt=0;bit_cnt<8;bit_cnt++)//循環傳送8位
        {
        if((c< //取當前發送位
        sda=1;
        else
        sda=0;
        _nop_();
        scl=1;//發送到數據線上
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        scl=0;
        }
        }
        //------------------------------------------------------------------------------
        //接收一個字節函數
        //返回接收的8位數據
        uchar receive_byte()
        {
        uchar temp;
        uchar bit_cnt;
        temp=0;
        sda=1; //置數據線為輸入方式
        for(bit_cnt=0;bit_cnt<8;bit_cnt++)
        {
        _nop_();
        scl=0; //置時鐘線為低電平,準備接收數據
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        scl=1;
        _nop_();
        _nop_();
        temp<<=1;
        if(sda==1)//接收當前數據位,接收內容放入temp中
        temp+=1;
        _nop_();
        _nop_();
        }
        scl=0;
        _nop_();
        _nop_();
        return(temp);
        }

        本文引用地址:http://www.104case.com/article/201611/321505.htm

        AT24C1024.c(這個才是壓軸的哦~~

        //------------------------------------------------------------------------------
        //AT24C1024文件的函數,便于以后調用
        //用的1M的EEPROM
        #include"reg52.h"
        #include"IIC.h"
        #include"MacroAndConst.h"
        #include"intrins.h"
        //------------------------------------------------------------------------------
        //器件當前地址寫字節數據
        //入口參數:器件地址碼和傳送的數據
        //返回一位,1表示成功,否則有誤,使用后必須結束總線
        bit mcu_send_byte(uchar add,uchar dat)
        {
        IIC_start();//發開始信號
        send_byte(add);//寫器件地址碼到IIC總線
        IIC_ack_acc();//其實我感覺應該把這個程序固化到發送字節,省得寫一遍又一遍~~~~
        if(ack==0)
        return(0);
        send_byte(dat);//如果接收到應答信號,則發送一個字節數據
        IIC_ack_acc();
        if(ack==0)
        return(0);
        IIC_stop();//正常結束,發送結束信號,返回1
        return(1);
        }
        //------------------------------------------------------------------------------
        //向器件指定地址按頁寫函數
        //入口參數有4個:器件地址碼、器件單元地址、寫入的數據串的指針、寫入的字節個數
        //寫入成功,返回1;不成功,返回0,使用后必須結束總線
        bit mcu_send_string(uchar add,uchar rom_add_h,uchar rom_add_l,uchar *s,uchar num)
        {
        uchar i;
        IIC_start();
        send_byte(add);//發送器件地址碼
        IIC_ack_acc();
        if(ack==0)
        return(0);
        send_byte(rom_add_h); //有應答,發送ROM的單元地址的高8位
        IIC_ack_acc();
        if(ack==0)
        return(0);
        send_byte(rom_add_l); //有應答,發送ROM的單元地址的低8位
        IIC_ack_acc();
        if(ack==0)
        return(0);
        for(i=0;i //連續發送num個字節數據
        {
        send_byte(*s);
        IIC_ack_acc();
        if(ack==0)
        return(0);
        s++;
        }
        IIC_stop();
        return(1);
        }
        //------------------------------------------------------------------------------
        //讀器件當前地址單元數據函數
        //入口參數兩個:器件的地址碼、讀入位置,讀成功返回1,否則返回0
        //在對AT24C1024芯片寫操作之前,需要將WP置0,允許寫,寫操作完成后,WP置1,禁止對AT24C1024改寫
        bit mcu_receive_byte(uchar add,uchar *c)
        {
        IIC_start();
        send_byte(add);
        IIC_ack_acc();
        if(ack==0)
        return(0);
        *c=receive_byte();//讀入字節送目的位置
        IIC_ack_send(1);//送非應答信號:1
        IIC_stop();
        return(1);
        }
        //------------------------------------------------------------------------------
        //從器件指定地址讀多個字節
        //入口參數有4個:器件地址碼、器件單元地址、讀出的數據串、讀出的字節個數,寫入成功返回1,不成功返回0
        bit mcu_receive_string(uchar add,uchar rom_add_h,uchar rom_add_l,uchar *s,uchar num)
        {
        uchar i;
        IIC_start();
        send_byte(add); //發送器件的地址碼,這里最低位為0,寫
        IIC_ack_acc();
        if(ack==0)
        return(0);
        send_byte(rom_add_h);//發送器件單元地址的高字節
        IIC_ack_acc();
        if(ack==0)
        return(0);
        send_byte(rom_add_l);//發送器件單元地址的低字節
        IIC_ack_acc();
        if(ack==0)
        return(0);
        //------------------------------------------------------------------------------
        IIC_start(); //重新發送開始信號,開始讀取數據
        send_byte(add+1);//發送器件的地址碼,這里最后一位為1,讀
        IIC_ack_acc();
        if(ack==0)
        return(0);
        for(i=0;i{
        *s=receive_byte();
        IIC_ack_send(0); //送應答信號
        s++;
        }
        *s=receive_byte();
        IIC_ack_send(1); //送非應答信號
        IIC_stop();
        return(1);
        }

        要是程序有問題的看這個:

        http://blog.sina.com.cn/s/blog_7ec8fc2c01012pla.html

        要是芯片資料有問題的話看這個:

        http://blog.sina.com.cn/s/blog_7ec8fc2c01012ksx.html



        上一頁 1 2 3 下一頁

        關鍵詞: 51單片機AT24C102程序解

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 乌拉特中旗| 宜丰县| 乐业县| 桃园县| 兴文县| 平顺县| 乐至县| 虎林市| 甘泉县| 射阳县| 马山县| 加查县| 独山县| 富宁县| 万宁市| 榕江县| 凤庆县| 平乐县| 岳池县| 韶山市| 光泽县| 沧州市| 称多县| 三台县| 达拉特旗| 大足县| 卢龙县| 白河县| 宜城市| 北京市| 喜德县| 将乐县| 苍溪县| 汽车| 乐昌市| 合作市| 洮南市| 金坛市| 江都市| 登封市| 佛冈县|