微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 大神,求助呀!帮帮一下啊!

大神,求助呀!帮帮一下啊!

时间:10-02 整理:3721RD 点击:
这是我写的一个有关于EEPROM的一个小程序,用的是24C02。可是问题总是数据存不进去呀!这是肿么回事呢?我刚学习不久,望大神解救!
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define  _Nop()  _nop_()        //定义空指令
bit write=0;
bit ack;
sbit en=P2^6;
sbit rs=P2^4;
sbit s1=P3^0;
sbit s2=P3^1;
sbit s3=P3^2;
sbit SCL=P1^1;
sbit SDA=P1^2;
uchar i,a,second,munite,hour,num;
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);       
}
void Start_I2c()
{
  SDA=1;   //发送起始条件的数据信号
  _Nop();
  SCL=1;
  _Nop();    //起始条件建立时间大于4.7us,延时
  _Nop();
  _Nop();
  _Nop();
  _Nop();   
  SDA=0;     //发送起始信号
  _Nop();    //起始条件锁定时间大于4μ
  _Nop();
  _Nop();
  _Nop();
  _Nop();      
  SCL=0;    //钳住I2C总线,准备发送或接收数据
  _Nop();
  _Nop();
}
void Stop_I2c()
{
  SDA=0;    //发送结束条件的数据信号
  _Nop();   //发送结束条件的时钟信号
  SCL=1;    //结束条件建立时间大于4μ
  _Nop();
  _Nop();
  _Nop();
  _Nop();
  _Nop();
  SDA=1;    //发送I2C总线结束信号
  _Nop();
  _Nop();
  _Nop();
  _Nop();
}
void  SendByte(uchar c)
{
uchar BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++)  //要传送的数据长度为8位
    {
     if((c<<BitCnt)&0x80)SDA=1;   //判断发送位
       else  SDA=0;               
     _Nop();
     SCL=1;               //置时钟线为高,通知被控器开始接收数据位
      _Nop();
      _Nop();             //保证时钟高电平周期大于4μ
      _Nop();
      _Nop();
      _Nop();         
     SCL=0;
    }
    _Nop();
    _Nop();
    SDA=1;               //8位发送完后释放数据线,准备接收应答位
    _Nop();
    _Nop();   
    SCL=1;
    _Nop();
    _Nop();
    _Nop();
    if(SDA==1)ack=0;     
       else ack=1;        //判断是否接收到应答信号
    SCL=0;
    _Nop();
    _Nop();
}
unsigned char  RcvByte()
{
  uchar retc;
  uchar BitCnt;
  retc=0;
  SDA=1;             //置数据线为输入方式
  for(BitCnt=0;BitCnt<8;BitCnt++)
      {
        _Nop();           
        SCL=0;       //置时钟线为低,准备接收数据位
        _Nop();
        _Nop();      //时钟低电平周期大于4.7us
        _Nop();
        _Nop();
        _Nop();
        SCL=1;       //置时钟线为高使数据线上数据有效
        _Nop();
        _Nop();
        retc=retc<<1;
        if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入retc中
        _Nop();
        _Nop();
      }
  SCL=0;   
  _Nop();
  _Nop();
  return(retc);
}
void Ack_I2c(void)
{
  SDA=0;     
  _Nop();
  _Nop();
  _Nop();      
  SCL=1;
  _Nop();
  _Nop();              //时钟低电平周期大于4μ
  _Nop();
  _Nop();
  _Nop();  
  SCL=0;               //清时钟线,钳住I2C总线以便继续接收
  _Nop();
  _Nop();   
}
void NoAck_I2c(void)
{
  SDA=1;
  _Nop();
  _Nop();
  _Nop();      
  SCL=1;
  _Nop();
  _Nop();              //时钟低电平周期大于4μ
  _Nop();
  _Nop();
  _Nop();  
  SCL=0;                //清时钟线,钳住I2C总线以便继续接收
  _Nop();
  _Nop();   
}
bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
{
   uchar i;
   Start_I2c();               //启动总线
   SendByte(sla);             //发送器件地址
     if(ack==0)return(0);
   SendByte(suba);            //发送器件子地址
     if(ack==0)return(0);
   for(i=0;i<no;i++)
    {   
     SendByte(*s);            //发送数据
     if(ack==0)return(0);
     s++;
    }
        Stop_I2c();                  //结束总线
          return(1);
}
bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
{
   uchar i;
   Start_I2c();               //启动总线
   SendByte(sla);             //发送器件地址
     if(ack==0)return(0);
   SendByte(suba);            //发送器件子地址
     if(ack==0)return(0);
   Start_I2c();
   SendByte(sla+1);
      if(ack==0)return(0);
   for(i=0;i<no-1;i++)
    {   
     *s=RcvByte();              //发送数据
      Ack_I2c();                //发送就答位
     s++;
    }
   *s=RcvByte();
    NoAck_I2c();                 //发送非应位
           Stop_I2c();                    //结束总线
          return(1);
}
void write_com(uchar com) //写指令
{
        rs=0;
        en=0;
        P0=com;
        delay(5);
        en=1;
        delay(5);
        en=0;
}
void write_data(uchar date)          //写数据
{
        rs=1;
        en=0;
        P0=date;
        delay(5);
        en=1;
        delay(5);
        en=0;
}
void init()
{
        P0=0;
        P2=0;
        en=0;
        second=0;
        munite=0;
        hour=0;
        a=0;
        write_com(0x38);//显示设置
        write_com(0x0c);//不显示光标,不闪烁
        write_com(0x06);//指针加一
        write_com(0x01);//清屏
        write_com(0x80);//数据指针
        write_com(0xc0+5);
        write_data(':');
        delay(5);
        write_com(0xc0+8);
        write_data(':');
        delay(5);
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;
}
void write_smh(uchar add,uchar date)
{
        uchar shi,ge;
        shi=date/10;
        ge=date%10;
        write_com(0x80+0x40+add);
        write_data(0x30+shi);
        write_data(0x30+ge);
}
void main()
{       
        init();
        IRcvStr(0xae,21,&second,1);
        IRcvStr(0xae,23,&munite,1);
        IRcvStr(0xae,25,&hour,1);
        write_smh(9,second);
        write_smh(6,munite);
        write_smh(3,hour);
        while(1)
        {
                if(a==20)
                {
                        a=0;
                        write=1;
                        second++;
                        if(write==1)
                        {
                                write=0;
                                ISendStr(0xae,21,&second,1);
                        }
                        if(second==60)
                                {
                                        second=0;
                                        munite++;
                                        if(write==1)
                                        {
                                                write=0;
                                                ISendStr(0xae,23,&munite,1);
                                        }
                                        if(munite==60)
                                                 {
                                                        munite=0;
                                                        hour++;
                                                        if(write==1)
                                                        {
                                                                write=0;
                                                                ISendStr(0xae,25,&hour,1);
                                                        }
                                                        if(hour==24)
                                                                {
                                                                hour=0;
                                                                }
                                                        write_smh(3,hour);
                                                }
                                        write_smh(6,munite);
                                }
                        write_smh(9,second);
                }       
        }       
}
void timer0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        a++;               
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top