|
單片機(jī)C語言實(shí)例-191-存儲AT24C02
/********************************************************************
* 文件名 : EEPROM_24C02.c
* 描述 : 該文件實(shí)現(xiàn)對24C02的操作。
確認(rèn)試驗(yà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; //定義計(jì)數(shù)值,每過1秒,sec加1
uint write; //寫標(biāo)志位
/********************************************************************
* 名稱 : 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()
* 功能 : 寫一個字節(jié)
* 輸入 : 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()
* 功能 : 讀一個字節(jié)
* 輸入 : 無
* 輸出 : 讀出的值
***********************************************************************/
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中寫入數(shù)據(jù)
* 輸入 : 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的個數(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 = 6;
P0 = table[sec / 10];
Delay_1ms(5);
P2 = 7;
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 = 0x4c; //對TH0 TL0賦值
TL0 = 0x00; //重裝計(jì)數(shù)初值
Count++;
if(Count == 20) //計(jì)滿20次(1秒)時
{
Count = 0; //重新再計(jì)
sec++;
write = 1; //1秒寫一次24C08
if(sec == 100) //定時100秒,在從零開始計(jì)時
{
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; //開始計(jì)時
}
/********************************************************************
* 名稱 : Main()
* 功能 : 主函數(shù)
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void Main(void)
{
x24c02_init(); //初始化24C02
sec = x24c02_read(2); //讀出保存的數(shù)據(jù)賦于sec
Time0_Init();
while(1)
{
LED();
if(write == 1) //判斷計(jì)時器是否計(jì)時一秒
{
write =0; //清零
x24c02_write(2,sec); //在24c08的地址2中寫入數(shù)據(jù)sec
}
}
}
更多詳情參考附件文檔
+08:00C126聯(lián)盟網(wǎng)3433.png (41 KB, 下載次數(shù): 2)
下載附件
保存到相冊
2022-2-17 10:02 上傳
|
|