#include<reg52.h>
#define uchar unsigned char
sbit sda=P3^5; //數據
sbit scl=P3^4; //時鐘
uchar a;
void delay() //延時
{ ;; }
void start() //開始信號 在scl時鐘高電平時數據sda由高到低跳變
{
sda=1;
scl=1;
delay(); //延時
sda=0;
delay(); //延時
}
void stop() //停止 在scl時鐘高電平時數據sda由低到高跳變
{
sda=0;
scl=1;
delay(); //延時
sda=1;
delay(); //延時
}
void respons() //應答 在scl時鐘高電平時檢測數據sda由高到低跳變,經過幾個周期無應答自動跳過
{
uchar i;
scl=1;
delay();
while((sda==1)&&(i<250))i++; //當i=250時無應答自動跳過
scl=0;
delay();
}
void init() //初始化
{
sda=1;
scl=1;
delay(); //延時
}
void write_byte(uchar date) //寫一個字節(jié)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i ++) //循環(huán)8次寫入一個字節(jié)
{
temp=temp<<1; //temp中的數據左移,最高位移入CY存儲器中,低位補零
scl=0;
delay();
sda=CY;
delay();
scl=1;
delay();
}
scl=0;
delay();
sda=1;
delay();
}
uchar read_byte() //讀取一個字節(jié)
{
uchar i,k;
scl=0;
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<<1)|sda; //k左移低位用sda代替(左移完后與sda與運算),循環(huán)8次,取出完整的字節(jié)
scl=0;
delay();
}
return k; //返回k值
}
void delay1(uchar x) //延時函數
{
uchar a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
void write_add(uchar address,uchar date) //完整的寫字節(jié)過程
{
start(); //開始信號
write_byte(0xa0); //發(fā)送片選并選擇寫
respons(); //應答
write_byte(address); //發(fā)送要寫入的地址
respons(); //應答
write_byte(date); //發(fā)送要寫入的數據
respons(); //應答
stop(); //停止
}
uchar read_add(uchar address) //完整的讀字節(jié)過程
{
uchar date;
start(); //開始信號
write_byte(0xa0); //發(fā)送片選并選擇寫
respons(); //應答
write_byte(address); //發(fā)送要讀取的地址
respons(); //應答
start(); //開始信號
write_byte(0xa1); //發(fā)送片選并選擇讀
respons(); //應答
date=read_byte(); //讀取數據
stop(); //停止
return date; //返回date
}
void main()
{
init(); //初始化
write_add(23,0x5a); //在位置23中寫入5a
delay1(100); //延時函數
P1=read_add(23); //在位置23中讀取數據并對P!口賦值
while(1);
}
全部程序51hei下載地址:
24c02例程.zip
(20.52 KB, 下載次數: 57)
2019-6-10 21:57 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|