打印

来个大大帮看下。DS1302程序

[复制链接]
1576|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
永远的龙虾|  楼主 | 2010-11-18 18:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
不知道哪里出问题了。。调了好久。。调不出来。。帮下。。谢谢
#include<reg52.h>
#include "intrins.h"
#define uchar unsigned char
#define uint undigned int
uchar time_data[7]={10,6,4,17,8,25,30};
uchar write_addr[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
uchar read_addr[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
//                      0   1    2     3    4    5    6   7     8    9     
uchar code D_smg[11]={~0xc0,~0xf9,~0xa4,~0xb0,~0x99,~0x92,~0x82,~0xf8,~0x80,~0x90,0xbf};
uchar code W_smg[8]={0x00,0x04,0x08,0x0c,0x10,0x14};
uchar disp[8];
uchar time_read[7];
sbit sck=P3^6;
sbit io=P3^4;
sbit rst=P3^5;
/***************************************************/
/**************向DS1302写一个字节*******************/
/***************************************************/
void write_Ds1302_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
  sck=0; //低电平时将数据送到总线
  io=dat&0x01;
  dat=dat>>1;
  sck=1; //拉高带来一个上升沿,将数据送入DS1302
}
}
/***************************************************/
/***********向DS1302的某一地址定一数据**************/
/***************************************************/
void write_Ds1302(uchar addr,uchar dat)
{
rst=0;
_nop_();
sck=0;
_nop_();
rst=1;
_nop_();
write_Ds1302_byte(addr);
write_Ds1302_byte(dat);
rst=0;
_nop_();
io=1;
sck=1;
}
/***************************************************/
/**************从DS1302读一个字节*******************/
/***************************************************/
uchar read_Ds1302_byte()
{
uchar i,value;
for(i=0;i<8;i++)
{
  value=value>>1;
  sck=0;
  if(io)
  value=value|0x80;
  sck=1;
  /*sck=0;
  value=(value<<1)|io;
  sck=1;*/
}
return value;
}
/***************************************************/
/**********从DS1302的某一地址读数据*****************/
/***************************************************/
uchar read_Ds1302(uchar addr)
{
uchar value;
rst=0;
_nop_();
sck=0;
_nop_();
rst=1;
_nop_();
write_Ds1302_byte(addr);
value=read_Ds1302_byte();
rst=0;
_nop_();
io=1;
sck=1;
return value;
}
/***************************************************/
/****************设置初始时间函数*******************/
/***************************************************/
void set_rtc()
{
uchar i,j;
for(i=0;i<7;i++) //转换为BCD码
{
  j=time_data[i]/10; //得出低位。
  time_data[i]=time_data[i]%10;  //得出高位
  time_data[i]=time_data[i]+j*16;   //转换为BCD码
}
write_Ds1302(0x8e,0x00); //去除写保护
for(i=0;i<7;i++)
{
  write_Ds1302(write_addr[i],time_data[i]);
}
write_Ds1302(0x8e,0x80);  //写保护
}
/***************************************************/
/**************读Ds1302中的时间函数*****************/
/***************************************************/
void read_rtc()
{
uchar i;
for(i=0;i<7;i++)
{
  time_read[i]=read_Ds1302(read_addr[i]);
}
}
/***************************************************/
/**************读出的时间处理函数*******************/
/***************************************************/
void time_pros()
{
disp[7]=time_read[6]%16;
disp[6]=time_read[6]/16;
disp[5]=11;
disp[4]=time_read[5]%16;
disp[3]=time_read[5]/16;
disp[2]=11;
disp[1]=time_read[4]%16;
disp[0]=time_read[4]/16;
}
/***************************************************/
/******************数码管显示程序*******************/
/***************************************************/
void display()
{

uchar i;
for(i=0;i<8;i++)
{
  P2=W_smg[i];
  P0=D_smg[disp[i]];
  _nop_();  
}
}
void main()
{
set_rtc();
while(1)
{
  read_rtc();
  time_pros();
  display();
}
}

相关帖子

沙发
crazyleen| | 2010-11-18 18:39 | 只看该作者
数码管动态显示是要延时1ms的,还要清除位选后写入段码再输位选码
void display()
{

uchar i;
for(i=0;i<8;i++)
{
P2=0x00;
  P0=D_smg[disp[i]];
  P2=W_smg[i];
delay_1ms();
}

使用特权

评论回复
板凳
永远的龙虾|  楼主 | 2010-11-18 19:03 | 只看该作者
果然。。。。谢谢了。。。。

使用特权

评论回复
地板
zdhlixiang2006| | 2010-11-18 22:33 | 只看该作者
:L

使用特权

评论回复
5
crazyleen| | 2010-11-18 22:34 | 只看该作者
呵呵,遇到问题呢,最好先从原理上入手

使用特权

评论回复
6
lixuan2165| | 2010-12-5 11:56 | 只看该作者
ds1302读写字节程序不妨这样写:void write_Ds1302_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
    io=dat&0x01;
  dat=dat>>1;
sck=0; //低电平时将数据送到总线
  sck=1; //拉高带来一个上升沿,将数据送入DS1302
}
}
uchar read_Ds1302_byte()
{
uchar i,value;
for(i=0;i<8;i++)
{
  value=value>>1;
sck=1;
sck=0;
   if(io)
  value=value|0x80;

  }
return value;
}
严格按照1302时序写这样的程序,效果还不错。

使用特权

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

本版积分规则

0

主题

6

帖子

1

粉丝