電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 2518|回復(fù): 0
收起左側(cè)

單片機C語言實例-195-EEPROM_24C02

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2022-2-18 09:39:48 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機C語言實例-195-EEPROM_24C02

/********************************************************************
* 文件名  : EEPROM_24C02.c
* 描述    :  該文件實現(xiàn)對24C02的操作。
                     確認(rèn)試驗是否成功:電源上電后,數(shù)碼管的值在遞增,觀察值。關(guān)閉電源,待幾秒后上電,
                     數(shù)碼管顯示的值會從斷電錢的那個值開始顯示。
* 創(chuàng)建人  : 東流,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;      //定義計數(shù)值,每過1秒,sec加1
uint write;                //寫標(biāo)志位

/********************************************************************
* 名稱 : delay1()
* 功能 : 短暫延時
* 輸入 : x
* 輸出 : 無
***********************************************************************/
void delay1(uchar x)
{  
        uint i;
        for(i=0; i<x; i++)
        ;
}

/********************************************************************
* 名稱 : 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)
{
        sda = 1;
        flash();
        scl = 1;
        flash();
        sda = 0;
        flash();
        scl = 0;
        flash();
}

/********************************************************************
* 名稱 : stop()
* 功能 : 停止I2C總線
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void stop()
{
        sda = 0;
        flash();
        scl = 1;
        flash();
        sda = 1;
        flash();
}

/********************************************************************
* 名稱 : writex()
* 功能 : 寫一個字節(jié)
* 輸入 : j(需要寫入的值)
* 輸出 : 無
***********************************************************************/
void writex(uchar j)
{  
        uchar i,temp;
        temp = j;
        for(i=0; i<8; i++)
        {
                temp = temp << 1;
                scl = 0;
                flash();
                sda = CY;
                flash();
                scl = 1;
                flash();
        }
        scl = 0;
        flash();
        sda = 1;
        flash();
}

/********************************************************************
* 名稱 : readx()
* 功能 : 讀一個字節(jié)
* 輸入 : 無
* 輸出 : 讀出的值
***********************************************************************/
uchar readx(void)
{
        uchar i, j, k = 0;
        scl = 0;
        flash();
        sda = 1;
        for(i=0; i<8; i++)
        {  
                flash();
                scl = 1;
                flash();
                if(sda == 1)
                {
                        j = 1;
                }
                else j = 0;
                k = (k << 1) | j;
                scl = 0;
        }
        flash();
        return(k);
}

/********************************************************************
* 名稱 : clock()
* 功能 : I2C總線時鐘
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void clock(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);
        clock();
        writex(address);
        clock();
        start();
        writex(0xa1);
        clock();
        i = readx();
        stop();
        delay1(10);
        return(i);
}

/********************************************************************
* 名稱 : x24c02_write()
* 功能 : 想24c02中寫入數(shù)據(jù)
* 輸入 : address(地址) , info(值)
* 輸出 : 無
***********************************************************************/
void x24c02_write(uchar address, uchar info)
{
        EA = 0;
        start();
        writex(0xa0);
        clock();
        writex(address);
        clock();
        writex(info);
        clock();
        stop();
        EA = 1;
        delay1(50);
}

/********************************************************************
* 名稱 : Delay_1ms()
* 功能 : 延時,延時時間為 1ms * i
* 輸入 : i(延時1ms的個數(shù))
* 輸出 : 無
***********************************************************************/
void Delay_1ms(uint i)
{
        uchar x, j;
        for(j=0; j<i; j++)
        for(x=0; x<=148; x++)
        ;       
}

/********************************************************************
* 名稱 : LED()
* 功能 : 顯示
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void LED()                  //LED顯示函數(shù)
{
        P2 = 0x06;
        P0 = table[sec / 10];
        Delay_1ms(5);
        P2 = 0x07;
        P0 = table[sec % 10];
        Delay_1ms(5);
}

/********************************************************************
* 名稱 : time0()
* 功能 : 定時中斷函數(shù),每秒中sec加一,并且寫標(biāo)識write使能
* 輸入 : del
* 輸出 : 無
***********************************************************************/
void time0(void) interrupt 1 using 3  //定時中斷服務(wù)函數(shù)
{
        static uchar Count = 0;
        TH0 = (65536 - 50000) / 256; //對TH0 TL0賦值
        TL0 = (65536 - 50000) % 256; //重裝計數(shù)初值
        Count++;        //每過250ust tcnt加一
        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 = (65536 - 50000) / 256;         //對TH0 TL0賦值
        TL0 = (65536 - 50000) % 256;         //使定時器0.05秒中斷一次
        TR0 = 1;                                           //開始計時
}

/********************************************************************
* 名稱 : Main()
* 功能 : 主函數(shù)
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void Main(void)
{
        P2 = 0x00;
        x24c02_init();                //初始化24C02
        Time0_Init();
        sec = x24c02_read(2);        //讀出保存的數(shù)據(jù)賦于sec
        while(1)
        {
                LED();
                if(write == 1)                                 //判斷計時器是否計時一秒
            {
                        write =0 ;              //清零
                        x24c02_write(2,sec);          //在24c08的地址2中寫入數(shù)據(jù)sec
                }
        }
}


更多詳情參考附件文檔

游客,如果您要查看本帖隱藏內(nèi)容請回復(fù)

回復(fù)

使用道具 舉報

發(fā)表回復(fù)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表