8051学习笔记——IIC与EEPROM实验

发布时间:2024-07-25  

main.c


  1 #include

  2 #include "iic.h"

  3 #define  AT24C02 0xa0  //AT24C02 地址

  4 

  5 sbit    LS138A=P2^2;      //译码器端

  6 sbit    LS138B=P2^3;

  7 sbit    LS138C=P2^4; 

  8 

  9 sbit    K1 = P1^0;     //保存

 10 sbit    K2 = P1^1;     //读取

 11 sbit    K3 = P1^2;     //+数据

 12 sbit    K4 = P1^3;   //-数据

 13 

 14 void delay(unsigned int i);

 15 

 16 //此表为 LED 的字模, 共阴数码管 0-9 

 17 unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; 

 18 

 19 unsigned char Count1;

 20 unsigned long D[17], LedOut[5],LedNumVal;

 21 unsigned int idata USEC;   //表示这个变量类型是unsigned int,地址在idata区,也就是内部RAM地址的128~255内

 22 

 23 void  system_ini() 

 24 {    

 25     TMOD|= 0x11;    //mode 1

 26     TH1 = 0xfe;     //0.5ms

 27     TL1 = 0x0c;

 28     TR1 = 1; 

 29     IE = 0x8A;

 30 }

 31 

 32 void main()

 33 {

 34     unsigned char i;

 35     unsigned char pDat[8];

 36 

 37        system_ini();

 38        while(1)

 39        {

 40          //========================IIC 读取

 41         if(K2 == 0)       //第二个按钮读取数据

 42         { 

 43               IRcvStr(AT24C02,0,&pDat[0], 8); 

 44               for (i=0; i<4; i++)

 45               {

 46                 D[14+i]=pDat[i*2+0]+pDat[i*2+1]*0x100;

 47                 Count1 = D[14];

 48                }         

 49          }

 50 

 51        //========================IIC 保存

 52            if(K1 == 0)    //第一个按钮保存数据

 53            { 

 54             D[14]= Count1;

 55              for (i=0; i<4; i++)

 56              {

 57                    pDat[i*2+0]=D[14+i];

 58                    pDat[i*2+1]=D[14+i]>>8;

 59              }

 60              ISendStr(AT24C02, 0 , &pDat[0], 8); 

 61               D[14] = 0;

 62            }

 63 

 64       /********以下将2402中保存的数据送到LED数码管显示*************/

 65         LedNumVal=Count1;

 66           LedOut[0]=Disp_Tab[LedNumVal%10000/1000];

 67           LedOut[1]=Disp_Tab[LedNumVal%1000/100];

 68           LedOut[2]=Disp_Tab[LedNumVal%100/10]|0x80;

 69           LedOut[3]=Disp_Tab[LedNumVal%10]; 

 70         

 71         for(i=0; i<4; i++) 

 72           {        

 73             P0 =  LedOut[i];

 74            

 75             switch(i)                      

 76              {        

 77                 case 0:LS138A=0; LS138B=0; LS138C=0; break;         

 78                 case 1:LS138A=1; LS138B=0; LS138C=0; break;                 

 79                 case 2:LS138A=0; LS138B=1; LS138C=0; break; 

 80                 case 3:LS138A=1; LS138B=1; LS138C=0; break; 

 81                 case 4:LS138A=0; LS138B=0; LS138C=1; break;

 82              }

 83             delay(100);

 84           }

 85    }

 86 }

 87 

 88 void delay(unsigned int i)

 89 {

 90     char j;

 91     for(i; i > 0; i--)

 92         for(j = 200; j > 0; j--);

 93 }

 94 

 95 void T1zd(void) interrupt 3   //3 为定时器1的中断号  1 定时器0的中断号 0 外部中断1 2 外部中断2  4 串口中断

 96 {

 97     TH1 = 0xfe; //12M    

 98     TL1 = 0x0c;

 99        if(USEC++==200)

100        {    

101         USEC = 0;

102         if(!K3) Count1++;     //改变数据

103         if(!K4)    Count1--;

104     }  

105 }

复制代码

iic.h


复制代码

  1 #include

  2 #include

  3 #define _NOP() _nop_()

  4 sbit    SCL = P2^1;

  5 sbit    SDA = P2^0;

  6 bit ack;

  7 

  8 void Start_IIC()

  9 {

 10     SDA = 1;

 11     _NOP();

 12     SCL = 1;

 13     _NOP();_NOP();_NOP();_NOP();_NOP();

 14     SDA = 0;

 15     _NOP();_NOP();_NOP();_NOP();_NOP();

 16     SCL = 0;

 17     _NOP();_NOP();

 18 }

 19 

 20 void Stop_IIC()

 21 {

 22     SDA = 0;

 23     _NOP();

 24     SCL = 1;

 25     _NOP();_NOP();_NOP();_NOP();_NOP();

 26     SDA = 1;

 27     _NOP();_NOP();_NOP();_NOP();_NOP();

 28 }

 29 

 30 void Send_Byte(unsigned char byte)

 31 {

 32     int i;

 33     for(i = 0;i < 8;i++)

 34     {

 35         if((byte << i) & 0x80)    SDA = 1;

 36         else    SDA = 0;

 37         SCL = 1;

 38         _NOP();_NOP();_NOP();_NOP();_NOP();

 39         SCL = 0;

 40     }

 41 

 42     SCL = 1;      //准备接受应答位

 43     _NOP();_NOP();

 44 

 45     if(SDA == 1)    ack = 0;

 46     else    ack = 1;

 47 

 48     SCL = 0;

 49     _NOP();_NOP();

 50 }

 51 

 52 unsigned char Rcv_Byte()

 53 {

 54     unsigned char byte;

 55     int i;

 56     byte = 0;

 57 

 58     for(i = 0;i < 8;i++)

 59     {

 60         SCL = 0;

 61         _NOP();_NOP();_NOP();_NOP();_NOP();

 62         SCL = 1;

 63         _NOP();_NOP();_NOP();_NOP();_NOP();

 64         byte <<= 1;

 65         if(SDA == 1)    byte++;

 66     }

 67     SCL = 0;

 68     _NOP();_NOP();

 69     return byte;

 70 }

 71 

 72 void Ack_IIC(bit a)

 73 {

 74   

 75   if(a==0)    SDA=0;              /*在此发出应答或非应答信号 */

 76   else    SDA=1;

 77   _NOP();_NOP();_NOP();     

 78   SCL=1;

 79   _NOP();_NOP();_NOP();_NOP();_NOP();

 80   SCL=0;                     /*清时钟线,钳住I2C总线以便继续接收*/

 81   _NOP();_NOP();  

 82 }

 83 

 84 //AT2402的功能函数

 85 /*******************************************************************

 86                     向有子地址器件发送多字节数据函数               

 87 函数原型: bit  ISendStr(UCHAR sla,UCHAR suba,ucahr *s,UCHAR no);  

 88 功能:     从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件

 89           地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。

 90           如果返回1表示操作成功,否则操作有误。

 91 注意:    使用前必须已结束总线。

 92 ********************************************************************/

 93 bit ISendStr(unsigned char  sla,unsigned char  suba,unsigned char  *s,unsigned char  no)

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。
服务
平台入驻

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

原厂代理商合作

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

闲置物料合作

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

生态合作

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

加工与定制类服务商合作

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

线上代理合作

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

邮件营销及广告服务

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>