标题:为什么会重新从00开始?
只看楼主
ljl223559772
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2013-7-20
结帖率:50%
已结贴  问题点数:20 回复次数:2 
为什么会重新从00开始?
利用定时器着重一个0-99秒变化的秒表,并且显示在数码管上,每过一秒将这个变化的数写入板上AT24C02内部.当关闭实验板电源时,单片机先从AT24C02中将原来写入的数读出来,接着此数继续变化并显示在数码管上.

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit sda=P2^0;
sbit scl=P2^1;
bit write=0;                            //写24C02的标志
uchar tcnt,sec;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay()                            //延时4到5微米
{;;}
void delay1ms(uint z)                    //延时毫秒
{
    uint x,y;
    for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}
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<255))i++;
    scl=0;
    delay();
}
void init()
{   
/*    TMOD=0x01;                       //设置定时器0为工作方式为1(M1M0为01)
    TH0=(65536-45872)/256;           //装初值11.0592M晶振定时50ms数为45872
    TL0=(65530-45872)%256;
    EA=1;                           //开总中断
    ET0=1;                           //开定时器中断
    TR0=1;                           //启动定时器     */
    sda=1;
    delay();
    scl=1;
    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();
    }   
}
uchar read_byte()                     //读一个字节
{
    uchar i,k;
    scl=0;
    delay();
    sda=1;
    for(i=0;i<8;i++)
    {
        scl=1;
        delay();
        k=(k<<1)|sda;
        scl=0;
        delay();
    }
    delay();
    return k;
}
/*void respons()                             //应答信号
{
    uchar i=0;
    scl=1;
    delay();
    while((sda==1)&&(i<255))
    i++;
    scl=0;
    delay();
}
void stop()                                   //停止
{
    sda=0;
    delay();
    scl=1;
    delay();
    sda=1;
    delay();
}*/
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 display(uchar bai,uchar shi)   //显示函数
{
    dula=0;
    P0=table[bai];
    dula=1;
    dula=0;
    wela=0;
    P0=0x7e;
    wela=1;
    wela=0;
    delay1ms(5);
    dula=0;
    P0=table[shi];
    dula=1;
    dula=0;
    wela=0;
    P0=0x7d;
    wela=1;
    wela=0;
    delay1ms(5);
}
void main()
{
    init();
    sec=read_add(2);                //读出保存的数据赋予sec
    if(sec>100)                        //防止首次读取出错
        sec=0;
    TMOD=0x01;                       //设置定时器0为工作方式为1(M1M0为01)
    TH0=(65536-45872)/256;           //装初值11.0592M晶振定时50ms数为45872
    TL0=(65530-45872)%256;
    EA=1;                           //开总中断
    ET0=1;                           //开定时器中断
    TR0=1;                           //启动定时器
    while(1)
    {
        display(sec/10,sec%10);
        if(write==1)                 //判断是否1秒了
        {
            write=0;                //清0
            write_add(2,sec);        //在24c02的地址2中写入数据sec
        }
    }
}
void t0() interrupt 1               //定时器中断函数
{
    TH0=(65536-45872)/256;           //重装初值
    TL0=(65530-45872)%256;
    tcnt++;
    if(tcnt==20)
    {
        tcnt=0;                     //重新计算
        sec++;
        write=1;                   //1秒写一次24c02
        if(sec==100)                //100秒后重来
        sec=0;
    }
}
我的这个代码烧录后会有数据,但重开电源后就只会从0重新开始,这是为什么?
求解答
搜索更多相关主题的帖子: include 单片机 定时器 数码管 write 
2013-09-13 20:48
小xiong
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:388
专家分:1722
注 册:2013-2-8
得分:20 
感觉问题出在这个对at2402操作上,估计读写数据不成功
2013-09-14 14:45
powenlei
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-10-22
得分:0 
手头有示波器吗?可以读取波形看看开机的时候读取的数据波形是不是正确。如果没有示波器的话,先屏蔽掉if(sec>100)语句,将读取的数据直接显示出来,看看是不是正确的数字。然后再判断是哪里出了问题。加油
2013-10-22 16:35



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-420545-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.109895 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved