打印

请高手帮看一下DS1302+1602的程序,读出显示的数据不正确

[复制链接]
3275|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xuehengs|  楼主 | 2011-11-24 12:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit dula=P2^6;
sbit wela=P2^7;
uchar num;
sbit sck=P2^2;
sbit sda=P2^0;
sbit rst=P2^1;
unsigned char timedata[7]={0,0,0,0x23,0x11,0x03,0x11};
code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
code unsigned char table[]={'0','1','2','3','4','5','6','7','8','9'};
void write_ds1302_byte(unsigned char temp)
{
unsigned char i;
for(i=0;i<8;i++)
  {
   
   sda=temp&0x01;
   sck=1;sck=0;
   temp>>=1;
  }
}
void write_ds1302(unsigned char address,unsigned char dat)
{
rst=0;
_nop_();
sck=0;_nop_();
rst=1;_nop_();
write_ds1302_byte(address);
write_ds1302_byte(dat);
sck=1;
rst=0;
}
unsigned char read_ds1302(unsigned char address)
{
  unsigned char i,temp=0x00;
  rst=0;_nop_();
  sck=0;_nop_();
  rst=1;_nop_();
  write_ds1302_byte(address);
  for(i=0;i<8;i++)
   {
    if(sda)
     temp|=0x80;
    sck=0;
    temp>>=1;
    sck=1;
   }
  rst=0;_nop_();
  rst=0;sck=0;_nop_();
  sck=1;_nop_();sda=0;
  _nop_();sda=1;_nop_();
  return (temp);  
}

void set_rtc(void)
{
unsigned char i;
write_ds1302(0x8e,0x00);

for(i=0;i<7;i++)
  {
   write_ds1302(write_rtc_address[i],timedata[i]);
  
  }
write_ds1302(0x8e,0x80);
}

void read_rtc(void)
{
unsigned char i;
for(i=0;i<7;i++)
  {
   timedata[i]=read_ds1302(read_rtc_address[i]);
    }
}

void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
dula=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}

void display(void)
{
write_com(0x80+0x01);
write_data('2');
write_data('0');
write_data(table[(timedata[3]>>4)&&0x0f]);
write_data(table[timedata[3]&&0x0f]);
write_data('-');
write_data(table[(timedata[4]>>4)&&0x0f]);
write_data(table[timedata[4]&&0x0f]);
write_data('-');
write_data(table[(timedata[3]>>4)&&0x0f]);
write_data(table[timedata[3]&&0x0f]);

write_data(table[(timedata[5]>>4)&&0x0f]);
write_data(table[timedata[5]&&0x0f]);
write_com(0x80+0x40);
write_data(table[(timedata[2]>>4)&&0x0f]);
write_data(table[timedata[2]&&0x0f]);
write_data(':');
write_data(table[(timedata[1]>>4)&&0x0f]);
write_data(table[timedata[1]&&0x0f]);
write_data(':');
write_data(table[(timedata[0]>>4)&&0x0f]);
   write_data(table[timedata[0]&&0x0f]);
}
main()
{
init();
set_rtc();
while(1)
{
  read_rtc();
  display();
  delay(500);
  
}
}

相关帖子

沙发
mugenwon| | 2011-11-24 13:18 | 只看该作者
除了自己写的,超过20行的程序不看。
自己要善用debug的方法。

使用特权

评论回复
板凳
consif| | 2011-11-24 13:47 | 只看该作者
一个注释都没有,谁会看

使用特权

评论回复
地板
xuehengs|  楼主 | 2011-11-24 20:06 | 只看该作者
注释加上了,请高行帮解决下
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit lcden=P3^4;          //1602使能端
sbit lcdrs=P3^5;                //1602读写控制端
sbit dula=P2^6;                        //开发板上的数码管段选,这里只是为了关闭数码管,下面的位选也一样,
sbit wela=P2^7;
uchar num;

sbit sck=P2^2;                        //1302时钟控制端
sbit sda=P2^0;                        //1302数据输入端
sbit rst=P2^1;                        //1302复位

unsigned char timedata[7]={0,0,0,0x23,0x11,0x03,0x11};   //秒分时日月周年  11-11-23 00:00:00
code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};        //秒分时日月周年的 写  操作地址
code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};        //秒分时日月周年的 读  操作地址
code unsigned char table[]={'0','1','2','3','4','5','6','7','8','9'};                //1602显示码0~9

void write_ds1302_byte(unsigned char temp)    //写一个字节
{
        unsigned char i;
        for(i=0;i<8;i++)                        //循环8次写入数据
                {
                       
                        sda=temp&0x01;                //每次传送低字节
                        sck=1;sck=0;
                        temp>>=1;                //右移一位
                }
}

void write_ds1302(unsigned char address,unsigned char dat)        //向1302写地址和数据
{
        rst=0;
        _nop_();
        sck=0;_nop_();
        rst=1;_nop_();                        //启动
        write_ds1302_byte(address);                                //发送地址
        write_ds1302_byte(dat);                                        //发送数据
        sck=1;
        rst=0;                        //恢复
}

unsigned char read_ds1302(unsigned char address)                //读数据
{
                unsigned char i,temp=0x00;
                rst=0;_nop_();
                sck=0;_nop_();
                rst=1;_nop_();
                write_ds1302_byte(address);
                for(i=0;i<8;i++)                        //循环8次 读取数据
                        {
                                if(sda)
                                        temp|=0x80;                //每次传送低字节
                                sck=0;
                                temp>>=1;                        //右移一位
                                sck=1;
                        }
                rst=0;_nop_();                        //以下为DSc1302复位的稳定时间
                rst=0;sck=0;_nop_();
                sck=1;_nop_();sda=0;
                _nop_();sda=1;_nop_();
                return (temp);                        //返回读取的值
}


void set_rtc(void)                                //设定日历
{
        unsigned char i;
        write_ds1302(0x8e,0x00);                //去除写保护
       
        for(i=0;i<7;i++)                        //分7次 写入 秒分时日月周年
                {
                        write_ds1302(write_rtc_address[i],timedata[i]);
               
                }
        write_ds1302(0x8e,0x80);                //写保护
}


void read_rtc(void)
{
        unsigned char i;

        for(i=0;i<7;i++)                        //分7次 读取 秒分时日月周年
                {
                        timedata[i]=read_ds1302(read_rtc_address[i]);
                                }
}


void delay(uint z)        //时延(ms)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}

void write_com(uchar com)                //1602写命令
{
        lcdrs=0;
        P0=com;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}

void write_data(uchar date)                //1602写数据
{
        lcdrs=1;
        P0=date;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
void init()                        //1602初始化
{
        dula=0;
        wela=0;
        lcden=0;
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);       

}


void display(void)                //1602显示时钟
{
        write_com(0x80+0x01);               
        write_data('2');
        write_data('0');
        write_data(table[(timedata[3]>>4)&&0x0f]);                //显示年
        write_data(table[timedata[3]&&0x0f]);
        write_data('-');

        write_data(table[(timedata[4]>>4)&&0x0f]);                //显示月
        write_data(table[timedata[4]&&0x0f]);
        write_data('-');

        write_data(table[(timedata[3]>>4)&&0x0f]);                //显示日
        write_data(table[timedata[3]&&0x0f]);
       

        write_data(table[(timedata[5]>>4)&&0x0f]);                //显示星期
        write_data(table[timedata[5]&&0x0f]);

        write_com(0x80+0x40);

        write_data(table[(timedata[2]>>4)&&0x0f]);                //显示时
        write_data(table[timedata[2]&&0x0f]);
        write_data(':');

        write_data(table[(timedata[1]>>4)&&0x0f]);                //显示分
        write_data(table[timedata[1]&&0x0f]);
        write_data(':');

        write_data(table[(timedata[0]>>4)&&0x0f]);                //显示秒
        write_data(table[timedata[0]&&0x0f]);
}

main()
{
        init();                                //1602初始化
        set_rtc();                        //设定时钟
        while(1)
        {
                read_rtc();                //读取时钟
                display();                //显示时钟
                delay(500);
               
        }
}

使用特权

评论回复
5
sjc_sugar| | 2012-3-26 17:05 | 只看该作者
1# xuehengs   

write_data(table[(timedata[3]>>4)&&0x0f]);
write_data(table[timedata[3]&&0x0f]);

应该改为:
write_data(table[(timedata[3]>>4)&0x0f]);
write_data(table[timedata[3]&0x0f]);


使用特权

评论回复
6
ayb_ice| | 2012-3-26 17:20 | 只看该作者
这种东西用PROTEUS调试还是不错的

使用特权

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

本版积分规则

0

主题

19

帖子

1

粉丝