|
EEPROM實(shí)驗(yàn)板采用ATMEL公司的AT24C02芯片,該芯片為單頁(yè)256字節(jié)的存儲(chǔ)器,通過(guò)IIC總線可以對(duì)芯片進(jìn)行讀寫(xiě)操作。SCL和SDA分別接單片機(jī)的P3.6和P3.7。
C語(yǔ)言源程序:
#include<reg52.h> //52單片機(jī)頭文件包含
#define uchar unsigned char //宏定義 uchar 為 unsigned char
sbit sda=P3^6; //定義sda接口引腳
sbit scl=P3^7; //定義scl接口引腳
uchar a; //定義無(wú)符號(hào)字符變量 a
void delay()//延時(shí)函數(shù) 執(zhí)行2條空語(yǔ)句
{ ;;}
void start() //開(kāi)始信號(hào)
{
sda=1;//sda置1
delay();//延時(shí)
scl=1;//scl置1
delay();//延時(shí)
sda=0;//sda置0
delay();//延時(shí)
}
void stop()//停止信號(hào)
{
sda=0;//sda置0
delay();//延時(shí)
scl=1;//scl置1
delay();//延時(shí)
sda=1;//sda置1
delay();//延時(shí)
}
void respons() //應(yīng)答
{
uchar i;//定義無(wú)符號(hào)字符變量 i
scl=1;//scl置1
delay();//延時(shí)
while((sda==1)&&(i<250)) i++; //如果sda=1并且i<250的話循環(huán)執(zhí)行i++
scl=0;//scl置0
delay();//延時(shí)
}
void init() //初始化
{
sda=1;//sda置1
delay();//延時(shí)
scl=1;//scl置1
delay();//延時(shí)
}
void write_byte(uchar date) //寫(xiě)一個(gè)字節(jié)
{
uchar i,temp; //定義無(wú)符號(hào)字符變量i,temp
temp=date;//將參數(shù)date賦值給temp
for(i=0;i<8;i++) //循環(huán)8次逐位寫(xiě)入
{
temp=temp<<1;//左移1位
scl=0;//scl置0
delay();//延時(shí)
sda=CY;//進(jìn)位標(biāo)志賦值給sda完成寫(xiě)入
delay();//延時(shí)
scl=1;//scl置1
delay();延時(shí)
}
scl=0;//scl置0
delay();//延時(shí)
sda=1;//sda置1
delay();//延時(shí)
}
uchar read_byte() //讀EEPROM中的一個(gè)字節(jié)
{
uchar i,k; //定義無(wú)符號(hào)字符變量i,k
scl=0;//scl置0
delay();//延時(shí)
sda=1;//sda置1
delay();//延時(shí)
for(i=0;i<8;i++) //分8次讀取每次讀一位
{
scl=1;//scl置1
delay();//延時(shí)
k=(k<<1) | sda;//k左移1位與sda相或得到1位的值
scl=0;//scl置0
delay();//延時(shí)
}
return k;//讀取完畢返回讀取到的值
}
void delay1(uchar x) //延時(shí)函數(shù)2
{
uchar a,b; //定義無(wú)符號(hào)字符變量a,b
for(a=x;a>0;a--)//循環(huán)x次
{
for(b=100;b>0;b--);//循環(huán)100次
}
}
void wirte_add(uchar address,uchar date) //按地址寫(xiě)入數(shù)據(jù)函數(shù)
{
start();//開(kāi)始信號(hào)
write_byte(0xa0); //寫(xiě)入指令0xa0;
respons();//應(yīng)答
write_byte(address);//寫(xiě)入地址
respons();//應(yīng)答
write_byte(date)//寫(xiě)入數(shù)據(jù)
respons()//應(yīng)答
stop();//停止
}
uchar read_add(uchar address)//讀取一個(gè)地址的數(shù)據(jù)
{
uchar date;//定義無(wú)符號(hào)字符變量date用于接收讀取的數(shù)據(jù)
start();//開(kāi)始信號(hào)
write_byte(0xa0);//讀寫(xiě)指令寫(xiě)入
respons();//應(yīng)答
write_byte(address);//寫(xiě)入地址
respons();//應(yīng)答
start();//開(kāi)始信號(hào)
write_byte(0xa1);//讀指令寫(xiě)入
respons();//應(yīng)答
date=read_byte();//讀入地址的數(shù)據(jù)賦值給date
stop();//停止
return date;//返回讀到的值
}
void main() // 入口函數(shù)
{
init();//對(duì)EEPROM進(jìn)行初始化
write_add(0x01,0x04);//在EEPROM的0x01號(hào)地址寫(xiě)入數(shù)據(jù)0x04
delay1(100);//延時(shí)100ms
write_add(0x02,0x08);//在EEPROM的0x02號(hào)地址寫(xiě)入數(shù)據(jù)0x08
delay1(100);//延時(shí)100ms
write_add(0x03,0);//在EEPROM的0x03號(hào)地址寫(xiě)入數(shù)據(jù)0
delay1(100);//延時(shí)100ms
P1=read_add(0x01)//讀入0x01號(hào)地址的值賦值給P1
while(1);//無(wú)限循環(huán)
}
//實(shí)驗(yàn)現(xiàn)象由于0x01號(hào)地址寫(xiě)入的是0x04 (00000100)所以第三個(gè)發(fā)光二極管被熄滅
|
|