4999|12

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

at2402程序的问题, [复制链接]

最近在学习《郭天祥老师10天学会51单片机和C语言》视频第9课最后留个课后作业:让两位数码管自动增长,当断电时自动存入AT24C02A,上电时还能自动在数码管上显示断电前的数字,并继续自动增长。以下是我写的程序,当上电时先显示“00”后在继续增长,不知为何,还请高手指教。[br]

#include  //52单片机头文件
#include
#define uint unsigned int    //宏定义
#define uchar unsigned char //宏定义
sbit sda=P3^7;
sbit scl=P3^6;
uchar numwe,ge,shi,temp,temp1,aa,t1,a;
uchar code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x98,0x88,0x80,
0xc6,0xc0,0x86,0x8e};  //0,1,2,3,4,5,6,7,8,9,a,b,c,e,f

uchar code tablewe[]={
0xfe,0xfd,0xfb,0xf7};

void delay()
{ ;; }
void start()  //开始信号
{       
        sda=1;
        delay();
        scl=1;
        delay();
        sda=0;
        delay();
}

void stop()   //停止
{
        sda=0;
        delay();
        scl=1;
        delay();
        sda=1;
        delay();
}

void respons()  //应答
{
        uchar i;
        scl=1;
        delay();
        while((sda==1)&&(i<250))i++;
        scl=0;
        delay();
}



void write_byte(uchar date)
{
        uchar i,temp1;
        temp1=date;


        for(i=0;i<8;i++)
        {
                temp1=temp1<<1;
                scl=0;
            delay();
                sda=CY;
                delay();
                scl=1;
                delay();
        //        scl=0;
     //   delay();
        }
        scl=0;
        delay();
        sda=1;
        delay();
}

uchar read_byte()
{
        uchar i,k;
        scl=0;
        delay();
        sda=1;
        delay();
        for(i=0;i<8;i++)
        {
                scl=1;
                delay();       
                k=(k<<1)|sda;
                scl=0;
                delay();       
        }
        return k;
}

void write_add(uchar address,uchar date)
{
        start();
        write_byte(0xa0);
        respons();
        write_byte(address);
        respons();
        write_byte(date);
        respons();
        stop();
}

uchar read_add(uchar address)
{
        uchar date;
        start();
        write_byte(0xa0);
        respons();
        write_byte(address);
        respons();
        start();
        write_byte(0xa1);
        respons();
        date=read_byte();
        stop();
        return date;
}
void delay1(uint z)     //延时子函数
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void display(uchar ge,uchar shi)
{
        if(numwe==2)
                        numwe=0;                       
                        P2=tablewe[numwe];                                               
                        P0=table[shi];
                        numwe++;
                        delay1(5);
                        P2=tablewe[numwe];                                               
                        P0=table[ge];
                        numwe++;
                        delay1(5);       
}
void init()
{
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;       
        sda=1;
        delay();
        scl=1;
        delay();
        temp=read_add(23);
       
       

}
void timer0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        aa++;       
}

void main()                    //主函数
{       
        init();//初始化子程序
        while(1)
        {       
        if(aa==20)
                  {
                        aa=0;
                       
                        temp++;
                        write_add(23,temp);
                        delay1(100);
                        if(temp==99)
                           {
                                        temp=0;
                           }
                        shi=temp%100/10;
                        ge=temp%10;
                  }
                display(ge,shi);
        }
}
[br]
连接图[br]
[br]

最新回复

我把正确答案给大家共享一下,谢谢huxinhui的指教。 #include #define uchar unsigned char char shu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; char wei[4]={0xfe,0xfd,0xfb,0xf7}; char dis[4]={0x00,0x00,0x00,0x00}; char timedata[2]={0x00,0x00}; sbit sda=P3^7; sbit scl=P3^6; char ms50=0x00; void delay1ms(int t) {   int i,j;   for(i=0;i  详情 回复 发表于 2010-4-25 14:43
点赞 关注

回复
举报

63

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
自己先顶一下
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
中断服务程序中得把当时的时间值放在EEPROM,然后再主函数的初始化程序上读EEPROM放时间的地址用显示代码刷一遍时间!
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 2 楼 huxinhui 的回复:
中断服务程序中得把当时的时间值放在EEPROM,然后再主函数的初始化程序上读EEPROM放时间的地址用显示代码刷一遍时间!


看着有点复杂,能提供点代码,看看吗
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

5
 
留个邮箱
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

6
 
好,hanyouxi3@163.com
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

7
 
都没有人会吗??
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

8
 

EmF63D2as



NMYSvUIv7
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(初级)

9
 
实在不想动手, 帮你顶吧
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

10
 
收到你的邮件了,不知道怎么给你分
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

11
 
呵呵,点“结贴”……建议一下LZ(52内置了EEPROM,可以设置寄存器来使用它)不需要买个外围芯片,比较经济,学得也多
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

12
 
求24C02页写和连续读的函数
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

13
 
我把正确答案给大家共享一下,谢谢huxinhui的指教。
#include
#define uchar unsigned char
char shu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
char wei[4]={0xfe,0xfd,0xfb,0xf7};
char dis[4]={0x00,0x00,0x00,0x00};
char timedata[2]={0x00,0x00};
sbit sda=P3^7;
sbit scl=P3^6;
char ms50=0x00;
void delay1ms(int t)
{
  int i,j;
  for(i=0;i   for(j=0;j<100;j++);
}
scan()
{
  char k;
          dis[1]=timedata[0]%10;
        dis[0]=timedata[0]/10;
//          dis[2]=timedata[1]%10;
//        dis[3]=timedata[1]/10;
  for(k=0;k<2;k++)
  {
    P0=shu[dis[k]];
        P2=wei[k];
        delay1ms(1);
//        P2=0xfd;
  }
}
void delay()
{ ;; }
void start()
{       
  sda=1;
  delay();
  scl=1;
  delay();
  sda=0;
  delay();
}

void stop()
{
  sda=0;
  delay();
  scl=1;
  delay();
  sda=1;
  delay();
}

void respons()
{
  uchar i;
  scl=1;
  delay();
  while((sda==1)&&(i<250))i++;
  scl=0;
  delay();
}
void write_byte(uchar date)
{
  uchar i,temp;
  temp=date;
  for(i=0;i<8;i++)
  {
    temp=temp<<1;
        scl=0;
        delay();
    sda=CY;
        delay();
        scl=1;
        delay();
  }
        scl=0;
        delay();
        sda=1;
        delay();
}

uchar read_byte()
{
        uchar i,k;
        scl=0;
        delay();
        sda=1;
        delay();
        for(i=0;i<8;i++)
        {
          scl=1;
          delay();       
          k=(k<<1)|sda;
          scl=0;
          delay();       
        }
        return k;
}

void delay1(uchar x)
{
   uchar a,b;
   for(a=x;a>0;a--)
   for(b=100;b>0;b--);
}

void write_add(uchar address,uchar date)
{
  start();
  write_byte(0xa0);
  respons();
  write_byte(address);
  respons();
  write_byte(date);
  respons();
  stop();
}

uchar read_add(uchar address)
{
  uchar date;
  start();
  write_byte(0xa0);
  respons();
  write_byte(address);
  respons();
  start();
  write_byte(0xa1);
  respons();
  date=read_byte();
  stop();
  return date;
}
uchar shuju()
{
   uchar Time;
   Time=timedata[0]+timedata[1]*100;
   return Time;
}
void time(void) interrupt 1
{

   ET0=0;TR0=0;TH0=0x3c;TL0=0xb0;TR0=1;ms50++;
   if(ms50==20)   
   {
         ms50=0x00;timedata[0]++;
     if(timedata[0]==100)
     {
           timedata[0]=0;timedata[1]++;
       if(timedata[1]==100)
       {
             timedata[1]=0;
       }
     }
         write_add(12,shuju());
   }
   ET0=1;
}

void init()
{
  uchar x;
  sda=1;
  delay();
  scl=1;
  delay();
  x=read_add(12);
  timedata[0]=x%100;
  timedata[1]=x/100;
  scan();
  delay1(1);
}
main()
{
        init();
        shuju();
        TMOD=0x01;
        TH0=0x3c;
        TL0=0xb0;
        TR0=1;
        ET0=1;
        EA=1;
   while(1)
        {scan();}
}


 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表