历史上的今天
返回首页

历史上的今天

今天是:2025年03月31日(星期一)

正在发生

2018年03月31日 | 基于I2C协议的单片机记录单片机开机次数

2018-03-31 来源:eefocus

  在之前我讲过I2C协议,也给出了简单例子,这次利用I2C协议,我们可以做一个小实验,让单片机记录单片机开机次数,也就是机器使用次数。

  // 内容:每次开机都将次数加1 并存储到EEPROM。这样就能直观的看到机器的使用 //

  // 次数用P1口 LED做为显示,次数大于256是将溢出,按复位模拟开机 //

  // 或者直接通过开关开机 //


  #include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

  #include //包含NOP空指令函数_nop_();

  #define AddWr 0xae //写数据地址,需要参考24c02芯片文档

  #define AddRd 0xaf //读数据地址

  sbit Sda=P1^2; //定义总线连接端口

  sbit Scl=P1^1;

  sbit WP=P1^0; //写保护,这里不使用

  /*------------------------------------------------

  延时程序

  ------------------------------------------------*/

  void mDelay(unsigned char j)

  {

  unsigned int i;

  for(;j>0;j--)

  {

  for(i=0;i<125;i++)

  {;}

  }

  }

  /*------------------------------------------------

  启动IIC总线

  ------------------------------------------------*/

  void Start(void)

  {

  Sda=1;

  _nop_();_nop_();

  Scl=1;

  _nop_();_nop_();_nop_();_nop_();_nop_();

  Sda=0;

  _nop_();_nop_();_nop_();_nop_();_nop_();

  Scl=0;

  }

  /*------------------------------------------------

  停止IIC总线

  ------------------------------------------------*/

  void Stop(void)

  {

  Sda=0;

  _nop_();

  Scl=1;

  _nop_();_nop_();_nop_();_nop_();_nop_();

  Sda=1;

  _nop_();_nop_();_nop_();_nop_();_nop_();

  Scl=0;

  }

  /*------------------------------------------------

  应答IIC总线

  ------------------------------------------------*/

  void Ack(void)

  {

  Sda=0;

  _nop_();_nop_();_nop_();

  Scl=1;

  _nop_();_nop_();_nop_();_nop_();_nop_();

  Scl=0;

  _nop_();_nop_();

  }

  /*------------------------------------------------

  非应答IIC总线

  ------------------------------------------------*/

  void NoAck(void)

  {

  Sda=1;

  _nop_();_nop_();_nop_();

  Scl=1;

  _nop_();_nop_();_nop_();_nop_();_nop_();

  Scl=0;

  _nop_();_nop_();

  }

  /*------------------------------------------------

  发送一个字节

  ------------------------------------------------*/

  void Send(unsigned char Data)

  {

  unsigned char BitCounter=8;

  unsigned char temp;

  do

  {

  temp=Data;

  Scl=0;

  _nop_();_nop_();_nop_();_nop_();_nop_();

  if((temp&0x80)==0x80)

  Sda=1;

  else

  Sda=0;

  Scl=1;

  temp=Data<<1;

  Data=temp;

  BitCounter--;

  }

  while(BitCounter);

  Scl=0;

  }

  /*------------------------------------------------

  读入一个字节并返回

  ------------------------------------------------*/

  unsigned char Read(void)

  {

  unsigned char temp=0;

  unsigned char temp1=0;

  unsigned char BitCounter=8;

  Sda=1;

  do

  {

  Scl=0;

  _nop_();_nop_();_nop_();_nop_();_nop_();

  Scl=1;

  _nop_();_nop_();_nop_();_nop_();_nop_();

  if(Sda)

  temp=temp|0x01;

  else

  temp=temp&0xfe;

  if(BitCounter-1)

  {

  temp1=temp<<1;

  temp=temp1;

  }

  BitCounter--;

  }

  while(BitCounter);

  return(temp);

  }

  /*------------------------------------------------

  写入数据

  ------------------------------------------------*/

  void WrToROM(unsigned char Data[],unsigned char Address,unsigned char Num)

  {

  unsigned char i;

  unsigned char *PData;

  PData=Data;

  for(i=0;i

  {

  Start();

  Send(AddWr); //写入芯片地址

  Ack();

  Send(Address+i);//写入存储地址

  Ack();

  Send(*(PData+i));//写数据

  Ack();

  Stop();

  mDelay(20);

  }

  }

  /*------------------------------------------------

  读出数据

  ------------------------------------------------*/

  void RdFromROM(unsigned char Data[],unsigned char Address,unsigned char Num)

  {

  unsigned char i;

  unsigned char *PData;

  PData=Data;

  for(i=0;i

  {

  Start(); //写入芯片地址

  Send(AddWr);

  Ack();

  Send(Address+i);//写入存储地址

  Ack();

  Start();

  Send(AddRd); //读入地址

  Ack();

  *(PData+i)=Read();//读数据

  Scl=0;

  NoAck();

  Stop();

  }

  }

  //以上程序是EEPROM24C02程序部分,IIC协议Scl=0;

  /*------------------------------------------------

  主程序


   ------------------------------------------------*/

    //下载程序后,记录下LED2~LED9的状态,然后按下复位键(相当于开机),观察LED2~LED9的状态改变

    void main()

 

    {

    unsigned char Number[1];

    unsigned char i;

    WP=0;//写保护关掉

    RdFromROM(Number,0,1);//调用存储数据 从地址0开始写一个数据

    Number[0]++;

    WrToROM(Number,0,1);//写入24c02

    P1 = ~ Number[0];//在P1口上显示 反向显示 LED亮代表1

    while(1)

    {

    }

    }

    //用户可以自己把程序移植到数码管显示或者液晶显示 ,可以直观的看到数字 ,也可以定义int类型 用于计数万次以上


推荐阅读

史海拾趣

DENWIRE公司的发展小趣事

以下是关于DENWIRE公司在电子行业中发展起来的五个相关故事,每个故事都遵循了字数和事实性的要求。

故事一:
DENWIRE公司起初只是一家小型的电线制造商,专注于生产低端音频线缆。然而,随着科技的进步和消费者对于音频质量的追求,公司创始人李先生看到了高品质音频线缆市场的潜力。他带领团队投入大量研发资源,成功开发出了一款具有极低信号损失和出色耐用性的音频线缆,赢得了市场的广泛认可。这款产品不仅让DENWIRE在音频线缆领域崭露头角,也为公司后续的发展奠定了坚实的基础。

故事二:
随着公司规模的扩大,DENWIRE逐渐涉足到了数据传输线缆的生产。在面对激烈市场竞争时,公司坚持创新驱动,注重产品质量。在一次与知名科技公司的合作中,DENWIRE凭借其出色的产品性能和可靠的品质,成功赢得了对方的信任,并签订了长期供货合同。这次合作不仅为DENWIRE带来了可观的收益,也进一步提升了公司在行业内的知名度。

故事三:
在新能源汽车行业蓬勃发展的背景下,DENWIRE敏锐地捕捉到了这一领域的商机。公司迅速调整战略方向,加大了对新能源汽车用线缆的研发和生产投入。经过多次试验和改进,DENWIRE成功开发出了一款符合新能源汽车高标准要求的线缆产品,并在市场上取得了良好的销售业绩。这一成就不仅彰显了DENWIRE的技术实力,也为公司未来的发展开辟了新的道路。

故事四:
面对全球化市场的挑战,DENWIRE积极寻求国际合作与拓展。公司先后与多个国家和地区的知名企业建立了战略合作关系,共同开发新产品、拓展新市场。通过国际合作,DENWIRE不仅学习到了先进的生产技术和管理经验,也进一步提升了自身的品牌影响力和市场竞争力。

故事五:
在环保和可持续发展成为全球共识的背景下,DENWIRE积极响应号召,致力于推动绿色生产和可持续发展。公司投入大量资金引进环保设备和工艺,优化生产流程,减少能源消耗和废弃物排放。同时,DENWIRE还积极参与社会公益活动,回馈社会。这些举措不仅提升了公司的社会形象,也为公司的长期发展注入了新的活力。

ABB Group公司的发展小趣事

ABB Group是一家全球性的工程技术公司,提供电力和自动化技术解决方案。以下是该公司发展的五个相关故事:

  1. 公司成立和早期发展: ABB Group的前身可以追溯到1883年,当时由瑞士的Brown, Boveri & Cie (BBC)和瑞典的ASEA公司合并成立。这个合并创造了一个跨国电气工程公司,专注于发电机、电气传动和电力系统的设计和制造。该公司成立后迅速扩展了国际业务,并在世界各地建立了分支机构和生产基地。

  2. 技术创新和产品多样化: ABB Group一直致力于技术创新,并不断推出新产品和解决方案,以满足客户的需求。公司在电力输送、工业自动化、机器人技术等领域拥有丰富的经验和专业知识,为各种行业提供了全面的电力和自动化解决方案。

  3. 国际化战略和全球扩张: ABB Group通过收购、合并和战略合作,加速了在全球范围内的扩张。公司在100多个国家设有分支机构和办事处,形成了覆盖全球的销售和服务网络。这种国际化战略使ABB能够更好地满足不同国家和地区客户的需求。

  4. 可持续发展和环保责任: ABB Group致力于推动可持续发展和环保责任,在产品设计、生产和运营过程中注重减少能源消耗和减排。公司积极推动清洁能源和智能电网的发展,为全球的环境保护和可持续发展做出贡献。

  5. 未来展望和发展方向: ABB Group将继续致力于技术创新和市场拓展,加强在电力和自动化领域的领先地位。公司将加大在数字化技术和人工智能领域的投入,推动工业智能化和数字化转型,为客户提供更智能、更高效的解决方案。

ET Enterprises Ltd公司的发展小趣事

进入1940年代后期,ET Enterprises Ltd公司将业务重心转向光电倍增管的开发和制造。通过不断的技术创新和市场拓展,公司逐渐在光电倍增管领域建立起领先地位,成为国际知名的光电倍增管供应商。

Electech Electronics公司的发展小趣事

随着科技的不断发展,Electech Electronics意识到仅仅依赖电子元器件的代理和销售已经无法满足市场的需求。于是,公司开始投入研发,专注于电子产品的设计和制造。经过数年的努力,Electech Electronics成功开发出一系列具有竞争力的电子产品,如智能控制模块、高精度传感器等。这些产品的推出不仅拓宽了公司的产品线,也提升了公司的市场竞争力。

HiRel Connectors Inc公司的发展小趣事
每个摄像头单独使用电源适配器供电,适用于小规模或分散安装的摄像头系统。
Altonics公司的发展小趣事

随着技术的不断进步,Altonics公司始终保持着对创新的热情。公司加大研发投入,引进高端技术人才,不断推出具有创新性和竞争力的新产品。其中,公司自主研发的一款智能传感器,凭借其高精度、高稳定性的特点,迅速占领市场份额,成为工业自动化领域的明星产品。

问答坊 | AI 解惑

TSC 7107cpl

各位 高手,在下 寻找有关TSC 7107cpl  /  8729BK   资料。用于连接着3位显示数码管的驱动 找到了 英文资料。。。 http://www.alldatasheet.com/view.jsp?Searchword=7107CPL http://www.alldatasheet.com/datash ...…

查看全部问答>

车载用加速度传感器市场分析

矢野经济研究所预测2008年度消费类加速度传感器市场将比上年增长30.8%,达到2亿7450万个。车载用加速度传感器将比上年增长12.2%,达到 2亿8230万个。这样,消费类加速度传感器和车载用加速度传感器的个数将接近同等规模。另一方面,预计角速度传感 ...…

查看全部问答>

12864菜单

12864菜单12864菜单12864菜单12864菜单12864菜单12864菜单…

查看全部问答>

4路组相联cache中4路是指什么?组数or每组的块数?

4路组相联cache中4路是指什么?组数or每组的块数?…

查看全部问答>

泰为公司(www.telenav.com)招聘iPhone程序员 急聘

Please send your resume to lma@telenav.cn for internal referral. ----------------- We are recruiting C++ SE for iPhone team in urgent. If you have any referral, please forward the resume to me. Many thanks! Here is the adv ...…

查看全部问答>

请教VS2005下PB定制系统的问题.

> 小弟刚接触Wince,装好了VS2005及其SP1,装好了Wince6.0,在VS2005中也出现了PB的插件. 照着网上的一些例子定制后,编译后提示如下: PB Debugger The Kernel Debugger is waiting to connect with target. 点击Targe-Attach Device后出现: ca ...…

查看全部问答>

向各位高手请教一个关于MSP430烧写程序的问题

我是第一次使用MSP430这个MCU,在烧写程序方面发现有两种烧写器。一种是一端接JATG口,另一端接在PC机上的并口,这种好像很便宜。另外一种是通过一个仿真盒接在PC的USB口,这种好像贵些。 请问我只是想往MSP430里烧写代码,用第一种可以吗,第二种 ...…

查看全部问答>

MSP430G2553 #define OUTMOD

#define OUTMOD_0            (0*0x20u)  /* PWM output mode: 0 - output only */ #define OUTMOD_1            (1*0x20u)  /* PWM outpu ...…

查看全部问答>