#define uchar unsigned char
#define uint unsigned int
sbit scl=P3^4;
sbit sda=P3^5;
void delay0()//大约4us的延时
{
;;
}
void delay(uint z)//大约1ms的延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void start()//起始信号
{
sda=1;
delay0();
scl=1;
delay0();
sda=0;
delay0();
}
void stop()//终止信号
{
sda=0;
delay0();
scl=1;
delay0();
sda=1;
delay0();
}
void respons()//应答信号
{
uchar i;
scl=1;
delay0();
while(sda==1&&i<250)i++;//等待应答
scl=0;
delay0();
}
void write_byte(uchar date)//写数据,写一个字节
{
uchar i;
scl=0;
delay0();
for(i=0;i<8;i++)
{
date=date<<1;
sda=CY;//最高位移入PSW的CY位
delay0();
scl=1;
delay0();
scl=0;
delay0();
}
sda=1;//释放sda线
delay0();
}
uchar read_byte()//读数据,读一个字节
{
uchar i,j;
scl=0;
delay0();
sda=1;
delay0();
for(i=0;i<8;i++)
{
scl=1;
delay0();
j=(j<<1)|sda;
scl=0;
delay0();
}
return j;
}
void write_add(uchar address,uchar date)//向某个地址写一个字节的数据
{
start();//起始信号
write_byte(0xa0);//器件地址+0,即1010 000 0,最后的'0'为写方向位
respons();//应答
write_byte(address);//写入器件的首地址
respons();
write_byte(date);//写入数据
respons();
stop();//终止信号
}
uchar read_add(uchar address)//读出某个地址的数据
{
uchar l;
start();//起始信号
write_byte(0xa0);//器件地址+0,即1010 000 0,最后的'0'为写方向位
respons();
write_byte(address);//要读出的首地址
respons();
start();//再次来起始信号
write_byte(0xa1);//器件地址+1,即1010 000 1,最后的'1'为读方向位
respons();
l=read_byte();//读数据
stop();
return l;//返回数据
}
void init_24C02()//24C02初始化
{
sda=1;//释放数据线
delay0();
scl=1;//释放时钟线
delay0();
}
void main()
{
init_24C02();
while(1)
{
write_add(1,0x00);
delay(100);//延时很有必要,因为器件写和读之间要一定的时间间隔,不然反应不过来
P2=read_add(1);//读取24C02里的数据,"1"为其存储地址
while(1);
}
}
上一篇:8051单片机C语言基础
下一篇:基于AT89S52的ISD4004语音芯片使用
推荐阅读最新更新时间:2024-03-16 15:17
- 热门资源推荐
- 热门放大器推荐
设计资源 培训 开发板 精华推荐
- Allegro MicroSystems 在 2024 年德国慕尼黑电子展上推出先进的磁性和电感式位置感测解决方案
- 左手车钥匙,右手活体检测雷达,UWB上车势在必行!
- 狂飙十年,国产CIS挤上牌桌
- 神盾短刀电池+雷神EM-i超级电混,吉利新能源甩出了两张“王炸”
- 浅谈功能安全之故障(fault),错误(error),失效(failure)
- 智能汽车2.0周期,这几大核心产业链迎来重大机会!
- 美日研发新型电池,宁德时代面临挑战?中国新能源电池产业如何应对?
- Rambus推出业界首款HBM 4控制器IP:背后有哪些技术细节?
- 村田推出高精度汽车用6轴惯性传感器
- 福特获得预充电报警专利 有助于节约成本和应对紧急情况