历史上的今天
返回首页

历史上的今天

今天是:2025年01月22日(星期三)

正在发生

2018年01月22日 | 51读写串行EEPROM芯片at2402程序(C)

2018-01-22 来源:eefocus

/* Name:AT24C02存储器的读写程序,用到I2C总线,含相对独立的I2C总线读写函数 */ 
    #include 
    #include 
    #include 
    #define DELAY_TIME 60 /*经实验,不要小于50!否则可能造成时序混乱*/ 

    #define TRUE 1 
    #define FALSE 0

    sbit SCL=P1^7;/*假设由P1.7和P1.6控制*/ 
    sbit SDA=P1^6;

/********** Function Definition 函数定义 ************/

    void DELAY(unsigned int t) /*延时函数*/ 
    { 
        while(t!=0) 
            t--; 
    }

    void I2C_Start(void) 
    { 
        /*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/ 
        SDA=1; 
        SCL=1; 
        DELAY(DELAY_TIME); 
        SDA=0; 
        DELAY(DELAY_TIME); 
        SCL=0; 
        DELAY(DELAY_TIME); 
    }

    void I2C_Stop(void) 
    { 
        /*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/ 
        SDA=0; 
        SCL=1; 
        DELAY(DELAY_TIME); 
        SDA=1; 
        DELAY(DELAY_TIME); 
        SCL=0; 
        DELAY(DELAY_TIME); 
    }

    void SEND_0(void)   /* SEND ACK */ 
    { 
        /*发送0,在SCL为高电平时使SDA信号为低*/ 
        SDA=0; 
        SCL=1; 
        DELAY(DELAY_TIME); 
        SCL=0; 
        DELAY(DELAY_TIME); 
    }

    void SEND_1(void) 
    { 
        /*发送1,在SCL为高电平时使SDA信号为高*/ 
        SDA=1; 
        SCL=1; 
        DELAY(DELAY_TIME); 
        SCL=0; 
        DELAY(DELAY_TIME); 
    }

    bit Check_AcknowLEDge(void) 
    { 
        /*发送完一个字节后检验设备的应答信号*/ 
        SDA=1; 
        SCL=1; 
        DELAY(DELAY_TIME/2); 
        F0=SDA; 
        DELAY(DELAY_TIME/2); 
        SCL=0; 
        DELAY(DELAY_TIME); 
        if(F0==1) 
            return FALSE; 
        return TRUE; 
    }

    void WriteI2CByte(char b)reentrant 
    { 
        /*向I2C总线写一个字节*/ 
        char i; 
        for(i=0;i<8;i++) 
            if((b<            else 
                SEND_0(); 
    }

 

    char ReadI2CByte(void)reentrant 
    { 
        /*从I2C总线读一个字节*/ 
        char b=0,i; 
        for(i=0;i<8;i++) 
        { 
            SDA=1;    /*释放总线*/ 
            SCL=1;    /*接受数据*/ 
            DELAY(10); 
            F0=SDA; 
            DELAY(10); 
            SCL=0; 
            if(F0==1) 
                { 
                    b=b<<1; 
                    b=b|0x01; 
                 } 
            else 
                b=b<<1; 
        } 
        return b; 
    }


/**********以下为读写24c02的函数**********/ 
void Write_One_Byte(char addr,char thEDAta) 

          bit acktemp=1; 
          /*write a byte to mem*/ 
          I2C_Start(); 
          WriteI2CByte(0xa0); 
          acktemp=Check_Acknowledge(); 
          WriteI2CByte(addr);/*address*/ 
          acktemp=Check_Acknowledge(); 
          WriteI2CByte(thedata);/*thedata*/ 
          acktemp=Check_Acknowledge(); 
          I2C_Stop();

}

void Write_A_Page(char *buffer,char addr) 

          bit acktemp=1; 
          bit wrtmp; 
          int i; 
          /*write a page to at24c02*/ 
          I2C_Start(); 
          WriteI2CByte(0xa0); 
          acktemp=Check_Acknowledge(); 
          WriteI2CByte(addr);/*address*/ 
          acktemp=Check_Acknowledge(); 
          for(i=0;i<7;i++) 
          { 
            WriteI2CByte(buffer[i]); 
            if(!Check_Acknowledge()) 
                { 
                    I2C_Stop();

                } 
           }


          I2C_Stop();

 


}

char Read_One_Byte(char addr) 
{         bit acktemp=1; 
          char mydata; 
           /*read a byte from mem*/ 
          I2C_Start(); 
          WriteI2CByte(0xa0); 
          acktemp=Check_Acknowledge(); 
          WriteI2CByte(addr);/*address*/ 
          acktemp=Check_Acknowledge(); 
          I2C_Start(); 
          WriteI2CByte(0xa1); 
          acktemp=Check_Acknowledge();


          mydata=ReadI2CByte(); 
          acktemp=Check_Acknowledge();

          return mydata; 
          I2C_Stop(); 
}

void Read_N_Bytes(char *buffer,char n,char addr) 

          bit acktemp=1;

          int i=0; 
           /*read 8 bytes from mem*/ 
          I2C_Start(); 
          WriteI2CByte(0xa0); 
          acktemp=Check_Acknowledge(); 
          WriteI2CByte(addr);/*address*/ 
          acktemp=Check_Acknowledge(); 
          I2C_Start(); 
          WriteI2CByte(0xa1);

          acktemp=Check_Acknowledge();

 


          for(i=0;i                buffer[i]=ReadI2CByte(); 
                if(i!=n-1) 
                    SEND_0();    /*发送应答*/ 
                else 
                    SEND_1();    /*发送非应答*/ 
          }

   I2C_Stop();

}


void main() 

          int i; 
          char mybyte; 
          char myarray[8]; 
          char myarray2[8]; 
          char rdarray[16]; 
           
          for(i=0;i<8;i++) 
          { 
                myarray[i]=i; 
                myarray2[i]=i+0x08;     

          }

          Write_One_Byte(0x20,0x28);

          Write_A_Page(myarray,0x10); 
          Write_A_Page(myarray2,0x18);

          mybyte=Read_One_Byte(0x20); 
          Read_N_Bytes(rdarray,16,0x10);

}


推荐阅读

史海拾趣

Gowanda Electronics公司的发展小趣事

对于连续可调直流稳压电源电路,网友可能会有多个方面的问题,以下是一些常见问题及其解答:

一、技术原理与性能参数

  1. 问:连续可调直流稳压电源电路的工作原理是什么?
    : 连续可调直流稳压电源电路的工作原理主要是通过扩展开关电源的电压和电流容量,采用高频调制技术,将输入的交流电转换为直流电,并通过调节电路使输出电压稳定在一个可调范围内。其内部包含整流、滤波、稳压等多个环节,以提供稳定且可调的直流电压输出。

  2. 问:如何选择合适的连续可调直流稳压电源?
    : 选择连续可调直流稳压电源时,需要考虑的主要因素包括所需电压范围、电流容量、稳压精度、纹波噪声、保护功能等。同时,也需要根据应用场景考虑电源的体积、重量、散热性能等因素。

二、使用与维护

  1. 问:在使用过程中,输出电压不稳定怎么办?
    : 如果输出电压不稳定,可以首先检查电源输入电压是否稳定,使用稳压电源或变压器等辅助设备来保持输入电压的稳定。其次,检查输出端电压设置是否正确,确保输出电压值在设定范围内。最后,检查电源输出端负载是否符合规定,避免负载过重或过轻导致输出电压波动。

  2. 问:如何对连续可调直流稳压电源进行日常维护?
    : 日常维护主要包括检查电源输入输出线路的连接是否牢固,清洁电源外壳和散热风扇上的灰尘,以及定期检查电源的工作状态和性能指标。如果发现异常或故障,应及时进行处理或更换损坏的部件。

三、故障排查与解决

  1. 问:电源无法输出电压或电流怎么办?
    : 如果电源无法输出电压或电流,可以首先检查电源输入电压是否正常,电源本身是否损坏。其次,检查电源输出端连接是否正确,是否存在开路或短路的情况。最后,检查电源是否过载或短路,确保电源在正常工作范围内。

  2. 问:电源输出电压波动大怎么办?
    : 输出电压波动大可能是由于电源输入电压不稳定、输出端负载不匹配或存在电磁干扰等原因造成的。解决方法包括稳定输入电压、匹配适当的负载、检查并消除电磁干扰源等。

四、扩展与升级

  1. 问:如何扩展连续可调直流稳压电源的电压和电流范围?
    : 扩展电压和电流范围通常需要根据具体的电源设计来进行。一般来说,可以通过更换更高功率的整流管、滤波电容和稳压元件等方式来提升电源的电压和电流容量。同时,也可以通过增加并联或串联电路的方式来实现电压和电流的分档调节。

  2. 问:如何进行电路的升级和改造?
    : 电路的升级和改造需要根据实际需求和技术能力来进行。在升级过程中,需要注意保持原有电路的稳定性和可靠性,避免引入新的故障点。同时,也需要关注新技术的发展和应用,以便在升级过程中采用更先进、更高效的电路设计方案。

以上是针对连续可调直流稳压电源电路的一些常见问题及其解答。希望这些信息能够对网友有所帮助。

Crameda Intersys公司的发展小趣事

Crameda Intersys公司非常重视人才的培养和引进。公司建立了完善的人才培养机制,通过内部培训和外部引进相结合的方式,不断提升员工的专业技能和创新能力。同时,公司还积极营造创新氛围,鼓励员工提出新的想法和解决方案。这些措施有效地激发了员工的创新热情,为公司的发展提供了源源不断的人才支持。

Bogen Communications Inc公司的发展小趣事

在电子行业的激烈竞争中,Bogen Communications Inc公司凭借一项革命性的技术创新,迅速崭露头角。该公司研发出一种新型的音频处理芯片,极大地提升了通信设备的音质和性能。这一创新不仅赢得了市场的广泛认可,还为公司带来了大量的订单和合作伙伴。随着技术的不断完善和市场的扩大,Bogen Communications Inc逐渐成为了音频通信领域的领导者。

Block USA Inc.公司的发展小趣事

除了支付业务外,Block USA Inc.还积极投身于软件SAAS服务的研发与创新。公司推出了一系列针对餐厅、薪资发放和预约等领域的软件解决方案,帮助商家提升运营效率和管理水平。这些软件服务的推出,不仅进一步丰富了Block的产品线,也为其在电子行业中树立了创新者的形象。

Einfochips公司的发展小趣事

为了满足不断增长的ASIC和嵌入式服务需求,Einfochips公司决定在印度孟买附近的Pune设立一家新的设计中心。该设计中心将为亚洲和北美客户提供服务,主要涉及存储网络、无线通信和消费多媒体等领域。这一举措不仅加强了Einfochips在亚洲和北美市场的地位,还为其未来的发展奠定了坚实基础。

GTE Microcircuits公司的发展小趣事
实现高频性能需要关注放大器的带宽和转换速率(Slew Rate)等参数。选择具有宽带宽和高转换速率的放大器是基础。此外,优化电路布局,减少寄生电容和电感的影响,以及采用适当的频率补偿技术也是提高高频性能的关键。

问答坊 | AI 解惑

爱特梅尔推出用于滑块和按键的触摸控制器

爱特梅尔公司 (Atmel® Corporation) 宣布推出触摸控制器IC 产品AT42QT2160,在单个器件中结合了触摸按键和触摸滑动功能。AT42QT2160能够控制多达16个单独的触摸按键,以及由2至8个触摸按键通道构成的滑块。此外,该芯片还可通过PWM的输出功能控 ...…

查看全部问答>

本人认为最好的单片机学习资料

大家顶啊! [ 本帖最后由 lovedata 于 2008-12-30 15:20 编辑 ]…

查看全部问答>

09车型新趋势

扭矩传感器在刚刚落幕的广州国际车展上,近20款国产新车亮相,全新发布的进口车型也有十几款之多。广本锋范、雪佛兰科鲁兹、新嘉年华、法比亚晶锐等首发车型为此次广州车展增加了耀眼星光。透过众多的新车,09年车型新趋势也初显端倪。 趋势  ...…

查看全部问答>

如何看懂430中各模块的结构图

[qq]371263995[/qq]我们知道,在MSP430单片机中,有很多模块,比如复位模块,时钟模块,I/O口模块,Timer A定时器模块,ADC模块等等。每个模块都有其结构图,比图下图所示。我们或许能粗略不用弄懂它们进行简单程序的编写。但是如果想要写出好的高 ...…

查看全部问答>

我的6410开发板为什么USB总是断掉

6410的板子,想在SDRAM运行系统镜像,写NK.nb0的时候 Checksum is being calculated.... (If you want to skip, press \'x\' key) Checksum O.K. ...…

查看全部问答>

norflash文件系统的移植

各位大虾:     辛苦了一段时间,终于可以在wince4.2中把剩下的norflash做成了文件系统,从而可以存放数据,但是!!,同样的代码和注册表移植到wince500系统下时,发现系统起来了,在存储管理器中没有出现Norflash磁盘,做了N次试验, ...…

查看全部问答>

如何更改WINCE系统托盘的输入法图标?

wince系统托盘的输入法图标是在哪里(或什么程序里)实现的呢?想改变这个图标该怎么操作呢?…

查看全部问答>

电脑看电影死机 高手请教!

电脑配置: cpu: intel  e2160(双核)  1.80GHz 主板:技嘉   GA-945GCM 内存:1G 硬盘:160G 显卡:集成 光驱:PHILIPUS  :  SPD2212P 电源:长城 我电脑是去年10月组装的,不知道这种 ...…

查看全部问答>

基于DE0的AM调制设计

本设计基于DE0开发板,使用了ADDA扩展板,完成了AM调制电台的设计,发射频率为1MHZ,可用常用AM广播接收。verilog hdl 编程。初来乍到,赚点金币,呵呵~~~ [ 本帖最后由 happysheep224 于 2011-7-14 15:00 编辑 ]…

查看全部问答>