打印

为什么我做的用eeprom来实现检验上电次数实现不了功能

[复制链接]
3920|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
q1074926748|  楼主 | 2012-4-30 22:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我做的这个程序是想实现断电后上电,数码管加一,,利用了eeprom的掉电数据不丢失的性能,利用结构体定义一个标志位,每次上电检测这个标志位,如果和定义的标志位相同,就加一,如果不相同,就把定义的标志位赋给结构体中得那个标志位,然后数码管显示为一。。不胜感激!!!具体程序如下(多文件程序
#include "main.h"
#include "eeprom.h"
void iic_start()
{
  SDA=1;
  _nop_();
  SCL=1;
  nops();
  SDA=0;
  nops();
  SCL=0;
}
void iic_stop()
{
  SDA=0;
  _nop_();
  SCL=0;
  nops();
  SCL=1;
  nops();
  SDA=1;
}
void iic_write_byte(uint8 dat)
{
   uint8 i=0;
   for(i=0;i<8;i++)
   {
      if(dat&0x80==0)
          {
             SDA=0;
          }
          else
          {
             SDA=1;
          }
          SCL=1;
          dat<<=1;
          nops();
          SCL=0;
          
   }
}
uint8 iic_read_byte()
{
    uint8 dat,i=0;
        for(i=0;i<8;i++)
        {
           SCL=1;
           nops();
           dat<<=1;
           if(SDA)
           {
             dat|=0x01;
           }
           SCL=0;
           nops();
        }
        return dat;
}
void iic_ack(bit ck)
{
  if(ck)
  {
     SDA=0;
  }
  else
  {
    SDA=1;
  }
  SCL=1;
  nops();
  SCL=0;
  nops();
}
bit waitack()
{
   SDA=1;
   nops();
   SCL=1;
   if(SDA)
   {
     SCL=0;
         iic_stop();
         return 1;
   }
   else
   {
     SCL=0;
         return 0;

   }
}
bit iic_write(uint8 addr,uint8 dat)
{
  iic_start();
  iic_write_byte(0xa0);
  if(waitack()==1)
  {
    return 1;
  }
    iic_write_byte(addr);
  if(waitack()==1)
  {
    return 1;
  }
    iic_write_byte(dat);
  if(waitack()==1)
  {
    return 1;
  }
  iic_stop();
  return 0;
}
bit iic_read(uint8 addr,uint8*dat)
{
  iic_start();
  iic_write_byte(0xa0);
  if(waitack()==1)
  {
    return 1;
  }
  iic_write_byte(addr);
  if(waitack()==1)
  {
    return 1;
  }
  iic_start();
  iic_write_byte(0xa1);
  if(waitack()==1)
  {
    return 1;
  }
  *dat=iic_read_byte();
  iic_ack(0);
  iic_stop();
  return 0;
}
bit iic_write_buf(uint8 *buf,uint8 addr,uint8 len)
{
  while(len--)
  {
     if(iic_write(addr++,*buf++))
         {
           return 1;
         }
  }
  return 0;
}
bit iic_read_buf(uint8 *buf,uint8 addr,uint8 len)
{
  while(len--)
  {
     if(iic_read(addr++,buf++))
         {
           return 1;
         }
  }
return 0;
}//这是eeprom.c

#include "main.h"
#include "eeprom.h"
code uint8 a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
code uint8 b[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uint8 c[10];
uint8 i=0;
POWER_UP Power_up;
void delay(uint8 n)
{
  while(n--);
}

void main()
{
          while(1)
    {
    iic_read_buf((uint8*)&Power_up,0x00,sizeof(POWER_UP));
        if(Power_up.flag!=P0WER_UP_MARK)
        {
           Power_up.flag=P0WER_UP_MARK;
           Power_up.times=1;
        }
        else
        {
           Power_up.times++;
        }
        iic_write_buf((uint8*)&Power_up,0x00,sizeof(POWER_UP));
        c[0]=a[Power_up.times%10];
        c[1]=a[Power_up.times/10%10];
        c[2]=a[Power_up.times/100%10];
        c[3]=a[Power_up.times/1000%10];
        c[4]=a[Power_up.times/10000%10];
        c[5]=a[Power_up.times/100000%10];
        c[6]=a[Power_up.times/1000000%10];
        c[7]=a[Power_up.times/10000000%10];
        for(i=0;i<8;i++)
        {
          P0=c[i];
          P1=b[i];
          delay(150);
        }
        }
}//这是main.c
#ifndef _MAIN_H_
#define _MAIN_H_
#include <reg51.h>
#include <intrins.h>
typedef unsigned char uint8;
typedef unsigned int  uint16;
typedef unsigned long uint32;
sbit SDA=P2^1;
sbit SCL=P2^0;
typedef struct{
uint32 times;
uint8   flag;
}POWER_UP;
#define P0WER_UP_MARK 0xAB
#endif//这是main.h
#ifndef _EEPROM_H_
#define _EEPROM_H_
#define nops() do{_nop_();_nop_();_nop_();_nop_();}while(0)
bit iic_write_buf(uint8*buf,uint8 addr,uint8 len);
bit iic_read_buf(uint8*buf,uint8 addr,uint8 len);
#endif//这是eeprom.h

相关帖子

沙发
q1074926748|  楼主 | 2012-4-30 22:11 | 只看该作者
说明一下了,我的是用共阴数码管,P0是段选,P1负责8个数码管的亮灭,SDA是P2^1,SCL是P2^0;

使用特权

评论回复
板凳
ningling_21| | 2012-5-1 09:01 | 只看该作者
IIC的读写函数都验证过吗?

使用特权

评论回复
地板
q1074926748|  楼主 | 2012-5-1 09:01 | 只看该作者
自己顶一下

使用特权

评论回复
5
q1074926748|  楼主 | 2012-5-1 09:25 | 只看该作者
3# ningling_21 是的,,我这个程序是根据别人已经做好的程序修改的,我只是修改了一下main.c函数,其他的都没变,,由于别人的板子和我的不一样,不一样的地方只是在于数码管,所以我把数码管的部分修改了一下,还有SDA, SCL,,也是看到电路图引脚定义的,,,我感觉应该是写入eeprom有问题了,可是检查了好几遍,还是没发现问题在哪,,昨晚曾怀疑过是不是24c02坏了,不过运行了一下我买的板子的例程,能正常工作,所以程序出问题了,多谢您了

使用特权

评论回复
6
NE5532| | 2012-5-1 10:26 | 只看该作者
楼主的关键是如何尽快得知“掉电”,并且赶在电源电压下降之前把E2给写好,软件是浮云,硬件才是关键,这个东西不是软件对了就能做的。

使用特权

评论回复
7
q1074926748|  楼主 | 2012-5-1 10:46 | 只看该作者
6# NE5532 “如何尽快得知“掉电”,并且赶在电源电压下降之前把E2给写好”,这句话我倒是原来并没有注意到。那到底怎么避免这个问题呢,24c02不都是相同的吗?只要把SDA,SCL定义对了不就行了吗?和硬件有哪方面的联系?多谢了!希望能有进一步解释

使用特权

评论回复
8
autopccopy| | 2012-5-1 11:46 | 只看该作者
直接每次开机EEPROM的数值加一不行吗?不少开发板的标准例程都有。

使用特权

评论回复
9
NE5532| | 2012-5-1 14:02 | 只看该作者
任何芯片都要有电源才能工作吧,掉电和上电期间电源电压不稳定,E2读写都容易出错。8楼上电写的思路倒是很好,楼主可以参考。
再告诉楼主,不要以为软件对了就OK了,硬件才是天。

使用特权

评论回复
10
hzci12lc| | 2012-5-1 18:45 | 只看该作者
顶8楼,简单实用!

使用特权

评论回复
11
q1074926748|  楼主 | 2012-5-1 19:18 | 只看该作者
8# autopccopy 我的这个程序就是开机的时候实现加一,,但是不知道怎么回事每次开机都是从零开始了,这个我的板子里面例程没有,是根据别的开发板的程序写的,那我再看看Iic读写--

使用特权

评论回复
12
q1074926748|  楼主 | 2012-5-1 19:19 | 只看该作者
9# NE5532 恩,,我做程序那个思路我8楼的一样,我再看看代码,,实在不行我就换个板子试一试看行不行

使用特权

评论回复
13
q1074926748|  楼主 | 2012-5-1 19:23 | 只看该作者
9# NE5532 恩,硬件才是天,,看来我再单片机学习的路上过于偏“软“以为只要能看得懂单片机电路图就行了,会看着电路图定义一些管教就行了,以后多注意硬件!!!

使用特权

评论回复
14
q1074926748|  楼主 | 2012-5-1 22:14 | 只看该作者
13# q1074926748 那如果是硬件的问题,怎么解决呢,难道在实际工作中碰到这样的问题,就放弃了吗。或者换板子,那不是很浪费,我现在还是一个学生,求教!!

使用特权

评论回复
15
NE5532| | 2012-5-2 08:04 | 只看该作者
13# q1074926748 那如果是硬件的问题,怎么解决呢,难道在实际工作中碰到这样的问题,就放弃了吗。或者换板子,那不是很浪费,我现在还是一个学生,求教!! ...
q1074926748 发表于 2012-5-1 22:14


硬件和软件都是根据需求来进行设计的,你的认识反了。你现在是“因为是学生”,所以“将就”手里有的东西做着玩,跟搞设计是两码事。

使用特权

评论回复
16
q1074926748|  楼主 | 2012-5-2 17:44 | 只看该作者
仍然希望这方面问题的大侠发言。顶起来

使用特权

评论回复
17
234641497| | 2012-5-4 13:39 | 只看该作者
开机加延时没有?开机延时,读一下,再加一保存,然后结束,应该就可以了,开机要加延时,1ms

使用特权

评论回复
18
234641497| | 2012-5-4 13:39 | 只看该作者
开机加延时没有?开机延时,读一下,再加一保存,然后结束,应该就可以了,开机要加延时,1ms

使用特权

评论回复
19
q1074926748|  楼主 | 2012-5-4 22:59 | 只看该作者
18# 234641497 开机加延时?为啥????是为了等待电源稳定吗?还是等待什么???

使用特权

评论回复
20
cjseng| | 2012-5-5 23:53 | 只看该作者
我觉得楼主缺乏查找问题的经验。
就你这个例子来说:IIC的读写函数验证了吗?数码管显示验证了吗?就算IIC读写函数没问题,数据在送到显示之前会不会中间被改变了呢?另外,编程思路是否正确呢?为什么要判断标志位呢?上电一次就加一不就完事了?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:郭强

0

主题

58

帖子

1

粉丝