⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shiyan4.c

📁 单片机I2C总线设计 程序功能:利用I2C总线写或读E2PROM 向E2PROM写n个数据
💻 C
字号:
//**程序设计**作者hyg214**网名**展凌**
//程序功能:利用I2C总线写或读E2PROM
//向E2PROM写n个数据,再按头尾地址读出
//当然你也可以设置n=1;那就只写读一个数据
//************************************
//********************************************
#include<reg52.h> 
#include<intrins.h>//空操作需要的头文件
#define uchar unsigned char
sbit sda=P2^0;//声明控制信号
sbit scl=P2^1;

uchar idata tab[]={
//数码显示从0-9数字,读ROM时
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};

uchar idata sdate[50];//接收数据的数组变量
uchar tn=0;//从那个地址开始读
uchar m=10;//读出时要读几个数据
//你可以只读一个(m=1),但这个程序让它循环显示
uchar n=10;//写入数据的个数
uchar  idata mdate[10]={53,28,37,45,69,74,56,82,30,99};//要写入的数据
//*********************************************

//----------------------------------
void delay()//延时函数
{//约等于5us用于控制信号SDA,SCL的延时
  uchar i;i++;
}
//----------------------------------
void delay_ms(uchar z)//延时函数
{//约等于z*0.5ms
 //用于写、读间时;数码动态显示间时
    uchar i,j;
    for(i=z;i>0;i--)
       for(j=222;j>0;j--);
}
//----------------------------------
void intc()//初始化函数
{
    sda=1;//控制信号拉高
    scl=1;
    P0=0x00;//数码管不显示
}
//----------------------------------
void start()//起始信号函数
{//向ROM发送一个开始的信号
    sda=1;
    scl=1;
    delay();
    sda=0;
    delay();
    scl=0; 
}
//----------------------------------
void stop()//停止信号函数
{//向ROM发送一个停止的信号
    sda=0;
    scl=1;
    delay();
    sda=1;
    delay();
    scl=0;  
}
//----------------------------------
void respons()//产生应答信号函数
{//接收一数据后应答
    sda=0;
    scl=1;
    delay();
    scl=0;
    sda=1;
}
//----------------------------------
void no_respons()//产生非应答信号函数
{//接收一数据没应答,则强制
    sda=0;
    scl=1;
    delay();
    scl=0;
    sda=1;
}
//----------------------------------
void write_date(uchar date)//向E2PEOM写数据函数
{//向E2PROM写一字节数据
    uchar i,temp;
     temp=date;
     for(i=0;i<8;i++)//总共写入8次位=1字节=1个数据
     {
          temp=temp<<1;//要存的数据左移1位,最高位给CY了
          scl=0;  //数据可以改变
          delay();
          sda=CY; //写入一位
          delay();
          scl=1;  //数据稳定,不能写了
          delay();
     }
     scl=0;
     delay();
     sda=1;//稳定数据
     delay(); 
}
//----------------------------------
uchar read_date()//从E2PROM读出数据函数
{//根据
     uchar i,k;
     scl=0;//数据改变
     delay();
     sda=1;//可读信号
     for(i=0;i<8;i++)//读出8次位=1字节=1个数据
     {
          scl=1;//数据稳定,可从sda读出一位
          delay();
          k=(k<<1)|sda;//写入时是从高位写,读出时也一行
          scl=0;//数据改变(准备下一位)
          delay();
     }
     delay();
     return k;//返回读出的一个数据 
}
//----------------------------------
void write_sword(uchar sta,uchar n,uchar *date)//写入串数据函数
{//根据起始地址、数据个数及数据写入E2PEOM中
     uchar i;//计数变量
     start();//起始
     write_date(0xa0);//E2PROM地址(ATC02为oxa0)
     respons();//应答
     write_date(sta);//写入数据要存放的地址
     respons();//应答
     for(i=0;i<n;i++)
     {
         write_date(date[i]);//写入数据
         respons();//应答
     }
     stop();//停止
}
//-----------------------------------
uchar read_sword(uchar sta,uchar n)//读出串数据函数
{//根据起始地址和读出个数,从E2PROM读出一串数据
     uchar i;//计数个数
     start();//起始
     write_date(0xa0);//AO表示主机向从机写数据
     respons();//应答
     write_date(sta);//数据地址
     respons();//应答

     start();//起始
     write_date(0xa1);//A1表示从机从主机读取数据
     for(i=0;i<n;i++)
     {
         respons();//应答
         *(sdate+i)=read_date();//读出数据存入数组         
     }
     no_respons();//非应答     
     stop();//停止
     return 1;//返回读出的数组数据
}
//----------------------------------
void display(uchar *dat)//数码管显示函数
{//从E2PROM读出的数据在数码管显示出来
   uchar i,j,k,tem1,tem0,temp;
   //计数变量,2个延时用,十位和个位,传值变量
   for(i=0;i<m;i++)
   {
     temp=*(dat+tn++);
     if(tn==n){tn=0;}//这里让它循环显示
     tem1=temp/10;//十位
     tem0=temp%10;//个位
     for(j=8;j>0;j--)
       for(k=8;k>0;k--)//大约1s一个数据
       {
          P2=0x10;//选通二个数码管
          P0=tab[tem1];//显示十位
          delay_ms(20);//延时10ms,动态显示时暂停时间
          //太快,不够亮,太慢,不稳定(闪烁),一般10ms
          P2=0x20;
          P0=tab[tem0];
          delay_ms(20);
       }    
   }
}
//----------------------------------
void main()//主函数
{//功能:初始化,写数据,读数据,显示数据
     uchar i=0,temp;//i表示开始读的地址    
     intc();//初始化
     write_sword(i,n,mdate);//根据起始地址和个数,串数据写入E2PROM
     delay_ms(100);//延时,写入和读出要有个时间的
     temp=read_sword(i,n);//根据地址读出一串数据   
     while(temp)
     {
         display(sdate);//读出的数据用数码管显示出来
     } 
}
//-----------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -