×
单片机 > 单片机程序设计 > 详情

基于AT89S52的24C02使用

发布时间:2020-08-24 发布时间:
|
#include

#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);  
 }
}




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机中高阻态的实质及意义